ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Qual o melhor modo de liberar form da memoria

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
LUCA55
Membro Junior
Membro Junior


Registrado: Domingo, 26 de Janeiro de 2014
Mensagens: 310
Localização: RIO DE JANEIRO

MensagemEnviada: Qui Jan 08, 2015 10:02 am    Assunto: Qual o melhor modo de liberar form da memoria Responder com Citação

Olá,

Qual a diferença que existe entre os metodos abaixo para liberar o form da memoria, qual deles libera completamente o form e seus componentes da memoria:

Application.CreateForm(TfrmCLIE,frmCLIE);

frmCLIE.ShowModal ;
FreeAndNil(frmCLIE); ;

ou usando:

Application.CreateForm(TfrmCLIE,frmCLIE);

frmCLIE.ShowModal ;
frmCLIE.Onrelease); ;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
LUCA55
Membro Junior
Membro Junior


Registrado: Domingo, 26 de Janeiro de 2014
Mensagens: 310
Localização: RIO DE JANEIRO

MensagemEnviada: Qui Jan 08, 2015 10:29 am    Assunto: Responder com Citação

Desculpe, coloque o segundo metodo errado, o correto é RELEASE:

frmCLIE.ShowModal ;
FreeAndNil(frmCLIE);

ou usando:

Application.CreateForm(TfrmCLIE,frmCLIE);

frmCLIE.ShowModal ;
frmCLIE.Release ;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Jan 08, 2015 11:02 am    Assunto: Responder com Citação

Bom dia,

Considerando os exemplos, o FreeAndNil também vai atribuir nil para frmClie, então seria mais indicado para esse caso.

Espero que ajude.


Editado pela última vez por imex em Dom Out 01, 2023 3:35 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
oneshotbr
Colaborador
Colaborador


Registrado: Quarta-Feira, 6 de Mai de 2009
Mensagens: 1948
Localização: Taubaté - SP

MensagemEnviada: Qui Jan 08, 2015 1:23 pm    Assunto: Responder com Citação

Free = libera o objeto da memória.
nil = libera o ponteiro.

Faz o freeandNil é o método correto.
_________________
AMD Phenom II X4 960T 3.00 GHz - 8 GB DDR III - HD 1000 GB SATA - GeForce GTX 650 TI GDDR 5 - Monitor 21,5" Full HD - Kubuntu 14.04 + Windows 7 Professional x64.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
LUCA55
Membro Junior
Membro Junior


Registrado: Domingo, 26 de Janeiro de 2014
Mensagens: 310
Localização: RIO DE JANEIRO

MensagemEnviada: Qui Jan 08, 2015 2:16 pm    Assunto: Responder com Citação

Ok, e este exemplo abaixo, ele tambem libera o form e o ponteiro da memoria?

no ONCLOSE do Form:

action := caFree;
frmCLIE := Nil;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
oneshotbr
Colaborador
Colaborador


Registrado: Quarta-Feira, 6 de Mai de 2009
Mensagens: 1948
Localização: Taubaté - SP

MensagemEnviada: Qui Jan 08, 2015 2:21 pm    Assunto: Responder com Citação

Citação:
Ok, e este exemplo abaixo, ele tambem libera o form e o ponteiro da memoria?

no ONCLOSE do Form:

action := caFree;
frmCLIE := Nil;


Não sei o que o caFree faz! Mas o recomendando até pela embarcadero parece que é mesmo o FreeAndNil
_________________
AMD Phenom II X4 960T 3.00 GHz - 8 GB DDR III - HD 1000 GB SATA - GeForce GTX 650 TI GDDR 5 - Monitor 21,5" Full HD - Kubuntu 14.04 + Windows 7 Professional x64.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Qui Jan 08, 2015 2:55 pm    Assunto: Responder com Citação

Alguns links interessantes sobre o assunto:

http://www.ericksasse.com.br/free-vs-freeandnil-vs-release/

http://www.devmedia.com.br/quick-tips-diferenca-entre-o-free-freeandnil-e-release/16403

https://htwojsystem.wordpress.com/2011/06/29/destroy-free-e-freeandnil-em-delphi/

http://www.devmedia.com.br/dicas-liberando-formulario-da-memoria/810
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
marcieldeg
Colaborador
Colaborador


Registrado: Terça-Feira, 5 de Abril de 2011
Mensagens: 1054
Localização: Vitória - ES

MensagemEnviada: Sáb Jan 10, 2015 7:00 pm    Assunto: Responder com Citação

Form1.Release só é necessário se o form ainda estiver aberto no momento que se quer eliminar da memória. Pode ser substituído por um Close seguido de um Free.

Exemplo:
Código:
  Form1 := TForm1.Create(Application);
  Form1.Show;
  // faz alguma coisa com o form
  Form1.Release; //form ainda está aberto nesse momento

  Form2 := TForm2.Create(Application);
  Form2.ShowModal;
  Form2.Free; // seguro, pois é certo que aqui o form terá sido fechado


Só é necessário setar nil na variável do form se a mesma será reutilizada em algum ponto, como em testes com Assigned().
A forma que fez usando o OnClose também é correta.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gadeji
Novato
Novato


Registrado: Terça-Feira, 25 de Janeiro de 2011
Mensagens: 26

MensagemEnviada: Dom Jan 11, 2015 1:11 am    Assunto: Responder com Citação

O melhor é usando o FreeAndNil...

Mas se não quis pode colocar no onClose:
Action := caFree;
frm := nil;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário
nildglan
Colaborador
Colaborador


Registrado: Sábado, 16 de Agosto de 2008
Mensagens: 1564
Localização: Goianésia do Pará

MensagemEnviada: Seg Jan 12, 2015 11:15 am    Assunto: Responder com Citação

pessol vou tirar uma dúvida em relação a essa assunto
para liberar os forms da fsNormal da memória faço isso que acho que é o mais indicado FreeAndNil(Form);
agora meus cadastro são forms herdade de um outro form pai onde também utilizo o FormStyle do tipo fsMDIChild e quando eu fecho form faço isso no form Pai Action:=caFree; e nos forms filho faço dessa forma FrmCadClientes:= nil;

então minha grande pergunta como faço para usar
FreeAndNil(FrmCadClientes);?

quando eu utilizo o FreeAndNil(FrmCadClientes); no form filhos em da um erro de acess violation porque será? como proceder?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Seg Jan 12, 2015 11:24 am    Assunto: Responder com Citação

Em aplicações MDI eu não utilizo FreeAndNil porque como relatado causa AccessViolation. Eu coloco o código abaixo no OnClose de cada form Filho:

Código:
procedure Tform1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  Form1 := Nil; // Troque Form1 pelo nome do form a ser liberado
end;


Funciona bem, sem problemas com memória e access violation na liberação do form.
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
LUCA55
Membro Junior
Membro Junior


Registrado: Domingo, 26 de Janeiro de 2014
Mensagens: 310
Localização: RIO DE JANEIRO

MensagemEnviada: Ter Jan 13, 2015 3:50 pm    Assunto: Responder com Citação

Ok pessoal, grato pelas dicas. Só mais uma duvida, para liberar da memoria qualquer processo do programa que ainda esteja pendente, basta colocar no ONCLOSE do form principal o APPLICATION.TERMINATE, ele finaliza todos os processos do programa?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
LUCA55
Membro Junior
Membro Junior


Registrado: Domingo, 26 de Janeiro de 2014
Mensagens: 310
Localização: RIO DE JANEIRO

MensagemEnviada: Ter Jan 13, 2015 5:23 pm    Assunto: Responder com Citação

Estou com esta duvida porque baixei um exemplo de codigo fonte para estudo e no ONCLOSE do form principal tem este codigo abaixo, é mesmo necessario fazer isso ou basta colocar o APPLICATION.TERMINATE para finalizar todos os componentes?

Código:
if (IBDatabase1.Connected)
   then IBDatabase1.Connected := False;
  if (QryAgenda.Active)
   then QryAgenda.Active := False;
  if (QryContatos.Active)
   then QryContatos.Active := False;
  if (QryNotas.Active)
   then QryNotas.Active := False;
   
    application.Terminate ;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB