2012-09-26 10 views
6

मेनफॉर्म विभिन्न विकल्प पैनलों को प्रदर्शित करने के लिए रनटाइम पर कुछ माध्यमिक फ़्रेम ऑब्जेक्ट बनाता है।डेल्फी और लाजर के बीच फॉर्म आरंभ में अंतर?

यहाँ (वे एक TFrame विस्तार) उन फ्रेम वर्गों में से एक के लिए एक विशिष्ट निर्माता है:

constructor Tframe2.Create(AOwner: TComponent); 
begin 
    inherited; 
    edTime.Text := '12:00pm'; //edTime is a TEdit control. this line is where it throws the exception 
    //etc. 
end; 

इस कोड डेल्फी में ठीक काम किया (चाहे या नहीं यह काम करने के लिए सही रास्ता नहीं था), लेकिन लाज़र में एक ही कोड एक EInvalidOperation अपवाद फेंकता रहता है, क्योंकि नियंत्रण (TEdit) में अभी तक कोई अभिभावक "विंडो" असाइन नहीं किया गया है (rsControlHasNoParentWindow), जो वास्तव में समझ में आता है जब मैं कोड की जांच करता हूं क्योंकि माता-पिता को असाइन नहीं किया जा रहा है जब तक कन्स्ट्रक्टर कहा जाता है।

if Assigned(frame) then FreeAndNil(frame); 
case Node.AbsoluteIndex of 
    optInterval: frame := Tframe2.Create(Self); //here's where the constructor gets called. 
    //etc 
end; 
frame := TframeOther.Create(Self); 
if Assigned(frame) then 
begin 
    frame.Parent := panOptions; //here's where Tframe2's parent gets set 
    frame.Align := alClient; 
end; 

तो किसी को भी वहाँ प्रपत्र प्रारंभ अनुक्रम के रूप में डेल्फी और लाजर के बीच कोई महत्वपूर्ण अंतर है, चाहे जहाँ तक व्याख्या कर सकते हैं:

यहाँ MainForm में कोड माध्यमिक फ्रेम initializes है?

और इस प्रकार की प्रारंभिकरण आदेश समस्या को हल करने का सबसे मानक तरीका क्या होगा? अन्य भाषाओं की तुलना में मैं अधिक परिचित हूं, ऐसी त्रुटियों को हल करने के लिए अलग-अलग रणनीतियां हो सकती हैं। मैं कन्स्ट्रक्टर को एक और पैरामीटर जोड़ सकता हूं, या यदि ऐसी कोई विधि है जिसे पोस्ट कन्स्ट्रक्टर को स्क्रीन पर प्री-ड्रॉइंग कहा जाता है जिसे मैं ओवरराइड कर सकता हूं, तो मैं उस कोड को स्थानांतरित कर सकता हूं, या केवल एक सहायक विधि बना सकता हूं और सेट के बाद इसे कॉल कर सकता हूं। यहां कोई विशेष सर्वोत्तम अभ्यास है?

संपादित करें]: ऐसा प्रतीत होता है कि यह किसी भी तरह से TEdit के लिए विशिष्ट हो सकता है। ऐसा लगता है कि चेकबॉक्स के लिए राज्य शुरू करने वाली रेखाएं एक ही समस्या नहीं हैं। क्या यह लाजर में बस एक बग हो सकता है?

+0

मुझे नहीं पता कि यह समस्या को ठीक करता है, लेकिन विरासत बनाएँ (AOwner) सेट करें; निर्माण प्रक्रिया में। – Ravaut123

+0

सरल कोड का प्रयास करें * TEDit.Create (शून्य) .क्स्ट: = '12345' *; यह कोड अभिभावक-रहित संपादन बनाता है और इसे कुछ कैप्शन असाइन करता है। यदि यह वीसीएल में काम करता है लेकिन एलसीएल में नहीं - तो इसका मतलब है कि वे माता-पिता होने के अलग-अलग wrt हैं। यह भी ध्यान रखें कि एलसीएल कुछ टूलकिट लाइब्रेरी के खिलाफ केवल एक रैपर है। जीटीके + पर एलसीएल हैं, क्यूटी पर एलसीएल और कौन जानता है और क्या। हो सकता है कि आप एलसीएल बैकएंड को दूसरी लाइब्रेरी में स्विच कर सकें और इसे ठीक कर सकें। या शायद नहीं। –

+0

मैंने इसे एक शॉट दिया, लेकिन मैं इस मुद्दे को डुप्लिकेट नहीं कर सकता (लाज़र 0.9.30.4)। –

उत्तर

1

आगे के प्रयोग के बाद, मैं TEDit के पैरेंट को फ्रेम (बनाम फ्रेम के पैरेंट को सेट करने के लिए) सेट करने के लिए एक लाइन जोड़कर क्रैश होने की तत्काल समस्या को हल करने में सक्षम हूं। इसलिए जैसा:

edTime.Parent := Self; 
edTime.Text := '12:00'; 

लेकिन मैं अभी भी बेहतर को समझने के लिए क्यों इस "कभी-कभी" की जरूरत है अच्छा लगेगा।

संपादित करें: जबकि यह फ़िक्स एक TEDIT पर टेक्स्ट सेट करने में सक्षम हैं, यह मेरे द्वारा स्वचालित किए गए ऑटोसोज़िंग कोड को ठीक नहीं करता है और चेकबॉक्स होने वाले किसी भी आकार का आकार बदलता है। स्पष्ट रूप से जिस फॉर्म का पैरेंट सेट नहीं है वह अभी भी एक समस्या का "प्रकार" है।

संपादित 2: कन्स्ट्रक्टर में दूसरा पैरामीटर जोड़ना और निर्माता को पूरे फॉर्म के लिए पैरेंट सेट करना टीडीटी के पूरी तरह से पैरेंट को सेट करने की आवश्यकता को खत्म करना था।

+2

जब आप दृश्य नियंत्रण (जैसे 'TEdit') बनाते हैं तो यह लगभग हमेशा आवश्यक होता है। इसमें दृश्य सामग्री है, इसलिए इसे उस सामग्री को पेंट करने के लिए कहीं और चाहिए, और यह 'माता-पिता' कनवस पर है। डीएफएम स्ट्रीमिंग विधि स्वचालित रूप से यह करती है (और आप स्ट्रक्चर व्यू में बाल नियंत्रण के 'वंश' या 'पैरेंट ऑर्डर' को देख सकते हैं या डीएफएम को टेक्स्ट के रूप में देखकर और इंडेंटेशन स्तर देख सकते हैं)। जब आप रनटाइम पर कोड में नियंत्रण बनाते हैं, तो आपको इसे स्वयं करना होगा (जैसा आपने पाया है)। –

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