Ver Mensaje Individual
  #1  
Antiguo 08-02-2010
Avatar de jbautista
jbautista jbautista is offline
Miembro
 
Registrado: jul 2008
Posts: 43
Reputación: 0
jbautista Va por buen camino
Post Forms: FreeAndNil ó Release y la validación Assigned?

Hola que tal, bueno tengo un problema al liberar Form creados en tiempo de ejecución, el siguiente codigo me funciona perfectamente:

Código Delphi [-]
  
  {si el Form no esta creado se crea y se muestra, y si le vuelven a dar click al   boton entonces solo lo muestra.}

  if not Assigned(Form_Prueba) then 
  begin
     Application.CreateForm(TForm_Prueba, Form_Prueba);
     Form_Prueba.Show;
  end else begin
    if Form_Prueba.WindowState <> wsNormal  then
      Form_Prueba.WindowState :=  wsNormal;
    Form_prueba.SetFocus ;
  end;

Como esta en modo "Show" se libera el mismo Form desde el evento OnClose con FreeAndNil y funciona bien.

Código Delphi [-]
procedure TForm_Prueba.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  FreeAndNil(Form_Prueba);
end;

Pero si deseo agregar un botón "Salir" en mi Form_Prueba al llamar a "Close" me genera un error... supongo que esto es por que FreeAndNil termina los procesos pendientes... y como OnClose es llamado desde otro evento a pesar de hacer el FreeandNil, regresa a terminar el evento OnClick (esto lo probe poniendo Showmessages y si regresa)

Código Delphi [-]
procedure TForm_Prueba.btnSalirClick(Sender: TObject);
begin
  //Showmessage('');
  close;
  //Showmessage(''); {Este se msg se muestra a pesar del FreeAndNil}
end;

{*************************************************************************************************** ***************}
Anteriormente tenia en el OnClose el llamado a Release, pero al perecer no libera al Form:

Código Delphi [-]
procedure TForm_Prueba.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  release;
end;

por al hacer la siguiente validación, el Assigned alparecer si lo encuentra :

Código Delphi [-]
  
  if not Assigned(Form_Prueba) then 
  ...
  end;

Esto me confunde, ya que se supone que Release internamente hace su propio Free... y lo ocupaba por que el Release sirve para cuando se quiere liberar el mismo Form que lo invoco a diferencia del Free que es para liberar externamente...

La pregunta general es ¿Como puedo liberar correctamente mi Form desde su evento Onclose y desde un botón "Salir" que invoque a Close; Y que respete la validación: ?

Código Delphi [-]
  
  if not Assigned(Form_Prueba) then 
  begin
     Application.CreateForm(TForm_Prueba, Form_Prueba);
     Form_Prueba.Show;
  end else begin
    if Form_Prueba.WindowState <> wsNormal  then
      Form_Prueba.WindowState :=  wsNormal;
    Form_prueba.SetFocus ;
end;

De antemano gracias y ojala puedan ayudarme!
Buen día saludos.
Responder Con Cita