Liberação de recursos de uma classe (Free e/ou destroy)
Olá amigos, preciso de ajuda para saber como liberar recursos de uma classe q criei.
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).
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
Curtidas 0
Respostas
Massuda
03/11/2007
Não sei se entendi direito...
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......mas como parece que esse deu TCadClient é um form que você exibe com Show e não ShowModal, o mais simples é usar o evento OnClose do form......o caFree faz com que seu form seja destruído automaticamente quando for fechado.
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
Edergilvani
03/11/2007
Ok, entendi, no form realmente já uso action := caFree. Mas acho que faltou mais explicação minha....
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.
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
Massuda
03/11/2007
O mais simples é guardar no form uma referencia ao objeto TCadClientes e usar essa referencia para destruir o objeto no OnDestroy do form.
GOSTEI 0
Edergilvani
03/11/2007
Ao tentar destruir a classe TCadClientes qdo fecha o form, dá erro de access violation...
GOSTEI 0
Massuda
03/11/2007
mostre o q vc fez... bastaria por um campo public na classe do form que receba o self do objeto tcadclientes qundo esse objeto cria o form.
GOSTEI 0