Uli*_*rdt 5 delphi interface event-handling delphi-2007
是否可以在 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.
Run Code Online (Sandbox Code Playgroud)
将错误添加@或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.
Run Code Online (Sandbox Code Playgroud)
作品。不过我不太喜欢里面的魔法3。
一个更简洁的解决方案是为您的基类实现 IInterfaceComponentReference 或类似的东西,并使用它来获取类引用。
上述代码不适用于 FPC 和其他兼容设备。他们的VMT结构略有不同。即使在 Delphi 上,未来的语言扩展也可能会导致这种情况。
一个完美的解决方案是为此拥有一个完全独立的“接口”methodvar 类型,但我想知道这是否值得这么麻烦。
| 归档时间: |
|
| 查看次数: |
1580 次 |
| 最近记录: |