atribuir uma procedure a um evento

12/01/2006

bom amigos, eu tenho um programa estruturado da seguinte forma ...

datamodule contendo 3 adotables e 3 datasources ...

varias telas de cadastro em que eu me utilizo desses 6 componentes .. entao quando mudo de tela eu mudo as propriedades em tempo de execucao .... até aqui ok ...

em alguns forms, eu criei algumas procedures e atibui elas a alguns eventos dos datasources e das tabelas ... entao toda vez que o evento da tabela ou datasource é disparado as procedures sao executadas ...

estou utilizando forms mdi ...

por exemplo, quando eu crio um form filho, no evento oncreate eu coloco todas as rotinas de inicializacao como por exemplo as atribuicoes aos eventos .. exemplo abaixo ...

 // inicializacao tb1
  Dm.tb1.TableName:=´tbRegistroExportacao´;
  Dm.tb1.Active:= True;
  Dm.Ds1.OnStateChange:= ControlaBotoes;
  Dm.tb1.AfterPost:= InsereData;


ao fechar o form nenhum erro ocorre ...
mas quando eu tento abrir o form de novo da um erro de violacao na memoria ....

perguntas ...

ao vincular as procedures aos eventos dos componentes, se eu fizer isso novamente pode gerar algum erro??

pq toda vez que eu crio o form os eventos serao vinculados aos componentes do datamodule ...

qual a maneira correta de se liberar o form filho da memoria quando é fechado ...???

estou usando a seguinte maneira ...
no evento onclose

Action:= CaFree;



aguardo respostas ...

[]s


Rafael Gomes

Respostas

12/01/2006

Rafael Gomes

apenas completando ...

eu atribuindo procedures contidas em um form filho a eventos de uma tabela por exemplo ... ao fechar o form, essas procedures continuam vinculadas?? preciso libera-las de alguma forma????

pergunto isso pq como disse alterno 3 componentes adotable entre N tabelas do meu sistema ..

[]sss


Responder Citar

12/01/2006

Bruno Belchior

Está ocorrendo erro, porque ao tentar acessar a tabela novamente a mesma está referenciando os seus eventos à um procedimento que foi liberado da memória quando seu formulário foi liberado... o que se deve fazer é no Destructor do seu formulário atribuir [b:4c554da464]nil[/b:4c554da464] as propriedades (eventos) dos DataSet´s...
Dm.Ds1.OnStateChange:= nil;
Dm.tb1.AfterPost:= nil
Você pode sobrescrever o destructor do Formulário para isso ou usar o evento [b:4c554da464]OnDestroy[/b:4c554da464] ou até mesmo o [b:4c554da464]OnClose[/b:4c554da464] do formulário...


Responder Citar

12/01/2006

Rafael Gomes

obrigado amigo, eu estava fazendo do modo errado entao ...

Ds1:= nil


se eu fizer isso, estou limpando a variavel inteira??
abraços!!


Responder Citar

12/01/2006

Bruno Belchior

[quote:0103c2a547=´Rafael Gomes´]obrigado amigo, eu estava fazendo do modo errado entao ...

Ds1:= nil


se eu fizer isso, estou limpando a variavel inteira??
abraços!![/quote:0103c2a547]Se você fizer isso você não vai destruir o objeto DS1, você pode chamar o seu método [b:0103c2a547]Free[/b:0103c2a547] (que internamente chama o destructor) de depois finalmente atribuir [b:0103c2a547]nil[/b:0103c2a547] a esse objeto, ou simplistemente chamar o método que foi inserido no delphi 5, [b:0103c2a547]FreeAndNil[/b:0103c2a547], e passar como parâmetro o objeto a ser destruido, você deve atribuir [b:0103c2a547]nil[/b:0103c2a547] ao evento que você citou acima, só lembrando que eventos são também propriedades (tando que aparecem no dfm do formulário)...


Responder Citar