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]