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: [email protected] [mailto:[email protected]] Em
nome de Rubem Rocha
Enviada em: segunda-feira, 12 de julho de 2010 11:44
Para: [email protected]
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: [email protected] <mailto:delphi-br%40yahoogrupos.com.br>
[mailto:[email protected] <mailto:delphi-br%40yahoogrupos.com.br>
] Em
nome de Anderson Junior
Enviada em: domingo, 11 de julho de 2010 20:22
Para: [email protected] <mailto:delphi-br%40yahoogrupos.com.br> ;
[email protected] <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]