2011-08-04 8 views
8

Mam prostą klasę komponentu z właściwości Boolean:Klasa boolean Ustaw na TRUE daje fałszywy na czasie wykonywania

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

    end; 

I umieścić go na moim formularzu, należy ustawić go na true (SomeProperty jest ustawiony na false, dlaczego?), Ale kiedy próbuję uzyskać dostęp do SomeProperty z run-time, to daje mi fałsz. Dlaczego to jest takie?

Odpowiedz

15

To dlatego, że specyfikator default w rzeczywistości nie przypisuje wartości do właściwości, po prostu mówi systemowi strumieniowemu, która wartość jest wartością domyślną (a zatem nie trzeba jej zapisywać). Nadal musisz zainicjować pole prop/field w konstruktorze, aby uzyskać pożądaną wartość domyślną. Jest to udokumentowane w help BTW, przeczytaj sekcję

+0

+1; Nie znalazłem niczego przydatnego w 'default'' z wyjątkiem tego, że w Inspektorze obiektów, gdy zmienisz wartość jakiejś właściwości z 'default', jest ona wyróżniona pogrubioną czcionką; jeśli zmienisz go z powrotem na "domyślny", pogrubiony styl zostanie usunięty. –

+2

Jak powiedział @Aain, przeczytaj sekcję Specyfikatory magazynu w pomocy lub DocWiki. To mówi: 'Uwaga: Wartości właściwości nie są automatycznie inicjowane do wartości domyślnej. Oznacza to, że domyślna dyrektywa steruje tylko wtedy, gdy wartości właściwości są zapisywane w pliku formularza, ale nie jest wartością początkową właściwości nowo utworzonego wystąpienia. " –

+2

Aby to naprawić, dodaj kod konstruktora' FSomeProperty: = true' –

5

Należy również ustawić właściwość true w konstruktorze „Storage Specifiers” - w przeciwnym razie jest to błąd:

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

Wartości domyślne określić, jakie będą przechowywane w pliku * .DFM. Jeśli ustawisz FSomeProperty na True w czasie projektowania, a domyślną wartością dla FSomeProperty jest True, wówczas FSomeProperty nie będzie przechowywane w * .DFM.

Jeśli nie zainicjować FSomeProperty do True w konstruktorze masz błąd opisany - FSomeProperty pojawia False w czasie wykonywania, jeśli został ustawiony True w czasie projektowania.

Powiązane problemy