Liberar objetos da memória
Pessoal
Para liberar ojbeto da memória estou usando:
FreeAndNil(FrmGpsCadRegiao);
Será que em vez do código acima poderia usar o cAction := free ??
Os forms estou usando no tipo mdichild e form principal mdiForm
Sou usuário de Delphi 7 + Interbase 6.0
Para liberar ojbeto da memória estou usando:
FreeAndNil(FrmGpsCadRegiao);
Será que em vez do código acima poderia usar o cAction := free ??
Os forms estou usando no tipo mdichild e form principal mdiForm
Sou usuário de Delphi 7 + Interbase 6.0
Rogeranalista
Curtidas 0
Respostas
Massuda
05/12/2006
Poderia, mas o valor de FrmGpsCadRegiao não seria nil após o form ser destruído; ele teria um valor inválido após o form ser destruído (ocorre access violation se você usar esse objeto sem criar um novo).
GOSTEI 0
Martins
05/12/2006
Correto, o q o mestre [b:91b2cb8afa]Massuda[/b:91b2cb8afa] citou é correto,
[b:91b2cb8afa]FreeAndNil[/b:91b2cb8afa] é uma procedure que pode ser vista em SysUtils, ela atribui [b:91b2cb8afa]Nil[/b:91b2cb8afa] a variável de instância logo depois chama um [b:91b2cb8afa]Free[/b:91b2cb8afa] liberando o objeto.
[b:91b2cb8afa]FreeAndNil[/b:91b2cb8afa] é uma procedure que pode ser vista em SysUtils, ela atribui [b:91b2cb8afa]Nil[/b:91b2cb8afa] a variável de instância logo depois chama um [b:91b2cb8afa]Free[/b:91b2cb8afa] liberando o objeto.
GOSTEI 0
Marco Salles
05/12/2006
Quando eu uso Os forms usando no tipo mdichild e form principal mdiForm eu uso action:=Cafree; porem eu também uso junto , no onclose eu também atribuo o valor nil ..
Usar o [b:f551f6149e]freeandnil[/b:f551f6149e] ´é meio esquisito´ , nesta situação , pois voce esta destruindo o form , na execução de um evento (Voce deve estar fazendo isto no onclose)...
O engraçado que deveria gerar uma exceção , pois a principio , não podemos destruir um objeto ,enquanto tivermos processando um dos seus eventos... Teoricamente , podera ter erros de acessso Violation, depende do que voce estiver no evento onclose
Action:=Cafree;
FrmGpsCadRegiao:=nil;
Usar o [b:f551f6149e]freeandnil[/b:f551f6149e] ´é meio esquisito´ , nesta situação , pois voce esta destruindo o form , na execução de um evento (Voce deve estar fazendo isto no onclose)...
O engraçado que deveria gerar uma exceção , pois a principio , não podemos destruir um objeto ,enquanto tivermos processando um dos seus eventos... Teoricamente , podera ter erros de acessso Violation, depende do que voce estiver no evento onclose
GOSTEI 0
Rinez
05/12/2006
Amigos, eu uso para criar e destruir um form:
procedure TF_Principal.sbf3Click(Sender: TObject);
begin
if f_Pedido<>nil then exit;
try
F_Pedido:=tf_Pedido.create(Application);
F_Pedido.showmodal;
finally
F_Pedido.QPIZZA.Close; //sqlquery
F_Pedido.CQPIZZA.Close; //clientdataset
F_Pedido.QPROCURA.Close; // sqlquery
F_Pedido.QSABOR.Close; // sqlquery
F_Pedido.CQSABOR.Close; //clientdataset
F_Pedido.QBEBIDAS.Close; //sqlquery
F_Pedido.CQBEBIDAS.Close; //clientdataset
freeandnil(F_Pedido);
end;
end;
será que estou fazendo errado?
procedure TF_Principal.sbf3Click(Sender: TObject);
begin
if f_Pedido<>nil then exit;
try
F_Pedido:=tf_Pedido.create(Application);
F_Pedido.showmodal;
finally
F_Pedido.QPIZZA.Close; //sqlquery
F_Pedido.CQPIZZA.Close; //clientdataset
F_Pedido.QPROCURA.Close; // sqlquery
F_Pedido.QSABOR.Close; // sqlquery
F_Pedido.CQSABOR.Close; //clientdataset
F_Pedido.QBEBIDAS.Close; //sqlquery
F_Pedido.CQBEBIDAS.Close; //clientdataset
freeandnil(F_Pedido);
end;
end;
será que estou fazendo errado?
GOSTEI 0
Marco Salles
05/12/2006
Amigos, eu uso para criar e destruir um form:
procedure TF_Principal.sbf3Click(Sender: TObject);
begin
if f_Pedido<>nil then exit;
try
F_Pedido:=tf_Pedido.create(Application);
F_Pedido.showmodal;
finally
F_Pedido.QPIZZA.Close; //sqlquery
F_Pedido.CQPIZZA.Close; //clientdataset
F_Pedido.QPROCURA.Close; // sqlquery
F_Pedido.QSABOR.Close; // sqlquery
F_Pedido.CQSABOR.Close; //clientdataset
F_Pedido.QBEBIDAS.Close; //sqlquery
F_Pedido.CQBEBIDAS.Close; //clientdataset
freeandnil(F_Pedido);
end;
end;
[b:57e5f58706]será que estou fazendo errado?[/[/b:57e5f58706]quote]
O caso do Roger é diferente do seu.. Ele esta numa estrutura MDI
Porém a maneira que voce esta usando , no caso de SDI , também pode não ser a mais correta... Voce esta atribuindoa aplicação com proprietário do form criado.. É isto muitas das vezes não esta correto.. Pode aparecer errros estranhos e voce não saber de onde vem , e o pior , nen se lembrar de como esta criando estes formulários
O Mais indicado é assim:
[b:57e5f58706]Para formulários , o mais indicado é usar release ao inves de Freeandnil[/b:57e5f58706]
procedure TF_Principal.sbf3Click(Sender: TObject);
begin
if f_Pedido<>nil then exit;
try
F_Pedido:=tf_Pedido.create(Application);
F_Pedido.showmodal;
finally
F_Pedido.QPIZZA.Close; //sqlquery
F_Pedido.CQPIZZA.Close; //clientdataset
F_Pedido.QPROCURA.Close; // sqlquery
F_Pedido.QSABOR.Close; // sqlquery
F_Pedido.CQSABOR.Close; //clientdataset
F_Pedido.QBEBIDAS.Close; //sqlquery
F_Pedido.CQBEBIDAS.Close; //clientdataset
freeandnil(F_Pedido);
end;
end;
[b:57e5f58706]será que estou fazendo errado?[/[/b:57e5f58706]quote]
O caso do Roger é diferente do seu.. Ele esta numa estrutura MDI
Porém a maneira que voce esta usando , no caso de SDI , também pode não ser a mais correta... Voce esta atribuindoa aplicação com proprietário do form criado.. É isto muitas das vezes não esta correto.. Pode aparecer errros estranhos e voce não saber de onde vem , e o pior , nen se lembrar de como esta criando estes formulários
O Mais indicado é assim:
if f_Pedido<>nil then exit;
try
F_Pedido:=tf_Pedido.create(nil);
F_Pedido.showmodal;
finally
f_Pedido.Release
end;
end;
[b:57e5f58706]Para formulários , o mais indicado é usar release ao inves de Freeandnil[/b:57e5f58706]
GOSTEI 0