TEMA 3. APLICACIONES CON MÚLTIPLES FORMULARIOS 3.1 ... · MenuStrip, bastará con hacer doble clic...

13
3.1 Programación .NET (II). Aplicaciones con múltiples formularios TEMA 3. APLICACIONES CON MÚLTIPLES FORMULARIOS 3.1. INTRODUCCIÓN Ya conocemos los fundamentos del diseño de formularios Windows simples. Sabemos, además, que nuestras aplicaciones pueden tener múltiples formularios o ventanas, que se abrirán desde la ventana inicial de la aplicación bajo demanda del usuario o al darse determinadas condiciones durante la ejecución. En este tema vamos a aprender a crear formularios capaces de contener a otros formularios al estilo de las llamadas aplicaciones de interfaz de múltiples documentos, conocidas como aplicaciones MDI. Ejemplos de este tipo de interfaz son muchos procesadores de textos bajo Windows, o en general, aplicaciones que permiten abrir múltiples documentos a la vez. Esta clase de aplicaciones tiene típicamente un menú para que el usuario navegue cómodamente entre las ventanas secundarias, por lo que también aprenderemos a crear un menú para el formulario principal.

Transcript of TEMA 3. APLICACIONES CON MÚLTIPLES FORMULARIOS 3.1 ... · MenuStrip, bastará con hacer doble clic...

3.1Programación .NET (II). Aplicaciones con múltiples formularios

TEMA 3. APLICACIONES CON MÚLTIPLES FORMULARIOS

3.1. INTRODUCCIÓN

Ya conocemos los fundamentos del diseño de formularios Windows simples.

Sabemos, además, que nuestras aplicaciones pueden tener múltiples

formularios o ventanas, que se abrirán desde la ventana inicial de la aplicación

bajo demanda del usuario o al darse determinadas condiciones durante la

ejecución.

En este tema vamos a aprender a crear formularios capaces de contener a

otros formularios al estilo de las llamadas aplicaciones de interfaz de múltiples

documentos, conocidas como aplicaciones MDI. Ejemplos de este tipo de

interfaz son muchos procesadores de textos bajo Windows, o en general,

aplicaciones que permiten abrir múltiples documentos a la vez.

Esta clase de aplicaciones tiene típicamente un menú para que el usuario

navegue cómodamente entre las ventanas secundarias, por lo que también

aprenderemos a crear un menú para el formulario principal.

Programación .NET (II). Aplicaciones con múltiples formularios3.2

3.2. PREPARACIÓN DE LA VENTANA PRINCIPAL

Las aplicaciones de múltiples formularios se componen de un formularioprincipal o primario, que será el contenedor MDI (padre), y de uno o varios

formularios secundarios (hijos) que se mostrarán siempre contenidos en el

principal.

Supongamos que tenemos creado un nuevo proyecto de Windows Forms tal y

como hemos hecho en anteriores ocasiones. Por ello contamos en nuestra

aplicación con un único formulario “Form1” que se comporta como una ventana

estándar.

¿Cómo transformar esta ventana estándar en una ventana contenedoraMDI?

Es muy sencillo, basta con poner a la propiedad IsMDIContainer del

formulario el valor “True”. Tras hacer esta modificación observamos que el

aspecto del formulario ha cambiado, su fondo ahora es más oscuro.

3.3Programación .NET (II). Aplicaciones con múltiples formularios

Desde el momento que establecemos la propiedad IsMDIContainer de un

formulario a true éste podrá contener tantos formularios como se desee.

También podremos añadir en él controles, como hemos hecho con formularios

estándar. La peculiaridad de estos controles es que permanecerán visibles

siempre por encima de los formularios secundarios que podamos agregar.

Veamos a continuación cómo añadir formularios secundarios al principal.

Programación .NET (II). Aplicaciones con múltiples formularios3.4

3.3. CREACIÓN DE VENTANAS SECUNDARIAS

Los formularios secundarios de un formulario MDI tienen el aspecto de una

ventana estándar. Durante la ejecución será posible variar su tamaño

(maximizarlas, minimizarlas…) y moverlas, pero todo esto estará siempre

limitado al cuerpo de la ventana principal que las contiene.

