GARANTIR DESCONTO

Fórum Dúvida para liberar o form da memória #344016

02/08/2007

0

Colegas;
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

Vispo

Responder

Posts

02/08/2007

Vitor Alcantara

Cara tem um negocio que ta meio confuso, tu ta querendo criar o form de nome FmTeste dentro do próprio FmTeste é isso?


Responder

Gostei + 0

02/08/2007

Vitor Alcantara

Para liberar o form da memória 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;



Responder

Gostei + 0

03/08/2007

Kohl

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:

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á


Responder

Gostei + 0

04/08/2007

Kohl

Qual seria o evento chamado quando um Frame eh fechado? OnExit?

Grato


Responder

Gostei + 0

04/08/2007

Martins

Por que vc não tenta assim.

Coloque no OnDestroy

begin 
  Action := caFree; 
  Self   := NIL; 
end;



Responder

Gostei + 0

10/08/2007

Kohl

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?


Responder

Gostei + 0

10/08/2007

Emerson Nascimento

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;



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar