Array
(
)

atribuir uma procedure a um evento

Rafael Gomes
   - 12 jan 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 ...

#Código

// 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

#Código
Action:= CaFree;



aguardo respostas ...

[]s


Rafael Gomes
   - 12 jan 2006

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


Bruno Belchior
   - 12 jan 2006

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 nil as propriedades (eventos) dos DataSet´s...#Código

Dm.Ds1.OnStateChange:= nil;
Dm.tb1.AfterPost:= nil
Você pode sobrescrever o destructor do Formulário para isso ou usar o evento OnDestroy ou até mesmo o OnClose do formulário...


Rafael Gomes
   - 12 jan 2006

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

#Código

Ds1:= nil


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


Bruno Belchior
   - 12 jan 2006


Citação:
obrigado amigo, eu estava fazendo do modo errado entao ...

#Código

Ds1:= nil


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