Как присвоить событие в 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