在這裏要小心。 default
指令不會執行任何操作來設置屬性本身的值。它隻影響值是否明確保存在.dfm
文件中。如果爲屬性指定default
值,則仍需確保構造函數將後備字段初始化爲該值。
Properties : Storage Specifiers
當保存組件的狀態,組件的published屬性的存儲說明符進行檢查。如果某個屬性的當前值從默認值不同(或者如果沒有默認值)和存儲符是真,則該屬性的值被保存。否則,該屬性的值不會被保存。
注意:屬性值不會自動初始化爲默認值。也就是說,僅當屬性值被保存到表單文件時,缺省指令控制,而不是新創建的實例上的屬性的初始值。
這僅僅是一個暗示,組件流系統,它並不需要在.dfm
明確存儲該值 - 您的合同的組成部分,是確保你真正支持字段初始化到該值。適當的地方做這種類型的初始化是在組件的構造:
constructor TMyComponent.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FVariantValue := False;
end;
也就是說,False
是一個布爾值,而不是一個變體,所以它不能被用來作爲Variant
類型的常量表達式。由於變體是複雜類型,因此不能將其表示爲單個常量,因此不能具有default
屬性。
每雷米,如果你想確保當後盾變種False
的變化就不會保存在.dfm
文件,你可以使用stored
指令與返回False
一個參數的方法,當變形計算結果爲布爾False
。例如:
property VariantValue : Variant read FVariantValue write FVariantValue stored IsVariantValueStored;
其中
function TMyComponent.IsVariantValueStored : Boolean;
begin
Result := not VarIsType(FVariantValue, varBoolean);
if not Result then
Result := FVariantValue;
end;
對於DFM流的目的,如果你不想在Variant包含一個False值時將屬性存儲在DFM中,你可以使用'stored'說明符而不是'default'說明符,其中'stored'是指轉換爲無參數方法,如果Variant包含False值則返回False,否則返回True。 –
@RemyLebeau非常聰明 - 不確定這是OP實際需要的,但我已經更新了這個例子。 –