2011-08-04 11 views
8

मैं बूलियन संपत्ति के साथ एक सरल घटक वर्ग मिल गया है देता है:कक्षा सामान्य प्रॉपर्टी रन-टाइम पर झूठी

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

    end; 

मैं इसे अपने फार्म पर डाल दिया है, यह सही पर सेट (SomePropertyपर सेट किया गया है, क्यों?), लेकिन जब मैं तक पहुंचने की कोशिश कर रहा हूं तो कुछ समय से कुछ प्रॉपर्टी यह मुझे झूठा दे रहा है। ऐसा क्यों हैं?

उत्तर

15

Thats क्योंकि default विनिर्देशक वास्तव में संपत्ति के लिए मूल्य निर्दिष्ट नहीं करता है, यह सिर्फ स्ट्रीमिंग सिस्टम को बताता है जो मान डिफ़ॉल्ट है (और इस प्रकार सहेजा जाने की आवश्यकता नहीं है)। आपको अभी भी वांछित डिफ़ॉल्ट मान पर कन्स्ट्रक्टर में प्रोप/फ़ील्ड प्रारंभ करना होगा। यह help btw में दर्ज है, पढ़ें "Storage Specifiers" खंड

+0

+1; मुझे 'डिफ़ॉल्ट' विनिर्देशक पर कुछ भी उपयोगी नहीं मिला है, सिवाय इसके कि ऑब्जेक्ट इंस्पेक्टर में जब आप 'डिफ़ॉल्ट' से कुछ प्रॉपर्टी का मान बदलते हैं, तो इसे बोल्ड फ़ॉन्ट द्वारा हाइलाइट किया जाता है; यदि आप इसे वापस 'डिफ़ॉल्ट' में बदलते हैं तो बोल्ड शैली हटा दी जाती है। –

+2

जैसा कि @ain ने कहा, सहायता या DocWiki के संग्रहण निर्दिष्टकर्ता अनुभाग पढ़ें। यह कहता है: 'नोट: संपत्ति मान स्वचालित रूप से डिफ़ॉल्ट मान में प्रारंभ नहीं होते हैं। यानी, डिफ़ॉल्ट निर्देश केवल तभी नियंत्रण होता है जब संपत्ति मान फ़ॉर्म फ़ाइल में सहेजे जाते हैं, लेकिन नए बनाए गए उदाहरण पर संपत्ति का प्रारंभिक मान नहीं। –

+2

तो इसे ठीक करने के लिए, कन्स्ट्रक्टर कोड 'FSomeProperty: = true' जोड़ें –

5

तुम भी निर्माता में सही पर गुण सेट करना चाहिए - अन्यथा यह एक त्रुटि है:

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

डिफ़ॉल्ट मान का निर्धारण क्या संग्रहीत किया जाएगा * डीएफएम फ़ाइल में। यदि आप डिज़ाइन समय पर FSomeProperty से True सेट करते हैं, और FSomeProperty के लिए डिफ़ॉल्ट मान True है, तो FSomeProperty * डीएफएम में संग्रहीत नहीं किया जाएगा।

आप निर्माता आप एक त्रुटि आप वर्णित पाने में True करने के लिए FSomeProperty प्रारंभ नहीं करते हैं - FSomeProperty रनटाइम पर False प्रकट होता है, हालांकि यह डिजाइन समय में True स्थापित किया गया था।

संबंधित मुद्दे