Delphi - Implementando suporte a eventos na sua classe
Este post mostra em Delphi como implementar suporte a eventos em suas classes.
Este post mostra a mesma funcionalidade em C#. Eu recomendo dar uma olhada para alguns detalhes explicativos.
Primeiro vamos ver nossa classeunit classesunit;
interface
type
TEventoInverter = procedure(const msg: string) of object;
TFigura = class
private
eixoX: Double;
eixoY: Double;
eixoZ: Double;
FAposInverter: TEventoInverter;
public
constructor Create(a, b, c: Double);
procedure InverterX;
procedure InverterY;
procedure InverterZ;
published
property AposInverter: TEventoInverter read FAposInverter write FAposInverter;
end;
implementation
{ TFigura }
constructor TFigura.Create(a, b, c: Double);
begin
eixoX := a;
eixoY := b;
eixoZ := c;
end;
procedure TFigura.InverterX;
begin
eixoX := -eixoX;
FAposInverter('Invertido eixo X');
end;
procedure TFigura.InverterY;
begin
eixoY := -eixoY;
FAposInverter('Invertido eixo Y');
end;
procedure TFigura.InverterZ;
begin
eixoZ := -eixoZ;
FAposInverter('Invertido eixo Z');
end;
end.
Primeiro vamos analisar a seção type:TEventoInverter = procedure(const msg: string) of object;
Esta é a forma de declarar um tipo procedure em Delphi.
Este tipo (TEventoInverter) representa uma procedure que aceita um parâmetro string.FAposInverter: TEventoInverter;
...
property AposInverter: TEventoInverter read FAposInverter write FAposInverter;
Nos métodos InverterX, InverterY e InverterZ nós "disparamos" o evento AposInverter, representado pelo campo privado FAposInverter. Como o evento precisa de um parâmetro string nós passamos a mensagem de acordo com o eixo que é invertido.
Agora vamos trabalhar com essa classe e interceptar este evento:unit formprincipalunit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, classesunit;
type
TFormPrincipal = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
Figura: TFigura;
procedure FiguraAposInverter(const msg: string);
{ Private declarations }
public
{ Public declarations }
end;
var
FormPrincipal: TFormPrincipal;
implementation
{$R *.dfm}
procedure TFormPrincipal.Button1Click(Sender: TObject);
begin
Figura.InverterX;
end;
procedure TFormPrincipal.Button2Click(Sender: TObject);
begin
Figura.InverterY;
end;
procedure TFormPrincipal.Button3Click(Sender: TObject);
begin
Figura.InverterZ;
end;
procedure TFormPrincipal.FiguraAposInverter(const msg: string);
begin
ShowMessage(msg);
end;
procedure TFormPrincipal.FormCreate(Sender: TObject);
begin
Figura := TFigura.Create(3, 2, 5);
Figura.AposInverter := FiguraAposInverter;
end;
end.
Este Form possui 3 botões: cada um inverte um eixo.
Agora vamos avaliar as "peças":private
Figura: TFigura;
procedure FiguraAposInverter(const msg: string);
Temos a variável Figura que vai receber a instância da classe TFigura e o procedimento FiguraAposInverter que vai interceptar o evento:procedure TFormPrincipal.FormCreate(Sender: TObject);
begin
Figura := TFigura.Create(3, 2, 5);
Figura.AposInverter := FiguraAposInverter;
end;
É no evento OnCreate do From que nós criamos a instância de TFigura para a variável Figura e definimos que o manipulador do evento AposInverter é a nossa procedure FiguraAposInverter.
Bem... ficou um pouco maior do que eu pensei mas tá aí. Grande abraço a todos e até a próxima!
Show de bola ...
ResponderExcluirMuito bom o artigo!!
xD Valeu...
ResponderExcluirEsse assunto realmente é muito interessante.