2011-08-04 36 views
8

我有與布爾屬性一個簡單的組件類:類默認屬性給出了運行時錯誤

TmyClass = class(TComponent) 
    private 
     fSomeProperty: boolean; 
    published 
     property SomeProperty: boolean 
        read fSomeProperty 
        write fSomeProperty 
        default true; 

    end; 

我把它放在我的形式,其設置爲true(SomeProperty設置爲false,爲什麼?),但是當我試圖從運行時訪問SomeProperty它給我錯誤。爲什麼?

回答

15

那是因爲default符不實際值分配給該屬性,它只是說,到流系統的默認值是(因此並不需要保存)。您仍然必須將構造函數中的prop/field初始化爲所需的默認值。這是在help BTW文件,閱讀「Storage Specifiers」部分

+0

+1;除了在Object Inspector中,當你將一些屬性的值從默認值改變爲默認值時,我沒有發現對default屬性有用的東西,它用粗體字突出顯示;如果您將其更改回「默認」,則刪除粗體樣式。 – 2011-08-04 16:15:09

+2

正如@ain所說,請閱讀幫助或DocWiki的存儲說明符部分。這說:'注意:屬性值不會自動初始化爲默認值。也就是說,只有當屬性值被保存到表單文件時,缺省指令纔會控制,而不是在新創建的實例上屬性的初始值。' –

+2

所以要修復它,添加構造函數代碼'FSomeProperty:= true' –

5

你也應該在屬性設置爲True在構造 - 否則它是一個錯誤:

constructor TMyClass.Create(AOwner: TComponent); 
begin 
    inherited; 
    FSomeProperty:= True; 
    ... 
end; 

默認值確定哪些將被保存在* .DFM文件中。如果在設計時將FSomeProperty設置爲True,並且FSomeProperty的默認值爲True,則FSomeProperty將不會存儲在* .DFM中。

如果不初始化FSomeProperty在你得到你所描述的錯誤的構造True - FSomeProperty出現False在運行時,雖然它在設計時設置True