Problemas com o Action := caFree no OnClose de um Form

Delphi

06/10/2004

Caros amigos,
estou com um probleminha e agradeceria se alguem pudesse me dar uma luz, é o seguinte:

Criei um Form (MDIChild) chamado de frmModelo com o layout do meu sistema e nele implementei o evento OnClose com o comando Action := caFree extamente para desalocá-lo da memória quando o Form fechar.

Crio outros Forms descendentes de frmModelo e retiro do Available Forms para que eles não seja criados automaticamente e os crio da seguinte forma:

if Assigned(frmModelo1) then begin
frmModelo1 := TfrmModelo1.Create(Self);
frmModelo1.Show;
end
else
frmModelo1.SetFocus;

Quando executado da primeira vez tudo funciona perfeitamente mas quando fecho o frmModelo1 e tento abrir novamente dá um erro do tipo ´Access Violation´ isso por que o Assigned(frmModelo1) retorna true mesmo eu usando o Action := caFree no OnClose do Form pai.

Gostaria que alguem pudesse me dar uma dica de como fazer o Assigned(frmModelo1) retornar false depois que eu efetuar o fechamento desse formulário, para que com isso o usuário possa abrir o formulário mais de uma vez depois que fechar sem dar o erro.

Desde já agradeço,


Eduardo Tavares

Eduardo Tavares

Curtidas 0

Respostas

Osocram

Osocram

06/10/2004

tenta fazer
form.release;
form := nil;


GOSTEI 0
Eduardo Tavares

Eduardo Tavares

06/10/2004

tenta fazer form.release; form := nil;


Você está dizendo pra colocar frmModelo1 := nil dentro de cada procedimento OnClose dos descendentes?


GOSTEI 0
Kenshindigital

Kenshindigital

06/10/2004

tem um erro de logica ai no seu if assigned, se o objeto não existir ele tenta focalizar um objeto não alocado e da access violation eu suponho.

tenta assim:

if not Assigned(frmModelo1) 
  then frmModelo1 := TfrmModelo1.Create(Self); 
frmModelo1.Show; 



GOSTEI 0
Aroldo Zanela

Aroldo Zanela

06/10/2004

Colega,

Formulário principal:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Assigned(Form2) then Form2 := TForm2.Create(Self);
  Form2.Show;
end;


No form2 (deste exemplo), evento OnClose:

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  Form2   := Nil;
end;



GOSTEI 0
POSTAR