डेल्फी घटक बनाना गतिशील (रन-टाइम पर)

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

गतिशील घटक निर्माण

गतिशील रूप से घटक बनाने के दो तरीके हैं। एक तरीका यह है कि नए घटक के मालिक के लिए एक फॉर्म (या कुछ अन्य TComponent) बनाया जाए। यह एक सामान्य अभ्यास है जब समग्र घटकों का निर्माण होता है जहां एक दृश्य कंटेनर बनाता है और सब-कमर्स का मालिक होता है। ऐसा करने से यह सुनिश्चित होगा कि मालिक के घटक के नष्ट होने पर नव-निर्मित घटक नष्ट हो जाता है।

किसी वर्ग का उदाहरण (ऑब्जेक्ट) बनाने के लिए, आप इसकी "बनाएँ" विधि कहते हैं। निर्माता बनाएँ एक है कक्षा विधिके रूप में, वस्तुतः अन्य सभी तरीकों का विरोध करते हुए आप डेल्फी प्रोग्रामिंग में मुठभेड़ करेंगे, जो कि ऑब्जेक्ट तरीके हैं।

उदाहरण के लिए, TComponent ने कंस्ट्रक्टर को निम्नानुसार घोषित किया:

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

मालिकों के साथ गतिशील निर्माण

instagram viewer

यहाँ गतिशील निर्माण का एक उदाहरण है, जहाँ स्वयं एक TComponent या TComponent वंशज है (जैसे, TForm का एक उदाहरण):

TTimer के साथ। बनाएँ (स्व) करते हैं
शुरू
अंतराल: = 1000;
सक्षम: = गलत;
OnTimer: = MyTimerEventHandler;
समाप्त;

मुक्त करने के लिए एक स्पष्ट कॉल के साथ गतिशील निर्माण
एक घटक बनाने का दूसरा तरीका उपयोग करना है शून्य मालिक के रूप में। ध्यान दें कि यदि आप ऐसा करते हैं, तो आपको अपने द्वारा बनाई गई वस्तु को भी स्पष्ट रूप से मुक्त करना होगा क्योंकि अब आपको इसकी आवश्यकता नहीं है (या आप उत्पादन करेंगे स्मृति रिसाव). यहां स्वामी के रूप में नील का उपयोग करने का एक उदाहरण दिया गया है:

TTable के साथ। बनाना (निल) करना
प्रयत्न
DataBaseName: = 'MyAlias';
सारणीनाम: = 'MyTable';
खुला हुआ;
संपादित करें;
FieldByName ('व्यस्त')। AsBoolean: = True;
पद;
आखिरकार
नि: शुल्क;
समाप्त;

गतिशील निर्माण और वस्तु संदर्भ
विधि के लिए वैरिएबल लोकल पर कॉल करने या कक्षा से संबंधित होने के परिणामस्वरूप दो पिछले उदाहरणों को बढ़ाना संभव है। यह अक्सर वांछनीय है जब संदर्भ के लिए अंग बाद में, या जब उपयोग करने की आवश्यकता हो scoping संभावित रूप से "विथ" ब्लॉक के कारण होने वाली समस्याओं से बचा जाना चाहिए। यहां ऊपर से TTimer निर्माण कोड दिया गया है, तात्कालिक TTimer ऑब्जेक्ट के संदर्भ के रूप में फ़ील्ड चर का उपयोग करते हुए:

फटीमर: = टीटीमर। बनाएँ (स्व);
FTimer के साथ करते हैं
शुरू
अंतराल: = 1000;
सक्षम: = गलत;
OnTimer: = MyInternalTimerEventHandler;
समाप्त;

इस उदाहरण में "FTimer" फॉर्म या विज़ुअल कंटेनर (या जो भी "स्व" है) का एक निजी क्षेत्र चर है। इस वर्ग के तरीकों से FTimer चर का उपयोग करते समय, यह देखने के लिए कि क्या उपयोग करने से पहले संदर्भ मान्य है, यह देखना एक बहुत अच्छा विचार है। यह डेल्फी के असाइन किए गए फ़ंक्शन का उपयोग करके किया जाता है:

यदि असाइन किया गया (FTimer) तो FTimer। सक्षम: = सत्य;

मालिकों के बिना गतिशील निर्माण और वस्तु संदर्भ
इस पर भिन्नता बिना किसी स्वामी के घटक को बनाने के लिए है, लेकिन बाद के विनाश के लिए संदर्भ बनाए रखें। TTimer के लिए निर्माण कोड इस तरह दिखेगा:

फटीमर: = टीटीमर। बनाना (निल);
FTimer के साथ करते हैं
शुरू
...
समाप्त;

