Dúvida para liberar o form da memória
Colegas;
Estou chamando um form da seguinte maneira:
e estou fechando assim:
Só que mesmo depois de fechar o form, ele não fica como NIL. Dessa forma, na segunda vez que eu tentar abrir ele não vai entrar no IF.
Por que? estou usando o Delphi 2006
Estou chamando um form da seguinte maneira:
procedure TfmTeste.Button1Click(Sender: TObject);
var
formTeste : TfmTeste;
begin
if formTeste = NIL then
formTeste := TfmTeste.Create(Application);
end;
e estou fechando assim:
procedure TfmTeste.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; Self := NIL; end;
Só que mesmo depois de fechar o form, ele não fica como NIL. Dessa forma, na segunda vez que eu tentar abrir ele não vai entrar no IF.
Por que? estou usando o Delphi 2006
Vispo
Curtidas 0
Respostas
Vitor Alcantara
02/08/2007
Cara tem um negocio que ta meio confuso, tu ta querendo criar o form de nome FmTeste dentro do próprio FmTeste é isso?
GOSTEI 0
Vitor Alcantara
02/08/2007
Para liberar o form da memória eu fasso assim:
Dai pra chamar eu fasso assim:
Procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := Cafree; Form2 := nil;//Coloco o nome do form atribuindo o valor nil a ele end;
Dai pra chamar eu fasso assim:
begin if Form2 = NIL then Form2 := TForm2.Create(Application) else Form2.Show; end;
GOSTEI 0
Kohl
02/08/2007
Tenho um problema semelhante, no meu caso eu queria liberar um FRAME da memoria, com um botao dentro do frame. O frame eh criado da seguinte forma:
O frame eh criado num TPanel que esta no frmMain. No frmMain tem um botao pra fechar esse frame, da seguinte maneira:
Pois bem, esse botao funciona normalmente, mas eu queria colocar um botao dentro do Frame tambem, pra fechar ele. O unico jeito q eu vi foi esse:
Ele até funciona e fecha o frame, mas dá uma mensagem de erro:
Como eu faria pra fazer esse botão fechar de forma eficiente o frame?
Obrigado desde já
new_fra:TFrame; if new_fra = nil then begin new_fra := TfraNewLyric.Create(Application); with new_fra do begin Parent := pnlContent; Align := alClient; Show; end; end;
O frame eh criado num TPanel que esta no frmMain. No frmMain tem um botao pra fechar esse frame, da seguinte maneira:
if new_fra <> nil then begin fra_newlyric.Free; fra_newlyric := nil end;
Pois bem, esse botao funciona normalmente, mas eu queria colocar um botao dentro do Frame tambem, pra fechar ele. O unico jeito q eu vi foi esse:
frmMain.btnCloseClick(Self);
Ele até funciona e fecha o frame, mas dá uma mensagem de erro:
Access violation at address 004036B9 in module ´Project1.exe´. Read of address 0000AFC8
Como eu faria pra fazer esse botão fechar de forma eficiente o frame?
Obrigado desde já
GOSTEI 0
Kohl
02/08/2007
Qual seria o evento chamado quando um Frame eh fechado? OnExit?
Grato
Grato
GOSTEI 0
Martins
02/08/2007
Por que vc não tenta assim.
Coloque no OnDestroy
Coloque no OnDestroy
begin Action := caFree; Self := NIL; end;
GOSTEI 0
Kohl
02/08/2007
OnDestroy do frame?
Tentei, mas ele diz q o Action nao foi definido.
Nao entendo o que acontece, pq com o botao no form principal funciona normal, mas no botao dentro do frame sempre dá aquele erro ou dá [i:aa6680b896]Abstract Error[/i:aa6680b896].
Alguem tem uma solucao?
Tentei, mas ele diz q o Action nao foi definido.
Nao entendo o que acontece, pq com o botao no form principal funciona normal, mas no botao dentro do frame sempre dá aquele erro ou dá [i:aa6680b896]Abstract Error[/i:aa6680b896].
Alguem tem uma solucao?
GOSTEI 0
Emerson Nascimento
02/08/2007
Colegas;
Estou chamando um form da seguinte maneira:
[quote:015781cd69]procedure TfmTeste.Button1Click(Sender: TObject);
var
formTeste : TfmTeste;
begin
if formTeste = NIL then
formTeste := TfmTeste.Create(Application);
end;
e estou fechando assim:
procedure TfmTeste.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; Self := NIL; end;
Só que mesmo depois de fechar o form, ele não fica como NIL. Dessa forma, na segunda vez que eu tentar abrir ele não vai entrar no IF.
Por que? estou usando o Delphi 2006[/quote:015781cd69]
isso não tem como dar certo, visto que a variável formTeste é local no procedimento. sempre que vc clicar no botão será criada a variável sem qualquer atribuição.
crie essa variável na seção private do seu form e tente algo como:
procedure TfmTeste.Button1Click(Sender: TObject); begin if (formTeste = nil) or not formTeste.Showing then formTeste := TfmTeste.Create(Application); end; procedure TfmTeste.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; end; procedure TfmTeste.FormCreate(Sender: TObject); begin formTeste := nil; end;
GOSTEI 0