2009-09-08 9 views
13

मैं कुछ कोड ढूंढ रहा हूं जो ऑब्जेक्ट की एक घटना में कई इवेंट हैंडलर को आसानी से इशारा कर रहा है ... मुझे इसकी प्लगइन आर्किटेक्चर के लिए बहुत कुछ चाहिए, इसलिए मैंने इसके लिए कुछ प्रतिस्थापन लागू किया हालांकि, मुझे इसके लिए मेरा समाधान पसंद नहीं है, इसलिए मैं जानना चाहता हूं कि आपका विचार/समाधान/टिप क्या है ... मेरा समाधान सिर्फ eventName: string; proc: TMyEventProc; जैसी वस्तुओं के साथ एक सूची है जहां TMyEventProc दो तर्क, प्रेषक और घटना डेटा: सूचक। घटना के नाम के आधार पर , ईवेंटडेटा अलग-अलग रिकॉर्ड/ऑब्जेक्ट को इंगित करता है।Win32 के लिए डेल्फी वीसीएल - एकाधिक ईवेंट हैंडलर

दुर्भाग्यवश यह तर्क के रूप में पारित होने के लिए कई, कई रिकॉर्ड की घोषणा की आवश्यकता है। विधि भी बहुत धीमी है, और "वास्तविक" ईवेंट हिट होने पर आवश्यक "कॉलबैक" को कॉल करने के लिए आवश्यक है।

उत्तर

10

मैंने इस के लिए एक समाधान लागू किया जो डेल्फी के किसी भी संस्करण में काम करता है - इसे मूल रूप से डेल्फी 7 में कार्यान्वित किया गया था, हालांकि मैंने इसे पिछले संस्करणों में परीक्षण नहीं किया है (लेकिन यदि आप डेल्फी 7 का उपयोग कर रहे हैं, तो आपको बस इतना जानने की ज़रूरत है, है ना?)। :)

आईआईआरसी यह कम से कम एलन बाउर के पद के लिए प्रेरणा थी। आप कुछ वीडियो में अपना कार्यान्वयन देख सकते हैं और कोड डाउनलोड कर सकते हैं from my blog:

जिन पोस्टों में आप रुचि रखते हैं उन्हें "मल्टीकास्ट" टैग किया जाता है। अंतिम कोड के लिए डाउनलोड लिंक available in this post है।

मेरे दृष्टिकोण में, आप TMultiCastEvent से एक कक्षा प्राप्त करते हैं। आपके सभी व्युत्पन्न वर्ग को एक विशिष्ट हस्ताक्षर के साथ एक ईवेंट जोड़ने, हटाने और आमंत्रित करने के लिए कुछ सरल प्रकार की सुरक्षा सुरक्षा लागू करना है।

TNotifyEvent - प्रक्रिया (प्रेषक: TObject) के लिए एक कार्यान्वयन - "आपको जाने के लिए" दोनों कार्यान्वयन के साथ प्रदान किया जाता है (ime सबसे अधिक "उपयोगी" मल्टीकास्ट घटनाएं सरल सूचनाएं होती हैं) और मल्टीकास्ट को कैसे प्राप्त करें इसका एक उदाहरण के रूप में विशिष्ट घटना हस्ताक्षर के लिए घटना वर्ग।

एक बार जब आप अपनी मल्टीकास्ट इवेंट क्लास रखते हैं तो आप मल्टी-कास्ट संस्करण के साथ नियमित रूप से "ईवेंट हैंडलर" का उपयोग कर सकते हैं, उदा। मल्टी-कास्ट ऑन_Cलिक घटना के साथ कुछ काल्पनिक बटन क्लास दिया गया है (मैंने ईवेंट नाम में अंडरस्कोर को इंटरैपोज़ करने के लिए एक मल्टीकास्ट, नियमित रूप से "यूनी-कास्ट" घटनाओं के रूप में पहचानने के लिए एक सम्मेलन अपनाया है:

कोड जो असाइन करता है एक यूनिकास्ट क्लिक करें घटना के लिए कोई हैंडलर:

Button.OnClick := MyClickHandler; 

सीधे घटना सूचित करें एक बहु डाली है कि एक ही हैंडलर जोड़ा जा सकता:

MultiCastButton.On_Click.Add(MyClickHandler); 

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

जिनमें से सभी मेरे ब्लॉग पोस्ट में वर्णित और प्रदर्शित किए गए हैं।

आनंद लें। :)

+2

+1; बीटीडब्लू: यह आपकी बहु-कलाकार घटना पोस्टिंग की सूची है: http://www.deltics.co.nz/blog/?tag=multicast-events –

+0

आपके प्रयास के लिए धन्यवाद लेकिन आप दिखाने के लिए नमूना क्यों प्रकाशित नहीं करते इसका इस्तेमाल कैसे करें? – FLICKER

2

एलन बाउर में a blog post about multicast events है जो उपयोगी हो सकता है। यह केवल डेल्फी 200 9 या बाद में काम करता है, हालांकि।

संपादित करें: यदि आप अभी भी डी 7 पर हैं, तो भी आप इस काम को करने में सक्षम होंगे यदि आपको बहुत से अलग ईवेंट हस्ताक्षर की आवश्यकता नहीं है। एलन के कोड को देखने का प्रयास करें और देखें कि क्या आप इसे गैर-सामान्य समाधान में अनुकूलित कर सकते हैं या नहीं।

+0

दुर्भाग्यवश, मैं डी 7 व्यक्तिगत का उपयोग कर रहा हूं ... मैं एक गरीब छात्र हूं;) डी 2009 का खर्च नहीं उठा सकता ... – migajek

+0

मैं आपको सुनता हूं। मैं वास्तव में डी 2009 का व्यक्तिगत संस्करण भी देखना चाहता हूं, लेकिन स्पष्ट रूप से रिलीज करने से डेल्फी व्यावसायिक बिक्री में बहुत अधिक कटौती होगी, और माइक्रोसॉफ्ट के विपरीत, एम्बरकेडेरो के पास सब्सिडी देने के लिए धन लाने वाले विशाल गैर-देव विभाजन नहीं हैं। –

+3

प्रश्न लंबी अवधि में है "क्या एम्बरकेडेरो के पास 'गरीब छात्रों' और शौकियों के लिए सस्ता संस्करण नहीं हो सकता है" –

1

यदि आप प्लगइन सिस्टम को कार्यान्वित कर रहे हैं, तो मुझे लगता है कि आप ईवेंट हैंडलर से दूर नहीं जा सकते - चाहे वह मल्टीकास्ट हो या नहीं। मेरा सुझाव है कि observer pattern पर एक नज़र डालें। मल्टीकास्ट घटनाओं के पास थोड़ा सा वर्बोज़ लग सकता है लेकिन जब आपको आवश्यकता हो तो कम से कम अधिक लचीला लग सकता है।

+0

असल में मुझे पता है कि पटर, भले ही मुझे इसका नाम पता नहीं था;) वैसे भी मुझे वीसीएल के साथ एकीकृत करते समय कुछ प्रकार की स्वचालन की आवश्यकता है। मेरे पास कई नियंत्रण प्रकार हैं जिनके लिए मुझे पकड़ने की आवश्यकता है ... – migajek

0

आप इसके लिए पर्यवेक्षक डिजाइन पैटर्न का उपयोग कर सकते हैं। यहां एक नमूना डेल्फी कार्यान्वयन है: http://blogs.teamb.com/joannacarter/2004/06/30/690

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