Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-09-2018
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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?
Responder Con Cita
  #2  
Antiguo 13-09-2018
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 13-09-2018
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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?
Responder Con Cita
  #4  
Antiguo 13-09-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Un MDIchild necesita un MDIform.
Todo o demás es independiente.
Responder Con Cita
  #5  
Antiguo 13-09-2018
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 13-09-2018
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Angel.Matilla Ver Mensaje
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.

Posiblemente porque después del ShowModal suele haber un Free (o FreeAndNil). Ahora con el Show hay que eliminar esa línea también.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
Antiguo 13-09-2018
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
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.
Responder Con Cita
  #8  
Antiguo 13-09-2018
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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:
Responder Con Cita
  #9  
Antiguo 13-09-2018
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

No puedes mostrar un formulario MDIChild con ShowModal, debes usar:
Código PHP:
  ...
  
Form2->Show(); //<-
  
... 
Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #10  
Antiguo 13-09-2018
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
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
Archivos Adjuntos
Tipo de Archivo: rar Prueba.rar (12,4 KB, 4 visitas)
Responder Con Cita
  #11  
Antiguo 14-09-2018
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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)
Archivos Adjuntos
Tipo de Archivo: zip AMatilla_MDI.zip (484,0 KB, 4 visitas)
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #12  
Antiguo 14-09-2018
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
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.
Responder Con Cita
  #13  
Antiguo 14-09-2018
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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.
Responder Con Cita
  #14  
Antiguo 15-09-2018
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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.
Responder Con Cita
  #15  
Antiguo 16-09-2018
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #16  
Antiguo 17-09-2018
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
MDI Child que contengo Otros MDI child. Enan0 Varios 2 03-11-2012 01:24:14
Como funcionan los campos con formulas? Alexandro Conexión con bases de datos 1 04-03-2009 10:54:29
Como funcionan los ReportBuilder? Irina Impresión 1 17-06-2007 01:16:52
Como cargar un MDI Child de Delphi en un MDI Form de VC++ onlytk Varios 0 10-12-2006 04:15:31


La franja horaria es GMT +2. Ahora son las 01:07:40.


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
Copyright 1996-2007 Club Delphi