Você está na página 1de 4

Multicast Events no Delphi

Veja neste artigo como aplicar o


conceito de multicast events no
Delphi.
por Marco Antonio Salles
00 00

Mexer em buraco de formigueiro sempre é uma má ideia. Cutucar a onça com vara curta então nem
se fala. São ditados populares que mesmo sem termos praticado (acho eu) concordamos com eles.
Existem muitos deste gênero e todos retratam a consequência de uma má ideia. E hoje eu tive uma
delas, que seria simular o Multicast events em Delphi . Talvez eu me conformasse mais no
formigueiro ou mexer com a onça, mas resolvi brincar com o Delphi. Mas chega de trocadilhos e
metáforas e seguiremos em frente. Só para não perder o Style, quem está na chuva é para se molhar.
Algumas linguagens permitem que um evento chame vários métodos quebrando uma limitação que
existe nativamente na VCL. Estamos falando de Multicast events, que no Prism é assim definido:
Listagem 1: Multicast events no Prism
1Button1.Click +=Button_Click_1;
2Button1.Click +=Button_Click_2;
3Button1.Click +=Button_Click_3;
Quando o Botão for clicado, em um único evento, três métodos serão chamados. Podemos definir
quais são esses eventos ainda em nível de projeto, o que eu acho fantástico e acredito que
brevemente esta funcionalidade estará incorporada ao Delphi deixando este artigo obsoleto. Porém
enquanto este dia não chega iremos propor aqui uma alternativa, que ao clicarmos em um Botão no
Delphi sejam executados dois eventos, simulando o Multicast events do Prism .
Quero deixar aqui registrado de antemão, que escolhi o evento onClick de um Button, mas o
conceito pode ser aplicado a qualquer evento. Também não estarei generalizando o exemplo,
“Interfaceando” suas características, nem aplicando conceitos mais elaborados. O Modelo com um
pouco mais de paciência pode ser expansível sem prejuízo nenhum à concepção original.
Vamos lá com algumas definições. Imagine que eu tenha três buttons em um formulários. O Buton1
e o Buton2 com um evento onClick definido em designed time e um terceiro button que não foi
definido nada em seu evento onClick. Imagine ainda que eu precise que todos os Butons dos
formulários compartilhem do mesmo evento que chamarei aqui de GeralClick(sender:TObject) cuja
implementação segue.
Listagem 2: Evento onClick geral
1procedure TForm1.GeralClick(Sender: TObject);
2begin
3//um exemplo simplório, mas imagine isto como um conjunto grande de
4//instruções a serem executadas ...
5Showmessage('Evento Geral que quer que seja executado');
end;
6
Por outro lado, os eventos onClick do Button1 e do Button2 respectivamente são:
Listagem 3: Evento onClick do Button1 e Button2
procedure TForm1.Button1Click(Sender: TObject);
1 begin
2 //Imagine isto como um conjunto grande de instruções que devem ser executadas
3 Showmessage('Evento Particular do Button1. Sempre executar');
end;
4
5 procedure TForm1.Button2Click(Sender: TObject);
6 begin
7
8 //Imagine isto como um conjunto grande de instruções que devem ser executadas
9 showmessage('Evento Particular do Button2 . sempre executar');
10end;
11
12
Bem, acho que já deu para entender que o que queremos… Mas isto, como dissemos anteriormente,
não é possível nativamente na VCL. Logo, temos que mexer com a onça. O que segue adiante não
entenda como a única e nem a melhor forma apenas minha abstração pessoal e, diga-se de passagem,
primitiva do problema original.
Surge a classe TSetEventos definida na unidade uMultiCastEvent cuja implementação segue:
Listagem 4: Classe TSetEventos
1 unit uMultiCastEvent;
2 interface
3
4 uses
5 classes , StdCtrls, controls, generics.collections;
6
7 Type
8 TMultiEventos = Array of TNotifyEvent;
9
Type
10TSetEventos = class
11strict private
12FOnClick : TDictionary;
13public
14procedure ExecuteOnClik(sender:TObject);
procedure ExcecuteMultiCast(Aonwer:TWinControl;GeralClick:TNotifyEvent);
15destructor destroy;override;
16constructor create;
17property OnClick:TDictionary read FOnClick write FOnClick;
18end;
19
implementation
20
21{ TSetEventos }
22
23constructor TSetEventos.create;
24begin
25FOnClick :=TDictionary.create;
26end;
27
destructor TSetEventos.destroy;
28begin
29FOnClick.Free;
30inherited;
31end;
32
33procedure TSetEventos.ExcecuteMultiCast(Aonwer: TWinControl;GeralClick:TNotifyEvent)
var
34C:TComponent;
35eventos:TMultiEventos;
36begin
for c in Aonwer do
37if c is TButton then
38begin
39if (assigned(TButton(C).OnClick)) then
40begin
41SetLength(eventos,2);
eventos[0]:=TButton(C).OnClick;
42eventos[1]:=GeralClick;
43end
44else
45begin
SetLength(eventos,1);
46eventos[0]:=GeralClick;
47end;
48self.OnClick.Add(TButton(C),eventos);
49TButton(C).OnClick:=self.ExecuteOnClik;
50end;
end;
51
52procedure TSetEventos.ExecuteOnClik(sender: TObject);
53var
54eventos:TMultiEventos;
55I: Integer;
begin
56setlength(eventos,high(self.FOnClick.Items[sender])+1);
57for I := Low(eventos) to High(eventos) do
58begin
59eventos[i]:=self.FOnClick.Items[sender][i];
60eventos[i](sender);
end;
61
62end;
63
64end.
65
66
67
68
69
70
71
72
73
74
75
76
Bem, criamos um classe que será responsável por executar ou simular o Multicast Events no Delphi.
Para saborear os bolinhos que esta classe disponibiliza, neste formulário onde estão definidos os
buttons (Button1, Button2, Button3) com os respectivos manipuladores de eventos (Button1.click,
Button2.click, Geralclick), damos uses a unidade uMultiCastEvent . Abaixo (um parcial) de como
esta a unidade unit1 do form em questão.
Listagem 5: Código do Form1
1 unit Unit1;
2
3 interface
4
5 uses
6 ........., uMultiCastEvent;
7
type
8 TForm1 = class(TForm)
9 Button1: TButton;
10 Button2: TButton;
11 Button3: TButton;
12 procedure GeralClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
13
14procedure Button2Click(Sender: TObject);
15 procedure FormCreate(Sender: TObject);
16 procedure FormClose(Sender: TObject; var Action: TCloseAction);
17 private
{ Private declarations }
18 FSetEventos:TSetEventos; //defina aqui o objeto que consumira a classe
19 public
20 { Public declarations }
21 end;
22
23
24
Bem já definimos os três eventos , resta-nos agora instanciar o objeto e destrui-lo posteriormente.
Isto será feito no onCreate do Form e no onClose.
Listagem 6: Eventos onCreate e onClose do form
1
2 procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
3 FSetEventos.Free;
4 end;
5
6 procedure TForm1.FormCreate(Sender: TObject);
7 begin
8 FSetEventos:=TSetEventos.Create;
FSetEventos.ExcecuteMultiCast(self,GeralClick);
9 end;
10
Consideração Finais
o Execute a aplicação e veja o resultado;
o O Modelo apresentado é expansivel a outros controles e eventos sem maiores dificuldades;
o Qualquer dúvida que por ventura possa existir, favor entrar em contato
o O código não foi comentado para poupar espaço;
o Caso necessite do projeto original , estarei disponibilizando a quem se interessar.
Amigos, vou ficando por aqui, quero agradecer a paciência, pela leitura e deixar registrado que se
alguém utilizar desta fonte em algum meio de comunicação , por questões de gentileza , cordialidade
bem como o respeito aos direitos autorais que faça menção os tópico Original . No mais meu muito
obrigado e até a próxima.
Blog do autor

Read more: http://www.linhadecodigo.com.br/artigo/3470/multicast-events-no-


delphi.aspx#ixzz5YkGXhJ7X

Você também pode gostar