Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   MDI Child ¿Qué son y como funcionan? (https://www.clubdelphi.com/foros/showthread.php?t=93404)

Angel.Matilla 13-09-2018 10:18:51

MDI Child ¿Qué son y como funcionan?
 
Me podéis mandar a la porra porque imagino que esta duda, que al margen de todo la tengo desde que empecé a programar con BCB, ha de ser un concepto básico pero por más que he mirado, buscado y tratado de entender pero tal vez tenga un error básico de concepto y por ello no soy capaz de hacerlo.


SI yo en un aplicación defino un formulario como MDIChild, ¿significa que se abre DENTRO del que lo ha llamado?

Neftali [Germán.Estévez] 13-09-2018 11:54:15

No exactamente.
En una aplicación MDI, existe siempre un formulario "padre" MDIForm y el resto que son MDIChild.

Cuando tu hablas de que "al abrir un formulario se abre dentro de otro", en realidad lo que pasa es que todos los MDIChild se abren dentro del MDIform (que es el equivalente al form principal de una aplicación normal).

No se si te aclaro algo o te lío más...


Creando aplicaciones MDI

Angel.Matilla 13-09-2018 12:49:23

Gracias por la respuesta. Algo me has aclarado. Mi duda ahora es otra.


Yo tengo una aplicación que, en parte, es otra que ya está funcionando y ha habido que añadir otro trozo. Tal cual lo he planteado tengo un formulario que uso como menú principal y definido con FormStyle = fsNormal. Si yo ahora defino el formualrio llamado por este con FormStyle = fsMDIChild, ¿se abriría dentro de ese primero? ¿tendría que cambiar algo más como que ese menú principal pasara a ser fsMDIForm?

Casimiro Notevi 13-09-2018 13:04:30

Un MDIchild necesita un MDIform.
Todo o demás es independiente.

Angel.Matilla 13-09-2018 13:07:37

Vale. Eso lo había supuesto, por lógica. Mientras estoy haciendo pruebas.


Hasta ahora casi siempre que llamaba a un formulario lo hacía con ShowModal, pero he comprobado que de esta forma me da un error de ejecución. Lo he cambiado por Show pero de esa manera se muestra y automaticamente se cierra. :confused:

Neftali [Germán.Estévez] 13-09-2018 15:13:55

Cita:

Empezado por Angel.Matilla (Mensaje 528388)
Hasta ahora casi siempre que llamaba a un formulario lo hacía con ShowModal, pero he comprobado que de esta forma me da un error de ejecución. Lo he cambiado por Show pero de esa manera se muestra y automaticamente se cierra. :confused:


Posiblemente porque después del ShowModal suele haber un Free (o FreeAndNil). Ahora con el Show hay que eliminar esa línea también.

Angel.Matilla 13-09-2018 17:58:44

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 528390)
Posiblemente porque después del ShowModal suele haber un Free (o FreeAndNil). Ahora con el Show hay que eliminar esa línea también.

Tengo puesto un Action = Free en OnClose del formulario, pero no antes. Y eos es lo que me despista.

Angel.Matilla 13-09-2018 18:19:10

Podéis mandarme a hacer gárgaras, que será lo más probable. Por aquello de ir probando y tratando de enterarme de este tema me he creado un proyecto con sólo dos formularios: uno (Unit1) que úncamente tiene un TMainMenu y un segundo con sólo un TLabeledEdit. Compilo y ejecuto y al seleccionar la opción del menú con este código:
Código PHP:

void __fastcall TForm1::Unit21Click(TObject *Sender)
{
     
Application->CreateForm(__classid(TForm2), &Form2);
     
Form2->ShowModal();
     
delete Form2;


me sale este mensaje, aunque se muestra bien el segundo formulario:

ecfisa 13-09-2018 18:48:49

Hola.

No puedes mostrar un formulario MDIChild con ShowModal, debes usar:
Código PHP:

  ...
  
Form2->Show(); //<-
  
... 

Saludos :)

Angel.Matilla 13-09-2018 19:09:43

1 Archivos Adjunto(s)
Cita:

Empezado por ecfisa (Mensaje 528394)
Hola.

No puedes mostrar un formulario MDIChild con ShowModal, debes usar:
Código PHP:

  ...
  
Form2->Show(); //<-
  
... 

Saludos :)

Si lo pongo así no me muestra nada. En el adjunto está el proyecto con el que estoy haciendo pruebas. Está hecho en BCB6

ecfisa 14-09-2018 04:44:15

1 Archivos Adjunto(s)
Hola.

En realidad si lo hace, pero como la línea próxima inmediata es:
Código PHP:

delete Form2

no lo alcanzas a ver.

Eso funciona con las ventanas modales ya que la línea del delete no se ejecuta hasta que no se cierra la ventana modal, pero con las no modales no sucede lo mismo.

Y es más, como los formularios MDIChild deben tener su propiedad Visible verdadera por definición, si los vas creando en tiempo de ejecución no es necesario usar el método Show. Y si están minimizados, basta con que manejes las propiedades WindowState y BringToFront para traerlo al frente.

Hice un simple código-ejemplo de manejo de formularios MDI que te adjunto. Los formularios MDIChild fueron quitados de la lista de auto creación de formularios.


Saludos :)

Pd: (Probado en C++ Builder 6)

Angel.Matilla 14-09-2018 10:04:17

Cita:

Empezado por ecfisa (Mensaje 528403)
Hola.

En realidad si lo hace, pero como la línea próxima inmediata es:
Código PHP:

delete Form2

no lo alcanzas a ver.

¡Perfecto! Muchas gracias ecfisa. No pude probar el código que me enviaste porque me falta un paquete (webdsnap.bpi), pero con las explicaciones que me has dado y el código lo he visto todo mucho más claro.

Angel.Matilla 14-09-2018 12:54:30

Es el problema de aprender a puñetazos, a lo bestia. Con los comentarios y ejemplos que me habéis dado he comprendido muchas cosa pero ahora me está ocurriendo un cosa curiosa. Ejecuto la aplicación y al seleccionar una de las opciones (de momento sólo tengo puesta una), durante un breve periodo de tiempo (menos de un segundo) veo el formulario pero automáticamente se expande para ocupar todo el área de cliente donde ha de abrirse y se "borran" todo los elementos del mismo viéndose solamente el menú que, como en el lanzador, es un TMainMenu. He estado probando con diferentes códigos y propiedades de este segundo formulario pero no soy capaz de encontrar que falla.

Angel.Matilla 15-09-2018 11:23:40

Vale. Ya encontré el por qué me hacía lo que explicaba antes. El formulario MDIChild también tiene un TMainMenu y es lo que provoca que se expanda a todo lo que permite el MDIForm. Buscaremos alternativas. :confused:

ecfisa 16-09-2018 02:04:18

Hola.

Si, lamentablemente sólo puede haber un TMainMenu al mismo tiempo en una aplicación MDI.

En una aplicación en que se me presentó ese problema le dí solución usando el componente TActionMainMenuBar en los formularios MDIChild.

Saludos :)

Angel.Matilla 17-09-2018 09:27:42

Yo lo he resuelto con un TToolBar dado que pueden asociarse los eventos del TMainMenu a cada uno de los botones. Dejo definido el menú pero elimino la propiedad Menu del TForm.


La franja horaria es GMT +2. Ahora son las 03:29:08.

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