Delphi:如何将Click事件分配给对象的方法?

时间:2010-05-13 19:16:37

标签: delphi events event-handling interface

我有一个菜单项,我正在尝试分配其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;

后续问题

If this won't work, what will?

1 个答案:

答案 0 :(得分:4)

你做不到。它说“对象的程序”,而不是“界面的程序”。如果您直接使用对象,它会让您这样做,但由于您不是,它不会考虑您正在尝试分配事件处理程序,而是解析器会尝试将您的代码视为方法调用。然后它会发现你没有方法调用的任何参数,但是调用需要一个参数,所以它放弃并给你一个错误信息。