Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Destrucción de Formas MDIChild (https://www.clubdelphi.com/foros/showthread.php?t=46067)

MaMu 23-07-2007 19:53:49

Destrucción de Formas MDIChild
 
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

Código Delphi [-]
MDIChild1:=TMDIChild1.Create(self);

y la destruyo en OnClose, asi:

Código Delphi [-]
  MDIChild1 := nil;
  action := cafree;

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

Código Delphi [-]
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

Código Delphi [-]
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?:

Código Delphi [-]
  if Application.MainForm.MDIChildCount = 1 then
  begin
    Application.MainForm.MDIChildren[0].Close;
  end;

Aunque realmente podrias ser:

Código Delphi [-]
  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

Cita:

Empezado por jhonny

Código Delphi [-]
 

  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:

Código Delphi [-]
 
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

Cita:

Empezado por jhonny
En alguna parte, después de cerrar el MDIChild coloca:


Código Delphi [-]
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


La franja horaria es GMT +2. Ahora son las 03:24:15.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi