It's not clear what you're trying to do. Assigning default
to a property has two uses:
To decide whether the property value is streamed to the DFM or not (used for ordinal or Boolean properties, usually, such as Visible
- since the default would be True
, there's no reason to write it to the DFM unless it's False
. (See note below)
For array properties, to indicate that the array is the default property of the class (such as Delphi's TList.Items
, where having Items
the default allows you to use List[x]
instead of List.Items[x]
in your code.
If your intent is to provide a default value to the string so it shows in the Object Inspector, simply set the value in the component constructor. If the user has assigned a different value, the value set in the constructor will be overwritten when the DFM content is streamed in.
As far as why string default values are not allowed, this is clearly stated in the documentation (see "Storage Specifiers" (emphasis mine):
The default and nodefault directives are supported only for ordinal types and for set types, provided the upper and lower bounds of the set's base type have ordinal values between 0 and 31; if such a property is declared without default or nodefault, it is treated as if nodefault were specified. For reals, pointers, and strings, there is an implicit default value of 0, nil, and '' (the empty string), respectively.
Note: The default is used in conjunction with the stored specifier that Remy's answer describes. From the same docs linked and quoted above (same section):
When saving a component's state, the storage specifiers of the component's published properties are checked. If a property's current value is different from its default value (or if there is no default value) and the stored specifier is True, then the property's value is saved. Otherwise, the property's value is not saved.