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

Edw*_*Yip 5 delphi

我想知道以下是否可能,如果是,怎么样?代码示例请.

  • 如何将指向对象方法的指针存储为整数值
  • 如何将该整数值转换回'方法指针'并调用它

我想要做的是将'方法指针'存储在TComponent派生对象的整数Tag值中,稍后调用存储的方法.您可以假设所有met方法具有相同的定义.

谢谢!

Zoë*_*son 9

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

TMethod = record
  Code, Data: Pointer;
end;
Run Code Online (Sandbox Code Playgroud)

Code字段是方法的地址,Data字段是Self传递给每个对象方法的隐藏参数.该记录与Int64的大小相同,因此如果将其转换为纯整数,则会丢失一半.

您可以使用GetMem在堆上分配TMethod记录,然后将其存储在Tag属性中,只要您记得在完成它时将其释放即可.


GJ.*_*GJ. 6

你可以做一些解决方法,但它不是很好的设计......

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));
Run Code Online (Sandbox Code Playgroud)