Es decir, en ningún caso podremos “sacar” una ventana secundaria dela principal.

Igualmente, la vida de la ventana secundaria está ligada a la de la principal y

no al revés, por ello, si cerramos la ventana principal, se cerrarán con ella todas

sus ventanas secundarias.

Si cerramos una ventana secundaria, la principal y otras posibles ventanas

secundarias no se verán afectadas.

3.5Programación .NET (II). Aplicaciones con múltiples formularios

Ahora supongamos que tenemos creado un nuevo proyecto de Windows Forms,

con un formulario vacío llamado “Form1”, como ya viene siendo habitual.

Además, hemos convertido este formulario en un formulario contenedor MDI

(Recuerda: hemos establecido IsMDIContainer a true en la ventana de

propiedades del formulario).

Añadimos un segundo formulario llamado “Form2” (Menú “Proyecto” y “Agregar

Windows Forms…”)

¿Cómo hacer que “Form2” sea un formulario secundario de “Form1”?

En esta ocasión no hay una propiedad en tiempo de diseño que establezca el

“parentesco” de “Form2” respecto a “Form1”. Debemos crear el formulariohijo en tiempo de ejecución.

¿En qué momento creamos el formulario secundario?

En este primer ejemplo lo haremos al iniciar el formulario principal, usaremos

el evento Load de “Form1”. Este evento es el evento principal de los

formularios, luego basta un doble clic sobre el diseño de form1 para crearlo.

Observa el código que hemos añadido en el evento:

Ejemplo:

