Как присвоить событие в run-time?
Как присвоить событие в run-time?
Пример стандартного присвоения события в run-time:
type
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
Взято с Vingrad.ru
А как сделать чтобы "procedure Click" была не методом класса, а отдельно стоящей функцией?
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
По идее, при вызове OnClick первым параметром будет запихнут указатель на экземпляр того класса который в этом OnClick хранится . Я в низкоуровневой реализации не силен, но кажись, так как параметры в процедурах в Delphi передаются через регистры, то ничего страшного не произойдет.
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