Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to declare string property defaults

I'm writing a component which consists of many properties which are to appear in the Delphi IDE Object Inspector (published properties)...

type
  TMyComponent = class(TComponent)
  private
    FMyProperty: String;
  published
    property MyProperty: String read FMyProperty write SetMyProperty default 'Something';
  end;

However, it's not allowing me to apply a default value to a string property...

[DCC Error] MyUnit.pas(278): E2146 Default values must be of ordinal, pointer or small set type

All other property defaults work fine (Integer, Enum, etc.).

My goal is to A) not save string properties to the DFM if they're the default value, and B) show the value in the Object Inspector as Bold if it's not the default, and regular if it is. There are over 130 properties which show for this component, and about 50 of them are string properties, some with rather large default values.

Why am I not allowed to declare a string property with a default value? Is this a shortcoming with Delphi, or is there a technical reason why strings can't be defaulted?

EDIT

If you really want to know what I'm doing, I'm encapsulating Inno Setup and wrapping the functionality into a component with an extensive property/collection editor. This topic pertains to just the Setup section alone, which consists of actually over 100 properties. Only about 20 of these properties are expected to actually be used for simple implementation, and therefore I don't want all the rest of those string properties to bloat the size of the DFM (if they're set to their defaults). Based on how the component is set up, it will produce an Inno Setup script file.

like image 756
Jerry Dodge Avatar asked Feb 23 '14 01:02

Jerry Dodge


People also ask

How do you give a property a default value?

Right-click the control that you want to change, and then click Properties or press F4. Click the All tab in the property sheet, locate the Default Value property, and then enter your default value. Press CTRL+S to save your changes.

What is the default initial value of a String?

An instance variable can also be a variable of object type. For such variables, the default initial value is null. (In particular, since Strings are objects, the default initial value for String variables is null.)

What is the default value property?

The DefaultValue property specifies text or an expression that's automatically entered in a control or field when a new record is created. For example, if you set the DefaultValue property for a text box control to =Now(), the control displays the current date and time.


1 Answers

Only numeric properties can have a default value specified in the property declaration. However, you can use the stored specifier instead, eg:

type
  TMyComponent = class(TComponent)
  private
    FMyProperty: String;
    function MyPropertyIsStored: Boolean;
    procedure SetMyProperty(const Value: String);
  public
    constructor Create(AOwner: TComponent); override;
  published
    property MyProperty: String read FMyProperty write SetMyProperty stored MyPropertyIsStored;
end;

constructor TMyComponent.Create(AOwner: TComponent);
begin
  Inherited;
  FMyProperty := 'my default value';
end;

function TMyComponent.MyPropertyIsStored: Boolean;
begin
  Result := FMyProperty <> 'my default value';
end;

procedure TMyComponent.SetMyProperty(const Value: String);
begin
  if FMyProperty <> Value then
  begin
    FMyProperty := Value;
    // update component as needed...
  end;
end;
like image 184
Remy Lebeau Avatar answered Sep 18 '22 13:09

Remy Lebeau