Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 获取重载方法的地址位置_Delphi_Overload Resolution_Object Address - Fatal编程技术网

Delphi 获取重载方法的地址位置

Delphi 获取重载方法的地址位置,delphi,overload-resolution,object-address,Delphi,Overload Resolution,Object Address,如何获取重载的函数/过程/方法的所有地址位置 例如,Dialogs.MessageDlgPosHelp被重载,有两个不同版本的Dialogs.MessageDlgPosHelp—一个没有默认按钮,另一个有默认按钮。如何获取这两个函数的地址位置?基于和指出的内容,您可以使用与要获取其地址的方法相同的签名来定义类型(对于每个重载)。如果您随后声明这些类型的变量并向它们分配方法指针,那么您将确保编译器为已知的变量类型选择正确的重载,而且如果它们不在代码中的任何地方使用,它也不会忽略它们(一些重载可能不

如何获取重载的函数/过程/方法的所有地址位置

例如,Dialogs.MessageDlgPosHelp被重载,有两个不同版本的Dialogs.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;

此外,您还可以创建派生类,将此重载方法公开为具有不同名称的简单方法,将该类的任何实例强制转换为新类,并轻松使用包装器方法的地址。

讨论如何获取重载类方法的地址。顺便说一下,在我的Delphi7中,MessageDlgPosHelp没有重载,它只是一个普通函数,而不是方法。术语“方法”指一个类的函数或过程。术语“方法”对我来说意味着一个函数或过程,可能是一个类的函数或过程。我对问题进行了编辑,以反映您对“方法”一词的含义。我喜欢特拉玛的回答(并相应地勾选)。我更喜欢RTTI方式(正如亨德拉的链接所建议的那样),它可以与旧版本的Delphi(没有扩展RTTI)一起工作。@Nicholas,你的意思是,与新版本的Delphi一起工作?我有Embarcadero特殊版本-Delphi 7、2007、2009、2010、XE和XE2。首选Delphi 7、XE(我在工作中使用)和XE2。在这种情况下,重载方法是“全局”方法。当你说“全局方法”时,你是指一个过程或一个单元的函数,而不是任何类或记录的方法吗?对于这种情况,您只需添加自己的包装程序或具有自己名称的函数,并在其中调用“全局方法”。没有任何铸造技巧。是的,“全局方法”是一个单元的函数/过程,而不是一个类/记录。因为这个项目已经有将近五年的历史了,我想我想要的是一个解决方案,它可以将所有(在本例中)MessageDlg方法重定向到一个自定义方法,而不必接触代码库中的很多文件。最后,我们走了这条路,在找到电话时改变电话。