Está en la página 1de 40

Formularios de interfaz mltiple (MDI)

Aplicaciones de estilo SDI


Una aplicacin de tipo o estilo SDI (Single Document Interface), Interfaz de Documento Sencillo, est
compuesta fundamentalmente de un nico formulario, a travs del cual, el usuario realiza toda la
interaccin con el programa. Como ejemplos de este tipo de aplicacin tenemos el Bloc de Notas o la
Calculadora de Windows.
Un programa SDI puede tener ms de un formulario, aunque no sea algo habitual. Cuando eso ocurre,
los formularios se ejecutan independientemente, sin un elemento contenedor que los organice.
Aplicaciones de estilo MDI
Una aplicacin de tipo o estilo MDI (Multiple Document Interface), Interfaz de Documento Mltiple,
se compone de un formulario principal, tambin denominado formulario MDI, que actuar como
contenedor de otros formularios (documentos) abiertos durante el transcurso del programa,
denominados formularios hijos o secundarios MDI. Como ejemplos de este tipo de aplicacin tenemos
PowerPoint o Access.
A diferencia de lo que ocurra en versiones anteriores de VB, un formulario MDI admite los mismos
controles que un formulario normal, aunque dada su orientacin de formulario contenedor, se
recomienda limitar los controles en un MDI a los estrictamente necesarios. El men es el ejemplo ms
identificativo de control idneo para un formulario MDI, ya que a travs de sus opciones, podremos
abrir los formularios hijos de la aplicacin.
Programacin con Visual Basic .NET Grupo EIDOS
602
Seguidamente describiremos el proceso de creacin de un proyecto que contenga un formulario MDI y
dos formularios hijos, as como el comportamiento de estos ltimos cuando son abiertos dentro del
formulario padre MDI. Este ejemplo tiene el nombre MDIPru, y se debe hacer clic aqu para acceder
al mismo.
Una vez creado el nuevo proyecto, cambiaremos el nombre del formulario por defecto a frmPrincipal.
Para conseguir que este formulario tenga el comportamiento de un contenedor MDI, debemos asignar
el valor True a su propiedad IsMdiContainer. Tambin debemos establecer a este formulario como
inicial en las propiedades del proyecto.
Ahora pasaremos a la creacin de los formularios hijos del MDI. El primero, frmCarta, permite la
escritura en un TextBox multilnea, cuyo contenido podremos grabar a un archivo en disco. La Figura
291 muestra este formulario.
Figura 291. Formulario hijo de MDI para escribir un texto largo.
El cdigo del botn que realiza la grabacin del texto lo podemos ver en el Cdigo fuente 497.
Debemos importar el espacio de nombres System.IO, ya que en esta clase del formulario hacemos uso
de los tipos File y StreamWriter.

Private Sub btnGrabar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnGrabar.Click

' escribir en un archivo el contenido
' del TextBox
Dim oEscritor As StreamWriter
oEscritor File.CreateText(Me.txtArchivo.Text)
oEscritor.Write(Me.txtCarta.Text)
oEscritor.Close()

End Sub

Cdigo fuente 497
Grupo EIDOS 33. Formularios de interfaz mltiple (MDI)
603
El otro formulario hijo, frmInfo, muestra la fecha y hora actual; esta ltima es actualizada a travs del
control Timer tmrTiempo. Ver la Figura 292.
Figura 292. Formulario hijo de MDI para mostrar fecha y hora actuales.
El Cdigo fuente 498 muestra las instrucciones que se ejecutan en el evento Tick del control Timer.

