Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
LUCA55 Membro Junior
![Membro Junior Membro Junior](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/star3.gif)
Registrado: Domingo, 26 de Janeiro de 2014 Mensagens: 310 Localização: RIO DE JANEIRO
|
Enviada: Qui Jan 08, 2015 10:02 am Assunto: Qual o melhor modo de liberar form da memoria |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
LUCA55 Membro Junior
![Membro Junior Membro Junior](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/star3.gif)
Registrado: Domingo, 26 de Janeiro de 2014 Mensagens: 310 Localização: RIO DE JANEIRO
|
Enviada: Qui Jan 08, 2015 10:29 am Assunto: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
imex Moderador
![Moderador Moderador](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/moderador.gif)
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Jan 08, 2015 11:02 am Assunto: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
oneshotbr Colaborador
![Colaborador Colaborador](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/colaborador.gif)
![](images/avatars/141514a8a8b2ebc741.jpg)
Registrado: Quarta-Feira, 6 de Mai de 2009 Mensagens: 1948 Localização: Taubaté - SP
|
Enviada: Qui Jan 08, 2015 1:23 pm Assunto: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
LUCA55 Membro Junior
![Membro Junior Membro Junior](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/star3.gif)
Registrado: Domingo, 26 de Janeiro de 2014 Mensagens: 310 Localização: RIO DE JANEIRO
|
Enviada: Qui Jan 08, 2015 2:16 pm Assunto: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
oneshotbr Colaborador
![Colaborador Colaborador](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/colaborador.gif)
![](images/avatars/141514a8a8b2ebc741.jpg)
Registrado: Quarta-Feira, 6 de Mai de 2009 Mensagens: 1948 Localização: Taubaté - SP
|
Enviada: Qui Jan 08, 2015 2:21 pm Assunto: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
natanbh1 Colaborador
![Colaborador Colaborador](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/colaborador.gif)
Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
|
Voltar ao Topo |
|
![](templates/subSilver/images/spacer.gif) |
marcieldeg Colaborador
![Colaborador Colaborador](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/colaborador.gif)
![](images/avatars/163033283657464727365d9.jpg)
Registrado: Terça-Feira, 5 de Abril de 2011 Mensagens: 1054 Localização: Vitória - ES
|
Enviada: Sáb Jan 10, 2015 7:00 pm Assunto: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
gadeji Novato
![Novato Novato](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/star1.gif)
Registrado: Terça-Feira, 25 de Janeiro de 2011 Mensagens: 26
|
Enviada: Dom Jan 11, 2015 1:11 am Assunto: |
|
|
O melhor é usando o FreeAndNil...
Mas se não quis pode colocar no onClose:
Action := caFree;
frm := nil; |
|
Voltar ao Topo |
|
![](templates/subSilver/images/spacer.gif) |
nildglan Colaborador
![Colaborador Colaborador](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/colaborador.gif)
![](images/avatars/29014db77bd82a4e1.jpg)
Registrado: Sábado, 16 de Agosto de 2008 Mensagens: 1564 Localização: Goianésia do Pará
|
Enviada: Seg Jan 12, 2015 11:15 am Assunto: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
natanbh1 Colaborador
![Colaborador Colaborador](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/colaborador.gif)
Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Seg Jan 12, 2015 11:24 am Assunto: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
LUCA55 Membro Junior
![Membro Junior Membro Junior](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/star3.gif)
Registrado: Domingo, 26 de Janeiro de 2014 Mensagens: 310 Localização: RIO DE JANEIRO
|
Enviada: Ter Jan 13, 2015 3:50 pm Assunto: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
LUCA55 Membro Junior
![Membro Junior Membro Junior](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/star3.gif)
Registrado: Domingo, 26 de Janeiro de 2014 Mensagens: 310 Localização: RIO DE JANEIRO
|
Enviada: Ter Jan 13, 2015 5:23 pm Assunto: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
|