Sources
Delphi Russian Knowledge Base
DRKB - база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как присвоить событие в runtime?

01.01.2007
Vit

Author: Vit

Source: Vingrad.ru https://forum.vingrad.ru

Пример стандартного присвоения события в 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.

Вариант 2:

Author: Le Taon

Source: Vingrad.ru https://forum.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;

Вариант 3:

Author: Fantasist

Source: Vingrad.ru https://forum.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'ом.

Previous page:
Как получить список всех назначенных событий?
Top:
DRKB
Next page:
Методы