2017-04-13 78 views
5

我寫了一個組件,他有一個Variant屬性,我想爲其設置一個默認值。Variant屬性可以有默認值嗎?

TMyComponent = class(TComponent) 
private 
    FVariantValue : Variant; 
published 
    property VariantValue : Variant read FVariantValue write FVariantValue default False; 
end; 

在編譯時,我得到了VariantValue財產線以下錯誤:

E2026常量表達式預期

做同樣的事情用Boolean財產不會造成任何有點錯誤。

我讀了一點documentation但我沒有發現關於Variant屬性默認值的任何內容。

回答

9

在這裏要小心。 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; 
+4

對於DFM流的目的,如果你不想在Variant包含一個False值時將屬性存儲在DFM中,你可以使用'stored'說明符而不是'default'說明符,其中'stored'是指轉換爲無參數方法,如果Variant包含False值則返回False,否則返回True。 –

+0

@RemyLebeau非常聰明 - 不確定這是OP實際需要的,但我已經更新了這個例子。 –

4

變體屬性不能有默認值。

+3

你的答案是沒有enogh,當你說不能最好的東西請有默認值,請嘗試解釋爲什麼,這是有道理的。 – Sami

+2

因爲設計師做出了這個決定。我不能說爲什麼。只有他們可以。 –

1

做的是建立

FVariantValue := false; 
在構造

procedure AfterConstruction; override;