Delphi: Как назначить событие Click методу объекта? - PullRequest
2 голосов
/ 13 мая 2010

У меня есть пункт меню, и я пытаюсь назначить его 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;

Так что я думаю, что я должен иметь возможность взять метод объекта и присвоить его обработчику события click :

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;

Дополнительный вопрос

Если это не сработает, что будет?

1 Ответ

4 голосов
/ 13 мая 2010

Вы не можете этого сделать. Он говорит «процедура объекта», а не «процедура интерфейса». Это позволило бы вам сделать это, если бы вы использовали объект напрямую, но поскольку это не так, он не учитывает, что вы пытаетесь назначить обработчик событий, а вместо этого анализатор пытается рассматривать ваш код как вызов метода. Затем он видит, что у вас нет параметров для вызова метода, но для вызова требуется один параметр, поэтому он сдается и выдает сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...