Pesquise no Blog

 

terça-feira, 15 de janeiro de 2008

Entendendo o Parâmetro Sender

As procedures padrões de eventos, tem como declaração:

procedure [NomeDoParente].[NomeDoObjet][Evento](Sender: TObject);
por exemplo:
procedure TForm1.Button1Click(Sender: TObject);
A pergunta de todo iniciante em programação Delphi é: Porque esse parâmetro Sender?

Em uma programação [Pascal] orientada a objetos, entende-se que cada evento é desencadeado por um objeto, e esse objeto é identificado pelo parâmetro Sender. Os eventos também pode ser desencadeados via programação ou poderia fazer a chamada direta à procedure, mas o programador terá que especificar o parâmetro Sender quando fizer isso.
Normalmente usamos componentes em nossos programas. Esses componentes são, diretamente ou não, descendentes de TComponent (que é descendente de TPersistent, que por sua vez é descendente de TObject)...
Por isso, concluimos que TObject esta no ponto mais alto da hierárquia.

O que podemos fazer com esse parâmetro
Com esse parâmetro podemos identificar quem foi o objeto que desencadeou o evento (um botão da classe TButton por exemplo) e podemos pegar os valores ajustados em suas propriedades, ao mesmo tempo que podemos ajustar esses valores à nossa necessidade.

Um jeito simples e comumente utilizado para modificar a propriedade Caption de um TButton seria:

procedure TForm1.Button1Click(Sender: TObject);
begin
(Sender as TButton).Caption := 'Meu Novo Caption';
end;


o operador as faz uma checagem de typecast de objetos. No caso acima, ele modifica a propriedade Caption como se Sender fosse um TButton.

O exemplo acima seria algo como:

(Sender como sendo TButton) modifica o Caption para 'Meu Novo Caption';

OK...
Mas ainda tem um problema: Se você ajustasse o evento OnClick de um TLabel, por exemplo, à procedure acima, receberia uma excessão quando clicasse no TLabel, mesmo esse componente tendo também uma propriedade Caption.
Isso ocorre porque o código acima "sub-entende" que o parâmetro Sender corresponde à um TButton, e não à um TLabel...

um jeito simples de arrumar isso seria:

procedure TForm1.Button1Click(Sender: TObject);
begin
If (Sender is TButton) then
(Sender as TButton).Caption := 'Meu Novo Caption';
end;


Isso ae... espero ter explicado direito...
Qualquer coisa, poste um comentário que os outros colaboradores terão enorme prazer em responder =D...

4 comentários:

nanis disse...

Me ajudou bastante, foi muito claro e objetivo. Valeu \o

Montecchyo disse...

Vlw demais!

Unknown disse...

No caso do segundo exemplo o TLabel iria invocar o click do Button1, correto ?

Unknown disse...

Muito bom, bem explicado. Ajudou demais