Ver Mensaje Individual
  #2  
Antiguo 02-04-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Por defecto, cuando cierras un formulario, la acción a seguir es como sigue:

si el formulario es MdiChild se minimiza (como ya notaste)
si el formulario no es MdiChild se oculta

Este comportamiento pede alterarse usando el evento OnClose del formulario y ajustando el parámetro Action al valor de tu preferencia:

caHide - oculta el formulario
caFree - destruye el formulario
caMinimize - minimiza el formulario
caNone - no hace nada (no cierra el formulario)

Pero con formularios MdiChild no es posible usar caHide de manera que sólo te queda destruirlo.

Ahora bien, lo recomendado en aplicaciones MDI es quitar todos los formularios MdiChild de la lista 'Auto-create forms' en el menú Project|Options|Forms a fin de que no se creen automáticamente. Tú debes crearlos manualmente:

Código:
with TMdiChildForm.Create do
  Show;
Esto lo pondrías en algún menú por ejemplo de manera que pueda volver a ejecutarse cada vez que se desee.

Nota que con este método el usuario podrá abrir varias copias del formulario- lo cual, por otro lado es lo normal en una aplicación MDI. En ocasiones se requiere poder abrir una sóla copia- hecho que a mi parecer no tiene mucho sentido pero no lo discuto. Para ello debes poder detectar, en el código de arriba si ya ya está abierto o no el formulario para crearlo sólo en caso de que no esté abierto.

Hay varias maneras de hacer esto. Una de ellas- no me gusta pero es muy práctica y fácil -es usar la variable que Delphi crea por tí cuando agregas el formulario durante el diseño:

Código:
type
  TMdiChildForm = class(TForm)
    ...
  end;

var
  MdiChildForm: TMdiChildForm;
El código quedaría así:

Código:
if MdiChildForm <> nil then
begin
  MdiChildForm := TMdiChildForm.Create(nil);
  MdiChildForm.Show;
end;
y en el evento OnClose del formulario MdiChild pondrías:

Código:
Action := caFree;
MdiChildForm := nil;
// Saludos
Responder Con Cita