在Delphi 2007中可以使用接口方法作爲事件處理程序嗎?簡單的版本不工作:作爲事件處理程序的接口方法
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.
添加@
或Addr
改變錯誤E2036(必需的變量)。
更新:這
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.
作品。不過我並不太喜歡那裏的魔法3。
發佈後,我發現http://blog.barrkel.com/2010/01/using-anonymous-methods-in-method.html和http://sergworks.wordpress.com/2010/07/06/delphi-interfaces-on-binary-level /看起來很有前途。 – 2010-08-06 08:39:48