sexta-feira, 27 de abril de 2007

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 classe

unit 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!

2 comentários: