オーバーロードされている関数/プロシージャ/メソッドのすべてのアドレス位置を取得するにはどうすればよいですか?
たとえば、Dialogs.MessageDlgPosHelpは、2つの異なるバージョン(デフォルトボタンなしとデフォルトボタンあり)でオーバーロードされています。2つの関数のアドレス位置を取得するにはどうすればよいですか?
オーバーロードされている関数/プロシージャ/メソッドのすべてのアドレス位置を取得するにはどうすればよいですか?
たとえば、Dialogs.MessageDlgPosHelpは、2つの異なるバージョン(デフォルトボタンなしとデフォルトボタンあり)でオーバーロードされています。2つの関数のアドレス位置を取得するにはどうすればよいですか?
そこで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;