2009-04-02 9 views
12

मेरे पास एक ऐसा फॉर्म है जिसका उपयोग मैं कुछ सेकंड के लिए कुछ जानकारी दिखाने के लिए करता हूं। क्या फॉर्म खुद को मुक्त करने के लिए ठीक है? क्या मैं कन्स्ट्रक्टर में टाइमर शुरू कर सकता हूं, और फिर टाइमर-इवेंट में self.free को कॉल कर सकता हूं? या क्या यह संभावित रूप से परेशानी का कारण बन जाएगा?डेल्फी: क्या यह फ़ॉर्म को स्वयं मुक्त करने के लिए ठीक है?

उत्तर

29

इसके अतिरिक्त, एक फॉर्म के साथ आप रिलीज कॉल कर सकते हैं।

यह फ़ॉर्म में एक CM_RELEASE संदेश भेजता है। एक प्रतिक्रिया के रूप में यह मुफ्त कहते हैं। रिलीज का लाभ यह है कि फ़ॉर्म के लिए कोई संदेश नहीं छोड़ा गया है जिसके परिणामस्वरूप क्रैश हो सकता है।

+0

+1, यह है, आईएमएचओ, उस मामले में करने का एकमात्र साफ तरीका – Fred

+0

मुझे लगता है कि मैं मालिक के अतिरिक्त बीमा के रूप में स्थापित करने के संयोजन के साथ इस के लिए जाऊंगा। – Vegar

1

मेरे पास ऑब्जेक्ट्स का पूरा सूट है जो स्वयं को मुक्त करता है, और मैंने उन पर विभिन्न परीक्षण चलाए हैं जिनमें कोई समस्या/रिसाव नहीं दिखाया गया है। एक TForm अधिक जटिल हो सकता है, लेकिन जब तक Self.Free() अंतिम कॉल किया जाता है, तो आपको सुरक्षित होना चाहिए।

(उन लोगों के लिए जो सोचते हैं कि मेरे पास क्यों ऑब्जेक्ट है जो खुद को मुक्त करते हैं; मैं उन्हें सिस्टम के चारों ओर बहुत पास करता हूं, इसलिए मैंने अपनी संदर्भ गिनती योजना द्वारा कार्यान्वित किया। जब अंतिम संदर्भ जारी किया जाता है, तो ऑब्जेक्ट खुद को मुक्त करता है)।

+0

लेकिन Self.Free लगभग किसी भी रूप में आखिरी कॉल नहीं होगा क्योंकि एक फॉर्म लगभग हमेशा कुछ उपयोगकर्ता कार्रवाई की प्रतिक्रिया में कोड चला रहा है। इसके बजाय रिलीज का प्रयोग करें। –

+0

संदर्भ-गणना के लिए इंटरफ़ेस का उपयोग क्यों न करें? –

16

आप खुद को मुक्त करने के प्रपत्र बना सकते हैं जब यह उपयोगकर्ता द्वारा या कोड से बंद कर दिया जाता है:

procedure TForm27.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    Action := caFree; 
end; 

procedure TForm27.FormCreate(Sender: TObject); 
begin 
    Timer1.Enabled := True; 
end; 

procedure TForm27.Timer1Timer(Sender: TObject); 
begin 
    Timer1.Enabled := False; 
    Close; 
end; 

सुनिश्चित करें कि आप आवेदन शटडाउन बैठाना निर्माता को स्वामी की आपूर्ति करते हैं और प्रपत्र पर नष्ट कर दिया नहीं है समय। स्वामी खुद को मुक्त करने से पहले फॉर्म को मुक्त कर देगा।

+0

जितना अधिक मैं इसके बारे में सोचता हूं, उतना ही मुझे TCloseAction-idea पसंद है। हो सकता है कि मुझे रिलीज के बजाय इसका उपयोग करना चाहिए ... – Vegar

+1

यदि केवल फॉर्मों में DefaultCloseAction गुण थे, तो पोन ईवेंट हैंडलर को निर्दिष्ट किए बिना उन्हें ऑटो-फ्री कर सकता था। –

0

यह बिल्कुल इंटरफेस के साथ किया जाता है।

+1

हां, लेकिन आपको याद रखना चाहिए कि डेल्फी का टीकंपोनेंट इंटरफ़ेस के संदर्भ गिनती को ओवरराइड करता है, जो अक्सर भ्रम का कारण बनता है। –

+0

इंटरफेस का उपयोग करते हुए, फॉर्म को स्कूप से बाहर होने पर मुक्त कर दिया जाएगा। मुझे वह नहीं चाहिए। मैं इसे तब तक जीना चाहता हूं जब तक कि यह किसी भी संदर्भ के बिना नहीं चाहता, और फिर इसे स्वयं दिखाए जाने पर स्वयं को मुक्त कर दें। – Vegar

+0

फैबियो: मुझे यकीन है कि आप इसे ओवरराइड कर सकते हैं। वेगर: इंटरफेस संदर्भ गिना जाता है, स्कोप-प्रबंधित नहीं। – Arafangion

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

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