Private Sub tmrTiempo_Tick(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles tmrTiempo.Tick

Dim dtFecha As Date
dtFecha DateTime.Today
Dim dtHora As Date
dtHora DateTime.Now

Me.lblFecha.Text dtFecha.ToString("d/MMM/yyyy")
Me.lblHora.Text dtHora.ToString("h.m.s")

End Sub

Cdigo fuente 498
El siguiente paso consiste en crear un men para poder abrir los formularios hijos a travs de sus
opciones. Ver Figura 293.
Figura 293. Men del formulario MDI.
En las opciones Carta e Informacin del men, instanciaremos un objeto del formulario
correspondiente, teniendo en cuenta que para conseguir que dichos formularios se comporten como
hijos del MDI, debemos asignar a su propiedad MdiParent, la instancia actual del formulario en
ejecucin, es decir, Me. Veamos este punto en el Cdigo fuente 499.
Programacin con Visual Basic .NET Grupo EIDOS
604

Private Sub mnuCarta_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuCarta.Click

Dim ofrmCarta As New frmCarta()
' con la siguiente linea conseguimos que el
' formulario se comporte como hijo del actual
ofrmCarta.MdiParent Me
ofrmCarta.Show()

End Sub

Private Sub mnuInformacion_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuInformacion.Click

Dim ofrmInfo As New frmInfo()
' con la siguiente linea conseguimos que el
' formulario se comporte como hijo del actual
ofrmInfo.MdiParent Me
ofrmInfo.Show()

End Sub

Cdigo fuente 499
En la Figura 294 mostramos el formulario MDI en ejecucin, conteniendo a los formularios hijos
dependientes.
Figura 294. Aplicacin MDI en ejecucin.
Creacin de mens de tipo Ventana, en formularios MDI
Es probable que el lector haya observado, en algunas aplicaciones Windows de tipo MDI, que existe
en la barra de mens de la ventana principal, un men con el nombre Ventana o Window (depende del
Grupo EIDOS 33. Formularios de interfaz mltiple (MDI)
605
idioma del programa), que nos muestra los nombres de los formularios hijos abiertos, permitindonos
cambiar de formulario activo al seleccionar una de esas opciones.
En nuestras aplicaciones MDI tambin podemos disponer de un men de este tipo, aadiendo una
nueva opcin al men principal del formulario MDI, y asignando a su propiedad MdiList el valor
True.
Adicionalmente, y para darle un aspecto ms profesional a este men, podemos aadir los MenuItem
correspondientes a la organizacin de los formularios hijos en Cascada, Mosaico Horizontal, etc. Para
organizar los formularios abiertos en la aplicacin en alguno de estos modos, deberemos ejecutar el
mtodo LayoutMdi( ) del formulario MDI, pasndole como parmetro uno de los valores
correspondiente a la enumeracin MdiLayout. El Cdigo fuente 500 muestra las opciones
correspondientes a la organizacin en cascada y en mosaico horizontal de nuestro ejemplo.

Private Sub mnuCascada_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuCascada.Click

Me.LayoutMdi(MdiLayout.Cascade)

End Sub

Private Sub mnuHorizontal_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuHorizontal.Click

Me.LayoutMdi(MdiLayout.TileHorizontal)

End Sub

Cdigo fuente 500
La Figura 295 muestra el mencionado men Ventana de este proyecto, en cual contiene en este caso
los nombres de los formularios abiertos que acaban de ser organizados en mosaico vertical.
Figura 295. Men ventana en formulario MDI.
Programacin con Visual Basic .NET Grupo EIDOS
606
Bloqueo de opciones de men en formularios MDI
En la aplicacin de ejemplo que estamos desarrollando, podemos abrir tantas copias de los formularios
hijos como necesitemos.
Respecto al formulario que nos permite escribir un texto para grabar a un archivo, es til poder tener
varios formularios de este tipo, ya que podemos trabajar con diversos archivos a la vez.
Del formulario hijo que muestra la fecha y hora actual sin embargo, tener ms de una copia no parece
algo muy lgico, ya que se trata simplemente de disponer de una informacin visualizada, y repetirla a
travs de la apertura de varios formularios iguales no tiene mucho sentido.
Para conseguir que de un determinado formulario hijo slo podamos abrir una instancia, debemos
hacer dos cosas: en primer lugar, en el manipulador de evento correspondiente a la opcin de men
que abre dicho formulario, asignaremos False a la propiedad True de la mencionada opcin de men.
Vemoslo en el Cdigo fuente 501.

Private Sub mnuInformacion_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuInformacion.Click

' deshabilitamos esta opcin de men
Me.mnuInformacion.Enabled False ' <-----

Dim ofrmInfo As New frmInfo()
' con la siguiente linea conseguimos que el
' formulario se comporte como hijo del actual
ofrmInfo.MdiParent Me
ofrmInfo.Show()

End Sub

Cdigo fuente 501
En segundo lugar, dentro del cdigo del formulario hijo, en nuestro caso frmInfo, debemos escribir el
manipulador para el evento Closed del formulario. Este evento se produce cuando se ha cerrado el
formulario, por lo que desde aqu volveremos a activar la opcin de men del formulario padre, que
habamos deshabilitado.
Para acceder desde un formulario hijo a su MDI contenedor, disponemos de la propiedad MdiParent,
que nos devuelve una referencia de dicho formulario padre. Observe el lector en el Cdigo fuente 502,
cmo adems de utilizar la mencionada propiedad, la potencia de la funcin CType( ) nos permite en
una sola lnea de cdigo, llevar a cabo esta accin.

' al cerrar este formulario, activamos de nuevo
' la opcin de men del formulario padre que
' permite crear instancias de este formulario
Private Sub frmInfo_Closed(ByVal sender As Object, ByVal e As System.EventArgs)
Handles MyBase.Closed

' utilizando la funcin CType(), moldeamos
' la propiedad MdiParent del formulario al tipo
' correspondiente a la clase del formulario MDI,
' con ello obtenemos acceso a sus miembros, y en
' particular a la opcin de men que necesitamos
Grupo EIDOS 33. Formularios de interfaz mltiple (MDI)
607
' habilitar
CType(Me.MdiParent, frmPrincipal).mnuInformacion.Enabled True

End Sub

Cdigo fuente 502
La Figura 296 muestra el resultado al ejecutar. Mientras que el formulario de informacin est abierto,
su opcin de men en el MDI estar deshabilitada.
Figura 296. Opcin de formulario hijo deshabilitada.
Recorrer los formularios hijos de un MDI
La clase Form tiene la propiedad MdiChildren, que devuelve un array con todos los formularios hijos
abiertos hasta el momento.
Esto nos permite recorrer todo este conjunto de formularios para realizar operaciones con alguno de
ellos o todos.
El Cdigo fuente 503 muestra un ejemplo de uso de esta propiedad, en el que mostramos el ttulo de
cada formulario hijo, y adems, cambiamos su color de fondo.

Dim oFormHijos() As Form
oFormHijos Me.MdiChildren

Dim oForm As Form
For Each oForm In oFormHijos
MessageBox.Show("Titulo de ventana. " & oForm.Text)
oForm.BackColor Color.Beige
Next

Cdigo fuente 503
Programacin con Visual Basic .NET Grupo EIDOS
608
Comportamiento No Modal (Modeless) de formularios
Un formulario de comportamiento no modal, permite el libre cambio de foco entre el resto de
formularios de la aplicacin.
Una clara muestra la hemos visto en el proyecto de ejemplo realizado durante los ltimos apartados
del texto. En dicha aplicacin, podamos abrir varios formularios hijos dentro del formulario MDI
principal, y pasar de uno a otro sin restricciones.
Otra caracterstica de los formularios no modales reside en que una vez creados y visualizados, el resto
del cdigo de la aplicacin contina su ejecucin. Ver Cdigo fuente 504.

Dim ofrmCarta As New frmCarta()
' crear formulario hijo de un mdi
ofrmCarta.MdiParent Me
ofrmCarta.Show()

' despus de mostrar el formulario hijo
' se muestra a continuacin este mensaje
MessageBox.Show("Se acaba de abrir un formulario hijo")

Cdigo fuente 504
Comportamiento Modal de formularios
Como contrapartida al anterior apartado tenemos los formularios de comportamiento modal, tambin
denominados cuadros o ventanas de dilogo.
Un formulario modal, al ser visualizado, bloquea el paso a otros formularios de la aplicacin hasta que
no es cerrado (aceptado o completado) por el usuario.
Como ejemplo de estos formularios se acompaa el proyecto FormDialogos (hacer clic aqu para
acceder al ejemplo), del que pasamos a describir su proceso de creacin.
Este proyecto contiene un formulario MDI llamado frmPrincipal, y uno hijo con el nombre frmHijo,
que abrimos mediante una opcin de men; la creacin de este tipo de formularios se ha descrito en
apartados anteriores.
A continuacin aadimos un nuevo formulario al proyecto con el nombre frmDialogo, que tambin
abriremos a travs de la correspondiente opcin de men del formulario MDI.
Para que este formulario tenga un comportamiento modal, debemos mostrarlo ejecutando el mtodo
ShowDialog( ) de la clase Form. En el Cdigo fuente 505 tenemos las instrucciones necesarias.
Observe tambin el lector, cmo hasta que el formulario de dilogo no es cerrado, no se mostrar el
mensaje que hay a continuacin de la llamada a ShowDialog( ). Si adems intentamos pasar al
formulario hijo, en el caso de que est abierto, no podremos.

Private Sub mnuDialogo_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuDialogo.Click

' instanciar el formulario que mostraremos como un dilogo
Dim ofrmDialogo As New frmDialogo()
Grupo EIDOS 33. Formularios de interfaz mltiple (MDI)
609
' dar una posicin al formulario
ofrmDialogo.StartPosition FormStartPosition.CenterParent
' mostrarlo de forma modal, como cuadro de dilogo
ofrmDialogo.ShowDialog()

MessageBox.Show("Se ha cerrado el dilogo")

End Sub

Cdigo fuente 505
Para cerrar un formulario modal podemos, al igual que para cualquier formulario, ejecutar su mtodo
Close( ). No obstante, un formulario de dilogo suele proporcionar, aunque esto no es obligatorio, los
tpicos botones para aceptar, cancelar, reintentar, etc.; de modo que una vez cerrado el formulario,
podamos averiguar qu botn puls el usuario.
Podemos proporcionar este comportamiento en nuestros formularios modales, asignando a la
propiedad DialogResult de la clase Form, uno de los valores del tipo enumerado DialogResult. Esto
tendr como efecto adicional el cierre del cuadro de dilogo.
Por lo tanto, vamos a aadir a nuestro formulario frmDialogo, dos controles Button: btnAceptar y
btnCancelar, en los que escribiremos las instrucciones del Cdigo fuente 506.

Private Sub btnAceptar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnAceptar.Click

' asignar un valor a esta propiedad,
' cierra al mismo tiempo el formulario
Me.DialogResult DialogResult.OK

End Sub

Private Sub btnCancelar_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Handles btnCancelar.Click

' asignar un valor a esta propiedad,
' cierra al mismo tiempo el formulario
Me.DialogResult DialogResult.Cancel

End Sub

Cdigo fuente 506
Como ayuda en la construccin de formularios modales de dilogo, la clase Form dispone de las
propiedades AcceptButton y CancelButton, a las que podemos asignar sendos controles Button que
sern ejecutados al pulsar las teclas [INTRO] y [ESCAPE] respectivamente.
Esto es lo que haremos en el formulario frmDialogo, asignando a AcceptButton el control btnAceptar,
y en CancelButton asignaremos btnCancelar.
Finalmente, en el evento de la opcin de men que abre este formulario modal, correspondiente a
frmPrincipal, aadiremos, tras la llamada a ShowDialog( ), el cdigo que comprobar el resultado de
la ejecucin del formulario de dilogo. Ver el Cdigo fuente 507.
Programacin con Visual Basic .NET Grupo EIDOS
610

Private Sub mnuDialogo_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuDialogo.Click

' instanciar el formulario que mostraremos como un dilogo
Dim ofrmDialogo As New frmDialogo()
' dar una posicin al formulario
ofrmDialogo.StartPosition FormStartPosition.CenterParent
' mostrarlo de forma modal, como cuadro de dilogo
ofrmDialogo.ShowDialog()

' comprobar lo que ha hecho el usuario
' en el cuadro de dilogo
Dim Resultado As DialogResult
Resultado ofrmDialogo.DialogResult
If Resultado DialogResult.OK Then
MessageBox.Show("Datos del dilogo. " & _
ofrmDialogo.txtNombre.Text & " " & _
ofrmDialogo.txtApellidos.Text)

Else
MessageBox.Show("Se ha cancelado el dilogo")
End If

End Sub

Cdigo fuente 507
La Figura 297 muestra el programa en ejecucin. Como puede comprobar el lector, el formulario
modal, debido a su comportamiento, no se encuentra limitado a los bordes del formulario MDI; pero
depende de este ltimo, ya que si intentamos pasar el foco a un formulario hijo, no podremos.
Figura 297. Formulario modal de dilogo en ejecucin.
Grupo EIDOS 33. Formularios de interfaz mltiple (MDI)
611
Controles de cuadros de dilogo del sistema
Del conjunto de controles que nos ofrece la ventana Cuadro de herramientas del IDE, existe un grupo
que nos permite el acceso a los cuadros de dilogo estndar del sistema operativo, esto es, los cuadros
de seleccin de color, tipo de letra o fuente, apertura-grabacin de archivo, etc.
Para ilustrar el uso de algunos de estos controles, vamos a crear un proyecto de ejemplo con el nombre
DialogosSistema (hacer clic aqu para acceder al ejemplo), en el que describiremos su modo de uso en
los aspectos de diseo y codificacin.
Crearemos pues, un nuevo proyecto de tipo aplicacin Windows, y en su formulario, insertaremos un
men, aadiendo las siguientes opciones: Abrir, Guardar, Color y Fuente. Cada opcin mostrar un
tipo de dilogo del sistema.
Seguidamente insertaremos un TextBox, que acoplaremos con la propiedad Dock a todo el espacio del
formulario, y que nos servir como base para las operaciones a realizar mediante los controles de
dilogo. La Figura 298 muestra el aspecto de este formulario.
Figura 298. Formulario de pruebas para controles de dilogo estndar.
Una vez dibujado un control de cuadro de dilogo en el formulario, dicho control quedar ubicado en
el panel de controles especiales, al igual que sucede con los mens. Para abrir un control de este tipo
en tiempo de ejecucin, emplearemos su mtodo ShowDialog( ).
A continuacin describiremos cada uno de los controles de dilogo utilizados en este ejemplo.
ColorDialog
Este control muestra el cuadro de dilogo del sistema para la seleccin de colores. Entre sus
propiedades podemos destacar las siguientes.
Color. Contiene un tipo de la estructura Color, que nos permite obtener el color seleccionado
por el usuario mediante este cuadro de dilogo, para poder aplicarlo sobre alguno de los
elementos del formulario.
Programacin con Visual Basic .NET Grupo EIDOS
612
AllowFullOpen. Contiene un valor lgico que permite habilitar y deshabilitar el botn que
muestra el conjunto de colores personalizados del cuadro de dilogo de seleccin de colores.
Al seleccionar en el formulario, la opcin de men Color, ejecutaremos el Cdigo fuente 508 que nos
permitir, utilizando el control dlgColor, de tipo ColorDialog, elegir un color y aplicarlo a la
propiedad BackColor, del control TextBox.

Private Sub mnuColor_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuColor.Click

Me.dlgColor.ShowDialog()
Me.txtTexto.BackColor Me.dlgColor.Color

End Sub

Cdigo fuente 508
La Figura 299 muestra esta aplicacin con el formulario y el cuadro de seleccin de color abiertos.
Figura 299. Cuadro de dilogo estndar para seleccin de colores.
FontDialog
Este control muestra el cuadro de dilogo del sistema para la seleccin del tipo de fuente. Entre sus
propiedades podemos destacar las siguientes.
Font. Contiene un tipo de la clase Font. Una vez seleccionada una fuente por el usuario en el
cuadro de dilogo, podremos cambiar el fuente de los controles del formulario.
ShowApply. Contiene un valor lgico que permite mostrar-ocultar el botn Aplicar, que nos
permitir asignar el tipo de letra sin cerrar el dilogo. Al pulsar este botn se desencadenar el
Grupo EIDOS 33. Formularios de interfaz mltiple (MDI)
613
evento Apply de este control de dilogo, en el que podremos escribir el cdigo necesario para
aplicar la nueva fuente seleccionada.
Al seleccionar en el formulario la opcin de men Fuente, ejecutaremos el Cdigo fuente 509 que nos
permitir, utilizando el control dlgFuente, de tipo FontDialog, elegir un tipo de letra, y aplicarlo a la
propiedad Font del control TextBox; con la particularidad de que el cambio de letra lo haremos tanto
al pulsar el botn Aceptar, como Aplicar del cuadro de dilogo.

' al hacer clic en este men, mostramos el cuadro
' de seleccin de fuente
Private Sub mnuFuente_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuFuente.Click

Me.dlgFuente.ShowApply True
Me.dlgFuente.ShowDialog()
Me.AplicarFuente()

End Sub

' este mtodo cambia el fuente del TextBox
Private Sub AplicarFuente()

Me.txtTexto.Font Me.dlgFuente.Font

End Sub

' al pulsar el botn Aplicar del dilogo de
' seleccin de fuente, se produce este evento
Private Sub dlgFuente_Apply(ByVal sender As Object, ByVal e As System.EventArgs)
Handles dlgFuente.Apply

Me.AplicarFuente()

End Sub

Cdigo fuente 509
La Figura 300 muestra el cambio de fuente sobre el texto del formulario.
Figura 300. Cuadro de dilogo del sistema para seleccin de tipo de letra.
Programacin con Visual Basic .NET Grupo EIDOS
614
SaveFileDialog
Este control muestra el cuadro de dilogo del sistema, mediante el que escribimos un nombre de
archivo, y elegimos un directorio, sobre el cual grabaremos informacin.
Es importante precisar que el control no se ocupa del proceso de grabacin de datos; su cometido es el
permitirnos navegar por la estructura del sistema de archivos del equipo, y la seleccin de un nombre
para el archivo a grabar.
Entre las propiedades del control, podemos destacar las siguientes.
Title. Contiene una cadena con el ttulo que aparecer en el cuadro de dilogo.
InitialDirectory. Ruta inicial que mostrar el control al abrirse.
Filter. Cadena con el tipo de archivos que mostrar el cuadro de dilogo al navegar por el
sistema de archivos. El formato de esta cadena es el siguiente: NombreArchivo
(*.Extensin)|*.Extensin; pudiendo situar varios filtros separados por el carcter de barra
vertical ( | ).
FilterIndex. Nmero que corresponde a alguno de los tipos de archivo establecidos en la
propiedad Filter.
FileName. Nombre del archivo en el que se realizar la escritura
DefaultExt. Cadena con la extensin por defecto a aplicar sobre el nombre del archivo.
CheckFileExists. Valor lgico que nos permite comprobar si el archivo sobre el que vamos a
grabar ya existe.
ValidateNames. Valor lgico que comprobar si el nombre de archivo proporcionado
contiene caracteres especiales, es decir, si se trata de un nombre vlido.
Al seleccionar en el formulario la opcin de men Grabar, ejecutaremos el Cdigo fuente 510, que nos
permitir, utilizando el control dlgGrabar, de tipo SaveFileDialog, seleccionar el nombre de un
archivo, y grabar el TextBox del formulario sobre el mismo, mediante un StreamWriter.

Private Sub mnuGuardar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuGuardar.Click

' configurar por cdigo el dilogo de grabacin de archivos
Me.dlgGrabar.Filter "Documento (*.doc)|*.doc|Texto (*.txt)|*.txt"
Me.dlgGrabar.FilterIndex ?
Me.dlgGrabar.ValidateNames True

Me.dlgGrabar.ShowDialog() ' abrir el cuadro de dilogo

' si todo es correcto, escribir mediante un objeto Stream
' el contenido del TextBox en el archivo indicado por
' las propiedades del cuadro de dilogo
Dim swEscritor As IO.StreamWriter
swEscritor New IO.StreamWriter(Me.dlgGrabar.FileName)
swEscritor.Write(Me.txtTexto.Text)
swEscritor.Close()

MessageBox.Show("Texto grabado en archivo")
Grupo EIDOS 33. Formularios de interfaz mltiple (MDI)
615

End Sub

Cdigo fuente 510
La Figura 301 muestra el cuadro de dialogo de grabacin de archivo.
Figura 301. Cuadro de dilogo para la grabacin de archivos.
OpenFileDialog
Este control muestra el cuadro de dilogo del sistema, mediante el que seleccionamos un archivo para
poder abrirlo posteriormente, y realizar sobre el mismo operaciones de lectura-escritura.
Al igual que en el control anterior, la lectura y escritura de informacin es algo que deberemos realizar
por cdigo, una vez que hayamos elegido el archivo mediante este cuadro de dilogo
Las propiedades de este control son prcticamente las mismas que las de SaveFileDialog, con algunas
excepciones como las siguientes.
Multiselect. Contiene un valor lgico, que nos permitir la seleccin de mltiples archivos.
ShowReadOnly. Permite mostrar la casilla de verificacin para mostrar los archivos de slo
lectura.
ReadOnlyChex. Permite obtener y establecer el valor para la casilla de verificacin de slo
lectura del cuadro de dilogo.
Al seleccionar en el formulario la opcin de men Abrir, ejecutaremos el Cdigo fuente 511, que nos
permitir, utilizando el control dlgAbrir, de tipo OpenFileDialog, seleccionar un archivo existente, y
pasar su contenido al TextBox del formulario, utilizando un StreamReader.
Programacin con Visual Basic .NET Grupo EIDOS
616

Private Sub mnuAbrir_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuAbrir.Click

' configurar el cuadro de dilogo por cdigo
Me.dlgAbrir.Title "Seleccionar archivo a leer"
Me.dlgAbrir.InitialDirectory "C.\CUBO"
Me.dlgAbrir.Filter "Cdigo fuente (*.vb)|*.vb|Texto (*.txt)|*.txt"

' abrir el dilogo
Me.dlgAbrir.ShowDialog()

' si se han seleccionado varios archivos
' mostrar su nombre
If Me.dlgAbrir.FileNames.Length > I Then
Dim sArchivo As String
For Each sArchivo In Me.dlgAbrir.FileNames
MessageBox.Show("Archivo seleccionado. " & sArchivo)
Next
End If

' abrir el primer archivo con un Stream
' y volcarlo al TextBox
Dim srLector As New IO.StreamReader(Me.dlgAbrir.FileName)
Me.txtTexto.Text srLector.ReadToEnd()

End Sub

Cdigo fuente 511
La Figura 302 muestra este cuadro de dilogo en ejecucin
Figura 302. Cuadro de dilogo de apertura de archivos.
Formularios dependientes y controles
avanzados
Formularios dependientes y fijos en primer plano
Un formulario dependiente, tambin denominado owned form, consiste en un formulario que es
abierto por otro, denominado formulario dueo (owner form), permaneciendo ambos abiertos, sin que
el formulario dependiente requiera ser cerrado, en el caso de que necesitemos pasar el foco al
formulario dueo.
No necesitamos ir muy lejos para encontrar un ejemplo de este tipo de formularios, en el propio IDE
de Visual Studio tenemos muchos casos. En la ventana del editor de cdigo, cuando abrimos la
ventana de bsqueda de texto tecleando [CTRL + F], quedan ambas visibles en todo momento, aunque
no efectuemos ninguna bsqueda y el foco lo tengamos en el editor de cdigo. En este caso, la ventana
Buscar es dependiente de la ventana del editor de cdigo. Ver Figura 303.
Este comportamiento en los formularios contrasta claramente con el que tienen los formularios de
dilogo, en los cuales, hasta que no es cerrado el dilogo, no podemos retornar el foco a la ventana que
abri el dilogo.
En versiones anteriores de VB, conseguir un formulario con tal funcionamiento era una ardua tarea,
que requera de conocimientos sobre el API de Windows; sin embargo, el nuevo motor de formularios
de la plataforma .NET, nos permite a travs de una serie de propiedades, que la configuracin de
formularios dependientes sea un trabajo realmente fcil y rpido de conseguir.
Programacin con Visual Basic .NET Grupo EIDOS
618
Figura 303. Editor de cdigo de Visual Studio con ventana de bsqueda.
Por otra parte, un formulario fijo en primer plano, tambin denominado topmost form, consiste en un
formulario que siempre aparece en primer plano respecto al resto de formularios de la aplicacin. Se
trata de una ligera variacin de comportamiento respecto al formulario dependiente; mientras que este
ltimo, en algunas ocasiones puede ser tapado por otros formularios del programa, un formulario
topmost siempre permanece visible en primer plano.
Para ilustrar el modo de creacin y funcionamiento de este tipos de formularios, se acompaa el
proyecto de ejemplo FormDependiente (hacer clic aqu para acceder al ejemplo), del que
comentaremos los pasos principales para su creacin.
Una vez creado este proyecto, eliminaremos su formulario por defecto, y aadiremos el formulario
frmPrincipal, que configuraremos como contenedor MDI, y al que aadiremos un men que nos
permitir abrir un formulario hijo para escribir un texto, y otro de dilogo para mostrar un literal. La
Figura 304 muestra esta ventana MDI de la aplicacin.
Figura 304. Formulario MDI para el ejemplo con formularios dependientes.
Grupo EIDOS 34. Formularios dependientes y controles avanzados
619
El siguiente paso consistir en crear el formulario frmCarta, que utilizaremos para abrir los
formularios dependientes que crearemos posteriormente en este proyecto. La Figura 305 muestra este
formulario.
Figura 305. Formulario para escribir un texto y abrir formularios dependientes.
El Cdigo fuente 512 muestra el cdigo del men de frmPrincipal que instancia este objeto y lo
muestra como formulario hijo del MDI.

Private Sub mnuCarta_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuCarta.Click

' este formulario se abre como hijo del MDI
Dim ofrmCarta As New frmCarta()
ofrmCarta.MdiParent Me
ofrmCarta.Show()

End Sub

Cdigo fuente 512
A continuacin agregaremos al proyecto el formulario frmBuscar. Este formulario actuar como
dependiente de frmCarta, permitindonos buscar una cadena en el TextBox de este ltimo. La Figura
306 muestra el aspecto de frmBuscar. Aunque no sera necesario, para adaptarlo mejor a su
funcionamiento, hemos variado mediante la propiedad FormBorderStyle, el estilo de su borde a
ventana de herramientas con el valor FixedToolWindow.
Para conseguir que frmBuscar se comporte como formulario dependiente, al pulsar dentro de frmCarta
el botn Buscar, instanciaremos un objeto frmBuscar, aadindolo a la coleccin de formularios
dependientes de frmCarta mediante el mtodo AddOwnedForm( ), de la clase Form. El Cdigo fuente
513 muestra el cdigo del botn Buscar en el formulario frmCarta.
Programacin con Visual Basic .NET Grupo EIDOS
620
Figura 306. Formulario dependiente frmBuscar.

Private Sub btnBuscar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnBuscar.Click

' crear un objeto frmBuscar
Dim ofrmBuscar As New frmBuscar()

' establecer dependencia entre forms
Me.AddOwnedForm(ofrmBuscar)
ofrmBuscar.Show()

End Sub

Cdigo fuente 513
Podemos eliminar la asociacin entre un formulario propietario y uno dependiente mediante el mtodo
RemoveOwnedForm( ) en el formulario propietario. Esto no quiere decir que el formulario
dependiente sea eliminado, simplemente se elimina su dependencia con respecto al propietario.
En lo que respecta al cdigo de frmBuscar, al pulsar su botn Buscar, buscamos el contenido del
control txtBuscar en el formulario propietario frmCarta.
Si la bsqueda tiene xito, seleccionamos el texto encontrado dentro del propietario. La propiedad
Owner del formulario nos devuelve una referencia del propietario, mientras que para manipular los
controles de dicho propietario, realizaremos un moldeado de tipo o type casting sobre Owner
utilizando la funcin CType( ) (observe el lector de nuevo, la enorme potencia que encierra esta
funcin).
Adems mostramos una etiqueta en el formulario dependiente, que slo se visualizar al localizar el
texto; cuando volvamos a escribir de nuevo texto a buscar, se ocultar dicha etiqueta. El Cdigo fuente
514 muestra los mtodos de frmBuscar que llevan a cabo estas labores.

' al pulsar este botn, buscamos en el formulario
' propietario de este dependiente
Private Sub btnBuscar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnBuscar.Click

Dim iResultadoBuscar As Integer
' la propiedad Owner contiene el formulario propietario
iResultadoBuscar CType(Me.Owner,
frmCarta).txtDocumento.Text.IndexOf(Me.txtBuscar.Text)

Grupo EIDOS 34. Formularios dependientes y controles avanzados
621
' si encontramos el texto buscado...
If iResultadoBuscar > 0 Then
' pasamos el foco al TextBox del formulario propietario
' y seleccionamos el texto encontrado
CType(Me.Owner, frmCarta).txtDocumento.Focus()
CType(Me.Owner, frmCarta).txtDocumento.SelectionStart iResultadoBuscar
CType(Me.Owner, frmCarta).txtDocumento.SelectionLength
Me.txtBuscar.Text.Length

Me.lblEncontrado.Show()
End If

End Sub

' al volver a teclear un valor a buscar, se oculta el Label
Private Sub txtBuscar_TextChanged(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles txtBuscar.TextChanged

Me.lblEncontrado.Hide()

End Sub

Cdigo fuente 514
La Figura 307 muestra la aplicacin con ambos formularios abiertos. El formulario frmCarta tiene el
foco actualmente, pero eso no impide que frmBuscar tambin permanezca abierto, para poder pasar a
l en cualquier momento.
Figura 307. Formulario propietario y dependiente en funcionamiento.
Un formulario dependiente, aunque se muestra en todo momento encima de su propietario, puede ser
ocultado por otro formulario de la aplicacin. Para demostrarlo, aadiremos al proyecto el formulario
frmDatosUsuario, que se mostrar como cuadro de dilogo, visualizando un Label en su interior. Ver
Figura 308.
Programacin con Visual Basic .NET Grupo EIDOS
622
Figura 308. Formulario frmDatosUsuario.
El cdigo de la opcin de men de frmPrincipal que abre este formulario se muestra en el Cdigo
fuente 515.

Private Sub mnuUsuario_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuUsuario.Click

' mostrar este formulario como un dilogo
Dim ofrmUsuario As New frmDatosUsuario()
ofrmUsuario.ShowDialog()

End Sub

Cdigo fuente 515
La Figura 309 muestra como este formulario oculta parcialmente al de bsqueda.
Figura 309. Formulario de dilogo ocultando parte del formulario dependiente.
Grupo EIDOS 34. Formularios dependientes y controles avanzados
623
Para lograr que un formulario se muestre en todo momento por encima del resto de formularios de la
aplicacin, hemos de asignar el valor True a su propiedad TopMost; obtenemos de esta manera, un
formulario con estilo de visualizacin fijo en primer plano.
Ilustraremos este particular aadiendo un nuevo formulario al proyecto, con el nombre frmPonerColor,
en el que asignaremos a su propiedad TopMost el valor True. Ver la Figura 310.
Figura 310. Formulario de estilo TopMost.
El Cdigo fuente 516 muestra el cdigo del botn Color de frmCarta, en el que se crea un formulario
frmPonerColor y se visualiza.

Private Sub btnColor_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnColor.Click

' abrir el formulario para poner color al texto
Dim ofrmPonerColor As New frmPonerColor(Me)
ofrmPonerColor.Show()

End Sub

Cdigo fuente 516
En este momento debemos hacer dos observaciones: en primer lugar, no aadimos el formulario
frmPonerColor a la coleccin de formularios dependientes del propietario; en segundo lugar, al
instanciar el objeto frmPonerColor, estamos pasando al constructor de esta clase la referencia del
formulario propietario.
La explicacin a este modo de proceder la encontramos dentro del cdigo del formulario dependiente;
en donde aadimos dicho formulario, a la lista de formularios dependientes del propietario, utilizando
la propiedad Owner de la clase base Form. Esto tiene el mismo efecto que usar el mtodo
AddOwnedForm( ). El Cdigo fuente 517 muestra el constructor de la clase frmPonerColor, en donde
llevamos a cabo esta operacin.

Public Class frmPonerColor
Inherits System.Windows.Forms.Form
'....
Programacin con Visual Basic .NET Grupo EIDOS
624
' crear un constructor para establecer
' el formulario propietario
Public Sub New(ByVal frmPropietario As frmCarta)
Me.New()
Me.Owner frmPropietario
End Sub

Cdigo fuente 517
Al volver a ejecutar ahora el programa, si abrimos el formulario frmPonerColor y despus el cuadro de
dilogo, ser el formulario de configuracin de color el que prevalezca por encima, al ser dependiente
y TopMost. Ver Figura 311.
Figura 311. El formulario TopMost siempre se sita encima del resto.
Este formulario ser abierto tambin desde frmCarta, mediante su botn Color, y lo utilizaremos para
cambiar el color del control de texto de frmCarta. El Cdigo fuente 518 muestra el procedimiento
manipulador de evento de los controles RadioButton, en el que se realiza el cambio de color en el
formulario propietario.

' en este mtodo ponemos el color al TextBox
' del formulario propietario
Private Sub PonerColor(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles rbtMadera.Click, rbtVerde.Click, rbtTurquesa.Click

Dim oColor As Color

Grupo EIDOS 34. Formularios dependientes y controles avanzados
625
If sender Is Me.rbtMadera Then
oColor Color.BurlyWood
End If

If sender Is Me.rbtVerde Then
oColor Color.MediumSpringGreen
End If

If sender Is Me.rbtTurquesa Then
oColor Color.Turquoise
End If

CType(Me.Owner, frmCarta).txtDocumento.BackColor oColor

End Sub

Cdigo fuente 518
Para finalizar con los formularios dependientes, debemos indicar que la clase Form dispone de la
propiedad OwnedForms, que contiene una coleccin con los formularios dependientes de un
formulario que acte como propietario.
Ya que en este ejemplo es el formulario frmCarta el que se comporta como propietario, aadiremos un
botn con el nombre btnDependientes, que nos permitir recorrer la mencionada coleccin, y hacer,
desde el propietario, una manipulacin sobre los formularios dependientes, en el caso de que haya
alguno abierto. El Cdigo fuente 519 muestra el cdigo de este botn.

Private Sub btnDependientes_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnDependientes.Click

' obtener los formularios dependientes
Dim oFormularios() As Form Me.OwnedForms
Dim oFormulario As Form

' si existen dependientes...
If oFormularios.Length > 0 Then
' recorrer la coleccin y
' manipular los formularios dependientes
For Each oFormulario In oFormularios

Select Case oFormulario.GetType().Name
Case "frmBuscar"

CType(oFormulario, frmBuscar).lblEncontrado.Show()
CType(oFormulario, frmBuscar).lblEncontrado.Text
"LOCALIZADO!"

Case "frmPonerColor"
CType(oFormulario, frmPonerColor).rbtTurquesa.Text "AZULADO"
CType(oFormulario, frmPonerColor).rbtTurquesa.BackColor
Color.Blue

' con el mtodo PerformClick() de un control,
' simulamos una pulsacin
CType(oFormulario, frmPonerColor).rbtTurquesa.PerformClick()

End Select

Next

End If
Programacin con Visual Basic .NET Grupo EIDOS
626

End Sub

Cdigo fuente 519
Validacin de controles
Los controles Windows vienen provistos de un potente y flexible sistema de validacin, que nos
permitir comprobar si el usuario introduce los valores adecuados en un control, de modo que le
permitiremos pasar el foco a otro control, u obligarle a permanece en el actual hasta que su valor no
sea correcto.
En este esquema de validacin, los miembros principales de la clase Control que intervienen son los
siguientes.
CausesValidation. Esta propiedad nos permite establecer un valor lgico, de manera que
cuando un control capture el foco, provocar la validacin para otro control del formulario que
la requiera.
Validating. Este evento se produce para que podamos escribir el cdigo de validacin
oportuno en un manipulador de evento. El procedimiento manejador de evento recibe entre sus
parmetros un objeto de tipo CancelEventArgs, por lo que si la validacin no es correcta,
asignaremos False a la propiedad Cancel de dicho objeto.
Validated. Este evento se produce en el caso de que la validacin haya tenido xito.
El proyecto de ejemplo ValidarControl (hacer clic aqu para acceder a este ejemplo) consta de un
formulario con tres controles TextBox. Todos tienen el valor True en su propiedad CausesValidation,
y adicionalmente, para el control txtImporte hemos escrito el procedimiento que actuar como
manipulador del evento Validating; con ello impediremos el paso desde dicho control a los dems
hasta que su contenido no sea numrico. Si pasamos la validacin, se ejecutar en ese caso el cdigo
del evento Validated. Veamos estos manipuladores de evento en el Cdigo fuente 520.

Private Sub txtImporte_Validating(ByVal sender As Object, ByVal e As
System.ComponentModel.CancelEventArgs) Handles txtImporte.Validating

If Not IsNumeric(Me.txtImporte.Text) Then
e.Cancel True
MessageBox.Show("Se requiere un nmero")
End If

End Sub

Cdigo fuente 520
La Figura 312 muestra esta aplicacin en funcionamiento, durante la ejecucin del evento de
validacin.
En el control txtFecha por otro lado, podemos teclear cualquier valor, aunque no sea fecha, ya que no
proporcionamos manipuladores de evento para validar su contenido.
Grupo EIDOS 34. Formularios dependientes y controles avanzados
627
Cuando escribimos cdigo de validacin empleando estos miembros de la clase Control hemos de
tener presente el comportamiento, a veces no muy intuitivo, del sistema de validacin para controles
en los formularios Windows.
Figura 312. Validacin de un control.
Como hemos mencionado anteriormente, cuando la propiedad CausesValidation de un control
contiene True, al recibir el foco dicho control, se provocar el evento de validacin para el control que
acaba de perder el foco. Pero si pasamos el foco a un control en el que CausesValidation contiene
False, la validacin no se producir sobre el control que acaba de perder el foco.
Esto lo podemos comprobar muy fcilmente sobre nuestro proyecto de ejemplo, asignando al control
txtFecha el valor False en su CausesValidation. A partir de ahora, cuando estemos situados en el
control txtImporte, si este no contiene un nmero, se producir la validacin si pasamos el foco a
txtNombre, pero no se validar si pasamos a txtFecha.
Controles avanzados
Los controles del Cuadro de herramientas del IDE tratados hasta el momento, son los que podramos
considerar bsicos o estndar en todas las aplicaciones; no obstante, esta ventana de herramientas
dispone de otra serie de controles avanzados o adicionales, que si bien, no son imprescindibles para
conseguir la funcionalidad elemental del programa, sirven como un magnfico complemento a la hora
de dotar a nuestras aplicaciones de un interfaz de usuario plenamente operativo.
En los siguientes apartados desarrollaremos un proyecto con el nombre ControlAvanzado (hacer clic
aqu para acceder a este ejemplo), a travs del cual, realizaremos una descripcin general de algunos
de estos controles adicionales y su modo de uso.
Como primer paso en este proyecto, eliminaremos el formulario por defecto, aadiendo a continuacin
uno nuevo con el nombre frmPrincipal, al que daremos la caracterstica MDI mediante la propiedad
IsMdiContainer. En este formulario crearemos un men con un conjunto de opciones generales: Abrir,
Guardar, Salir, etc.
Programacin con Visual Basic .NET Grupo EIDOS
628
ImageList
Este control acta como repositorio de imgenes, del que se alimentarn otros controles del formulario
que necesiten mostrar grficos en su interior.
Una vez aadido este control en el formulario, se situar en el panel de controles especiales del
diseador, y haciendo clic en su propiedad Images, se abrir la ventana de la Figura 313, en la que
podremos aadir y quitar las imgenes que van a formar parte de la lista del control, as como ver en el
panel complementario, la informacin sobre cada imagen asignada.
Figura 313. Ventana de administracin de imgenes del control ImageList.
Las imgenes que insertamos en el control tienen un tamao por defecto, en el caso de que
necesitemos modificarlo, expandiremos la propiedad ImageSize en la ventana de propiedades y
asignaremos nuevos valores en Width y Height.
Otra ventaja de este control es que nos permite manipular las imgenes por cdigo, por ejemplo, para
aadir nuevas imgenes, debemos usar el mtodo Add( ) de su propiedad Images, como muestra el
Cdigo fuente 521.

Me.imlImagenes.Images.Add(New Bitmap("tutorias.gif"))

Cdigo fuente 521
Grupo EIDOS 34. Formularios dependientes y controles avanzados
629
ToolBar
Este control representa la barra de herramientas o botones de acceso rpido que facilitan al usuario la
ejecucin de los procesos principales del programa, evitndole la navegacin por el men del
formulario.
Al ser dibujado, este control queda acoplado a la parte superior del formulario. Despus de ponerle
tbrBarra como nombre, asignaremos a su propiedad ImageList, el control de ese mismo tipo que
acabamos de crear; esto nos permitir asignar los grficos de la lista a los botones que vayamos
creando en el ToolBar. Para establecer el tamao de los botones de la barra utilizaremos la propiedad
ButtonSize de este control.
Seguidamente haremos clic en la propiedad Buttons, que abrir una ventana con la coleccin de
botones de la barra, en la que podremos crear y configurar dichos botones. Ver Figura 314.
Figura 314. Editor de botones del control ToolBar.
Cada botn en un ToolBar es un objeto de tipo ToolBarButton, del que podemos destacar las
siguientes propiedades.
Text. Cadena con el texto que muestra el botn.
ImageIndex. En el caso de asociar el ToolBar con un control ImageList, en esta propiedad
asignamos para un botn una de las imgenes del ImageList, indicando el nmero de orden de
la imagen.
Style. Permite establecer el estilo del botn: de pulsacin; separador; o de tipo desplegable,
que abre un subconjunto de opciones.
Programacin con Visual Basic .NET Grupo EIDOS
630
DropDownMenu. Si asociamos el botn con una opcin de la barra de men del formulario,
y configuramos su estilo como DropDownButton, al pulsar el botn desplegable, se mostrarn
las opciones de men; el efecto ser el mismo que si hubiramos desplegado directamente el
men del formulario.
La Figura 315 muestra la ventana principal de la aplicacin con la barra de herramientas
Figura 315. Formulario con ToolBar.
Una vez terminado el diseo del ToolBar, debemos codificar su evento ButtonClick, que ser
provocado cada vez que se pulse un botn de la barra. Dentro del procedimiento de este evento,
comprobaremos qu botn ha sido pulsado y ejecutaremos las acciones oportunas. El Cdigo fuente
522 muestra este evento. Tanto el botn Abrir como la opcin de men del mismo nombre realizan la
misma tarea, por lo que llaman al mtodo AbrirArchivo( ), que es quien realmente muestra el
formulario necesario.

Private Sub tbrBarra_ButtonClick(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.ToolBarButtonClickEventArgs) Handles tbrBarra.ButtonClick

' comprobar qu botn de la barra se ha pulsado
If e.Button Is Me.btnAbrir Then
' llamamos al mtodo que abre el
' formulario para abrir un archivo
Me.AbrirArchivo()
End If

If e.Button Is Me.btnSalir Then
' cerrar la aplicacin
Me.Close()
End If

End Sub

Private Sub mnuAbrir_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuAbrir.Click

' al seleccionar esta opcin de men
' llamar al mtodo que abre el formulario
' que permite abrir un archivo
Me.AbrirArchivo()

End Sub
Grupo EIDOS 34. Formularios dependientes y controles avanzados
631

Private Sub AbrirArchivo()
Dim ofrmAbrirArchivo As New frmAbrirArchivo()
ofrmAbrirArchivo.MdiParent Me
ofrmAbrirArchivo.Show()
End Sub

Cdigo fuente 522
Al haber asignado al botn btnPersonal uno de los mens de la barra del formulario, no ser necesario
escribir cdigo para detectar este botn en el evento ButtonClick, ya que se ejecutar directamente el
cdigo del evento Click de las opciones de men. El Cdigo fuente 523 muestra el cdigo
perteneciente a la opcin de men Personal + Datos.

Private Sub mnuDatos_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuDatos.Click

Dim ofrmPersonal As New frmDatosPersonal()
ofrmPersonal.MdiParent Me
ofrmPersonal.Show()

End Sub

Cdigo fuente 523
StatusBar
Para mostrar una barra informativa de estado recurriremos a este control, que al dibujarse queda
situado en la parte inferior del formulario; como nombre le daremos sbrEstado. De forma similar al
ToolBar, un control StatusBar est compuesto de una coleccin de objetos Panel, que iremos
aadiendo al control mediante la propiedad Panels, la cual mostrar una ventana para la creacin y
configuracin de tales paneles. Ver Figura 316.
Figura 316. Editor de paneles del control StatusBar.
Programacin con Visual Basic .NET Grupo EIDOS
632
Entre las propiedades destacables de un objeto Panel podemos mencionar las siguientes.
BorderStyle. Muestra el panel con efecto resaltado, hundido o normal.
Icon. Permite asociar un icono al panel.
AutoSize. Con esta propiedad podemos conseguir que el panel se redimensione ajustndose a
su contenido o que tenga un tamao fijo.
En este ejemplo, hemos aadido dos paneles a la barra de estado del formulario. En uno mostramos un
texto fijo; mientras que en el otro, visualizamos la hora actual a travs de un objeto Timer que
ponemos en marcha en el evento Load del formulario. Veamos los mtodos implicados, en el Cdigo
fuente 524.

Private Sub frmPrincipal_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles MyBase.Load

' al cargar el formulario, creamos un temporizador
' le asociamos un manejador para su evento Tick
' y lo iniciamos
Dim oTiempo As New Timer()
oTiempo.Interval I000
AddHandler oTiempo.Tick, AddressOf PonerHoraActual
oTiempo.Start()

End Sub

Private Sub PonerHoraActual(ByVal sender As Object, ByVal e As EventArgs)

' actualizamos a cada segundo la hora de un panel
' de la barra de estado
Me.sbrEstado.Panels(I).Text DateTime.Now.ToString("HH.mm.ss")

End Sub

Cdigo fuente 524
La Figura 317 muestra el formulario con la barra de estado.
Figura 317. Formulario con StatusBar.
Grupo EIDOS 34. Formularios dependientes y controles avanzados
633
Finalizada la creacin del StatusBar, aadiremos al proyecto un formulario con el nombre
frmDatosPersonal, en el dibujaremos un conjunto de nuevos controles que iremos describiendo
seguidamente.
DateTimePicker
Este control permite la seleccin e introduccin de fechas en una caja de texto con capacidades
extendidas, o bien mediante un calendario desplegable que se mostrar al pulsar el botn de expansin
que contiene. Ver Figura 318.
Figura 318. Control DateTimePicker.
Para modificar la fecha en el cuadro de texto, debemos situarnos en la parte a modificar de la fecha y
teclear el nuevo valor, o bien, con las flechas de direccin arriba-abajo, cambiar esa parte de la fecha.
Si expandimos el calendario, podremos realizar la seleccin de un modo ms grfico.
Por defecto el control muestra la fecha actual, pero con la propiedad Text podemos cambiar la fecha
por cdigo, cosa que hacemos al cargar el formulario, asignando una fecha distinta de la actual. Ver
Cdigo fuente 525.

Private Sub frmDatosPersonal_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Load

' modificar fecha del DateTimePicker
Me.dtpFNacim.Text "IS/08/?00?"
'....
End Sub

Cdigo fuente 525
Podemos restringir el rango de fechas a mostrar por este control con las propiedades MinDate y
MaxDate. Si queremos, por otra parte, que la fecha se muestre con un formato personalizado,
aplicaremos dicho formato mediante la propiedad CustomFormat, teniendo en cuenta que no se har
efectivo hasta que a la propiedad Format no le asignemos el valor Custom.
El botn btnCambiosFecha del formulario realiza algunas modificaciones por cdigo sobre el control
DateTimePicker dtpFNacim del formulario, que vemos en el Cdigo fuente 526.
Programacin con Visual Basic .NET Grupo EIDOS
634

Private Sub btnCambiosFecha_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnCambiosFecha.Click

' configurar por cdigo el
' control DateTimePicker
Me.dtpFNacim.MinDate "I/4/?00?"
Me.dtpFNacim.MaxDate "I/I0/?00?"
Me.dtpFNacim.CustomFormat "d-MMM-yy"
Me.dtpFNacim.Format DateTimePickerFormat.Custom

End Sub
Cdigo fuente 526.
NumericUpDown
Control que muestra una caja de texto con un valor numrico que podremos ir aumentando-
disminuyendo al pulsar los botones para esta labor de que dispone el control. La Figura 319 muestra
este control en nuestro formulario de pruebas.
Figura 319. Control NumericUpDown.
Entre las propiedades de este control destacaremos las siguientes.
Increment. Nmero en el que se incrementar el valor del control cuando pulsemos sus
botones o teclas de direccin.
InterceptArrowKeys. Permite que las flechas de direccin arriba-abajo tengan el mismo
efecto que si pulsamos los botones para incrementar o disminuir, de este control.
Maximum, Minimun. Contienen los lmites superior e inferior en cuanto al nmero que
podr contener el control.
TextAlign. Permite alinear el nmero dentro la caja de texto del control.
UpDownAlign. Permite situar los botones del control a la izquierda o derecha de la caja de
texto que contiene el valor.
Entre los eventos de que dispone este control, ValueChanged se produce cada vez que cambia el valor
del control, de modo que en este caso, vamos a cambiar el color de fondo en funcin del nmero que
contenga. Veamos el Cdigo fuente 527.

Private Sub nupEdad_ValueChanged(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles nupEdad.ValueChanged

Select Case Me.nupEdad.Value
Case ?0 To 0
Me.nupEdad.BackColor Color.Gold

Case 0 To 40
Me.nupEdad.BackColor Color.LimeGreen
Grupo EIDOS 34. Formularios dependientes y controles avanzados
635

Case Else
Me.nupEdad.BackColor Me.nupEdad.DefaultBackColor
End Select

End Sub

Cdigo fuente 527
DomainUpDown
Este control nos permite desplazarnos por una lista de valores, al mismo estilo que el control anterior.
Dicha lista de valores la crearemos mediante la propiedad Items, en tiempo de diseo o ejecucin.
El Cdigo fuente 528 muestra como al cargar el formulario frmDatosPersonal, con la propiedad Items
y su mtodo AddRange( ), aadimos los valores que seleccionaremos en el control en tiempo de
ejecucin.

Private Sub frmDatosPersonal_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Load

'....
' crear la lista del DomainUpDown
Me.dudCategoria.Items.AddRange(New String() "Auxiliar", "Jefe departamento",
"Coordinador")

End Sub

Cdigo fuente 528
La Figura 320 muestra el control dudCategora, de este tipo al ser utilizado en el formulario. En el
caso de que necesitemos los valores ordenados, asignaremos True a su propiedad Sorted.
Figura 320. Control DomainUpDown.
MonthCalendar
Este control muestra en modo grfico un calendario por el que podemos desplazarnos para seleccionar
una fecha. El control DateTimePicker utiliza internamente un MonthCalendar para mostrar su
calendario desplegable.
Por defecto se visualiza un mes, pero si asignamos a su propiedad CalendarDimensions un objeto Size,
podemos expandir el tamao del calendario para que muestre varios meses. El Cdigo fuente 529
muestra el cdigo de un botn del formulario mediante el que cambiamos el tamao del calendario.

Private Sub btnTamCalendario_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnTamCalendario.Click

Programacin con Visual Basic .NET Grupo EIDOS
636
Me.mclCalendario.CalendarDimensions New Size(?, ?)

End Sub

Cdigo fuente 529
En la Figura 321 vemos el resultado de expandir el tamao del control.
Figura 321. Control MonthCalendar con el tamao ampliado.
Para detectar la seleccin de una fecha utilizaremos el evento DateChanged. Debido a que en un
control MonthCalendar podemos seleccionar un rango de fechas, las propiedades que tenemos que
manipular para averiguar la fecha/s seleccionada/s son: SelectionStart, SelectionEnd y
SelectionRange, aunque en muchas ocasiones slo ser necesario utilizar una de ellas. Veamos el
Cdigo fuente 530.

Private Sub mclCalendario_DateChanged(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.DateRangeEventArgs) Handles mclCalendario.DateChanged

' mostrar en un Label la fecha seleccionada
' en el control MonthCalendar
Me.lblCalendario.Text Me.mclCalendario.SelectionStart

End Sub

Cdigo fuente 530
LinkLabel
Este control permite tener en un formulario Windows un enlace hacia una pgina de Internet, con un
comportamiento similar al que encontramos en un hiperenlace de una pgina web.
Grupo EIDOS 34. Formularios dependientes y controles avanzados
637
Su propiedad Text muestra un literal, de modo que al hacer clic sobre el mismo, se provocar el evento
LinkClicked en el que escribiremos el cdigo a ejecutar.
En nuestro formulario de ejemplo, hemos creado un control de este tipo con el nombre lnkEidos, que
tiene el aspecto de la Figura 322, ya que adems del enlace, le hemos asignado una imagen.
Figura 322. Conrol LinkLabel.
Para conseguir que al hacer clic en este enlace, se abra Internet Explorer y navegue hacia una
determinada pgina, vamos a utilizar la clase Process, que como su nombre indica, nos permite la
gestin de procesos del sistema, tales como su inicio y finalizacin.
En este caso, el mtodo compartido Start( ), de Process, va a ejecutar el navegador al pasarle como
parmetro una direccin web en forma de cadena. Veamos el Cdigo fuente 531.

Private Sub lnkEidos_LinkClicked(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles lnkEidos.LinkClicked

' inicia Internet Explorer y navega hacia una pgina
Process.Start("http.//www.eidos.es")

End Sub

Cdigo fuente 531
Creacin y manipulacin de elementos en ejecucin
El conjunto de controles que acabamos de ver, al igual que los bsicos permiten ser creados no slo
mediante el diseador de formularios, sino tambin desde cdigo. Como muestra de ello, la opcin de
men Varios + Aadir botn y panel, aade dos imgenes al control ImageList del formulario
frmPrincipal, creando un nuevo botn para el ToolBar y un panel para el StatusBar Ver el Cdigo
fuente 532.

Private Sub mnuAgregaElementos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuAgregar.Click

' anadir por cdigo imgenes a la lista
Me.imlImagenes.Images.Add(New Bitmap("tutorias.gif"))
Me.imlImagenes.Images.Add(New Bitmap("cameraI.gif"))

Dim oBoton As New ToolBarButton()
oBoton.Text "TUTORIAS"
oBoton.ImageIndex 4
Me.tbrBarra.Buttons.Add(oBoton)

Dim oPanel As New StatusBarPanel()
Programacin con Visual Basic .NET Grupo EIDOS
638
oPanel.Text "BUSCAR"
oPanel.BorderStyle StatusBarPanelBorderStyle.Raised
oPanel.ToolTipText "Informacin sobre bsquedas"
oPanel.Icon New Icon("magnify.ico")
Me.sbrEstado.Panels.Add(oPanel)

End Sub

Cdigo fuente 532
Para detectar la pulsacin del nuevo botn de la barra de herramientas, aadimos el siguiente cdigo
en su evento ButtonClick, que vemos en el Cdigo fuente 533.

Private Sub tbrBarra_ButtonClick(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.ToolBarButtonClickEventArgs) Handles tbrBarra.ButtonClick
'....
If e.Button.Text "TUTORIAS" Then
MessageBox.Show("Se ha pulsado el botn de tutorias")
End If
End Sub

Cdigo fuente 533
La Figura 323 muestra este formulario en ejecucin tras aadir los nuevos elementos.
Figura 323. Nuevos controles aadidos al formulario en tiempo de ejecucin.
NotifyIcon
Este control permite aadir un icono asociado con nuestra aplicacin en el panel de iconos del sistema
(Windows System Tray) situado en la parte derecha de la barra de tareas de Windows.
Tales iconos suelen utilizarse por aplicaciones que permanecen ocultas, y al hacer clic derecho sobre
su icono en este panel, aparece un men contextual que permite mostrar la aplicacin.
En nuestro caso vamos a utilizar este control para ejecutar y parar la calculadora del sistema
empleando la clase Process, comentada en un apartado anterior.
Grupo EIDOS 34. Formularios dependientes y controles avanzados
639
Despus de agregar un control de este tipo al formulario, asignaremos un icono a su propiedad Icon y
una cadena a su propiedad Text, que ser mostrada al situar el ratn encima de este control en tiempo
de ejecucin.
Crearemos despus un men contextual con las opciones Abrir y Cerrar, que asignaremos a la
propiedad ContextMenu del control NotifyIcon.
Para poder controlar la calculadora de Windows cuando est en ejecucin, declararemos una variable
de tipo Process a nivel de la clase. Al ejecutar la calculadora mediante el mtodo Start( ) de la clase
Process, obtendremos un objeto de dicho tipo, que pasaremos a esta variable, y nos permitir
posteriormente, cerrar el proceso en el que se est ejecutando la calculadora mediante el mtodo Kill(
). Veamos esta parte en el Cdigo fuente 534.

Public Class frmPrincipal
Inherits System.Windows.Forms.Form

Private oCalculadora As Process
'....

Private Sub mnuCalcAbrir_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuCalcAbrir.Click

' iniciar la calculadora
oCalculadora Process.Start("calc.exe")

End Sub

Private Sub mnuCalcCerrar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuCalcCerrar.Click

' cerrar la calculadora
oCalculadora.Kill()
End Sub

End Class

Cdigo fuente 534
Al ejecutar el programa, se mostrar un nuevo icono en la lista del panel de iconos del sistema de la
barra de tareas, como muestra la Figura 324.
Figura 324. Control NotifyIcon en el panel de iconos del sistema de la barra de tareas.
Programacin con Visual Basic .NET Grupo EIDOS
640
Como puede comprobar el lector, la clase Process ampla enormemente nuestra capacidad de
manipulacin de los procesos del sistema.

También podría gustarte