Delphi 作为事件处理程序的接口方法
在Delphi2007中是否可以使用接口方法作为事件处理程序?简单的版本不起作用:Delphi 作为事件处理程序的接口方法,delphi,interface,delphi-2007,event-handling,Delphi,Interface,Delphi 2007,Event Handling,在Delphi2007中是否可以使用接口方法作为事件处理程序?简单的版本不起作用: type TMyEvent = procedure of object; IMyInterface = interface procedure Handler; end; TMyClass = class(TInterfacedObject, IMyInterface) public procedure Handler; end; var ev: TMyEvent
type
TMyEvent = procedure of object;
IMyInterface = interface
procedure Handler;
end;
TMyClass = class(TInterfacedObject, IMyInterface)
public
procedure Handler;
end;
var
ev: TMyEvent;
obj: TMyClass;
intf: IMyInterface;
begin
obj := TMyClass.Create;
intf := obj;
ev := obj.Handler; // compiles
ev := intf.Handler; // <== Error E2010 (incompatible types)
end.
工作。但是,我不太喜欢其中的magic 3。一个更干净的解决方案是为基类实现IInterfaceComponentReference或类似的东西,并使用它来获取类引用 上述代码不适用于FPC和其他兼容产品。它们的VMT结构略有不同。甚至在Delphi上,未来的语言扩展也可能导致这种情况
一个完美的解决方案是为此提供一个完全独立的“接口”methodvar类型,但我不知道这是否值得麻烦。发布此内容后,我发现了一些有希望的方法。听起来很合理。也许我会将其修改为GetHandler方法,而不是GetSelf方法。谢谢
procedure IntRefToMethPtr(const IntRef; var MethPtr; MethNo: Integer);
type
TVtable = array[0..999] of Pointer;
PVtable = ^TVtable;
PPVtable = ^PVtable;
begin
//QI=0, AddRef=1, Release=2, etc
TMethod(MethPtr).Code := PPVtable(IntRef)^^[MethNo];
TMethod(MethPtr).Data := Pointer(IntRef);
end;
var
ev: TMyEvent;
intf: IMyInterface;
begin
intf := TMyClass.Create;
IntRefToMethPtr(intf, ev, 3);
ev;
end.