2012-06-25 22 views
8

如何獲取過載的函數/過程/方法的所有地址位置?獲取過載方法的地址位置

例如,Dialogs.MessageDlgPosHelp有兩種不同的版本 - 一種沒有默認按鈕,另一種使用。我如何獲得這兩個功能的地址位置?

+0

獲取重載類方法的地址在這裏討論[這裏](http://stackoverflow.com/questions/10083448/trttimethod-invoke-function-doesnt-work-in-overloaded-methods)。順便說一句,在我的Delphi 7中,MessageDlgPosHelp不會被重載,它只是一個正常的函數,而不是方法。術語「方法」是指一個類的功能或過程。 – Hendra

+1

對於我來說,術語'方法'是指一個函數或過程,可能是一個類。我編輯了這個問題,以反映你的術語'方法'的含義。 –

+1

我喜歡TLama的回覆(並已相應勾選)。我會更喜歡RTTI方式(正如Hendra的鏈接所建議的),它可以與Delphi的舊版本(沒有擴展RTTI)一起工作。 –

回答

15

根據this threadThomas 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

在這種情況下,重載的方法是'global'methonds –

+0

當您說「全局方法」是指單位的過程或函數,而不是任何類或記錄的方法?對於這種情況,你可以添加自己的包裝程序或函數與自己的名字,只是在他們內部調用「全局方法」。沒有任何鑄造技巧。 – Nashev

+0

是 - 「全局方法」是單元的功能/過程,而不是類/記錄。 由於這個項目已經接近五十年了,我想我是在一個解決方案後,將所有的(在這種情況下)MessageDlg方法重定向到一個自定義的方法,而不必觸摸代碼庫中的很多文件。最後,我們走了這條路,改變了我們找到的電話。 –

相關問題