डेल्फी "समस्या": TForm। बनाएँ () - शून्य, स्व या अनुप्रयोग?

जब आप बनाते हैं डेल्फी ऑब्जेक्ट्स गतिशील रूप से TControl से विरासत में मिली, जैसे कि TForm (डेल्फी अनुप्रयोगों में एक फॉर्म / विंडो का प्रतिनिधित्व करते हुए), निर्माता "बनाएँ" एक "मालिक" पैरामीटर की अपेक्षा करता है:

निर्माता बनाएँ (AOwner: TComponent);

AOwner पैरामीटर TForm ऑब्जेक्ट का मालिक है। फ़ॉर्म को मुक्त करने के लिए फ़ॉर्म का स्वामी ज़िम्मेदार है - यानी, फ़ॉर्म द्वारा आवंटित मेमोरी - जब ज़रूरत हो। प्रपत्र उसके स्वामी के घटक सरणी में प्रकट होता है और जब उसका स्वामी नष्ट हो जाता है, तो यह स्वचालित रूप से नष्ट हो जाता है।

आपके पास AOwner पैरामीटर के लिए तीन विकल्प हैं: शून्य, आत्म, तथा आवेदन.

उत्तर को समझने के लिए, आपको सबसे पहले "nil," "self" और "Application" का अर्थ जानना होगा।

  • शून्य निर्दिष्ट करता है कि कोई भी ऑब्जेक्ट फॉर्म का मालिक नहीं है और इसलिए डेवलपर बनाए गए फॉर्म को मुक्त करने के लिए जिम्मेदार है (myForm को कॉल करके)। नि: शुल्क जब आपको अब फॉर्म की आवश्यकता नहीं है)
  • स्वयं उस ऑब्जेक्ट को निर्दिष्ट करता है जिसमें विधि कहा जाता है। यदि, उदाहरण के लिए, आप एक बटन के ऑनक्लिक हैंडलर (जहाँ यह बटन मेनफ़ॉर्म पर रखा गया है) के अंदर से एक टीएमफार्म फॉर्म का एक नया उदाहरण बना रहे हैं,
    instagram viewer
    स्वयं "मेनफॉर्म" को संदर्भित करता है। इस प्रकार, जब MainForm मुक्त हो जाता है, तो यह MyForm भी मुक्त हो जाएगा।
  • आवेदन जब आप अपना एप्लिकेशन चलाते हैं तो एक वैश्विक TAPlication प्रकार का चर बनाता है। "एप्लिकेशन" आपके एप्लिकेशन को एनकैप्सूलेट करने के साथ-साथ प्रोग्राम की पृष्ठभूमि में होने वाले कई कार्यों को प्रदान करता है।

उदाहरण:

  1. मोडल रूप। जब आप एक फॉर्म को सामान्य रूप से प्रदर्शित करने के लिए बनाते हैं और जब उपयोगकर्ता फ़ॉर्म को बंद कर देता है, तो मालिक के रूप में "nil" का उपयोग करें:
    var myForm: TMyForm; myForm शुरू करें: = TMyForm। सृजन करना(शून्य); myForm का प्रयास करें। ShowModal; अंत में myForm। नि: शुल्क; समाप्त; समाप्त;
  2. मॉडल रूप। स्वामी के रूप में "एप्लिकेशन" का उपयोग करें:
    वर
    myForm: TMyForm;
    ...
    myForm: = TMyForm। बनाएँ (आवेदन);

अब, जब आप आवेदन को समाप्त (बाहर) करते हैं, तो "एप्लिकेशन" ऑब्जेक्ट "myForm" उदाहरण को मुक्त कर देगा।

TMyForm क्यों और कब होता है। बनाएँ (अनुप्रयोग) अनुशंसित नहीं है? यदि प्रपत्र एक मोडल रूप है और नष्ट हो जाएगा, तो आपको मालिक के लिए "निल" पास करना चाहिए।

आप "एप्लिकेशन" पास कर सकते हैं, लेकिन अधिसूचना विधि के कारण हर घटक को भेजे जा रहे समय और आवेदन के स्वामित्व या अप्रत्यक्ष रूप से स्वामित्व के कारण विघटनकारी साबित हो सकता है। यदि आपके आवेदन में कई घटकों (हजारों में) के साथ कई रूप हैं, और आपके द्वारा बनाए जा रहे फॉर्म में कई नियंत्रण हैं (सैकड़ों में), तो सूचना में देरी महत्वपूर्ण हो सकती है।

"आवेदन" के बजाय मालिक के रूप में "नील" पास करने से फॉर्म जल्दी दिखाई देगा, और अन्यथा कोड को प्रभावित नहीं करेगा।

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

चेतावनी: डेल्फी घटक को गतिशील रूप से त्वरित करने के लिए और स्पष्ट रूप से कुछ समय बाद इसे मुक्त करें, हमेशा मालिक के रूप में "निल" पास करें। ऐसा करने में विफलता अनावश्यक जोखिम, साथ ही प्रदर्शन और कोड रखरखाव समस्याओं का परिचय दे सकती है।

में SDI अनुप्रयोगों, जब कोई उपयोगकर्ता फ़ॉर्म को बंद करता है ([x] बटन पर क्लिक करके) फॉर्म अभी भी मेमोरी में मौजूद है - यह केवल छिपा हुआ है। एमडीआई अनुप्रयोगों में, एमडीआई बच्चे के फॉर्म को बंद करना केवल इसे कम करता है।
OnClose घटना एक प्रदान करता है कार्य पैरामीटर (TCloseAction प्रकार का) आप यह निर्दिष्ट करने के लिए उपयोग कर सकते हैं कि उपयोगकर्ता द्वारा फॉर्म को बंद करने का प्रयास करने पर क्या होता है। इस पैरामीटर को "caFree" पर सेट करने से फॉर्म फ्री हो जाएगा।

डेल्फी टिप्स नाविक:
»TWebBrowser घटक से पूर्ण HTML प्राप्त करें
«पिक्सेल को मिलीमीटर में कैसे बदलें

instagram story viewer