我有一个菜单项,我正在尝试分配其OnClick
事件处理程序:
miFrobGizmo.OnClick := {something};
OnClick
事件处理程序属性与几乎所有其他事件处理程序一样,被定义为TNotifyEvent
方法类型:
property OnClick: TNotifyEvent
其中TNotifyEvent
是:
TNotifyEvent = procedure(Sender: TObject) of object;
我有一个对象,其方法与TNotifyEvent
签名匹配:
TAnimal = class(TObject)
public
procedure Frob(Sender: TObject);
end;
所以我认为我应该能够采用对象的方法并将其分配给单击事件处理程序:
var
Animal: TAnimal;
miFrobGizmo.OnClick := Animal.Frob;
除非我收到错误:
[Error]File.pas(1234): Not enough actual parameters
也许我有一个大脑放屁,但我想我应该能做到这一点。
我没有提到的一个细节是我的具有匹配方法的对象是通过接口公开该方法:
IAnimal = interface
procedure Frob(Sender: TObject);
end;
TAnimal = class(TInterfacedObject, IAnimal)
public
procedure Frob(Sender: TObject);
end;
var
Animal: IAnimal;
miFrobGizmo.OnClick := Animal.Frob;
答案 0 :(得分:4)
你做不到。它说“对象的程序”,而不是“界面的程序”。如果您直接使用对象,它会让您这样做,但由于您不是,它不会考虑您正在尝试分配事件处理程序,而是解析器会尝试将您的代码视为方法调用。然后它会发现你没有方法调用的任何参数,但是调用需要一个参数,所以它放弃并给你一个错误信息。