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


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


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

Автор ответа:
Le Taon
Взято с Vingrad.ru http://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'ом.

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





DELPHI FAQ




EOMY TOP 100      Рейтинг@Mail.ru      Rambler's Top100