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

时间:2010-12-20 03:23:26

标签: delphi

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

  • 如何将指向对象方法的指针存储为整数值
  • 如何将整数值转换回“方法指针”并将其称为

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

谢谢!

2 个答案:

答案 0 :(得分:9)

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

TMethod = record
  Code, Data: Pointer;
end;

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

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

答案 1 :(得分: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));