As procedures padrões de eventos, tem como declaração:procedure [NomeDoParente]
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:
Me ajudou bastante, foi muito claro e objetivo. Valeu \o
Vlw demais!
No caso do segundo exemplo o TLabel iria invocar o click do Button1, correto ?
Muito bom, bem explicado. Ajudou demais
Postar um comentário