Fórum Liberação de recursos de uma classe (Free e/ou destroy) #348392
03/11/2007
0
Criei uma classe padrão ([TCadPadrao) com funções básicas de cadastro e manutenção. Depois criei classe com herança dessa primeira (TCadClientes = class(TCadPadrao), por exemplo). Nessa ultima, implementei funções de controle especifica para clientes e ela cria 2 datamodules e 2 forms para essa finalidade.
Na chamada, estancio a classe normalmente..
procedure Txxx.Click(xxx)
var
CadCli: TCadClientes;
begin
CadCli := TCadClientes.Create(Self);
CadCli.Incluir;
end;
Mas como faço para destruir e liberar a classe CadCli assim q forem fechados os 2 forms q são chamados por ela forem fechados.
Tentei incluir logo ao final CadCli.Free ou FreeAndNil(CadCli), mas o form é aberto e já fechado na hora. Tentei colocar num bloco try...finally, com este ult. comando em finally, mas ocorre a mesma coisa.
A estrutura para a classe saber q os forms foram todos fechados já fiz, mas não sei como liberar a classe inteira (CadCli).
Edergilvani
Curtir tópico
+ 0Posts
04/11/2007
Massuda
Para liberar os objetos que vc está criando, vc precisa guardar uma referencia a cada objeto criado. Como CadCli é uma variável local, cada TCadClientes que é criado fica na memória até o seu programa terminar. O usual seria destruir o objeto quando ele não for mais necessário. Por exemplo...
var CadCli: TCadClientes; begin CadCli := TCadClientes.Create(Self); CadCli.Incluir; CadCli.Free; ...
procedure TSeuForm.FormClose(... ... Action := caFree; ...
Gostei + 0
04/11/2007
Edergilvani
TCadClientes é uma classe (apenas unit) onde implementei funções, procedures, etc, ela é a regra de negócio. Ela gerencia as funções que serão chamadas pelo datamodule ou form. Dessa forma centralizo o q é regra de negócio na classe (unit). Banco de dados no datamodule e parte visual no form.
Exemplo: Ao clicar num botão ´Novo cliente´, o evento click desse botão cria a variável CadCli q é TCadClientes.
A procedure CadCli.Incluir, cria o datamodule, o form de cadastro, e nessa mesma classe há os comandos de inserir registro, checar a edição, salvar ou cancelar essa edição e tal... essa classe é a regra de negócio, o datamodule chama rotinas da classe TCadClientes e o form tem codigos apenas da parte visual e chamadas de negócio a TCadClientes.
Qdo o usuario fecha o form, é acionado OnClose, q tem o codigo Action := caFree, inclusive ele tbm destroy o datamodule correspondente dele, até aí tudo bem, o que não sei ainda, é como liberar a classe TCadClientes (variável CadCli) qdo fechasse o form.
Na classe TCadClientes criei um destructor Destroy para liberar algumas coisas criadas em runtime pela classe. Marquei uma linha para o delphi debugar qdo a classe fosse destruida, ou seja, para eu poder ver q o destructor está sendo executado e a classe sendo liberada, mas isso não acontece.
O que preciso saber é como destruir o owner (TCadClientes) do form (frmCadClientes) qdo fechar esse form. Tipo, sei lá, enviar uma notificação que a classe deve ser destruida.
Já tentei pelo evento OnClose, dar um Owner.Free, mas dá erro, ´access violation´. Tentei FreeNotification(Owner), não deu erro, mas o debug não pára no destructor destroy citado acima, portanto acho q a classe não está sendo liberada, portanto, só liberaria qdo fechasse a aplicação.
Um fluxograma seria assim
CadCli = TCadClientes
TCadClientes => cria o datamodule (dmCadCli) e form (frmCadCli)
frmCadCli ao ser fechado...
1 - Destroy o dmCadCli
2 - Seta Action := caFree dele
3 - Deve informar que TCadClientes está liberado para ser destruido tbm, ou mesmo destrui-lo.
Gostei + 0
04/11/2007
Massuda
Gostei + 0
04/11/2007
Edergilvani
Gostei + 0
04/11/2007
Massuda
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)