“Ah, mas e se eu não tiver um método de objeto e sim uma rotina ‘solta’, que
não está declarada em um objeto, mas que eu queira atribuí-la a um evento?
Como eu faço?”

 

Assim perguntaria um hipotético participante da lista. Também tem jeito sim.
Existe uma estrutura chamada TMethod que pode representa os
dados(argumentos) e código de um método. Com essa estrutura, é possível
manipular eventos de forma a ser possível atribuir rotinas ‘soltas’ de
objetos a eventos. Vamos a um exemplo.

 

Supondo que queremos atribuir uma rotina ‘solta’ a um botão que iremos criar
para um formulário, de forma análoga ao exemplo fornecido pelo Eric. Usando
a estrutura TMethod faríamos assim:

 

procedure MostraMensagem(Data: Pointer; Sender: TObject);

begin

  ShowMessage(‘Evento atribuído em tempo de execução.’);

end;

 

procedure MeuBotao(UmForm: TForm);

var

  Botao: TButton;

  Evento: TNotifyEvent;

begin

  Botao := TButton.Create(UmForm);

  with Botao do

  begin

    Parent := UmForm;

    SetBounds(10, UmForm.Height - Botao.Height - 40, 60, Botao.Height);

    Caption := ‘Close’;

  end;

  TMethod(Evento).Code := @MostraMensagem;

  TMethod(Evento).Data := Botao;

  Botao.OnClick := Evento;

end;

 

(Referência: http://www.delphi3000.com/articles/article_3335.asp)

 

É importante prestar atenção para a assinatura da rotina ‘solta’. Ela recebe
dois argumentos, um que consiste num dado referente à instância que irá
chamar o código do evento, e outro que é faz parte da assinatura do evento.
Ou seja, para atribuir rotinas ‘soltas’ a um evento, ainda assim estas devem
possuir a assinatura do evento precedida de um ponteiro para a instância de
objeto que será indicada na chamada ao evento.

 

Sds.

 

 

De: delphi-br@yahoogrupos.com.br [mailto:delphi...@yahoogrupos.com.br] Em
nome de Rubem Rocha
Enviada em: segunda-feira, 12 de julho de 2010 11:44
Para: delphi-br@yahoogrupos.com.br
Assunto: RES: [delphi-br] Como atribuir instruções a eventos em tempo de
execução ?
Prioridade: Alta

 

  

Na verdade não seria atribuição de instruções a eventos, mas atribuições de
métodos a eventos. Isso é simples de se fazer. Basta que o método possua uma
assinatura igual a que é requerida pelo evento. Por exemplo, o evento
OnClick de um botão é definido como um ponteiro para um método de um objeto
que deve possuir como parâmetro um elemento do tipo TObject, conforme é
definido no help da seguinte maneira:

type TNotifyEvent = procedure (Sender: TObject) of object;

(Fonte: help do Delphi)

Sabendo disto, você só pode atribuir diretamente a um evento um método de
objeto que tenha a mesma assinatura requerida pelo evento. Não se pode
simplesmente atribuir um ShowMessage(). Mesmo com a possibilidade existente
na linguagem Delphi do RAD Studio 2010 de permitir atribuição anônima de
eventos, os mesmos devem obedecer a assinatura do evento.

Portanto, colega Eric, você tem que criar um método de objeto com a
assinatura do evento para que o mesmo possa ser atribuído diretamente a ele.

Exemplo:

{ Método criado com assinatura requerida pelo evento OnClick }

procedure <ObjetoQualquer>.MostraMensagem(Sender: TObject);

begin

ShowMessage(‘Evento atribuído em run-time’);

end;

procedure MeuBotao(UmForm: TForm);

begin

with TButton.Create(UmForm) do

begin

Parent := UmForm;

Width := 60;

Left := 10;

Top := oFrm.Height - oBtn.Height - 40;

Caption := 'Close';

OnClick := <ObjetoQualquer>.MostraMensagem;

end; 

end;

Sds.

De: delphi-br@yahoogrupos.com.br <mailto:delphi-br%40yahoogrupos.com.br>
[mailto:delphi-br@yahoogrupos.com.br <mailto:delphi-br%40yahoogrupos.com.br>
] Em
nome de Anderson Junior
Enviada em: domingo, 11 de julho de 2010 20:22
Para: delphi-br@yahoogrupos.com.br <mailto:delphi-br%40yahoogrupos.com.br> ;
memsystems-pas...@yahoo.com <mailto:memsystems-pascal%40yahoo.com> 
Assunto: Re: [delphi-br] Como atribuir instruções a eventos em tempo de
execução ?

boa noite, vc conegui resolver seu problema com "Como atribuir 
instruções a eventos em tempo de execução ?"

Em 19/01/2010 02:48, developer.systems escreveu:
>
> Boa noite a todos !
>
> Tenho uma função que cria o botão tem tempo de execução, mas como 
> atribuir em tempo de execução, uma função/procedure ao evento onClick ?
>
> procedure MeuBotao( oFrm: TForm ) ;
> var oBtn: TButton ;
>
> begin
> oBtn:=TButton.Create(oFrm);
> oBtn.Parent:=oFrm;
> oBtn.Width:=60;
> oBtn.Left:=10;
> oBtn.Top:=oFrm.Height-oBtn.Height-40;
> oBtn.Caption:='Close';
> //oBtn.onClick ???? Neste evento, atribuir por exemplo: ShowMessage( 
> 'MyButton RunTime and onClick' ) ;
>
> end;
>
> Virtualmente/Regards
> Eric
> Developer.Systems
> São Paulo - Brasil
>
>
> 

[As partes desta mensagem que não continham texto foram removidas]

[As partes desta mensagem que não continham texto foram removidas]





[As partes desta mensagem que não continham texto foram removidas]

Responder a