Как присвоить событие в run-time? |
Previous Top Next |
Пример стандартного присвоения события в run-time:
Code: |
type {©Drkb v.3(2007): www.drkb.ru, ®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. |
©Drkb::00099
Автор: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
Взято с Vingrad.ru http://forum.vingrad.ru
А как сделать чтобы "procedure Click" была не методом класса, а отдельно стоящей функцией?
Code: |
{©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
©Drkb::00100
Взято с Vingrad.ru http://forum.vingrad.ru
По идее, при вызове OnClick первым параметром будет запихнут указатель на экземпляр того класса который в этом OnClick хранится . Я в низкоуровневой реализации не силен, но кажись, так как параметры в процедурах в Delphi передаются через регистры, то ничего страшного не произойдет.
Code: |
{©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'ом.
©Drkb::00101
Автор: Fantasist
Взято с Vingrad.ru http://forum.vingrad.ru