GARANTIR DESCONTO

Fórum Liberação de recursos de uma classe (Free e/ou destroy) #348392

03/11/2007

0

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).


Edergilvani

Edergilvani

Responder

Posts

04/11/2007

Massuda

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...
var 
  CadCli: TCadClientes; 
begin 
  CadCli := TCadClientes.Create(Self); 
  CadCli.Incluir; 
  CadCli.Free;
...
...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...
procedure TSeuForm.FormClose(...
...
  Action := caFree;
...
...o caFree faz com que seu form seja destruído automaticamente quando for fechado.


Responder

Gostei + 0

04/11/2007

Edergilvani

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.


Responder

Gostei + 0

04/11/2007

Massuda

O mais simples é guardar no form uma referencia ao objeto TCadClientes e usar essa referencia para destruir o objeto no OnDestroy do form.


Responder

Gostei + 0

04/11/2007

Edergilvani

Ao tentar destruir a classe TCadClientes qdo fecha o form, dá erro de access violation...


Responder

Gostei + 0

04/11/2007

Massuda

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar