2009-02-24 8 views
21

डेल्फी घटकों में CreateWnd और CreateWindowHandle (और DestroyWnd और DestroyWindowHandle) हैं। वे दोनों वंशजों द्वारा ओवरराइड किए जाने का इरादा रखते हैं, है ना? और अंतर्निहित वीसीएल कार्यान्वयन को छोड़कर बुलाया जाने का इरादा नहीं है?CreateWnd और CreateWindowHandle के बीच क्या अंतर है?

उनके बीच क्या अंतर है; जब उनमें से किसी एक को ओवरराइड किया जाना चाहिए?

उत्तर

36

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

CreateParams();

सामान्यतः, अधिकांश समय आपको वास्तव में CreateParams() को ओवरराइड करने की आवश्यकता होती है। यदि आप सब कुछ करना चाहते हैं (विंडोज स्टाइल "सबक्लासिंग याद रखें?" विंडोज प्रोग्रामिंग पर पेटज़ोल्ड का मौलिक काम देखें) एक मौजूदा नियंत्रण वर्ग और इसे वीसीएल नियंत्रण में लपेटें, तो आप इसे CreateParams से करते हैं। आप यह भी नियंत्रित कर सकते हैं कि स्टाइल बिट्स सेट हैं और अन्य विभिन्न पैरामीटर। हमने "सबक्लास" बनाने की प्रक्रिया को बहुत आसान बना दिया है। बस अपनी CreateParams() विधि से CreateSubClass() को कॉल करें। उदाहरण के लिए कोर वीसीएल नियंत्रण देखें जैसे कि टीकेकबॉक्स या टीबटन।

CreateWnd();

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

CreateWindowHandle();

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

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

+0

शानदार उत्तर। मूल प्रश्न VCL का उल्लेख करने के बाद से जवाब को पूरा करने के लिए बस एक अच्छा वेब संसाधन जोड़ना चाहता था: http://edn.embarcadero.com/article/20569 – Ampere

4

CreateWnd पहले CreateParams को कॉल करता है, फिर बनाए गए पैराम्स का उपयोग करके CreateWindowHandle को कॉल करता है। आम तौर पर, आप CreateWindowHandle के बजाय CreateWnd और CreateParams को ओवरराइड करेंगे।

मुझे आशा है कि इससे मदद मिलती है!

0

मुझे यकीन है कि अंतिम उत्तर केवल वीसीएल (एलन?) के निर्माण में शामिल लोगों से आ सकता है, लेकिन आईएमएचओ कम से कम ज़िम्मेदारी के साथ वर्चुअल विधि/जो कॉल की श्रृंखला में सबसे कम है, होना चाहिए अधिरोहित। यही कारण है कि मैंने हमेशा CreateParams() और CreateWindowHandle() पर ओवरराइड किया है। यह एक अच्छा फिट जैसा दिखता है क्योंकि उन्हें CreateWnd() द्वारा कॉल किया जाता है, और दोनों केवल एक विशेष चीज़ करते हैं।

अंत में यह शायद वरीयता का मामला है।

2

कौन क्या करता है:
CreateWnd सामान्य ठेकेदार है कि एक WinControl के लिए पूरी तरह से बनाई विंडो बनाता है।
सबसे पहले, इसे CreateParams पर कॉल करके विंडो क्लास के लिए आवश्यक विशेषताओं को सेट करना होगा और यह सुनिश्चित करना होगा कि यह सही तरीके से पंजीकृत है।
फिर यह कॉल करके विन्डोवांडल पर कॉल करके वास्तव में बनाई गई विंडो को प्राप्त करता है जो ओएस से परिणामस्वरूप हैंडल देता है।
उसके बाद, हम एक वैध संदेशों प्रोसेस करने में सक्षम खिड़की, और CreateWnd अंतिम ग्रूमिंग, आकार, फ़ॉन्ट, आदि की तरह अलग अलग दृश्य पहलुओं को एडजस्ट करने

वहाँ भी बाद में द्वारा किया कदम है करता CreateHandle है, CreateWnd समाप्त होने के बाद, वीसीएल को अपनी खिड़कियों (पहचान, अभिभावक, ...) के प्रबंधन में मदद करने के लिए।

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