Re: RES: [delphi-br] Como atribuir instruções a eventos em tempo de execução ?

2010-07-13 Por tôpico cartouchebr
De nada, lista! Sempre às ordens, viu?   :(

(Ô povo sem noção! Nem ao menos agradece!)

Sds.

--- Em delphi-br@yahoogrupos.com.br, Rubem Rocha rubem.ro...@... escreveu

 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...@... 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

Re: [delphi-br] Como atribuir instruções a eventos em tempo de execução ?

2010-07-12 Por tôpico Anderson Junior
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]



[delphi-br] Como atribuir instruções a eventos em tempo de execução ?

2010-01-19 Por tôpico developer.systems
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