PDA

Ver la Versión Completa : Destrucción de Formas MDIChild


MaMu
23-07-2007, 19:53:49
Tengo una aplicación MDI, en la cual voy creando las MDIChild a medida que las necesito y las destruyo al cerrar las mimas, esto sin problemas.
Pero quiciera hacer que solo me permita una forma MDIChild a la vez, es decir, si creo una forma, y luego intento crear otra, primero, verificar si alguna forma esta creada y luego cerrarla y destruirla, recien ahi crear la nueva forma.

Como puedo hacer esto?

Yo las creo asi


MDIChild1:=TMDIChild1.Create(self);


y la destruyo en OnClose, asi:


MDIChild1 := nil;
action := cafree;


Intente hacer lo siguiente, para determinar si hay otra forma creada, asi


procedure cerrameformas;
begin
if assigned(MDIChild1) then MDIChild1 Close;
if assigned(MDIChild2) then MDIChild2 Close;
if assigned(MDIChild3) then MDIChild3 Close;
end;

//entonces, al crear una nueva:

begin
cerrameformas;
MDIChild1:=TMDIChild1.Create(self);
end;


Funcioar, me funciona, pero... si lo ejecuto un par de veces seguidas, me tira error. Como tendria que hacer??

Saludos y gracias

axesys
23-07-2007, 20:16:25
Yo uso el siguiente procedimiento pero no se si funcion con mdi


procedure TfrmMenu.CerrarVentanasAbiertas;
var
i: integer;
begin
for i:=0 to Screen.FormCount - 1 do
if Screen.Forms[i].Name <> Name then
Screen.Forms[i].Close;
end;

jhonny
23-07-2007, 20:28:01
Así, ¿Te funciona?:

if Application.MainForm.MDIChildCount = 1 then
begin
Application.MainForm.MDIChildren[0].Close;
end;


Aunque realmente podrias ser:

if Application.MainForm.MDIChildCount = 2 then
begin
Application.MainForm.MDIChildren[0].Close;
end;


Ya que no estoy seguro de que cuando se este creando dicho TForm nuevo, el ChildCount sea igual a 1 o 2.

//Edito: Ese codigo es asi, siempre y cuando el formulario principal de tu aplicación sea el formulario MDI "padre". De lo contrario, no debe ir MainForm si no, el nombre de dicho formulario MDI "padre".

MaMu
23-07-2007, 23:33:16
if Application.MainForm.MDIChildCount > 0 then begin

Application.MainForm.MDIChildren[numero_mdi_child].Close;
end;






Y si lo quiciera generalizar, como obtengo el numero del MDIChild que esta abierto?
Saludos

MaMu
23-07-2007, 23:56:09
SOLUCIONADO

Pero ahora tengo una duda, cada vez que creo y destruyo un MDICHild, este se va creando pero se forma en una posicion diferente, es decir, en cascada, a pesar de ser el unico creado. Existe alguna forma de evitar ese efecto como de maximizacion cada vez que se crea la forma MDIChild??? porque esteticamente queda feo, osea creo la MDIChild maximizada, y me gustaria que la muestre ya maximizada, sin ese efecto visual de maximizarse. No se si se entiende lo que pregunto.

jhonny
24-07-2007, 00:43:05
En alguna parte, después de cerrar el MDIChild coloca:


ShowWindow(Handle, SW_MAXIMIZE); //Donde Handle puede ser por ejemplo: Form2.Handle o el que necesites maximizar.


Espero que funcione. ;)

MaMu
24-07-2007, 18:51:48
En alguna parte, después de cerrar el MDIChild coloca:



ShowWindow(Handle, SW_MAXIMIZE); //Donde Handle puede ser por ejemplo: Form2.Handle o el que necesites maximizar.


Espero que funcione. ;)

No me funciona, se sigue produciendo el mismo efecto. Osea, se crea el MDIChild y si pudieramos verlo en cámara lenta, notariamos como se crea la ventanida y al cabo de cierto tiempo esta se agiganta hasta ocupar el area cliente. Intente engañar su creacion, forzando su tamaño MaxWidth y MaxHeight (en constraints) y mejora notablemente el efecto. Pero no se como hacer, digamos, para "resetear" la posicion inicial de cualquier ventana hija, esto es, cuando se van creando, se posicionan en cascada y aunque sea una sola la que siempre se crea, al destruir esta y crear otra, esta nueva ventana hija, toma la posicion del segundo lugar, y no la del primero, y asi hasta llegar a la X posicion, en donde luego vuelve a empezar. Claramente en las primeras el efecto no se nota tanto, pero en las otras si, y es bastate feo. Como puedo solucionar esto? Imaginense que crean una ventana hija, de 10 x 10, y al cabo de milisegundos explota y se expande hasta ocupar una area de 300 x 300, queda bastante feo el efecto visual.

Saludos