简体   繁体   中英

Delphi: How to assign Click event to object's method?

i have a menu item, and i'm trying to assign its OnClick event handler:

miFrobGizmo.OnClick := {something};

The OnClick event handler property, like almost every other event handler, is defined as a TNotifyEvent method type:

property OnClick: TNotifyEvent 

where TNotifyEvent is:

TNotifyEvent = procedure(Sender: TObject) of object;

i have an object, with a method matching the TNotifyEvent signature:

TAnimal = class(TObject)
public
   procedure Frob(Sender: TObject);
end;

So i think i should be able to take the method of the object and assign it to the click event handler:

var
   Animal: TAnimal;


miFrobGizmo.OnClick := Animal.Frob;

Except i get the error:

[Error]File.pas(1234): Not enough actual parameters

Perhaps i'm having a brain fart, but i thought i should be able to do this.


A detail i failed to mention is that my object that has the matching method is having the method exposed though an interface:

IAnimal = interface
   procedure Frob(Sender: TObject);
end;

TAnimal = class(TInterfacedObject, IAnimal)
public
   procedure Frob(Sender: TObject);
end;

var
   Animal: IAnimal;

miFrobGizmo.OnClick := Animal.Frob;

Follow-up question

If this won't work, what will?

You can't do that. It says "procedure of object", not "procedure of interface". It would let you do that if you were using an object directly, but since you're not, it doesn't consider that you're trying to assign the event handler and instead the parser tries to treat your code as a method call. Then it sees that you don't have any parameters for your method call, but the call requires one parameter so it gives up and gives you an error message.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM