PDA

Ver la Versión Completa : Los MDI en delphi


GeoAvila
02-04-2004, 00:44:25
HOla he estado trabajando ultimante con delphi...

tengo un problema, el cual es que cuando creo un mdichild, cuando le doy cerrar el mdichild lo unico que hace es que se minimiza, bueno por alli encontre un codigo, para cerrarlo y me lo cierra, pero como lo vuelvo a abrir les agradeceria si alguno de ustedes me puediera resolver al duda de como cerrar y volver a abrir el mdichild, cual es codigo adecuado para hacerlo. gracias de antemano

roman
02-04-2004, 01:06:11
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:


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:


type
TMdiChildForm = class(TForm)
...
end;

var
MdiChildForm: TMdiChildForm;


El código quedaría así:


if MdiChildForm <> nil then
begin
MdiChildForm := TMdiChildForm.Create(nil);
MdiChildForm.Show;
end;


y en el evento OnClose del formulario MdiChild pondrías:


Action := caFree;
MdiChildForm := nil;


// Saludos

GeoAvila
02-04-2004, 01:13:14
Gracias por tu muy completa resuesta me ha servido de mucha ayuda..

nos vemos..