Este artigo demonstra como atualizar as tabelas de dados na rede sem usar timer.
Para quem não conhece o componente TmdMailSlot, acesse meu artigo anterior no link...
Clique Aqui !
Acompanhe os
passos abaixo para fazer com que esse componente funcione em seus programas:
1- Baixe a última versão desse componente no site do Autor
Martin Djernæs
http://www.djernaes.dk/martin ou diretamente pelo link
http://djernaes.dk/martin/vcl.html#TmdMailSlot
2- Depois instale o componente no seu Delphi, clique no menu
"Component" Item "Install Component" selecione a Unit mdMailSlot.pas e Instale.
3- A paleta mdVCL vai aparecer na barra de ferramentas do
Delphi com os seguintes componentes:

Neste
artigo vamos usar tabelas do Interbase com os componentes IBDataBase,
IBTransaction, IBTable e IBQuery mas poderíamos usar qualquer tipo de banco de
dados ou componentes e adaptar o código deste artigo sem problemas.
Depois insira no DataModule do seu programa o componente
mdMailSlot.
Na
propriedade Slot do componente, insira o nome do seu programa, isso fará com que
ele troque mensagens somente com outros programas que tenham o mesmo nome na
propriedade Slot do componente.
Não
use nomes muito grandes ou com espaçamentos!
Defina a propriedade Active do componente para True.
No
Evento OnMessageAvail insira o código que vai receber a mensagem:
mdMailSlot1.Active := False;
If Msg = 'AtualizarBDs' Then
RedeAtualizaDados.Execute;
mdMailSlot1.Active := True;
Insira um componente ActionList no DataModulo e crie 2
actions, um com o nome RedeAtualizaDados e o outro com o nome RedeGravaDados.
No
evento OnExecute do Action RedeAtualizaDados insira o seguinte código:
Var AtualizaDataSet: Integer;
Begin
For AtualizaDataSet := 0 To IBDatabase1.DataSetCount -1 Do
If (IBDatabase1.DataSets[AtualizaDataSet] Is TIBTable) And
IBDatabase1.DataSets[AtualizaDataSet].Active And
(IBDatabase1.DataSets[AtualizaDataSet].State In [dsBrowse]) Then
(IBDatabase1.DataSets[AtualizaDataSet]
As TIBTable).Refresh
Else
If (IBDatabase1.DataSets[AtualizaDataSet] Is TIBQuery) And
IBDatabase1.DataSets[AtualizaDataSet].Active And
(IBDatabase1.DataSets[AtualizaDataSet].State In [dsBrowse])
Then
Begin
(IBDatabase1.DataSets[AtualizaDataSet] As TIBQuery).Close;
(IBDatabase1.DataSets[AtualizaDataSet] As TIBQuery).Open;
End;
No evento OnExecute do Action RedeGravaDados insira o
seguinte código:
Var GravaDataSet: Integer;
Begin
For GravaDataSet := 0 To IBDatabase1.DataSetCount -1 Do If (IBDatabase1.DataSets[GravaDataSet]
Is TIBTable) Then
If IBDatabase1.DataSets[GravaDataSet].Active
Then
Begin
If (IBDatabase1.DataSets[GravaDataSet] As TIBTable).State In
[DsBrowse] Then
Begin
(IBDatabase1.DataSets[GravaDataSet] As TIBTable).ApplyUpdates;
If IBTransaction1.InTransaction Then
IBTransaction1.CommitRetaining;
(IBDatabase1.DataSets[GravaDataSet] As
TIBTable).Refresh;
SendToMailSlot('*', mdMailSlot1.Slot,
'AtualizarBDs');
End;
End;
End;
Agora Insira o comando abaixo nos eventos AfterPost e
AfterDelete de suas tabelas
RedeGravaDados.Execute;
Pronto, sua aplicação vai atualizar automaticamente as tabelas na rede somente
quando houver a necessidade real.
Sou André Luiz de Souza Fernandes, Técnico em Processamento
de Dados, dono do site GSoftWares.COM e responsável pelo projeto OpenSource de
Portais PHP CPGNUKE no Brasil.Contato
suporte@gsoftwares.com
Um forte abraço a todos!
|