Liberar objetos da memória

Delphi

05/12/2006

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


Rogeranalista

Rogeranalista

Curtidas 0

Respostas

Massuda

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

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.


GOSTEI 0
Marco Salles

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

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

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?


GOSTEI 0
Marco Salles

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:


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
POSTAR