और विनाश कोड (संभवतः फॉर्म के विध्वंसक में) कुछ इस तरह दिखाई देगा:

FTimer। नि: शुल्क;
फटीमर: = नील;
(*
या FreeAndNil (FTimer) प्रक्रिया का उपयोग करें, जो ऑब्जेक्ट संदर्भ को मुक्त करता है और संदर्भ को nil से बदल देता है।
*)

वस्तुओं को मुक्त करते समय शून्य पर वस्तु संदर्भ सेट करना महत्वपूर्ण है। नि: शुल्क पहली कॉल को देखने के लिए जाँचता है कि वस्तु संदर्भ शून्य है या नहीं, और यदि ऐसा नहीं है, तो यह ऑब्जेक्ट के विध्वंसक को नष्ट करता है।

मालिकों के बिना गतिशील निर्माण और स्थानीय वस्तु संदर्भ

यहाँ ऊपर से TTable निर्माण कोड है, तात्कालिक TTable वस्तु के संदर्भ के रूप में एक स्थानीय चर का उपयोग करते हुए:

स्थानीयटैबल: = TTable। बनाना (निल);
प्रयत्न
स्थानीय के साथ करते हैं
शुरू
DataBaseName: = 'MyAlias';
सारणीनाम: = 'MyTable';
समाप्त;
...
// बाद में, यदि हम स्पष्ट रूप से गुंजाइश बताना चाहते हैं:
localTable। खुला हुआ;
localTable। संपादित करें;
localTable। FieldByName ('व्यस्त')। AsBoolean: = True;
localTable। पद;
आखिरकार
localTable। नि: शुल्क;
localTable: = nil;
समाप्त;

ऊपर के उदाहरण में, "localTable" एक है स्थानीय चर इस कोड वाली एक ही विधि में घोषित। ध्यान दें कि किसी भी वस्तु को मुक्त करने के बाद, सामान्य रूप से यह शून्य को संदर्भित करने के लिए एक बहुत अच्छा विचार है।

खतरे के संकेत के लिए एक शब्द ही काफी है

महत्वपूर्ण: कंस्ट्रक्टर के लिए एक वैध मालिक को पास करने के साथ फ्री में कॉल न मिलाएं। पिछली तकनीकों के सभी काम करेंगे और मान्य हैं, लेकिन निम्नलिखित चाहिए अपने कोड में कभी नहीं:

TTable के साथ। (स्व) बनाएँ
प्रयत्न
...
आखिरकार
नि: शुल्क;
समाप्त;

ऊपर दिया गया कोड उदाहरण अनावश्यक प्रदर्शन हिट का परिचय देता है, स्मृति को थोड़ा प्रभावित करता है, और बग को खोजने के लिए कठिन परिचय देने की क्षमता रखता है। जानिये क्यों।

नोट: यदि एक गतिशील रूप से बनाए गए घटक में एक स्वामी है (निर्माणकर्ता के AOwner पैरामीटर द्वारा निर्दिष्ट), तो वह स्वामी घटक को नष्ट करने के लिए जिम्मेदार है। अन्यथा, आपको स्पष्ट रूप से नि: शुल्क कॉल करना होगा जब आपको घटक की आवश्यकता नहीं होगी।

मूल रूप से लिखा गया लेख मार्क मिलर

प्रारंभिक घटक गणनाओं के साथ 1000 घटकों के गतिशील निर्माण के लिए डेल्फी में एक परीक्षण कार्यक्रम बनाया गया था। परीक्षण कार्यक्रम इस पृष्ठ के निचले भाग में दिखाई देता है। चार्ट परीक्षण कार्यक्रम से परिणामों का एक सेट दिखाता है, मालिकों और बिना दोनों के घटकों को बनाने में लगने वाले समय की तुलना करता है। ध्यान दें कि यह केवल हिट का एक हिस्सा है। घटकों को नष्ट करते समय एक समान प्रदर्शन देरी की उम्मीद की जा सकती है। मालिकों के साथ घटकों को गतिशील रूप से बनाने का समय 1200% से 107960% धीमा है जो इसे बनाना है मालिकों के बिना घटक, फार्म पर घटकों की संख्या और घटक होने के आधार पर बनाया था।

द टेस्ट प्रोग्राम

चेतावनी: यह परीक्षण कार्यक्रम मालिकों के बिना बनाए गए और मुक्त घटकों को ट्रैक नहीं करता है। इन घटकों को ट्रैक और मुक्त नहीं करके, गतिशील सृजन कोड के लिए मापा गया समय अधिक सटीक रूप से गतिशील रूप से एक घटक बनाने के लिए वास्तविक समय को दर्शाता है।

स्रोत कोड डाउनलोड करें

चेतावनी!

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

instagram story viewer