Private Sub Form1_Load(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles MyBase.Load

'Declaramos una variable de la clase Form2

Dim formulario_hijo As New Form2

'Indicamos quién es el contenedor MDI del formulario

formulario_hijo.MdiParent = Me

formulario_hijo.Show()

End Sub

Programación .NET (II). Aplicaciones con múltiples formularios3.6

El código anterior realiza lo siguiente:

Declara una variable de la clase Form2. Este formulario nos sirve de

modelo al crear el formulario “formulario_hijo”.

Determina quién es el contenedor MDI padre del formulario a través de la

propiedad MdiParent. Como ya hemos dicho, esta propiedad no está

disponible en tiempo de diseño.

En este caso, el fomulario cintenedor es “Form1”, pero al estar implementado

Form1_Load dentro de la declaración de la clase “Form1” nos referimos a él

con “Me”.

Finalmente mostramos el formulario.

“Form2” ha servido de molde para crear un nuevo formulario durante el evento

Load. Por ello, el formulario creado (“formulario_hijo”) tiene las mismas

propiedades que “Form2”, así como los manejadores de eventos y otros

métodos que hayamos podido implementar en “Form2”.

Esto es útil si pretendemos ir añadiendo formularios secundarios iguales al

formulario principal. Partimos de un formulario que hace de modelo (en nuestro

ejemplo “Form2”), cuyos métodos y propiedades modificamos según

necesitemos. Después solo habrá que crear nuevos formularios secundarios de

la clase del formulario modelo (“Form2”).

El sencillo ejemplo que acabamos de ver crea la ventana secundaria

directamente al cargar la principal. Lo normal es crear los formularios

secundarios bajo demanda del usuario. Bastará elegir el evento que provocará

la creación de una nueva ventana. Veremos cómo hacerlo.

A continuación vamos a añadir al formulario principal un menú de opciones que

servirá para que el usuario abra nuevas ventanas secundarias y navegue entre

ellas con facilidad.

3.7Programación .NET (II). Aplicaciones con múltiples formularios

3.4. CREACIÓN DE UN MENÚ DE OPCIONES

El menú es un elemento típico de las aplicaciones de tipo MDI. Facilita que el

usuario tenga siempre visibles y a mano sus opciones dado que, colocado en

la ventana principal, el menú permanece siempre por encima de ventanas

secundarias.

En la sección “Menús y barras de herramientas” del cuadro de herramientas

de nuestro entorno de desarrollo podemos ver diversos controles de gran

utilidad. Nosotros vamos a prestar especial atención a los controles MenuStripy ToolStrip.

En la siguiente imagen puedes ver todos estos controles tal y como aparecen

en el cuadro de herramientas de Visual Basic Express.

Programación .NET (II). Aplicaciones con múltiples formularios3.8

Veamos una pequeña descripción de cada uno de ellos:

ContextMenuStrip

Este control es un menú contextual. Se puede asociar a cualquier control, lo

que provocará que se abra al hacer clic con el botón secundario del ratón sobre

él. Sustituye al control ContextMenu.

Este menú es útil para presentar las opciones específicas o más habituales de

cierto control de forma rápida y accesible.

MenuStrip

MenuStrip representa el menú que habitualmente vemos en las ventanas de

las aplicaciones Windows. Frecuentemente se coloca en la parte superior de la

ventana, aunque podemos ubicarlo en cualquier otra zona.

Sirve para agrupar opciones y comandos de la aplicación por su funcionalidad.

3.9Programación .NET (II). Aplicaciones con múltiples formularios

StatusStrip

Representa la barra de estado que frecuentemente vemos al pie de la

ventana de las aplicaciones para Windows. Sustituye y amplia al control

StatusBar. Permite mostrar en la barra de estado controles como barras de

progreso, etiquetas o listas desplegables entre otros.

Su principal utilidad consiste en mostrar información al usuario.

ToolStrip

Este control es una barra de herramientas. En ella podremos alojar diversos

controles como botones, listas desplegables, cajas de texto, barras de

progreso…

ToolStripContainer

Como su nombre indica, este control es un contenedor de barras de

herramientas. También puede contener controles MenuStrip y StatusStrip.

Es útil cuando nuestra aplicación cuenta con varias barras de herramientas que

nos interesa agrupar y organizar.

Veamos cómo funciona el control MenuStrip. Volvemos al ejemplo anterior y

añadimos un control MenuStrip al formulario principal arrastrándolo desde el

cuadro de herramientas.

Programación .NET (II). Aplicaciones con múltiples formularios3.10

Hemos añadido dos elementos al menú: Ventanas y Salir. Serán controles de

la clase ToolStripMenuItem.

Con el carácter & indicamos cuál será la letra del método abreviado de cada

opción.

Queremos que el elemento del menú "Ventana" muestre una lista de lasventanas secundarias abiertas.

La propiedad MdiWindowListItem del control MenuStrip nos ofrece la

posibilidad de hacerlo de forma automática.

Sólo hay que asignar a esta propiedad el elemento del menú a partir del cual

queremos que se muestre la lista.

La opción "Salir" cerrará el formulario principal. El evento principal de un

elemento del menú es el evento click. Hacemos doblle clic con el ratón para

acceder a su manejador y añadimos el código necesario:

Private Sub SalirToolStripMenuItem_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles SalirToolStripMenuItem.Click

Me.Close()

End Sub

3.11Programación .NET (II). Aplicaciones con múltiples formularios

Añadimos ahora nuestro ejemplo una barra de herramientas o ToolStrip.

La colocamos justo debajo del menú.

Añadimos un botón (Button), será un objeto de la clase ToolStripButton. Este

botón nos va servir para crear nuevas ventanas secundarias.

¿Cómo lo hacemos? En primer lugar, tenemos que crear el manejador para el

evento click de botón. Al igual que ocurría con los elementos del menú

MenuStrip, bastará con hacer doble clic sobre el elemento para crear el

manejador del evento click, dado que es su evento predeterminado.

Ya hemos visto qué código haría falta para crear una ventan secundaria. En el

ejemplo realizado se creaba una ventana secundaria durante carga del

formulario principal (evento Load). Usamos el mismo código en el manejador

que acabamos de crear:

Programación .NET (II). Aplicaciones con múltiples formularios3.12

Así, cada vez que el usuario haga clic en el botón de nuestra barra de

herramientas, se creará una nueva ventana hija de la clase Form2.

Dentro del menú "Ventana" debería aparecer un listado con las ventanas

actualmente abiertas

Private Sub ToolStripButton1_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles ToolStripButton1.Click

Dim formulario_hijo As New Form2

formulario_hijo.MdiParent = Me

formulario_hijo.Show()

End Sub

3.13Programación .NET (II). Aplicaciones con múltiples formularios

Con este menú podremos navegar facilmente entre las ventanas secundarias.

El listado de ventanas activas se mantendrá actualizado automáticamente.