8

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

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

4

2 に答える 2

15

そこでThomas Muellerthis threadが指摘した内容に基づいて、アドレスを取得したいメソッドと同じ署名を持つ型を (オーバーロードごとに) 定義することができます。次に、これらの型の変数を宣言し、それらにメソッド ポインターを割り当てると、コンパイラーが既知の変数型に対して適切なオーバーロードを選択するようになり、さらに、コード内のどこにも使用されない場合は無視されません。 (一部のオーバーロードはバイナリでリンクされない場合があります)。

したがって、彼の考えに基づいて、次の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;
于 2012-06-25T05:14:23.253 に答える