gpt4 book ai didi

delphi - 作为事件处理程序的接口(interface)方法

转载 作者:行者123 更新时间:2023-12-03 15:34:23 26 4
gpt4 key购买 nike

是否可以在 Delphi 2007 中使用接口(interface)方法作为事件处理程序?简单版本不起作用:

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.

有效。不过我不太喜欢里面的 Magic 3。

最佳答案

一个更简洁的解决方案是为您的基类实现 IInterfaceComponentReference 或类似的东西,并使用它来获取类引用。

上面的代码不适用于例如FPC等兼容。他们的VMT结构略有不同。即使在 Delphi 上, future 的语言扩展也可能会导致这种情况。

一个完美的解决方案是为此拥有一个完全独立的“接口(interface)”methodvar 类型,但我想知道这是否值得这么麻烦。

关于delphi - 作为事件处理程序的接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3422142/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com