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