Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.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 - Fatal编程技术网

Delphi 将方法指针转换为整数,然后调用它

Delphi 将方法指针转换为整数,然后调用它,delphi,Delphi,我想知道以下这些是否可能,如果可能,如何?代码示例请 如何将指向对象方法的指针存储为整数值 如何将整数值转换回“方法指针”并调用它 我要做的是在TComponent派生对象的整数标记值中存储一个“方法指针”,然后稍后调用存储的方法。可以假定所有met方法都具有相同的定义 谢谢 不,这是不可能的。对象的方法等同于TMethod: TMethod = record Code, Data: Pointer; end; code字段是方法的地址,Data字段是传递到每个对象方法中的隐藏的Sel

我想知道以下这些是否可能,如果可能,如何?代码示例请

  • 如何将指向对象方法的指针存储为整数值
  • 如何将整数值转换回“方法指针”并调用它
我要做的是在TComponent派生对象的整数标记值中存储一个“方法指针”,然后稍后调用存储的方法。可以假定所有met方法都具有相同的定义


谢谢

不,这是不可能的。对象的方法等同于TMethod:

TMethod = record
  Code, Data: Pointer;
end;
code
字段是方法的地址,
Data
字段是传递到每个对象方法中的隐藏的
Self
参数。该记录的大小与Int64相同,因此如果将其转换为普通整数,则会丢失一半


您可以使用GetMem在堆上分配一个TMethod记录,然后将该记录的地址存储在Tag属性中,只要您在处理完它后记得释放它。

您可以做一些变通,但这不是一个好的设计

var
  Method: ^TNotifyEvent;
begin
//Create New method 
  GetMem(Method, SizeOf(TNotifyEvent));
//Init target Tag
  Tag := Integer(Method);

//Store some method
  Method^ := Button1Click;

//call stored method
  Method := (Pointer(Tag));
  Method^(self);

//And don't forget to call in to object destructor...
  if Tag <> 0 then
    FreeMem(pointer(Tag));
var
方法:^TNotifyEvent;
开始
//创建新方法
GetMem(方法,SizeOf(TNotifyEvent));
//初始化目标标记
标记:=整数(方法);
//存储一些方法
方法^:=按钮1单击;
//调用存储方法
方法:=(指针(标记));
方法^(自我);
//别忘了调用对象析构函数。。。
如果标记为0,则
FreeMem(指针(标签));

方法指针不适合32位标记。感谢您的解释。我不明白为什么Darian Miller的代码有效…它没有。发布的简单案例没有遇到它,但是有致命的缺陷,可能会使一个真正的程序崩溃。谢谢。看起来你的代码就是克雷格·彼得森描述的一个例子?@Edwin,是的,如果我有更多的时间,我会发布这些。谢谢你们!似乎维护很多这样的方法指针是一场噩梦,看起来我应该找到另一种方法。。。反正我有这个主意!我现在不知道该接受哪个答案,克雷格的答案排在第一位,但GJ通过一个例子帮助我完全理解了这个方法。。。