Как присвоить событие в run-time?

Пример стандартного присвоения события в run-time:

type

{©Drkb v.3(2007): <a href="http://www.drkb.ru" title="www.drkb.ru">www.drkb.ru</a>,

 ®Vit (Vitaly Nevzorov) - nevzorov@yahoo.com}


 TForm1 = class(TForm)

  Button1: TButton;

  procedure FormCreate(Sender: TObject);

 private

  procedure Click(Sender: TObject);

 end;

var Form1: TForm1;

implementation

procedure TForm1.Click(Sender: TObject);

begin

 // do something

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

 button1.OnClick:=Click;

end;

end.

Автор: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
Взято с Vingrad.ru http://forum.vingrad.ru

А как сделать чтобы "procedure Click" была не методом класса, а отдельно стоящей функцией?

{©Drkb v.3(2007): www.drkb.ru}

procedure Click(Self: TObject; Sender: TObject);

begin

 ...

end;

var

 evhandler: TNotifyEvent;

 TMethod(evhandler).Code := @Click;

 TMethod(evhandler).Data := nil;

 Button1.OnClick := evhandler;

 Без извращений можно так:

 TDummy = class

  class procedure Click(Sender: TObject);

 end;

 Button1.OnClick := TDummy.Click;

Автор ответа: Le Taon
Взято с Vingrad.ru http://forum.vingrad.ru

По идее, при вызове OnClick первым параметром будет запихнут указатель на экземпляр того класса который в этом OnClick хранится . Я в низкоуровневой реализации не силен, но кажись, так как параметры в процедурах в Delphi передаются через регистры, то ничего страшного не произойдет.

{©Drkb v.3(2007): www.drkb.ru}

procedure C(Self:pointer;Sender:TObject);

begin

 TButton(Sender).Caption:='ee';

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

 @Button1.OnClick:=@c;

end;

Self тут у нас будет равен nil, а Sender как раз и получается Sender'ом.

Автор: Fantasist
Взято с Vingrad.ru http://forum.vingrad.ru

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...