2012-06-25 9 views
8

オーバーロードされた関数/プロシージャ/メソッドのすべてのアドレス位置を取得するにはどうすればよいですか?オーバーロードメソッドのアドレス位置の取得

たとえば、Dialogs.MessageDlgPosHelpには2つの異なるバージョンがあります.1つはデフォルトボタンなし、もう1つはオーバーロードされています。どのようにして2つの機能のアドレス位置を取得できますか?

+0

オーバーロードされたクラスメソッドのアドレスを取得する方法については、こちら[こちら](http://stackoverflow.com/questions/10083448/trttimethod-invoke-function-doesnt-work-in-overloaded-methods)を参照してください。ちなみに、私のDelphi 7では、MessageDlgPosHelpはオーバーロードされておらず、メソッドではなく通常の関数です。 「方法」という用語は、クラスの機能または手順を指す。 – Hendra

+1

私のための「方法」という用語は、おそらくクラスの関数または手続きを意味します。私はあなたの用語「方法」の意味を反映するために質問を編集しました。 –

+1

私はTLamaの返事が好きです(それに応じて)。私はDelphiの古いバージョン(RTTIを拡張していない)で動作するRTTIのようなもの(Hendraのリンクで提案されたもの)を好みました。 –

答えて

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

はい - "グローバルメソッド"は、クラス/レコードではなく、ユニットの関数/プロシージャです。 この項目は半世紀にも及んでいるので、私はコードベースの多くのファイルに触れることなく、MessageDlgのすべてのメソッドをカスタムメソッドにリダイレクトするという解決策にしたと思います。結局のところ、私たちはそれを見つけたときに呼び出しを変更するこのように行ってきました。 –

関連する問題