6.1.- ¿QUÉ ES MDI?
Visual Basic permite crear aplicaciones empleando una interfaz de múltiples documentos (MDI - Multiple Document Interface), o dicho en términos de Visual Basic, múltiples formularios. En una aplicación MDI, se pueden abrir varias ventanas hijas. Cada una de estas ventanas hijas (formularios) son iguales entre sí. En una aplicación MDI pueden haber varias ventanas hijas, pero solo una ventana padre por aplicación. El formulario padre actúa como contenedor de los formulario hijo. Muchos procesadores de textos bajo Windows son buenos ejemplos de aplicaciones MDI.
Para crear una aplicación MDI se empezará a crear un nuevo proyecto y, se accede a Insert/MDI Form. El nuevo formulario será el formulario padre. Para que un formulario sea un formulario hijo, se deberá cambiar su propiedad MDIChild y establecerla a True.
Cuando se visualizan varios formulario hijos, todos comparten el mismo código, pero cada uno de ellos guarda sus propios datos y reconoce sus propios sucesos. Según ésto, no se podrá utilizar el identificador del formulario para referirse a los controles o a sus propiedades, aunque sí se podrá utilizar la palabra clave Me.
6.2.- COMPORTAMIENTO DE MENÚS Y BARRAS DE HERRAMIENTAS
Los únicos controles que se pueden incluir en un formulario padre son aquellos que tengan la propiedad Align y, dentro de éstos controles se podrán colocar otros controles. De esta forma se crean las barras de herramientas.
Los menús de cada formulario hijo, son visualizados en el formulario padre. Cada vez que se activa un formulario hijo, su menú sustituye al menú que se esté visualizando en el formulario padre. Ahora bien, si no hay un formulario hijo cargado, o si dicho formulario no tiene menú, entonces se visualiza el del padre, si lo tiene.
Es aconsejable que el formulario padre tenga un menú que permita abrir o crear un nuevo formulario hijo.
6.3.- EVENTO QUERYUNLOAD
Cuando el usuario ejecuta la orden Cerrar del menú de control del formulario padre, Visual Basic intenta descargar dicho formulario. Esto hace que se dé el suceso QueryUnload primero para el formulario padre y luego para cada uno de los hijos.
Cuando el usuario ejecuta la orden Cerrar del menú de control del formulario hijo también se da el suceso QueryUnload pero solo para este formulario.
La sentencia Unload permite descargar un formulario o un control de la memoria, pero antes de que el formulario sea descargado, se da el suceso QueryUnload, seguido del suceso Unload. El suceso QueryUnload para un formulario MDI va seguido del suceso QueryUnload para cada uno de los formularios hijo.
EJEMPLO:
Vamos a construir una aplicación que permita crear varios formularios hijo. Para ello, se necesitará crear un nuevo proyecto con un formulario MDI y, un formulario hijo, al que se le haya establecido su propiedad Caption a Formulario Hijo y su propiedad Name a frmHijo. Al formulario padre se le añadirá un menú Archivo con los comandos Nuevo y Salir. Se añadirá el menú Ventana con la propiedad Window List activada y, con las opciones Cascada, Mosaico y Organizar iconos. También se le añadirá un control 3D panel, seleccionando Tools/Custom Controls. A dicho control se le modificará las propiedades Align con 2 - Align Bottom, BevelInner con 1 - Inset, BevelWidth con 2 y, BordeWidth con 2. Dentro de este control se añadirán dos etiquetas: lblTexto y lblContador.
En un nuevo módulo:
Public Contador As Integer
En el formulario padre:
Private Sub mnuArchivoNuevo_Click()
Dim X As New frmHijo
Contador = Contador + 1
X.Show
End Sub
Private Sub mnuArchivoSalir_Click()
End
End Sub
Private Sub mnuVentanaCascada_Click()
MDIForm1.Arrange 0
End Sub
Private Sub mnuVentanaMosaico_Click()
MDIFomr1.Arrange 1
End Sub
Private Sub mnuVentanaOrganizar_Click()
MDIFomr1.Arrange 3
End Sub
Private Sub MDIForm_Initialize()
Contador = 0
lblContador = Str(Contador)
End Sub
En el formulario hijo:
Private Sub Form_Initialize()
Me.Caption = Me.Caption & " #" & Str(Contador)
MDIForm1.lblContador = Str(Contador)
End Sub
Private Sub Form_Unload(Cancel As Integer)
‘Si el valor de Cancel es True, el formulario asociado no se descarga.
‘En otro caso, se van cerrando primero cada hijo y, por último el padre.
Contador = Contador - 1
MDIForm1.lblContador = Str(Contador)
End Sub
EJERCICIOS: