2012-06-25 15 views
8

मैं ओवरलोड किए गए कार्यों/प्रक्रियाओं/विधियों के लिए सभी पता स्थान कैसे प्राप्त करूं?अधिभार विधि के पता स्थान प्राप्त करना

उदाहरण के लिए, Dialogs.MessageDlgPosHelp को इसके दो अलग-अलग संस्करणों के साथ ओवरलोड किया गया है - एक डिफ़ॉल्ट बटन के बिना और एक के साथ। मैं दो कार्यों के लिए पता स्थान कैसे प्राप्त करूं?

+0

ओवरलोडेड क्लास विधि का पता प्राप्त करने पर चर्चा की गई है [यहां] (http://stackoverflow.com/questions/10083448/trttimethod-invoke-function-doesnt-work-in-overloaded-methods)। वैसे, मेरे डेल्फी 7 में, MessageDlgPosHelp अधिभारित नहीं है, और यह सिर्फ एक सामान्य कार्य है, विधि नहीं। शब्द "विधि" एक वर्ग के कार्य या प्रक्रिया को संदर्भित करता है। – Hendra

+1

मेरे लिए 'विधि' शब्द का अर्थ संभवतः एक वर्ग का कार्य या प्रक्रिया है। मैंने 'विधि' शब्द के अपने अर्थ को दर्शाने के लिए प्रश्न संपादित किया है। –

+1

मुझे टीलामा के जवाब पसंद हैं (और तदनुसार टिके हैं)। मैंने आरटीटीआई तरीके (जैसे हेन्द्र के लिंक द्वारा सुझाए गए) की तरह कुछ पसंद किया होगा जो डेल्फी के पुराने संस्करण (जो आरटीटीआई बढ़ाया नहीं गया है) के साथ काम करेगा। –

उत्तर

15

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

तो अपने विचार यह हो सकता है के आधार पर इस तरह MessageDlgPosHelp समारोह भार के लिए लग रहा है:

type 
    TMessageDlgPosHelp1 = function(const Msg: string; DlgType: TMsgDlgType; 
    Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer; 
    const HelpFileName: string): Integer; 
    TMessageDlgPosHelp2 = function(const Msg: string; DlgType: TMsgDlgType; 
    Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer; 
    const HelpFileName: string; DefaultButton: TMsgDlgBtn): Integer; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    MessageDlgPosHelp1: TMessageDlgPosHelp1; 
    MessageDlgPosHelp2: TMessageDlgPosHelp2; 
begin 
    MessageDlgPosHelp1 := MessageDlgPosHelp; 
    MessageDlgPosHelp2 := MessageDlgPosHelp; 
    ShowMessage(Format('%p; %p', [@MessageDlgPosHelp1, @MessageDlgPosHelp2])); 
end; 
+2

+1, यह काम करेगा – Hendra

0

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

+0

इस मामले में, अधिभारित विधियां 'वैश्विक' मेथॉन्ड –

+0

हैं जब आप कहते हैं कि "वैश्विक विधि" का मतलब है कि आप एक प्रक्रिया या इकाई का कार्य करते हैं, और किसी वर्ग या रिकॉर्ड की विधि नहीं ? इस मामले के लिए आप अपने ही नाम के साथ अपनी रैपर प्रक्रिया या फ़ंक्शन जोड़ सकते हैं और बस उसमें "वैश्विक विधि" को कॉल कर सकते हैं। कभी भी किसी भी कास्टिंग चाल के बिना। – Nashev

+0

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

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