2008-10-07 16 views
16

मुझे डर है कि यह शायद एक डमी सवाल का थोड़ा सा है, लेकिन यह मुझे काफी स्टंप है।डेल्फी में पैरामीटर के रूप में ऑब्जेक्ट विधि कैसे पास करें, और फिर इसे कॉल करें?

मैं किसी ऑब्जेक्ट की प्रक्रिया को किसी प्रक्रिया में पास करने के लिए सबसे आसान तरीका ढूंढ रहा हूं, ताकि प्रक्रिया ऑब्जेक्ट की विधि को कॉल कर सके (उदा। टाइमआउट के बाद, या शायद एक अलग थ्रेड में)। तो मूल रूप से मैं चाहता हूं:

  • किसी ऑब्जेक्ट की विधि के संदर्भ को कैप्चर करें।
  • एक प्रक्रिया के संदर्भ में पास करें।
  • उस संदर्भ का उपयोग करके, प्रक्रिया से ऑब्जेक्ट की विधि को कॉल करें।

मुझे लगता है कि मैं इंटरफेस का उपयोग करके एक ही प्रभाव प्राप्त कर सकता हूं, लेकिन मैंने सोचा कि एक और तरीका था, क्योंकि यह "ऑब्जेक्ट की प्रक्रिया" प्रकार की घोषणा मौजूद है।

निम्नलिखित काम नहीं है, लेकिन क्या यह समझाने में सहायता कर सकता है कि मैं कहां उलझन में हूं ...?

interface 
    TCallbackMethod = procedure of object; 

    TCallbackObject = class 
    procedure CallbackMethodImpl; 
    procedure SetupCallback; 
    end; 

implementation 

procedure CallbackTheCallback(const callbackMethod: TCallbackMethod); 
begin 
    callbackMethod(); 
end; 

procedure TCallbackObject.CallbackMethodImpl; 
begin 
    // Do whatever. 
end; 

procedure TCallbackObject.SetupCallback; 
begin 
    // following line doesn't compile - it fails with "E2036 Variable required" 
    CallbackTheCallback(@self.CallbackMethodImpl); 
end; 

(एक बार सवाल का जवाब है, जब तक यह स्पष्टीकरण किसी भी तरह एड्स मैं ऊपर कोड से निकाल देंगे।)

+0

कृपया कोड छोड़ दें। –

+0

प्रभावशाली है कि कुछ लोग कभी-कभी कठिन तरीके से कैसे काम करते हैं, जहां मैं काम करता हूं वहां थ्रेड कॉल विधि का विश्लेषण करता हूं, अगर यह इस दृष्टिकोण का उपयोग करके कॉल करता है तो यह इतना आसान होगा। प्रश्न के लिए thx – kabstergo

उत्तर

18

बस सूचक सामान को हटा दें। डेल्फी यह तुम्हारे लिए क्या करेंगे:

procedure TCallbackObject.SetupCallback; 
begin 
    CallbackTheCallback(CallbackMethodImpl); 
end; 
+0

प्रभावशाली सरल, धन्यवाद! –

2

कारण आप सूचक वाक्य रचना की जरूरत नहीं है कि आप वस्तु की एक प्रक्रिया के रूप में विधि प्रकार घोषित किया है। कंपाइलर "ऑब्जेक्ट" कथन से पता लगाएगा कि कॉलबैक प्रो से विधि को पास करने के तरीके को कैसे संभाला जाए।

+0

मुझे लगता है - धन्यवाद :) –

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