Documentos de Académico
Documentos de Profesional
Documentos de Cultura
APLICACIONES INFORMÁTICAS
CICLO FORMATIVO DE GRADO SUPERIOR
FORMACIÓN PROFESIONAL A DISTANCIA
1
Unidad
MÓDULO
Diseño y realización de servicios de
presentación en entornos gráficos
Título del Ciclo: DESARROLLO DE APLICACIONES INFORMATICAS
Dirección de la obra:
Alfonso Careaga Herrera
Antonio Reguera García
Arturo García Fernández
Ascensión Solís Fernández
Juan Carlos Quirós Quirós
Luís Mª Palacio Junquera
Yolanda Álvarez Granda
ISBN: 978-84-692-3442-6
Esta publicación tiene fines exclusivamente educativos. Queda prohibida la venta, así como la
reprodución total o parcial de sus contenidos sin autorización expresa de los autores y del Copyright
Unidad
1 Introducción Visual Basic NET
OBJETIVO DE LA UNIDAD
El objetivo de la unidad es conocer el entorno de Visual Basic .NET. Veremos cómo crear
nuestro primer proyecto, dibujando algunos controles básicos en el formulario de inicio, así
como proporcionarle código a los eventos o acciones de dichos controles. También nos
iniciaremos en el uso de la depuración del proyecto y de la ayuda.
INDICE DE CONTENIDOS
3
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
¿Qué es Visual Basic .NET?
Microsoft Visual Basic es un lenguaje de programación que está diseñado para crear
aplicaciones orientadas a objetos en el entorno del sistema operativo Microsoft Windows. Está
implementado sobre el framework .NET que es un amplio proyecto de Microsoft para crear una
plataforma que permita un cómodo y rápido desarrollo de aplicaciones.
Microsoft nos ofrece una versión gratuita de la herramienta llamada “Visual Basic Express
Edition”. Podemos descargarla en la dirección web siguiente:
http://www.microsoft.com/express/vb/default.aspx
Visual Basic Express Edition es funcional durante 30 días. Pero si te registras ya estará
operativo de forma indefinida. Este registro es gratuito, sólo necesitaras una cuenta de correo
donde te enviarán el número de registro.
En está página puedes encontrar información sobre el Visual Basic que será útil tanto para el
principiante como para el programador ya experimentado.
Una vez iniciado el proyecto nos mostrará el entorno de desarrollo de aplicaciones (fig.1).
Estamos en la pestaña de diseño: “Form1.vb [Diseño]”, y en primer término vemos el
“formulario principal” o “formulario de inicio”, identificado en su parte superior con el nombre
“Form1”. Este formulario es el que se mostrará cuando ejecutemos la aplicación. En él
dibujaremos los objetos o controles que necesitemos para nuestro proyecto.
4
Unidad
1 Introducción Visual Basic NET
5
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Vamos a dibujar un control “TextBox” y un control “Button” (fig.4). Hay varias maneras de
realizar este proceso, una de ellas es haciendo doble clic sobre los controles en el cuadro de
herramientas. Primero en el control “Button” y después en el control “TextBox”, que están
señalados en la siguiente figura:
Técnico Superior en Desarrollo de Aplicaciones Informáticas
Ahora volvemos al formulario “Form1”, moviendo el cursor del ratón hacia él se pliega el
“cuadro de herramientas” y podemos ver los dos controles en la esquina superior izquierda,
uno encima del otro. Uno a uno, los seleccionamos y arrastramos con el ratón hacia el lugar del
formulario que consideremos mas apropiado. (fig.5).
6
Unidad
1 Introducción Visual Basic NET
El control que hemos creado, “Button1”, es un objeto de la clase Button, y representa un típico
botón de Windows. Y el otro elemento, “TextBox1”, es un objeto de la clase TextBox, y
representa un cuadro de texto de Windows.
• Haciendo clic sobre el icono del control, y a continuación hacemos clic sobre la superficie del
formulario. El nuevo control se insertará desde el punto en que hemos pulsado, extendiéndose
hacia la derecha y abajo.
• Haciendo clic sobre el icono del control, y seguidamente clic sobre la posición del formulario
en la que queramos comenzar a dibujar el control, arrastraremos y soltaremos dando nosotros
el tamaño requerido al control.
Todos los controles que dibujamos en el formulario tienen un conjunto de propiedades que
identificaran a cada control y definirán su aspecto y su comportamiento. Vamos a acceder a la
ventana de las propiedades de los controles haciendo clic en el icono de la barra de
herramientas (fig.6):
7
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
La ventana que nos aparecerá será la siguiente (fig.7):
Técnico Superior en Desarrollo de Aplicaciones Informáticas
Nota: podemos fijar las ventanas, haciendo clic en la “chincheta” de la franja azul superior del
cuadro
En la parte superior de la ventana de propiedades vemos una lista desplegable (fig.8), en ella
están todos los controles que tenemos en el formulario, además del propio formulario que
también dispone de propiedades. Al seleccionar uno de ellos accedemos a sus propiedades.
8
Unidad
1 Introducción Visual Basic NET
Es muy importante fijarse en el control que aparece en esa lista, antes de realizar alguna
modificación en las propiedades, para cerciorarnos de que estamos editando las propiedades
del control que realmente queremos modificar. Esto es motivo muchas veces de
equivocaciones.
Vamos a modificar la propiedad Text del control Button1. Editamos el valor de la propiedad
Text, eliminamos el texto “Button1” y escribimos “Haz clic”, cuando pulsemos la tecla Enter o
el tabulador se modificará el texto del botón en el formulario (fig.9).
9
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Añadir código a los controles
Vamos introducir código a nuestro ejemplo. Para acceder al código del formulario, podemos
hacerlo de alguna de las siguientes maneras:
• Pulsar F7.
• Hacer clic derecho sobre el formulario y elegir la opción Ver código del menú contextual que
aparece.
Nos aparece una nueva pestaña en el entorno de desarrollo: “Form1.vb”, aquí escribiremos el
código del formulario “Form1”.
Para volver a la ventana que hemos utilizado hasta ahora para diseñar el formulario haremos
clic en la pestaña “Form1.vb[Diseño]”.
Pero volvamos a la pestaña de código “Form1.vb” y observemos el código que nos muestra:
End Class
Todo formulario es un objeto y el código de un objeto se escribe en una clase. Por esto, el
código lo escribiremos dentro de un bloque Class... End Class. “Form1” es el nombre de la
clase.
10
Unidad
1 Introducción Visual Basic NET
Vamos a introducir código para que al hacer clic en el botón “Button1” (evento “Click” de
“Button1”) se muestre el texto “¡Hola Mundo!” en el cuadro de texto “TextBox1”. La línea de
código será:
Con está sentencia conseguimos que al hacer clic en el botón “Button1”, la propiedad “Text”
del cuadro de texto “TextBox1” reciba el valor “¡Hola Mundo!”.
Para escribir el código del evento “Click” correspondiente a la pulsación del control “Button1”, la
forma más rápida es haciendo doble clic sobre el control en la ventana de diseño del formulario
(pestaña “Form1.vb [Diseño]”), lo que abrirá el editor de código y nos situará en el
procedimiento vacío “Button1_Click”. Escribimos dentro de él la línea de código anterior.
End Sub
End Class
Lo que ha ocurrido es que se ha ejecutado el evento “Click” del botón “Button1” tal y como nos
lo indica la expresión que vemos al final del encabezamiento del procedimiento.
...Handles Button1.Click
Esto es lo verdaderamente importante. La palabra clave “Handles”, seguida del nombre del
control, un punto y el nombre del evento; esto le indica al Framework que debe ejecutar este
procedimiento cuando se produzca el evento para ese control. El nombre del procedimiento
“Button1_Click” no tiene importancia, se puede modificar y poner cualquier otro; pero
normalmente lo dejaremos como está ya que le otorga un nombre significativo.
Ahora vamos a dibujar otro botón en nuestro formulario. Para ello seleccionemos la pestaña
“Form1.vb [Diseño]”. Vayamos al “cuadro de herramientas” y hacemos doble clic en el control
Button. Lo colocamos debajo del botón que ya teníamos. Y modificamos la propiedad “Text”
asignándole el literal “Borrar” (fig.11).
11
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
12
Unidad
1 Introducción Visual Basic NET
Me.TextBox1.Text = Nothing
End Sub
Con lo que conseguiremos “borrar” el contenido de la propiedad “Text” del objeto “TextBox1” al
hacer clic en el botón “Button2.”
13
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Fig.14.Deteniendo la ejecución.
Guardar el proyecto
Por defecto, el proyecto se guardará en la carpeta “Mis documentos”, dentro de ésta en la ruta:
“Visual Studio 2008\Projects\MiPrimerPrograma”. Dentro de esta última carpeta tenemos otra
Técnico Superior en Desarrollo de Aplicaciones Informáticas
carpeta con el mismo nombre y un fichero del tipo “Microsoft Visual Studio Solution”. Este es el
fichero que hay que hacer doble clic en él para que podamos editar el proyecto con el Visual
Basic Express.
VB (Visual Basic) tiene un buen depurador, que nos permitirá introducirnos dentro del código
de nuestro programa durante la ejecución del mismo, para observar qué es lo que está
ocurriendo: ejecutar línea a línea el programa, observar el valor de las variables, etc., aspectos
todos ellos fundamentales para el seguimiento de errores y fallos en la lógica de la
programación.
Vamos a ejecutar nuestro proyecto en modo depuración. Para ello pulsaremos F8, o
seleccionaremos en el menú “Depurar + Paso a paso por instrucciones”. Cualquiera de estas
acciones iniciará la ejecución del programa dentro del contexto del depurador. Nos aparecerá
el formulario, hacemos clic en el botón con el texto “Haz clic” y la ejecución se detendrá en la
primera línea de código del procedimiento “Button1.Click”, destacándola en color amarillo. La
línea marcada en amarillo indica que es la siguiente línea a ejecutarse, para ejecutarla y pasar
a la siguiente línea pulsaremos de nuevo F8, y así sucesivamente hasta llegar a la última línea
del procedimiento (End Sub), ejecutada ésta, se finalizará el procedimiento y nos mostrará de
nuevo el formulario. Si hacemos clic en el botón con el texto “Borrar”, se realizará el mismo
proceso pero con el procedimiento “Button2.Click”.
14
Unidad
1 Introducción Visual Basic NET
En el proceso de depuración, podemos ver de forma inmediata el valor de una variable o de
una propiedad simplemente situando el cursor del ratón sobre ella. En la figura siguiente
(fig.15), observamos que la línea siguiente a ejecutarse es “End Sub”, por lo que la línea
anterior que asignaba el texto “¡Hola Mundo!” a la propiedad “Text” de cuadro de texto
“TextBox1” ya se ha ejecutado. Si colocamos el cursor sobre la expresión
“Me.TextBox1.Text” aparece un recuadro con el contenido de dicha propiedad (fig.15).
Fig.15.Depurando la aplicación.
Probar a hacer lo mismo pero antes de ejecutar la línea de código que asigna el texto a la
propiedad. Vemos que la propiedad Text no tiene ningún contenido.
Si en cualquier momento queremos continuar la ejecución normal del programa sin seguir
utilizando el depurador, pulsaremos F5.
Utilización de la ayuda
Para acceder a ella pulsaremos la tecla F1, tanto si estamos en la pestaña de diseño como en
la de código. Aparecerá una nueva entrada en la barra de tareas (fig.16).
15
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Vamos a realizar una búsqueda en la ayuda para que nos informe sobre el tipo de datos
“String”. Seleccionamos la pestaña “Buscar” y escribimos en el primer cuadro “tipo String”,
hacemos clic en el botón “Buscar” de la derecha y esperamos a que realice la búsqueda.
Como podemos observar, nos proporciona numerosas entradas que hacen referencia al tema
buscado. Tendremos que seleccionar aquellas que se ajusten más a nuestras necesidades de
Técnico Superior en Desarrollo de Aplicaciones Informáticas
información. Aunque en este caso la primera entrada nos puede resolver totalmente la
consulta, otras veces no es así, hay que realizar una exhaustiva búsqueda para encontrar
aquello que deseamos.
Nota: También podemos observar que realiza la búsqueda primero en el MSDN online, en
comunidades y foros, y por último en la ayuda local, si quisiéramos que busque primero en la
ayuda local, o sólo en esta, podemos realizar la siguiente modificación: en el menú
seleccionamos Herramientas + Opciones y dentro de esta en Ayuda + En Pantalla. Aquí
seleccionamos la opción que nos resulte más conveniente en el apartado “Cuando cargue
contenido de la ayuda…”
Hacemos clic en la entrada “String (Tipos de datos, Visual Basic)” y nos mostrará información
sobre este tipo de datos. Si la información va a ser consultada con frecuencia, conviene
agregarla a “Favoritos de la ayuda”, para ello hacemos clic en el icono de la barra de
herramientas (fig.18). Para acceder a los “favoritos de la ayuda” ya guardados, tenemos la
pestaña lateral “Favoritos de la ayuda” que está en la izquierda de la ventana (fig.18.).
16
Unidad
1 Introducción Visual Basic NET
17
Técnico Superior en
Desarrollo de Aplicaciones Informáticas
TÉCNICO SUPERIOR EN DESARROLLO DE
APLICACIONES INFORMÁTICAS
CICLO FORMATIVO DE GRADO SUPERIOR
FORMACIÓN PROFESIONAL A DISTANCIA
2
Unidad
MÓDULO
Diseño y realización de servicios de
presentación en entornos gráficos
Título del Ciclo: DESARROLLO DE APLICACIONES INFORMATICAS
Dirección de la obra:
Alfonso Careaga Herrera
Antonio Reguera García
Arturo García Fernández
Ascensión Solís Fernández
Juan Carlos Quirós Quirós
Luís Mª Palacio Junquera
Yolanda Álvarez Granda
ISBN: 978-84-692-3442-6
Esta publicación tiene fines exclusivamente educativos. Queda prohibida la venta, así como la
reprodución total o parcial de sus contenidos sin autorización expresa de los autores y del Copyright
Características del lenguaje y
Unidad
2 controles más comunes
OBJETIVO DE LA UNIDAD
En esta unidad veremos las características del lenguaje de programación Visual Basic Net. Y
desarrollaremos un ejercicio que nos permitirá conocer tres controles más comunes en un
formulario de Windows: TextBox, Button y Label.
INDICE DE CONTENIDOS
3
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Características del lenguaje
Declaración de variables
Podemos también realizar declaraciones de variables en la misma sentencia Dim, aunque sean
de distinto tipo.
Vamos a crear un nuevo proyecto para probar las declaraciones de variables que realicemos
en esta unidad de trabajo. Abrimos la aplicación Visual Basic, o si ya la tenemos abierta vamos
al menú a Archivo + Nuevo Proyecto. Creamos una nueva aplicación para Windows y le
asignamos el nombre “Unidad2”. Agregamos un botón al formulario y en el evento “click” de
botón escribimos las siguientes declaraciones y asignaciones de variables:
Antes de ejecutar ninguna línea, vamos a visualizar las variables locales de la aplicación en
una ventana, para ello vamos al menú Depurar + Ventanas + Variables locales. Nos aparece
una ventana con las variables locales de la aplicación, fijémonos en las que hemos declarado
nosotros dentro del procedimiento que vamos a ejecutar (fig.1).
4
Características del lenguaje y
Unidad
2 controles más comunes
Observando la ventana de variables locales antes de asignar ningún valor a las variables,
podemos ver los valores iniciales para los distintos tipos de variables. Para “Integer” es cero;
también es cero para el tipo “Single”, pero con un decimal; para “String” es “Nothing”; para el
tipo “Boolean” es “false”. Y para el tipo “Date” le asigna el valor “#12:00:00 AM#”.
Vayamos ejecutando línea a línea el código, para ello pulsamos nuevamente F8. Vemos como
se modifican los valores de las variables a medida que ejecutamos las líneas de código.
Recordar que la línea resaltada en amarillo es la línea que se va a ejecutar al pulsar F8,
Cuando llegamos al final del procedimiento (“End Sub”).Tenemos las siguientes
asignaciones (fig.2).
Los valores que nos llaman la atención son los de las variables de tipo “Date”. Le asignamos
fechas en el formato “día/mes/año” (FNueva = "21/11/2007") y a efectos de almacenamiento
interno la convierte en el formato “mes/día/año” (#11/21/2007#). Y, también, cuando le
asignamos una hora en formato de 24 horas, la representa en el formato 12 horas; con la
sentencia (fHora1 = "17:40:00"), almacena el valor (#5:40:00 PM#).
5
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Dim fFecha As Date = #11/21/2007#
Observamos también que es posible declarar una variable y en la misma línea de código
asignarle un valor.
Declaración de constantes
Al igual que las variables, una constante es un elemento del lenguaje que guarda un valor, pero
que en este caso y como su propio nombre indica, dicho valor será permanente a lo largo de la
ejecución del programa, no pudiendo ser modificado.
Para declarar una constante, utilizamos la palabra reservada “Const” seguida de nombre de la
constante y le asignamos el valor que va a tener.
Const Pi = 3.1416
En el primer caso, la constante “Pi” se considera del tipo “Double”, que representa valores
“numéricos de punto flotante de doble precisión de 64 bits”, el doble que un valor de tipo
“Single”. (Observarlo en la ventana Variables locales al depurar la aplicación).
Declaración de arrays
Para declarar un array, o matriz, actuaremos prácticamente igual que para declarar una
variable, con la diferencia de que utilizaremos los paréntesis después del nombre, para indicar
que se trata de un array, y opcionalmente, dentro de los paréntesis, indicaremos el número de
elementos que inicialmente va a tener el array. También es posible, asignar valores a los
Técnico Superior en Desarrollo de Aplicaciones Informáticas
Debemos tener en cuenta a la hora de establecer el número de elementos, que el primer índice
de un array es el cero, por lo que al ser creado, el número real de elementos en un array será
el especificado en la declaración más uno.
Para probar las siguientes sentencias de declaraciones de arrays, vamos a añadir otro botón al
formulario “Button2”, y escribimos las siguientes líneas de código que declaran de arrays.
Nombres(0) = "Enrique"
Nombres(1) = "Marta"
' array con 3 elementos, cuyos valores asignamos en el momento de la
declaración del array
Dim Colores() As String = {"Rojo", "Verde", "Azul"}
End Sub
6
Características del lenguaje y
Unidad
2 controles más comunes
Ejecutamos la aplicación en modo depuración, pulsando F8, y vamos ejecutando, línea a línea,
hasta llegar al “End Sub” del procedimiento que se ejecuta al hacer clic al botón último añadido,
“Button2.Click”.
En la ventana de las variables locales podemos observar los valores que tomarán los arrays
declarados. (fig.3). Hacemos clic en el símbolo “+” que tenemos a la izquierda del nombre de
los arrays “Colores” y “Nombres”.
Vemos que los arrays declarados los define en la columna “Tipo” con la expresión “String()”,
esto es, que contendrán valores de tipo “String” y con los paréntesis puesto que son arrays.
El array “Paises” no tiene ningún número de elementos, su valor es “Nothing”. El array
“Nombres” tiene 4 elementos, del 0 al 3, las dos primeras posiciones con los valores asignados
y las dos últimas con valor “Nothing”, ya que nada hemos asignado a esas posiciones. Y el
array “Colores” tiene 3 elementos, con índice de 0 al 2, con los valores asignados al declararlo.
En las declaraciones que hemos hecho de arrays, todos sus valores son del mismo tipo de
datos. Si necesitamos que un array almacene datos de tipos diferentes, debemos declarar el
array como tipo “Object”, el tipo de dato genérico en el entorno de NET. Por ejemplo,
probemos las siguientes líneas de código:
En la ventana de las variables locales podemos observar los valores de distinto tipo que
contendrá el array (fig.4).
7
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Nota: Si observáis, la asignación de la fecha a la última posición del array se tuvo que hacer en
el formato “mes/día/año”, empleando el símbolo “#”. Si se asignase con las comillas,
(“21/11/2007”) consideraría que se trataba de un valor de tipo “String”, no de un valor de tipo
“Date”.
Una solución sería utilizar la función “CDate”, para convertir una expresión (“String”) en tipo
“Date”:
Valores(3) = CDate("21/11/2007") ' date
En esto ejemplo hemos utilizado arrays de una única dimensión pero, lógicamente, podemos
declarar arrays de más dimensiones.
Redimensión de arrays
Utiliza el ejercicio “Unidad2” para probar estas líneas de código. Primero redimensiona el array
sin la palabra “Preserve” y observa en la ventana de variables locales como se han perdido los
tres primeros valores del array. Luego comprueba como con la palabra “Preserve” estos valores
se mantienen.
Recorrer un array
8
Características del lenguaje y
Unidad
2 controles más comunes
La variable “i” (que la declaramos de tipo “Integer”) recogerá cada elemento del array
“Numeros” y mediante el método “AppendText” del cuadro de texto, se añadirá al contenido de
la propiedad “Text” del “TextBox1”. Al final, en la propiedad “Text” tendremos la secuencia de
todos los elementos del array “Numeros”.
Operadores aritméticos
Suma/Resta +/-
Multiplicación *
Potencia ^ Dim Rtdo As Integer = (-2) ^ 3 ' Rtdo = -8
División real / Dim Rtdo As Single = 9 / 5 ' Rtdo = 1.8
División entera \ Dim Rtdo1 As Single = 9 \ 5 ' Rtdo = 1.0
Resto Mod Divide, con división entera, dos números y devuelve el resto de la
división.
Dim Resto As Single = 9 Mod 5 ' Rtdo = 4.0
Concatenación & Une dos o más cadenas de caracteres para formar una única cadena.
Dim Nombre As String = "Marcos " & "García"
' Nombre = "Marcos García"
Operadores de comparación
El resultado obtenido es un valor de tipo “Boolean”, esto es un valor lógico, “True” (verdadero)
o “False” (falso).
Para obtener más información sobre los operadores del lenguaje, podéis consultar la ayuda. Y
sobre los operadores lógicos no hago referencia a ellos ya que son similares a los de otros
lenguajes de programación.
9
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Procedimientos
Los procedimientos son un conjunto de sentencias de código, identificadas con un nombre, que
al invocar a éste se ejecutan en secuencia. Existen tres tipos:
La sentencia “Return” y “Exit Sub” permiten concluir la ejecución del procedimiento sin haber
llegado a su fin. Podemos utilizarla en tantos lugares dentro de un procedimiento como sea
necesario.
Como podemos ver, los procedimientos “Function”, llamados “funciones”, pueden retornar un
valor, para ello tenemos las sentencias “Return Valor” o “NombreFunción = Valor”. Veamos un
ejemplo que podemos probar en el ejercicio “Unidad2”.
10
Características del lenguaje y
Unidad
2 controles más comunes
End Sub
El valor de retorno, que será la suma de los dos operandos, se realizará mediante las
expresiones:
“CalcularSuma = operando1 + operando2” o también “Return operando1 + operando2”
Cualquiera de ellas será válida.
Ejecutar el código en modo depuración y observar los valores de las variables en la ventana de
variables locales (fig.5).
Pasos de parámetros
11
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Si no se especifica nada, el editor de código añade la palabra “ByVal”, es decir, por defecto el
paso de parámetros se realiza “por valor”.
Estructuras de control
• Sentencia If
If Expresión Then
líneas de código
cuando Expresión es Verdadero
......
[Else]
líneas de código
cuando Expresión es Falso
......
End If
If ExpresiónA Then
líneas de código cuando ExpresiónA es Verdadero
.......
ElseIf ExpresiónB Then
líneas de código cuando ExpresiónB es Verdadero
.......
[ElseIf ExpresiónN Then]
líneas de código cuando ExpresiónN es Verdadero
.......
Técnico Superior en Desarrollo de Aplicaciones Informáticas
[Else]
líneas de código cuando ninguna expresión devuelve Verdadero
.......
End If
La lista de expresiones asociada a cada Case en esta estructura estará separada por comas y
podrá tener alguno de los siguientes formatos:
• Expresión.
• ExpresiónMenor To ExpresiónMayor
• Is OperadorComparación Expresión.
12
Características del lenguaje y
Unidad
2 controles más comunes
Veamos un ejemplo:
Se pueden utilizar varias expresiones o intervalos en cada cláusula Case. Por ejemplo, la línea
siguiente es válida:
• Sentencia Do…Loop
La condición se puede comprobar al principio, después del “Do”, o al final, después del “Loop”,
y con “While” o con “Until”.
También podemos utilizar la sentencia “Exit Do” para finalizar la ejecución de un bloque
“Do…Loop” en cualquier lugar de las líneas de código. Se puede emplear la sentecia “Exit Do”
tantas veces como sea necesario.
Veamos el proceso de sumar los números del 1 al 5 empleando un bloque “Do…Loop” con la
condición en distintos lugares.
13
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
• Con la condición al final y con “Until”
Vamos a ejecutar este último bloque “Do…Loop”. Para ello escribimos todo el código dentro de
un procedimiento “Clic” de un botón“. Una vez hecho, vamos a aprender a establecer un
“punto de interrupción” en nuestro código. Al establecer puntos de interrupción en las líneas de
código, cuando iniciemos la ejecución del proyecto con F5, ésta se detendrá cuando encuentre
un punto de interrupción, a partir de esa línea se podrá ejecutar el programa en modo
depuración, con F8, o retomar la ejecución normal, con F5.
Vamos a establecer un punto de interrupción al comienzo del bloque “Do…Loop”. Situamos el
Técnico Superior en Desarrollo de Aplicaciones Informáticas
14
Características del lenguaje y
Unidad
2 controles más comunes
Si iniciamos la ejecución con F5, nos aparecerá el formulario, y al hacer clic en el botón
“Button1”, la ejecución del código se detendrá en la línea donde tenemos el punto de
interrupción, esto es, donde comienza el bloque “Do…Loop”. Ahora vamos ejecutando, con F8,
el código línea a línea y observamos los valores que van tomando las variables locales
“numero” y “total”; así como el momento en que se cumple la condición y se ejecuta la
sentencia “Exit Do”.
Para eliminar un punto de interrupción hacemos clic sobre el círculo rojo o pulsamos F9 con el
cursor sobre la línea de código.
15
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
• Sentencia For…Next
“Contador” se inicializa con el valor de “Inicio” y el código existente entre For y Next es
ejecutado hasta que el valor de “Contador” sea igual a “Fin”.
Por defecto, los incrementos de Contador son en uno, pero podemos cambiar este aspecto
utilizando el modificador “Step”, mediante el que podemos establecer el número en el que se
van a realizar los incrementos. “Step” también nos permite realizar decremento utilizando un
número negativo.
El ejemplo anterior de obtener la suma de los números del 1 al 5 sería con un bloque
“For…Next”.
También podemos declarar la variable que hace de contador (variable “i”) en la misma
declaración “For”.
Técnico Superior en Desarrollo de Aplicaciones Informáticas
Si queremos realizar una salida de la ejecución de esta estructura antes de haber completado
el número de iteraciones establecidas, podemos utilizar la instrucción Exit For, que provocará
dicha salida de igual modo que el explicado anteriormente en la estructura Do...Loop.
Una instrucción “For Each…Next” ejecuta un bloque de instrucciones para cada elemento de
un array o una colección (más adelante veremos este concepto).
16
Características del lenguaje y
Unidad
2 controles más comunes
Veamos el ejemplo anterior, pero almacenando los números en un array, y recorriéndolo con
un bloque “For Each…Next”.
Al formulario de inicio “Form1” vamos a cambiarle el nombre para identificarlo mejor, y también
la leyenda que aparece en el cuadro azul superior, que también contiene el literal “Form1”.
Para ello vamos al “Cuadro de Propiedades” y en la propiedad “Name” le asignamos el valor
“frmInicio”. Las tres primeras letras “frm” se emplean para identificarlo como un “objeto de la
clase Form (formulario)”. Y en la propiedad “Text” escribimos “Datos Alumnos” (fig.7).
17
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Como se puede ver, el nombre del formulario se actualizó en la lista desplegable de la parte
superior del “cuadro de herramientas”, su nuevo nombre es “frmInicio”. Y también se actualizó
la leyenda del formulario del cuadro azul superior, ahora aparece el literal “Datos Alumnos”
Nota: Siempre que se vaya a modificar una propiedad hay que fijarse en la lista desplegable
superior del cuadro de herramientas para cerciorarse de que se están editando las propiedades
del objeto que deseamos modificar. Esto es muchas veces causa de equivocaciones.
Vamos a añadir otro formulario a nuestro proyecto. Para ello tendremos que conocer otra
ventana del entorno de desarrollo del VB, el “Explorador de soluciones”, accedemos a él
situándonos en la pestaña lateral de la parte derecha o en el icono del menú señalado en la
siguiente figura:
Técnico Superior en Desarrollo de Aplicaciones Informáticas
El explorador de soluciones nos muestra los elementos que contiene nuestro proyecto:
formularios, módulos, clases, etc. (fig.10).
Vamos a añadir los dos elementos señalados en la figura 10, el formulario “frmVerDatos.vb” y
el módulo “datos.vb”. Para añadir un nuevo formulario a nuestro proyecto vamos a la opción del
menú “Proyecto + Agregar Windows Forms” y nos aparece una ventana donde está
18
Características del lenguaje y
Unidad
2 controles más comunes
Vamos a comenzar el diseño del formulario “frmInicio”. Los controles que necesitamos para
este formulario son TextBox, Button y Label. (fig.11).
19
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
En el siguiente cuadro representamos los valores que recibirán las propiedades de los distintos
controles dibujados en el formulario:
Las etiquetas que no se van a utilizar en el código del formulario no es necesario que
cambiemos el nombre que se le asigna por defecto (label1, label2, label3….). Sin embargo la
etiqueta “lblNalum” le asignamos otro nombre, ya que va a contener el número de alumnos que
hemos introducido en un momento dado, por lo que durante el proceso irá variando su
contenido.
Como se puede observar, a los objetos los nombramos con tres letras al principio de su
nombre para identificar el tipo de objeto que es. Vamos a adoptar el siguiente criterio:
Control Prefijo
Label lbl
Button btn
TextBox txt
La etiqueta “Label1” que contiene el literal “Datos Alumnos” tiene un tamaño de letra mayor que
el resto de las etiquetas. Para ello modificamos la propiedad “Font” de dicha etiqueta (fig.13). Al
20
Características del lenguaje y
Unidad
2 controles más comunes
seleccionar esta propiedad, nos aparece un pequeño botón a la derecha; al hacer clic en él
surge un cuadro donde podremos modificar la fuente del texto de “Label1”.
Module datos
Structure Alumno
Dim nombre As String
Dim apellido As String
Dim curso As String
21
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
End Structure
Examinemos estas líneas de código. Primeramente declaramos una “estructura”, que consiste
en la agupación de un conjunto de datos para formar un dato compuesto. Esta es una
definición sencilla de una estructura, pero para este ejercicio nos basta. A la estructura le
hemos dado el nombre “Alumno”, ya que contendrá información de un alumno: su nombre,
apellido y el curso en el que está matriculado. Declaramos tres variables para recoger esa
información.
A continuación declaramos el array “aAlumno”, que será del tipo de la estructura que acabamos
de crear (“As Alumno”). Por lo que cada posición del array “alumno” almacenará un valor
“nombre”, un valor “apellido” y un valor “curso”. Para acceder a estos valores tendremos que
escribir:
aAlumno(i).nombre
aAlumno(i).apellido
aAlumno(i).curso
Este array tiene un “nivel de acceso” distinto del utilizado hasta ahora. La declaración del array
viene encabezada por la palabra “Friend” en vez de “Dim”. Si empleásemos esta última, el
array sólo sería accesible en el módulo donde lo hemos declarado, esto es en “datos.vb”. Pero
con un nivel de acceso “Friend”, conseguimos poder utilizar el array en el código de todos los
ficheros con extensión “vb” que tenemos en el proyecto, esto es, podemos utilizarlo en el
código de los formularios del proyecto. El nivel de acceso “Public” también nos valdría.
También observamos que no hemos especificado ningún valor entre los paréntesis al declarar
el array “aAlumno”, esto es, que no determinamos el número de elementos que contendrá el
array. Ya que no sabemos el número de alumnos que vamos a almacenar en él,
redimensionaremos el array a medida que se vayan introduciendo nuevos alumnos.
Técnico Superior en Desarrollo de Aplicaciones Informáticas
Y por último, declaramos la variable “nAlumno”, también con nivel de acceso “Friend”, y de tipo
“Short” (entero de formato corto).
22
Características del lenguaje y
Unidad
2 controles más comunes
Este método se ejecuta antes de que se muestre el formulario por primera vez, es decir,
cuando se “carga” el formulario en memoria. En él escribimos un comentario y una única
sentencia:
Que inicializa el valor de la propiedad Text de la etiqueta “lblNalum” a cero. Está etiqueta nos
indicará el número de alumnos que tendremos ya recogidos en el array, por lo que inicialmente
valdrá cero.
Si ejecutamos el proyecto en modo depuración (pulsando F8, y ejecutando línea a línea) vemos
que antes de que se muestre el formulario se ejecuta este método y la etiqueta contendrá su
nuevo valor, cero.
Nota: La palabra “MyBase” hace referencia a la clase de donde heredó la clase en la que nos
encontramos (“frmInicio”). Todos los formularios heredan de la clase base “Form”, por lo tanto
Mybase hace referencia esa clase. Y con la expresión “MyBase.Load” se está invocando al
método Load de la clase Form, clase base del formulario “frmInicio”.
Sigamos con el código del formulario. La lógica del proceso parece sencilla: se escribirán
valores para los cuadros de texto txtNombre, txtApellidos y txtCurso, y después se hará clic en
el botón “Aceptar”, esto conllevará el guardar los datos en el array. Su proceso será:
Luego buscamos el método “Click” del botón “btnAceptar” (en las listas desplegables
superiores) y escribiremos el código siguiente:
23
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Me.lblNalum.Text = nAlumno
Para ejecutar este proceso línea a línea (modo depuración) vamos a añadir un punto de
interrupción en el comienzo del método “btnAceptar.Click”, y ejecutamos el proyecto. Damos
valores para un nuevo alumno y pulsamos el botón “Aceptar”. La ejecución se detiene al
comienzo del procedimiento. Para ver los valores que van tomando la variable “nAlumno” y el
array “aAlumno”, vamos a llevarlos a una “ventana de Inspección”. La ventana “Variables
locales” no contendrá estas variables porque, recordemos, están declaradas en el módulo
“datos” no en el formulario.
Empecemos por la variable “nAlumno”, para llevarla a la “ventana inspección”, situamos el
cursor en la variable y vamos al menú, a la opción Depurar + Inspección rápida; nos muestra la
ventana de inspección rápida, hacemos clic en el botón “Agregar inspección” y ya tenemos la
variable en la “ventana inspección”. Hacemos el mismo proceso para el array.
Ahora vamos ejecutando línea a línea el procedimiento (F8) y vamos viendo como va
cambiando el contenido de la variable y el array en la ventana de inspección. Cuando
lleguemos al final del procedimiento, antes de ejecutar la sentencia “End Sub”, tendremos la
variable “nAlumno” con valor 1, y en la posición 1 del array los datos del alumno que hemos
introducido (fig. 16).
Nota: La posición 0 del array se creó al redimensionar el array con el valor 1, pero no la vamos
a utilizar en este ejercicio.
Técnico Superior en Desarrollo de Aplicaciones Informáticas
24
Características del lenguaje y
Unidad
2 controles más comunes
Cómo podéis ver, comprobamos si alguno de los cuadros de texto tiene un valor vacío
(“Nothing”), en el caso de que alguno estuviese vacío, mostramos un mensaje mediante el
objeto “MessageBox”, y su método “Show”, avisando de este hecho, y ejecutamos la sentencia
“Exit Sub”, esta sentencia, como su nombre indica, provoca la conclusión de la ejecución del
procedimiento en el que estamos.
Ahora veamos el código que contendrá el evento “Click” del botón “btnVerDatos”. Simplemente
queremos que al hacer clic en este botón, nos muestre el otro formulario que tenemos en
nuestro proyecto, “frmVerDatos”. Con la siguiente instrucción lo conseguiremos:
Pero este formulario está sin ningún objeto. Vamos a la pestaña de diseño del formulario y
dibujamos sólo dos objetos en él, un “TextBox” y un “Button”.
25
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Tipo de Control Propiedad: Name Propiedad: Text
TextBox txtDatos
Button btnCerrar Cerrar
El formulario quedaría:
Nota: para cambiar el texto que aparece en el cuadro azul superior del formulario. Modificamos
el valor de la propiedad “Text” del formulario “frmVerDatos”.
26
Características del lenguaje y
Unidad
2 controles más comunes
El inconveniente es que la posición 0 del array no la estamos utilizando y con esta secuencia si
se tendría en cuenta y aparecería una línea con dos guiones al principio.
Ya por último nos quedaría asignarle código al botón “btnCerrar”, simplemente vamos a “cerrar”
el formulario actual con la sentencia Me.Close().
Nota: Me hace referencia a la propia clase en la que estamos. En nuestro caso al formulario, el
método Close, provoca el cierre del formulario.
Lo usamos bastante al introducir el código ya que al escribir Me y a continuación añadir un
punto, nos muestra un desplegable con todas las propiedades del formulario y todos los
controles que hemos dibujado en el formulario, facilitándonos así la búsqueda de los
mismos.
También MyClass tiene esta misma utilidad.
El procedimiento quedaría:
27
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Ya hemos terminado el proyecto, vamos a ejecutarlo e introducir varios alumnos y vemos que
funciona tal y como habíamos pensado (fig.20).
28
Técnico Superior en
Desarrollo de Aplicaciones Informáticas
TÉCNICO SUPERIOR EN DESARROLLO DE
APLICACIONES INFORMÁTICAS
CICLO FORMATIVO DE GRADO SUPERIOR
FORMACIÓN PROFESIONAL A DISTANCIA
3
Unidad
MÓDULO
Diseño y realización de servicios de
presentación en entornos gráficos
Título del Ciclo: DESARROLLO DE APLICACIONES INFORMATICAS
Dirección de la obra:
Alfonso Careaga Herrera
Antonio Reguera García
Arturo García Fernández
Ascensión Solís Fernández
Juan Carlos Quirós Quirós
Luís Mª Palacio Junquera
Yolanda Álvarez Granda
ISBN: 978-84-692-3442-6
Esta publicación tiene fines exclusivamente educativos. Queda prohibida la venta, así como la
reprodución total o parcial de sus contenidos sin autorización expresa de los autores y del Copyright
3 Creación y utilización de una
Unidad
clase en Visual Basic.NET
OBJETIVO DE LA UNIDAD
En esta unidad se mostrarán las características del lenguaje Visual Basic .NET para crear una
clase, definiendo sus propiedades y métodos. Desarrollaremos un pequeño ejemplo en el que
crearemos y utilizaremos una clase.
INDICE DE CONTENIDOS
3
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Crear una clase. Propiedades y métodos.
Vamos a crear un nuevo proyecto donde realizaremos un ejemplo de creación de una clase y
utilización de la misma. Al nuevo proyecto le asignamos el nombre “02.ClaseEmpleado”.
Añadimos una clase a nuestro proyecto. Para ello vamos a las opciones del menú “Proyecto +
Agregar Clase…”, aparecerá un cuadro donde le asignaremos un nombre a la clase, el nombre
por defecto es “Class1.vb”, lo cambiaremos por “CEmpleado.vb”.
Al principio de la clase, y dentro del bloque “Public Class CEmpleado…End Class”, vamos a
declarar una serie de variables privadas o internas de la clase, que recogerán características
del empleado tales como: su nombre, categoría, sueldo, número de cuenta bancaria, y nombre
de la entidad bancaria:
Ahora vamos a desarrollar los métodos Property que se emplearan para asignar y obtener los
valores de las variables privadas que hemos declarado.
Técnico Superior en Desarrollo de Aplicaciones Informáticas
El primero será la propiedad Nombre que asignará y obtendrá el valor de la variable csNombre.
En su asignación, comprobaremos que el valor no sea un valor vacío.
4
3 Creación y utilización de una
Unidad
clase en Visual Basic.NET
vacío con la expresión value.Equals(""), donde “value” es el valor que se desea asignar a
la variable csNombre.Si es así se muestra un mensaje y si no se le asigna dicho valor a la
variable. Observar que “value” es de tipo String y por lo tanto disponemos de las funciones de
la clase String, y una de ellas es la función Equals, que en este caso compara el contenido de
“value” con una cadena vacía (“”).
Para la variable csCategoria, sólo aceptaremos los valores “A, B o C”, como categorías válidas.
El método Property que escribiremos será el siguiente:
El valor de la variable cdbSueldo, tendrá relación con la categoría. Para un empleado con la
categoría A, sueldo tendrá que ser mayor o igual a 1000 y menor que 1500; para un empleado
de la categoría B, mayor o igual a 800 y menor que 1000; y para un empleado de la categoría
C, mayor o igual a 500 y menor que 800. Lógicamente primero tenemos que conocer la
categoría del empleado para poder asignarle un sueldo. El método Property que recogerá estas
condiciones será el siguiente:
Nota: Si queremos escribir la extensa condición del ElseIf en varias líneas, debemos de separarlas con un
guión bajo, dejando un espacio en blanco antes de dicho guión. No obstante si queremos podemos
escribirla toda seguida, solamente es por una mejora visual.
5
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Vamos a crear una propiedad CtaBanco que utilizaremos para asignar valores a las variables
csCuenta y csEntidad. Será una propiedad de sólo escritura, por lo que no tendrá el bloque
Get. A la hora de escribir la cabecera del procedimiento Property, añadimos la palabra
WriteOnly, que la identifica como propiedad de sólo escritura.
En nuestro ejercicio adoptaremos el siguiente formato para las cuentas: 1111-123456. Los
cuatro primero números identificaran el banco al que pertenece la cuenta, y los seis siguientes
dígitos serán el número de la cuenta.
Y ya sólo añadiremos una propiedad más. La propiedad EntidadBanco será de sólo lectura,
esto es únicamente tendrá el bloque Get, y su misión será obtener el valor de la variable
csEntidad. En la cabecera del procedimiento escribiremos ReadOnly.
Cómo métodos de la clase, sólo vamos a declarar uno, y de carácter compartido (Shared).
Recordar que un método compartido de una clase se puede ejecutar sin necesidad de crear
instancias de esa clase. El método será el siguiente:
6
3 Creación y utilización de una
Unidad
clase en Visual Basic.NET
End Function
El método FinVacaciones tiene dos parámetros, uno de tipo Date que recogerá la fecha de
inicio de las vacaciones y otro de tipo Integer, que recogerá el número de días de vacaciones, y
devolverá la fecha de finalización de las vacaciones; para ello sumará a la fecha de inicio,
primer parámetro, el número de días de vacaciones, segundo parámetro, empleando la función
AddDays de los tipos de datos Date, para realizar este cálculo. Con ToShortDateString,
conseguimos que nos devuelva la fecha resultante en un formato de fecha corto (dd/mm/aa).
Diseño
Una vez definida la clase CEmpleado. Realizaremos el diseño del formulario de inicio de
nuestro proyecto (Form1.vb) y añadiremos los siguientes controles:
7
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Módulo de datos
Module datos
' declaramos un array que almacenará objetos de la clase CEmpleado
Public aEmpleado(0) As CEmpleado
' declaramos una variable que contendrá el número de empleados que se
vayan introduciendo en el array
Public nEmp As Short
End Module
Técnico Superior en Desarrollo de Aplicaciones Informáticas
Al hacer clic en el botón “Aceptar” del formulario crearemos un objeto o instancia de la clase
CEmpleado, que llamaremos oEmpleado. A continuación asignaremos los contenidos de los
distintos TextBox a las propiedades del objeto. Si alguna asignación no fuese correcta, la
propiedad contendrá un valor Nothing o cero, tal y como las definimos en la clase. En ese caso
llevaremos el cursor al TextBox correspondiente para que el usuario corrija el valor introducido.
Para realizar esta acción tenemos el método Focus, mediante la expresión
“NombreTextBox.Focus()”).
Y a continuación finalizamos la ejecución del procedimiento con “Exit Sub”.
Después de aceptados todos los valores para el objeto oEmpleado, tenemos que almacenarlo
en el array aEmpleado. Para ello y previamente, incrementamos la variable nEmp y
redimensionamos el array para añadir una posición más y almacenar en ella el objeto
oEmpleado. El código que realiza este proceso será el siguiente:
8
3 Creación y utilización de una
Unidad
clase en Visual Basic.NET
Me.txtNombre.Focus()
Exit Sub
End If
Recomiendo que se ejecute el proyecto en modo depuración (F8), línea a línea; observando en
cada momento la secuencia de ejecución del programa y el valor que van tomando las
variables y demás estructuras de datos. Esto facilita mucho la compresión del código escrito,
así como su depuración si se produce algún error.
9
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Recordaremos que el método FinVacaciones tenía dos parámetros, la fecha de inicio de las
vacaciones y el número de días que durarían éstas. Dicho método sumaba los días a la fecha
de inicio y nos proporcionaba la fecha de final de vacaciones. Para obtener los dos parámetros
utilizaremos la función InputBox. Mediante esta función podremos solicitar un dato al usuario a
través de un cuadro de diálogo que se mostrará en pantalla. Su sintaxis es:
InputBox(Mensaje,Título,RespuestaDefecto,XPosicion,YPosicion)
•
Técnico Superior en Desarrollo de Aplicaciones Informáticas
El primer InputBox solicita la fecha de inicio de vacaciones. Como “respuesta por defecto” se
anotó la expresión Now.Date, que proporciona la fecha de hoy y que se mostrará en el cuadro
de diálogo pudiendo el usuario aceptarla o modificarla, si no es ésta la fecha deseada.
10
3 Creación y utilización de una
Unidad
clase en Visual Basic.NET
La última sentencia del código anterior, calcula el final de las vacaciones empleando el método
compartido de la clase CEmpleado, mostrando el resultado en la etiqueta lblFinVacaciones.
Añadamos un nuevo formulario a el proyecto, en él vamos a mostrar los empleados que están
almacenados en el array hasta ese momento. Para añadir un nuevo formulario, vamos a las
opciones del menú Proyecto + Agregar Windows Forms, le llamaremos “frmVerEmpleados.vb”.
Contendrá sólo dos controles:
El TextBox txtEmpleados será de sólo lectura (ReadOnly = true), ya que sólo vamos a mostrar
unos datos, no se van a editar.
11
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
End Sub
Tendremos que incorporar un botón al formulario inicial (Form1.vb) para que desde él
podamos invocar al nuevo formulario frmVerEmpleados:
Y el código sería:
12
Técnico Superior en
Desarrollo de Aplicaciones Informáticas
TÉCNICO SUPERIOR EN DESARROLLO DE
APLICACIONES INFORMÁTICAS
CICLO FORMATIVO DE GRADO SUPERIOR
FORMACIÓN PROFESIONAL A DISTANCIA
4
Unidad
MÓDULO
Diseño y realización de servicios de
presentación en entornos gráficos
Título del Ciclo: DESARROLLO DE APLICACIONES INFORMATICAS
Dirección de la obra:
Alfonso Careaga Herrera
Antonio Reguera García
Arturo García Fernández
Ascensión Solís Fernández
Juan Carlos Quirós Quirós
Luís Mª Palacio Junquera
Yolanda Álvarez Granda
ISBN: 978-84-692-3442-6
Esta publicación tiene fines exclusivamente educativos. Queda prohibida la venta, así como la
reprodución total o parcial de sus contenidos sin autorización expresa de los autores y del Copyright
Controles ListBox, MenuStrip,
Unidad
4 ComboBox, RadioButton y
CheckBox
OBJETIVO DE LA UNIDAD
En esta unidad veremos una serie de ejercicios que nos mostraran el funcionamiento de cinco
controles típicos de los formularios Windows: ListBox, MenuStrip, ComboBox, RadioButton,
CheckBox.
INDICE DE CONTENIDOS
CONTROL LISTBOX.......................................................................................................................... 4
CONTROL MENUSTRIP. ................................................................................................................. 10
CONTROL COMBOBOX.................................................................................................................. 20
CONTROL RADIOBUTTON............................................................................................................. 22
CONTROL CHECKBOX................................................................................................................... 24
3
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Control ListBox.
Un ListBox es un control que contiene una lista de elementos, de los cuales el usuario puede
hacer una selección de uno o varios elementos.
La propiedad Items recoge la lista de elementos que tiene un ListBox. Podemos acceder a ella
en el cuadro de propiedades y asignarle elementos a la lista en tiempo de diseño. También
proporciona métodos para añadir elementos a la lista en tiempo de ejecución.
Vamos a añadir algunos elementos a la propiedad Items del ListBox. De nuevo, en el cuadro
de propiedades buscamos esta propiedad, y hacemos clic en el pequeño cuadro de la derecha.
Nos aparecerá una ventana donde podremos escribir los elementos que deseamos incorporar
al ListBox. Escribiremos una serie de nombres, uno en cada línea. Y hacemos clic en el botón
Aceptar (fig.2).
4
Controles ListBox, MenuStrip,
Unidad
4 ComboBox, RadioButton y
CheckBox
Para ver más características de este control desarrollaremos más el proyecto. Además del
ListBox lstFuente, añadiremos los siguientes controles al formulario
5
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Empezaremos a codificar el evento click de botón “btnAñadirF”. Este botón tendrá como
finalidad el añadir un nuevo elemento al ListBox lstFuente. El código podría ser el siguiente:
En él, primeramente declaramos una variable de tipo String, “dato”. Mediante la función
InputBox solicitamos el dato a añadir a lstFuente. Comprobamos que el valor introducido no es
una secuencia vacía y si no lo es, lo añadimos a la colección Items de lstFuente mediante la
función Add.
dato.Trim. La función Trim elimina los espacios en blanco al inicio y al final de “dato”, si los
hubiera.
El código para el botón “btnAñadirD” será igual que el anterior pero añadiendo el elemento
introducido a lstDestino.
6
Controles ListBox, MenuStrip,
Unidad
4 ComboBox, RadioButton y
CheckBox
Por defecto, en un ListBox podemos seleccionar un elemento de cada vez, pero también es
posible seleccionar varios elementos de la lista. La propiedad SelectionMode con valor “One”
sólo nos permitirá seleccionar un elemento. Vamos a modificar su valor, a “MultiSimple”, con lo
que podremos seleccionar varios elementos, haciendo clic en cada uno de ellos (fig.4).
Dentro del bucle For sólo hay una sentencia. Dicha sentencia invoca al método “Remove” de la
colección “Items” del ListBox lstFuente, y como parámetro le pasamos el primer elemento
seleccionado, que lo proporciona la propiedad “SelectedItem” de lstFuente.
7
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Veámoslo con un ejemplo. Establezcamos un punto de interrupción en la instrucción de
comienzo del blucle For (fig.5).
8
Controles ListBox, MenuStrip,
Unidad
4 ComboBox, RadioButton y
CheckBox
Si ejecutamos “paso a paso” las instrucciones del bucle For, vemos que en la siguiente
ejecución del bucle, el número de elementos que devuelve Count es 2, y que ahora, el primer
elemento seleccionado es “Tomás”, ya que Luis fue eliminado de la lista de lstFuente y
lógicamente, también de la lista de elementos seleccionados. En la siguiente ejecución, Count
devuelve 1 y SelectedItem la cadena “Ramón”.
El código del botón “btnEliminarD” sería el mismo pero sobre el ListBox lstDestino.
Los botones para “Eliminar todos los elementos” de la lista, tendrían el siguiente código:
Simplemento “borrar” con el método Clear la colección Items de los ListBox lstFuente y
lstDestino.
Veamos ahora los métodos para mover elementos entre los dos ListBox. El botón
“btnMoverTodoADestino”, identificado con “>>”, llevará toda el contenido de lstFuente a
lstDestino, y eliminará el contenido de lstFuente. El código podría ser:
9
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Private Sub btnMoverTodoAFuente_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles btnMoverTodoAFuente.Click
Me.lstFuente.Items.AddRange(Me.lstDestino.Items)
Me.lstDestino.Items.Clear()
End Sub
El botón “btnMoverADestino”, llevará los elementos que han sido previamente seleccionados
de lstFuente a lstDestino. Eliminándolos de lstFuente. El código podría ser:
Me.lstFuente.Items.Add(Me.lstDestino.SelectedItem)
Me.lstDestino.Items.Remove(Me.lstDestino.SelectedItem)
Next
End Sub
Control MenuStrip.
10
Controles ListBox, MenuStrip,
Unidad
4 ComboBox, RadioButton y
CheckBox
Observamos que en la parte inferior del diseñador aparece una referencia del nuevo control del
formulario con el nombre “MenuStrip1” (fig.10).
En la parte superior del formulario ya podemos añadir las opciones del menú que necesitemos.
En el mismo literal “Escriba aquí”, vamos a escribir “Opciones-Lista”, que será el nombre de la
primera opción principal del menú. Debajo de éste escribiremos las opciones de menú “Añadir”,
11
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
“Eliminar”, a continuación un separador, que conseguiremos con escribir un simple guión (“-“), y
por último la opción “Rellenar” (fig.11).
Cada una de estas opciones de menú crea un control del tipo “ToolStripMenuItem” que se van
generando a medida que las vamos añadiendo en el editor de menú. Podemos ver estos
controles en la lista desplegable de la parte superior del cuadro de propiedades (fig.12).
Técnico Superior en Desarrollo de Aplicaciones Informáticas
Vemos que, por ejemplo, con la opción “Añadir”, se crea un control cuya propiedad Name será
“AñadirToolStripMenuItem”. La propiedad Text será “Añadir”.
Con las opciones del menú definidas, tendremos que introducir el código que se ejecutará al
seleccionar una de estas opciones. El evento que se produce cuando seleccionamos una
opción de menú es el evento “Click”. Empecemos por la opción “Rellenar”. Esta opción va a
rellenar el ListBox con letras mayúsculas generadas de forma aleatoria.
12
Controles ListBox, MenuStrip,
Unidad
4 ComboBox, RadioButton y
CheckBox
Comentemos el código anterior. Definimos una variable de tipo Random, que llamamos “rnd”, y
la utilizaremos para generar números aleatorios. Borramos la lista, con el método Clear. A
continuación, mediante un bucle For, generaremos cien números aleatorios entre 65 y 90, ya
que entre estos dos valores están representadas las letras mayúsculas en el Código ASCII. La
función “Next”, que nos proporciona los objetos de la clase Random, tal como la hemos escrito,
generará números aleatorios mayores o iguales a 65 y menores a 91.
Mediante la función “Chr” obtenemos el carácter correspondiente al código ASCII obtenido de
forma aleatoria. Y ese carácter lo añadimos a la colección Items de lstLista con el método Add.
Declaramos una varible de tipo Char, ya que solamente necesitamos almacenar un carácter.
Mediante la función InputBox solicitamos dicho carácter. La función “ToUpper”, al final del
13
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
InputBox, convierte a mayúsculas el carácter introducido. Si el valor introducido es distinto de
“Nothing”, lo añadimos a lstLista.
Simplemente escribimos una sentencia que mediante el método Remove de la colección Items
del ListBox, elimina el elemento seleccionado de la lista. Si no se hubiera seleccionado ningún
elemento nada ocurriría.
Ya tenemos todas las opciones del menú principal “Opciones-lista” desarrolladas. Añadiremos
más opciones, como muestra la siguiente figura (fig.14).
La opción del menú principal “Buscar”, tendrá dos opciones, “Buscar elemento” con tecla de
acceso rápido F8, y “Buscar siguiente”, con tecla de acceso rápido F9.
Las opciones de búsqueda de este nuevo menú se realizarán sobre el ListBox lstLista. Por lo
Técnico Superior en Desarrollo de Aplicaciones Informáticas
tanto tenemos que tener en cuenta que si la lista está vacía, las opciones de este menú
principal deberían aparecer desactivadas, ya que no hay elementos para realizar una
búsqueda. Para conseguir esto emplearemos el evento “DropDowOpening” de la opción
principal “Buscar”. Este evento se produce justamente antes de desplegarse el menú, esto es,
antes de mostrar las opciones que contiene. El código para el procedimiento que atiende este
evento podría ser:
14
Controles ListBox, MenuStrip,
Unidad
4 ComboBox, RadioButton y
CheckBox
Para codificar las opciones nuevas del menú, necesitaremos añadir al formulario los siguientes
controles:
15
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Private Sub BuscarElementoToolStripMenuItem_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles
BuscarElementoToolStripMenuItem.Click
LetraBuscar = InputBox("Letra a buscar : ", "Buscar en lista")
If LetraBuscar = Nothing Then Exit Sub
Me.lblLetra.Text = Char.ToUpper(LetraBuscar)
Me.lstPosiciones.Items.Clear()
Posicion = Me.lstLista.FindStringExact(LetraBuscar)
If Posicion <> -1 Then
Me.lstPosiciones.Items.Add(Posicion)
Me.lstLista.TopIndex = Posicion
Me.lstLista.SelectedIndex = Posicion
Me.BuscarSiguienteToolStripMenuItem.Enabled = True
PrimeraPosicion = Posicion
Else
MessageBox.Show("La letra no está en la lista", " Buscar en lista
", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
End Sub
Primeramente declaramos tres variables fuera del procedimiento, ya que las utilizaremos en
otros procedimientos del proyecto. “LetraBuscar” es una variable de tipo Char que recogerá la
letra que estamos buscando en un momento dado, y por lo tanto necesitaremos conocerla
también en el procedimiento asociado al evento de la opción “Buscar siguiente”. Y lo mismo
ocurrirá con las variables de tipo Short “Posicion” y “PrimeraPosicion”. Las definimos como
variables a nivel de formulario, esto es, serán reconocidas en todos los procedimientos del
formulario.
Después, ya que realizamos una primera búsqueda, activamos la opción “Buscar siguiente”, la
cual realizará una nueva búsqueda del carácter, pero a partir de la siguiente posición a la
primera aparición del carácter. Y por último, recogemos en la variable “PrimeraPosicion” el
valor de la variable “Posicion”, ya que necesitaremos conocer ese valor en otros
procedimientos que desarrollaremos a continuación.
16
Controles ListBox, MenuStrip,
Unidad
4 ComboBox, RadioButton y
CheckBox
Antes de probar el código escrito hasta ahora, añadiremos tres sentencias al final del
procedimiento “RellenarToolStripMenuItem_Click”. La finalidad de esas sentencias es “borrar”
el contenido de la etiqueta lblLetra y del ListBox lstPosiciones, y activar la opción “Buscar
elemento”. El código completo sería:
Vamos a ejecutar el proyecto para probar el código escrito hasta ahora. Llenamos el ListBox
seleccionando la opción “Rellenar” o pulsando F11. Busquemos una letra seleccionando la
opción “Buscar elemento” o pulsando F8. Una vez introducida una letra y, si existe alguna
coincidencia en la lista, se situará esa letra como primer elemento visible del ListBox y además
aparecerá seleccionada. En lstPosiciones tendremos la posición del elemento en lstLista
(fig.16).
17
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Las siguientes instrucciones son las mismas que escribimos en el código de la opción “Buscar
elemento”.
Si se encuentra una nueva coincidencia, esto es, si devuelve un valor distinto de -1, añadimos
a la colección Items del ListBox lstPosiciones la posición de la nueva aparición del carácter y
asignamos a las propiedades TopIndex y SelectedIndex del ListBox el valor de la nueva
posición.
Técnico Superior en Desarrollo de Aplicaciones Informáticas
18
Controles ListBox, MenuStrip,
Unidad
4 ComboBox, RadioButton y
CheckBox
Resuelta nuestra duda, tendremos que modificar el procedimiento ya que cuando se vuelva a
repetir la primera aparición detectemos el fin de lista. El nuevo código para el procedimiento de
la opción “Buscar siguiente” podría ser:
19
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Para concluir el proyecto podemos incorporar la opción de menú “Cerrar” que con la sentencia
“Me.Close” con lo que se cierra el formulario.
Control ComboBox.
Añadiremos también un control MenuStrip, con una sola opción de menú, “Añadir Ciudad”.
La disposición de los controles en el formulario podría ser la siguiente (fig.18).
Técnico Superior en Desarrollo de Aplicaciones Informáticas
Al ComboBox cmbCiudades vamos a añadir una serie de elementos en tiempo de diseño. Para
ello, al igual que un ListBox, tendremos que acceder a la propiedad Items del control en el
cuadro de propiedades y en el editor de la colección escribiremos los siguientes nombres de
ciudades: Oviedo, Gijón, Avilés y Mieres (fig.19).
20
Controles ListBox, MenuStrip,
Unidad
4 ComboBox, RadioButton y
CheckBox
El proceso de este ejemplo es sencillo. Cuando el usuario seleccione una de la ciudades del
ComboBox cmbCiudades, la ciudad seleccionada se mostrará en lblCiudad. Al igual que en el
ListBox, el evento que se produce cuando se selecciona un elemento en un ComboBox es
“SelectedIndexChanged”. El código para este evento sería el siguiente.
Con este código ya concluimos el ejemplo. Una propiedad a destacar del ComboBox es
“DropDownStyle”. Las opciones que tiene esta propiedad modifican la apariencia y el
comportamiento del ComboBox. Ejecutar el ejemplo que hemos visto con los distintos valores
que puede tomar esta propiedad y fijaros en la funcionalidad y apariencia del control.
21
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Control RadioButton.
Este control permite ofrecer al usuario un conjunto de opciones para que escoja una de ellas.
Por lo tanto si tenemos varios botones en un formulario, sólo podemos tener una de ellas
seleccionada en un momento dado. Si queremos ofrecer varios conjuntos de opciones,
tendremos que agrupar cada conjunto de opciones en un control GroupBox, que es un control
contenedor de otros controles.
22
Controles ListBox, MenuStrip,
Unidad
4 ComboBox, RadioButton y
CheckBox
La lógica del ejercicio consistirá en modificar la fuente y el estilo del texto “Buenos Días” que
muestra la etiqueta, seleccionando las alternativas que nos ofrecen los RadioButton del
formulario.
Para los otros dos RadioButton escribiremos la misma sentencia, modificando el tipo de fuente.
El tamaño será el mismo para los tres.
23
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Private Sub rbtArial_CheckedChanged(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles rbtArial.CheckedChanged
Me.lblSaludo.Font = New Font("Arial", 10)
End Sub
Control CheckBox.
Técnico Superior en Desarrollo de Aplicaciones Informáticas
Los controles CheckBox tienen una función similar a los RadioButton; permiten al usuario
elegir de un conjunto de opciones, pero, al contrario que los RadioButton, se pueden
seleccionar varias de estas opciones. Desarrollemos un ejercicio de ejemplo. Creamos un
nuevo proyecto, que llamaremos “09.ControlCheckBox”. Incorporaremos al proyecto los
siguientes controles:
24
Controles ListBox, MenuStrip,
Unidad
4 ComboBox, RadioButton y
CheckBox
Al igual que los controles RadioButton, los CheckBox tienen la propiedad Checked que toma el
valor True si está seleccionado y False si no lo está. También tienen el evento
“CheckedChanged”, que se produce cuando se modifica el valor de la propiedad Checked de
un control CheckBox.
La lógica del ejercicio es sencilla. El usuario seleccionará algunas de las noticias que le
interesan y hará clic en el botón. Mostraremos la selección que hizo mediante un MessageBox.
Creamos una variable de tipo String y la llamamos “Seleccion”. En ella vamos a guardar el tipo
de noticias que el usuario ha seleccionado. Vamos concatenando (“&=”) el valor de la
propiedad Text de los CheckBox si la propiedad Checked es True. La expresión “& vbTab” la
utilizamos para separar los tipos de noticias en la variable (carácter de tabulador).
25
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
el procedimiento que atiende este evento mostramos el mensaje de advertencia si el valor que
va a tomar Checked es True, si el valor va a ser False no se muestra dicho mensaje.
26
Técnico Superior en
Desarrollo de Aplicaciones Informáticas
TÉCNICO SUPERIOR EN DESARROLLO DE
APLICACIONES INFORMÁTICAS
CICLO FORMATIVO DE GRADO SUPERIOR
FORMACIÓN PROFESIONAL A DISTANCIA
5
Unidad
MÓDULO
Diseño y realización de servicios de
presentación en entornos gráficos
Título del Ciclo: DESARROLLO DE APLICACIONES INFORMATICAS
Dirección de la obra:
Alfonso Careaga Herrera
Antonio Reguera García
Arturo García Fernández
Ascensión Solís Fernández
Juan Carlos Quirós Quirós
Luís Mª Palacio Junquera
Yolanda Álvarez Granda
ISBN: 978-84-692-3442-6
Esta publicación tiene fines exclusivamente educativos. Queda prohibida la venta, así como la
reprodución total o parcial de sus contenidos sin autorización expresa de los autores y del Copyright
5 Métodos y funciones de los
Unidad
arrays. La clase Random
OBJETIVO DE LA UNIDAD
En esta unidad desarrollaremos un ejercicio que nos permitirá profundizar en los arrays,
utilizando algunos de sus métodos y funciones. También emplearemos la clase random que
nos proporciona el .Net.
INDICE DE CONTENIDOS
PLANTEAMIENTO DE EJERCICIO................................................................................................... 4
Diseño ........................................................................................................................................ 4
Proceso del ejercicio. ................................................................................................................. 5
3
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Planteamiento de ejercicio
Diseño
En el formulario de inicio del proyecto (Form1.vb), añadiremos los siguientes controles:
4
5 Métodos y funciones de los
Unidad
arrays. La clase Random
Vamos también a “desactivar” los botones btnOrdenar y btnRepeticiones, para ello asignamos
el valor False a propiedad Enabled de ambos botones. A lo largo del proceso iremos
activándolos.
La función Val convierte el valor de tipo string de la propiedad Text en un valor numérico
Si el valor introducido es correcto. Redimensionamos el array con ese valor para crear el
espacio justo para almacenar los números aleatorios. Declaramos un objeto de la clase
Random y mediante un bucle “for” generamos los números aleatorios. El bucle for se recorrerá
desde 1 hasta el número de elementos que tiene el array, y que nos lo proporciona el método
GetUpperBound.
Dentro de este bucle, utilizamos el objeto de la clase Random “rnd”. Esta clase contiene el
método Next, que pasándole el argumento 100 a dicho método, nos proporciona un valor
menor que 100 de forma aleatoria.
Buscar en la ayuda información sobre este método. Hacer la búsqueda con la expresión
Random.Next
5
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Para mostrar todos los números aleatorios almacenados en el array en la etiqueta vamos a
declarar un procedimiento “VerArray” que invocaremos en varias ocasiones a lo largo del
ejercicio, una de ellas será en este procedimiento; y por último activamos el botón btnOrdenar,
asignándole el valor true a la propiedad Enabled.
Sub VerArray()
Me.lblVerMatriz.Text = Nothing
For i As Short = 1 To aNumeros.GetUpperBound(0)
Me.lblVerMatriz.Text &= i & " - " & aNumeros(i) & vbNewLine
Next
End Sub
6
5 Métodos y funciones de los
Unidad
arrays. La clase Random
Es muy sencillo. Si investigamos en la ayuda, vemos que la clase Array tiene un método para
ordenar los elementos de un array, el método Sort. Para utilizar este método especificamos el
nombre de la clase, seguido del método Sort y como parámetro el array a ordenar. Y volvemos
a invocar el método VerArray para que nos muestre nuevamente los números aleatorios del
array en la etiqueta, pero esta vez ordenados.
Sólo nos queda asignarle código al botón btnRepeticiones. Este botón está desactivado, lo
activaremos cuando se teclee un número en txtNumero y lo volvemos a desactivar cuando
txtNumero este vacío. Para realizar este proceso vamos a utilizar el evento TextChanged. Este
evento se produce cuando cambia el contenido de la propiedad Text de un TextBox. El código
a introducir en dicho evento podría ser el siguiente:
El código es sencillo, mediante una sentencia if, comprobamos si el valor de la propiedad text
de txtNumero es Nothing, desactivando el botón si es así, y en caso contrario lo activamos.
7
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Para realizar este proceso vamos a crear una función, que llamaremos nRepeticiones, en ella
contaremos el número de veces que se repite el número a buscar en el array. Será de tipo
Short, ya que nos devuelve un valor entero. El código podría ser el siguiente:
Y, por último, en el evento Click del botón btnRepeticiones formamos el literal que aparecerá
en la etiqueta lblRepeticiones e invocamos el método nRepeticiones anterior.
8
Técnico Superior en
Desarrollo de Aplicaciones Informáticas
TÉCNICO SUPERIOR EN DESARROLLO DE
APLICACIONES INFORMÁTICAS
CICLO FORMATIVO DE GRADO SUPERIOR
FORMACIÓN PROFESIONAL A DISTANCIA
6
Unidad
El parámetro “sender” y la
colección “Controls” de un
formulario
MÓDULO
Diseño y realización de servicios de
presentación en entornos gráficos
Título del Ciclo: DESARROLLO DE APLICACIONES INFORMATICAS
Dirección de la obra:
Alfonso Careaga Herrera
Antonio Reguera García
Arturo García Fernández
Ascensión Solís Fernández
Juan Carlos Quirós Quirós
Luís Mª Palacio Junquera
Yolanda Álvarez Granda
ISBN: 978-84-692-3442-6
Esta publicación tiene fines exclusivamente educativos. Queda prohibida la venta, así como la
reprodución total o parcial de sus contenidos sin autorización expresa de los autores y del Copyright
El parámetro “sender” y la
Unidad
6 colección “Controls” de un
formulario
OBJETIVO DE LA UNIDAD
INDICE DE CONTENIDOS
PLANTEAMIENTO DE EJERCICIO................................................................................................... 4
Diseño ........................................................................................................................................ 4
Proceso del ejercicio. ................................................................................................................. 5
Añadir un control en tiempo de ejecución .................................................................................. 7
3
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Planteamiento de ejercicio
Diseño
Como txtPorcentaje y txtTotal solamente las utilizaremos para mostrar datos, no para
introducirlos, vamos a modificar el valor de la propiedad ReadOnly de dichos controles,
estableciéndola a True, en tiempo de diseño.
4
El parámetro “sender” y la
Unidad
6 colección “Controls” de un
formulario
El proceso del ejercicio consiste en introducir una cantidad en txtCantidad, y el usuario hará clic
en algunos de los botones del formulario que representa porcentajes que se aplicarán a la
cantidad introducida. Calculado el porcentaje lo mostramos en txtPorcentaje y el total, que será
la suma de la cantidad más el porcentaje, en txtTotal. Por ejemplo, si introducimos la cantidad
1000 y el botón seleccionado es el del 16%, el porcentaje será 160 y el total 1160, como
vemos en la imagen siguiente.
Observemos también que al hacer clic en uno de los botones, la etiqueta del centro tendrá que
mostrarnos el porcentaje seleccionado, por lo que tendremos que modificar la propiedad Text
de dicha etiqueta en tiempo de ejecución, cada vez que seleccionemos un porcentaje.
Atendiendo a la lógica del ejercicio, nos damos cuenta que el proceso para los tres botones es
el mismo, lo único que varía es el valor del porcentaje a aplicar. Por lo tanto vamos a hacer que
un mismo procedimiento atienda o maneje el evento clic de los tres botones. Para conseguir
esto, la cabecera del procedimiento tendrá que ser la siguiente:
Para escribir esta cabecera, nos situamos en el primero de los botones y hacemos doble clic,
esto nos llevará a la ventana de código del evento click de ese botón; modificamos el nombre
del procedimiento dándole un nombre que no se identifique con un botón en concreto, por
ejemplo “btnPorcentaje_Click”; y añadimos, después de la cláusula Handles, la expresión
“botón.evento” de los botones restantes. Así conseguiremos que el procedimiento
btnPorcentaje se ejecute al hacer clic en alguno de los tres botones de porcentaje.
Ahora veamos el código que podemos incorporar a este procedimiento. Lo primero que vamos
hacer es validar los datos de entrada, es decir, si no tenemos ninguna cantidad introducida en
txtCantidad, vamos a mostrar un mensaje advirtiendo de esta circunstancia, llevamos el cursor
a txtCantidad con el método Focus, y finalizamos la ejecución del procedimiento (Exit Sub).
5
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
A continuación tendremos que determinar el porcentaje a calcular. Dado que este
procedimiento atiende al evento clic de los tres botones, para saber cual botón ha provocado la
ejecución del procedimiento tendremos que consultar al primer parámetro del procedimiento,
sender (“ByVal sender As System.Object”). Como podemos observar es del tipo
Object y hace referencia al objeto o control que provocó la ejecución del procedimiento, en
nuestro caso, referenciará al botón seleccionado de los tres posibles botones que atiende el
procedimiento.
la variable btn recogerá el valor de la propiedad Text del botón seleccionado, esto es, si el
botón fue el del “16%”, este será el contenido de dicha variable.
Pero, realmente lo que nos interesa será el valor numérico de esa expresión, es decir,
necesitamos obtener solamente los dos primeros caracteres (“16”) y desechar el último (“%”).
Esto lo conseguimos con la función Val, que al convertir a valor numérico la expresión “16%”
solamente selecciona los dígitos numéricos, desechando el símbolo de porcentaje.
Y ya, por último, sólo quedará realizar los cálculos para obtener el porcentaje y el total, y
también mostrar, en la etiqueta lblPorcentaje, el porcentaje seleccionado.
Sería muy conveniente ejecutar el procedimiento paso a paso, para ir viendo con más facilidad
la lógica del proceso y los valores que van tomando las variables en la ejecución de cada
sentencia.
6
El parámetro “sender” y la
Unidad
6 colección “Controls” de un
formulario
Vamos a incorporarle otra funcionalidad a este ejercicio. Necesitamos que aparezca un botón
nuevo en el formulario, si la cantidad que se introduce es igual o superior a 10000. Este botón
calculará el porcentaje del 54%. Y si volvemos a modificar la cantidad a un valor inferior a
10000, ese nuevo botón tendrá que eliminarse del formulario.
Para realizar este proceso, codificaremos el evento TextChanged de txtCantidad que, como su
nombre indica, ocurre cuando la propiedad Text de un TextBox se modifica.
Con esta variable ya podemos realizar la pregunta que en cada modificación de txtCantidad
debemos plantear. Esta pregunta es: “si la cantidad es igual o superior a 10000 y si no está el
botón54 en el formulario”. Ya que puede ocurrir que el valor anterior de txtCantidad ya fuese
igual o superior a 10000 y el botón54 ya estuviese creado en el formulario; en ese caso no
sería necesario crearlo.
Declaramos el nuevo objeto “btn54” del tipo Button. También lo declararemos fuera del
procedimiento, como la variable de tipo Boolean “boton54”.
¿Cómo podemos añadir un nuevo control al formulario?. Todos los controles que dibujamos en
un formulario se encuentran recogidos en una colección, la colección Controls. Si queremos
incorporar un nuevo control al formulario tendremos que añadir a esta colección el nuevo
control. Este se consigue mediante el método Add.
Hemos creado un objeto de tipo Button y lo hemos añadido al formulario, ahora tendremos que
dar valores a las propiedades de ese nuevo control.
btn54.Text = "54%"
btn54.Size = New Size(62, 20)
btn54.Location = New Point(24, 156)
7
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Se asignó un valor a la propiedad Text (“54%”); un tamaño a la propiedad Size, que será el
mismo que tengan los otros botones; y una localización en el formulario. Para determinar la
localización del nuevo control en el formulario nos fijaremos en uno de los botones que ya
están en él, por ejemplo el del “33%”.
Observemos la siguiente imagen.
Técnico Superior en Desarrollo de Aplicaciones Informáticas
Vemos que la coordenada X del botón “33%” es 24, y es la distancia del botón al borde
izquierdo del formulario; al nuevo botón le asignaremos esa misma distancia. La coordenada Y
del botón “33%” es 112, y es la distancia del botón al borde superior del formulario; el nuevo
botón queremos que aparezca más debajo de éste, luego le asignaremos un valor mayor, por
ejemplo 156. Con estos valores, cuando aparezca el botón nuevo estará situado debajo del
botón “33%”.
Ya sólo resta escribir la sentencia que asocie el evento clic de este nuevo botón al
procedimiento “btnPorcentaje_Click”; tal y como ocurre con todos los botones de porcentaje de
este formulario.
Con esta sentencia ya conseguimos que al hacer clic en el nuevo botón “btn54” se ejecute el
procedimiento “btnPorcentaje_Click”.
8
El parámetro “sender” y la
Unidad
6 colección “Controls” de un
formulario
La última línea del código anterior es para asignarle el valor True a la variable Boolean
boton54, ya que ahora el botón nuevo está en el formulario. Al estar declarada fuera del
procedimiento, en la siguiente ejecución del procedimiento tendrá valor True y sabremos que el
botón nuevo está presente en el formulario.
Ahora tendríamos que completar el código con las sentencias necesarias para eliminar el botón
btn54 cuando la cantidad sea inferior a 10000 y el nuevo botón esté en el formulario.
…………….
…………….
ElseIf Val(Me.txtCantidad.Text) < 10000 And boton54 Then
Me.Controls.Remove(btn54)
boton54 = False
…………….
9
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Si ejecutamos el ejercicio, podemos comprobar su funcionamiento. Para cantidades iguales o
superiores a 10000, aparece el nuevo botón. Y al hacer clic sobre él, calcula el porcentaje
asignado al botón, el 54%.
Técnico Superior en Desarrollo de Aplicaciones Informáticas
10
Técnico Superior en
Desarrollo de Aplicaciones Informáticas
TÉCNICO SUPERIOR EN DESARROLLO DE
APLICACIONES INFORMÁTICAS
CICLO FORMATIVO DE GRADO SUPERIOR
FORMACIÓN PROFESIONAL A DISTANCIA
7
Unidad
MÓDULO
Diseño y realización de servicios de
presentación en entornos gráficos
Título del Ciclo: DESARROLLO DE APLICACIONES INFORMATICAS
Dirección de la obra:
Alfonso Careaga Herrera
Antonio Reguera García
Arturo García Fernández
Ascensión Solís Fernández
Juan Carlos Quirós Quirós
Luís Mª Palacio Junquera
Yolanda Álvarez Granda
ISBN: 978-84-692-3442-6
Esta publicación tiene fines exclusivamente educativos. Queda prohibida la venta, así como la
reprodución total o parcial de sus contenidos sin autorización expresa de los autores y del Copyright
El evento KeyPress. El parámetro
Unidad
7 "e". La instrucción ”Try...Catch”.
La función “Format”
OBJETIVO DE LA UNIDAD
En esta unidad desarrollaremos un sencillo ejercicio que nos permitirá conocer una serie de
conceptos importantes en el entorno del lenguaje que estamos utilizando:
• El evento KeyPress
• El parámetro “e”
• La instrucción “Try…Catch”
• Y la función “Format”
INDICE DE CONTENIDOS
PLANTEAMIENTO DE EJERCICIO................................................................................................... 4
Diseño ........................................................................................................................................ 4
Proceso del ejercicio. ................................................................................................................. 4
3
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Planteamiento de ejercicio
Diseño
El proceso del ejercicio consiste en introducir una cantidad de euros en txtEuros y al pulsar la
tecla “Enter” nos muestre en txtDolares el cambio en dólares. Y viceversa, si introducimos una
cantidad de dólares en txtDolares, al pulsar “Enter”, en txtEuros nos muestre el cambio en
euros.
Por lo tanto, lo primero que necesitaremos saber es cómo podemos detectar si el usuario pulsó
la tecla Enter. Para ello tendremos que utilizar el evento KeyPress de un TextBox. Este evento
tiene lugar al pulsar una tecla cuando estamos editando el contenido de un TextBox. Hagamos
doble clic en el TextBox txtEuros para ir a la ventana de código del formulario. Nos sitúa dentro
del evento TextChanged de txtEuros. Vamos a buscar en la lista desplegable de la parte
superior de la ventana, el evento KeyPress.
4
El evento KeyPress. El parámetro
Unidad
7 "e". La instrucción ”Try...Catch”.
La función “Format”
e.KeyChar
El evento “txtEuros.KeyPress” se producirá siempre que pulsemos una tecla cualquiera cuando
estamos editando txtEuros. Por lo tanto tendremos que preguntar en cada pulsación, si la tecla
pulsada es la tecla Enter, ya que, en ese caso, se acabó la introducción de la cantidad en euros
y se realiza el cálculo del cambio a dólares.
La constante “vbCr” hace referencia a la tecla Enter, o carácter “de retorno de carro” o
carácter “13”.
El parámetro “e” también tiene otra propiedad, “Handled”. Esta propiedad es de tipo Boolean, y
si, en un evento KeyPress de un Texbox, le asignamos un valor True, conseguimos que se
rechace el carácter pulsado y no se represente en el TextBox. Si el valor asignado es False,
el carácter sí aparecerá en el TextBox.
Con esta información vamos a emplear el evento KeyPress para realizar un proceso de
validación de los datos a introducir en txtEuros.
Solamente queremos que en txtEuros se acepten los números y la coma decimal. Vamos a
definir una función de tipo Boolean que reciba como parámetro un carácter y devuelva un valor
False si es un número o una coma, y valor True en caso contrario. Será así por la
funcionalidad de la propiedad Handled descrita. Ya que si el carácter pulsado no es un número
ni una coma, para rechazarlo, habrá que asignarle el valor True a la propiedad Handled.
5
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Return False
Else
Return True ' se rechaza el carácter pulsado
End If
End Function
El tipo de datos “Char”, tiene la función “IsNumber” de tipo Boolean que devuelve un valor
True si el carácter que le pasamos como parámetro es un carácter numérico, y False si no lo
es.
Por lo tanto el evento KeyPress tendrá, por ahora, las siguientes instrucciones.
Si se pulsó la tecla Enter, hay que realizar la conversión, proceso que aún no hemos
desarrollado. Con cualquier otro carácter pulsado realizamos la validación a través de la
función “ValidaCaracter”. Se le pasa el carácter pulsado, “e.Keychar”, y en dicha función
comprobamos si el carácter es un número o una coma. Si no es un número o una coma
devuelve el valor True, que asignando este valor a la propiedad Handled del parámetro “e”, se
rechaza el carácter pulsado y no aparece en txtEuros.
Podemos mejorar la función de validación que hemos creado, permitiendo también que se
acepte la pulsación de la tecla de retroceso para poder corregir los caracteres tecleados en
txtEuros si nos hemos equivocado en su introducción. Para ello añadimos una nueva condición
a la sentencia “if” de la función “ValidaCaracter”. Dicha función quedaría
6
El evento KeyPress. El parámetro
Unidad
7 "e". La instrucción ”Try...Catch”.
La función “Format”
Luego para realizar el cambio de euros a dólares multiplicaremos el contenido de txtEuros por
la constante “Cambio”.
El contenido de la propiedad Text de txtEuros es de tipo String, vamos a convertirlo a numérico
para realizar la operación anterior. En ejemplos anteriores utilizamos la función Val para esta
acción. Pero en este caso vamos a utilizar otra función de conversión que nos proporciona este
entorno de desarrollo. La función “CSng” convierte el argumento que se le pasa a un número
decimal de precisión simple.
¿Por qué no utilizamos la función Val? Veámoslo con un ejemplo. Si ejecutamos las siguientes
instrucciones:
Observaremos que en la primera sentencia el valor devuelto por la función Val es 1.4 y en la
segunda es 1.0. El motivo es que se está trabajando con la notación inglesa donde se utiliza el
punto decimal y no la coma. La función Val al encontrar una coma no sigue la conversión y no
tiene en cuenta el decimal para formar el número de tipo Single.
Sin embargo, en nuestro sistema operativo casi seguro que tenemos seleccionado en la
“Configuración Regional y de idiomas” el formato español, donde utilizamos la coma decimal.
La función CSng nos resuelve este problema. La sentencia siguiente:
En este caso sí convierte el número con su parte entera y decimal, devuelve el valor 1.4.
No obstante observaremos que convierte la coma decimal en un punto decimal. Y esto es
necesario porque internamente, el entorno de desarrollo que utilizamos, trabaja con la notación
inglesa.
Luego cuando llevemos el resultado a txtDolares veremos que el punto decimal se convierte en
coma decimal por la configuración que tenemos en nuestro sistema operativo.
Ya hemos visto los motivos que nos obligan a utilizar la función “CSng”. Sin embargo se nos
plantea otro problema. Cuando introducimos un valor que la función CSng no puede convertir a
tipo Single, la ejecución del programa se detiene y nos muestra un mensaje de error. Por
ejemplo, si ejecutamos la siguiente instrucción.
Como no puede convertir el String “1,,4” a un valor numérico porque se encuentra con dos
comas, se producirá un error de ejecución con el mensaje “La conversión de la cadena "1,,4"
en el tipo 'Single' no es válida”.
7
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Try
Valor = CSng(Me.txtEuros.Text)
Catch ex As Exception
MessageBox.Show(ex.Message)
Exit Sub
End Try
El nombre de variable “ex” es el que se le asigna por defecto, si queremos podemos cambiarlo.
La clase “Exception” contiene todos los errores que se pueden producir en la ejecución de una
aplicación.
Ya sólo nos queda calcular el cambio y mostrarlo en txtDolares. La siguiente sentencia nos
valdría.
Pero para evitar mostrar cambios con muchos decimales. Como el representado en la siguiente
imagen.
Técnico Superior en Desarrollo de Aplicaciones Informáticas
Vamos a utilizar la función “Format” para que solamente nos muestre dos decimales. La
sentencia sería.
8
El evento KeyPress. El parámetro
Unidad
7 "e". La instrucción ”Try...Catch”.
La función “Format”
Tanto el carácter “0” como el carácter “#” identifican una posición de un dígito. La diferencia es
que con el carácter “#”, si el valor de esa posición es cero, no representa nada en esa posición,
y con el carácter “0” si se muestra el cero.
End Class
Para concluir el ejercicio, tendremos que programar el evento KeyPress de txtDolares para
que, al pulsar Enter, convierta la cantidad introducida en txtDolares a euros y los muestre en
txtEuros.
En este caso para realizar el cambio de dólares a euros dividiremos el contenido de txtDolares
por la constante “Cambio”. El código sería:
9
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Private Sub txtDolares_KeyPress(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyPressEventArgs) Handles txtDolares.KeyPress
Dim valor As Single
' si pulsó Enter, realizamos la conversión
If e.KeyChar = vbCr Then 'c = ControlChars.Cr
Try
valor = CSng(Me.txtDolares.Text)
Catch ex As Exception
MessageBox.Show(ex.Message)
Exit Sub
End Try
Me.txtEuros.Text = Format(valor / Cambio, "#,##0.00")
Else
' validar carácter tecleado
e.Handled = ValidaCaracter(e.KeyChar)
End If
End Sub
Por supuesto que también validamos la entrada de caracteres para que solamente se acepten
los números y la coma decimal, empleando la función “ValidaCaracter”.
Técnico Superior en Desarrollo de Aplicaciones Informáticas
10
Técnico Superior en
Desarrollo de Aplicaciones Informáticas
TÉCNICO SUPERIOR EN DESARROLLO DE
APLICACIONES INFORMÁTICAS
CICLO FORMATIVO DE GRADO SUPERIOR
FORMACIÓN PROFESIONAL A DISTANCIA
8
Unidad
MÓDULO
Diseño y realización de servicios de
presentación en entornos gráficos
Título del Ciclo: DESARROLLO DE APLICACIONES INFORMATICAS
Dirección de la obra:
Alfonso Careaga Herrera
Antonio Reguera García
Arturo García Fernández
Ascensión Solís Fernández
Juan Carlos Quirós Quirós
Luís Mª Palacio Junquera
Yolanda Álvarez Granda
ISBN: 978-84-692-3442-6
Esta publicación tiene fines exclusivamente educativos. Queda prohibida la venta, así como la
reprodución total o parcial de sus contenidos sin autorización expresa de los autores y del Copyright
Editor. Control RichTextBox.
Unidad
8 Cuadros de diálogos
OBJETIVO DE LA UNIDAD
En esta unidad desarrollaremos un sencillo “editor de texto”. Para ello utilizaremos el control
RichTextBox, de similares características a un TextBox pero con mayores posibilidades. Y
también empleamos los controles de diálogos SaveFileDialog, OpenFileDialog, FontDialog y
ColorDialog.
INDICE DE CONTENIDOS
PLANTEAMIENTO DE EJERCICIO................................................................................................... 4
Diseño ........................................................................................................................................ 4
Proceso del ejercicio. ................................................................................................................. 7
3
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Planteamiento de ejercicio
Vamos a desarrollar un pequeño editor. Para ello, crearemos un nuevo proyecto, con el nombre
“11.Editor”.
Diseño
Al formulario principal, vamos a añadir un control MenuStrip, para incorporarle una serie de
opciones de menú al formulario. Y un control de similares características a un cuadro de texto
TextBox, pero con más funcionalidades, “RichTextBox”.
Técnico Superior en Desarrollo de Aplicaciones Informáticas
Queremos que el control RichTextBox, ocupe todo el formulario, para ello vamos a su
propiedad “Dock”, y seleccionamos el rectángulo central que nos muestra al desplegar sus
posibles opciones. El valor que toma esta propiedad al hacer esa selección es “Fill”.
4
Editor. Control RichTextBox.
Unidad
8 Cuadros de diálogos
Como se puede ver, modificamos para algunas de las opciones la propiedad ShorcutKeys,
para tener un acceso directo a ellas mediante la combinación de teclas Ctrl y una letra.
5
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
6
Editor. Control RichTextBox.
Unidad
8 Cuadros de diálogos
Estos controles se incorporan en el parte inferior del diseñador, al lado del control “MenuStrip”.
Su finalidad es mostrar los cuadros de diálogo típicos del entorno del sistema operativo
Windows tanto para guardar archivo, abrir archivo, mostrar las fuentes o los colores
disponibles.
La finalidad del ejercicio es realizar las funciones de un pequeño editor, reflejadas en los
menús que hemos creado, y utilizando el control RichTexBox para mostrar el texto editado.
Para comenzar la programación del proyecto. Vamos a definir una variable a nivel de formulario
que recoja el nombre que le hemos dado al archivo que estamos editando.
Comenzamos con la opción “Archivo + Guardar”. Esta opción será la primera que
seleccionemos cuando ejecutamos la aplicación. Pero no estará disponible hasta que hayamos
escrito algo en rtxtEditor. Y esto lo podremos controlar mediante la propiedad “Modified” que ya
vimos con TextBox. Para ello, en el evento “DropDownOpening” activaremos la opción
“Guardar” si rtxtEditor se modificó o la desactivamos si no hubo modificación.
Otra cuestión que se nos plantea a la hora de seleccionar la opción “Archivo + Guardar” es que
no tengamos asignado ningún nombre al archivo, es decir que la variable a nivel de formulario
“NombreArchivo” este a “Nothing”. Por lo que la opción que realmente tendríamos que ejecutar
sería “Guardar como” para asignarle un nombre de archivo al texto que queremos guardar.
Veamos el código que podríamos asignarle a la opción “Guardar”.
Me.GuardarComoToolStripMenuItem.PerformClick()
7
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Esta sentencia simula la acción del usuario de hacer clic en el botón “Guardar como”.
• Filter: con ella vamos a establecer la cadena actual de filtro de nombres de archivo,
que determina las opciones que aparecen en la lista desplegable “Tipo” del cuadro de
diálogo.
8
Editor. Control RichTextBox.
Unidad
8 Cuadros de diálogos
En nuestro caso establecemos el tipo de archivo con formato de texto enriquecido, que
tienen la extensión “RTF” y todos los ficheros, extensión “*.*”. La asignación a la
propiedad Filter será:
El separador utilizado es la barra vertical que se obtiene pulsado la combinación de teclas “alt
gr” + “1”
A continuación comprobamos, con una sentencia “if”, si el usuario no hizo clic en el botón
“Cancelar” del cuadro de diálogo. Si fuese así, la variable “NombreArchivo” estará a Nothing.
Si el usuario seleccionó o tecleo un nombre de archivo. Guardamos el archivo con el método
“SaveFile”. Mostramos el nombre del archivo en la barra del título del formulario (Me.Text =
NombreArchivo). Colocamos el cursor al final del texto del rtxtEditor con la sentencia
siguiente:
Me.rtxtEditor.SelectionStart = Me.rtxtEditor.TextLength
9
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
La ruta de archivos que aparece por defecto en la lista desplegable “Guardar en:” del cuadro de
diálogo suele ser la carpeta “Debug” del proyecto, es la carpeta donde se encuentra el fichero
ejecutable.
La opción “Archivo + Abrir” del menú mostrará un cuadro de diálogo que permita al usuario
seleccionar un archivo de los ya almacenados en el disco. Pero deberemos tener en cuenta si
el texto que se está editando en el RichTextBox ha sufrido cambios, e interrogar al usuario si
esos cambios desea descartarlos, ya que si abrimos un nuevo archivo en el RichTextBox,
dichos cambios se perderían.
With Me.OpenFileDialog1
.Filter = "Ficheros RTF|*.rtf|Todos los ficheros|*.*"
.FileName = Nothing
.ShowDialog()
NombreArchivo = .FileName
End With
If NombreArchivo <> Nothing Then
Me.rtxtEditor.LoadFile(NombreArchivo)
Me.Text = NombreArchivo
' colocar el cursor al final del texto
Me.rtxtEditor.SelectionStart = Me.rtxtEditor.TextLength
Me.rtxtEditor.Modified = False
End If
End Sub
Técnico Superior en Desarrollo de Aplicaciones Informáticas
Si el usuario no hizo clic en el botón Cancelar y seleccionó un nombre de archivo, este archivo
lo “cargamos” en rtxtEditor con el método “LoadFile”. A continuación realizamos las mismas
acciones que en el procedimiento anterior (colocar el cursor al final del texto y modificar el valor
de la propiedad Modified)
La opción “Archivo + Nuevo” consistirá en crear un archivo nuevo, para ello eliminaremos el
contenido de rtxtEditor, y también el nombre de archivo recogido en la variable
“NombreArchivo”. Pero si el texto editado en ese momento en rtxtEditor se modificó, le
preguntaremos al usuario si desea descartar los cambios. El código para esta opción podría ser
el siguiente.
10
Editor. Control RichTextBox.
Unidad
8 Cuadros de diálogos
Me.rtxtEditor.Clear()
Me.Text = "Editor"
NombreArchivo = Nothing
Me.rtxtEditor.Modified = False
End Sub
La última opción del menú “Archivo” que nos queda por programar es la opción “Salir”, cuyo
objetivo es cerrar la aplicación, que conseguimos con la sentencia Application.Exit().
No obstante, al igual que en el anterior, comprobaremos primero si se modificó el contenido de
texto y preguntaremos si se desea o no descartar los cambios.
Las opciones del menú “Editar” van a utilizar el “portapapeles” del sistema operativo. En el
Visual Studio hay una clase para manejar los datos en él almacenados, la clase “Clipboard”.
Podemos incluir en el procedimiento “Load” del formulario la sentencia que borra el
portapapeles para que al ejecutar la aplicación tengamos el portapapeles del sistema operativo
vacío.
La clase Clipboard tiene métodos para realizar las acciones de Cortar, Copiar y Pegar. Pero el
control RichTextBox tiene sus propios métodos para realizar estas acciones. Utilizando los
métodos del control RichTexBox, “Cut”, “Copy” y “Paste”, el código para las opciones del
menú “Cortar”,”Copiar” y “Pegar” será sencillo.
11
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Private Sub CopiarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles CopiarToolStripMenuItem.Click
Me.rtxtEditor.Copy()
End Sub
Con estos procedimientos ya tenemos disponibles en nuestro editor las acciones Cortar, Copiar
y Pegar. Pero pensemos en la posibilidad de llevar a cabo estas acciones. Si no tenemos
ningún texto seleccionado no podremos realizar las acciones de Cortar y Pegar. Por lo tanto,
en el evento “DropDowOpening” de la opción “Editar”, comprobamos si la propiedad
“SelectionLength” de rtxtEditor es mayor que 0 (cero), si es así tenemos texto seleccionado y
por lo tanto activamos las opciones Cortar y Copiar. Si no se cumple la condición es que no hay
texto seleccionado y desactivamos esas opciones.
El procedimiento sería:
texto seleccionado
If Me.rtxtEditor.SelectionLength > 0 Then
Me.CortarToolStripMenuItem.Enabled = True
Me.CopiarToolStripMenuItem.Enabled = True
Else
Me.CortarToolStripMenuItem.Enabled = False
Me.CopiarToolStripMenuItem.Enabled = False
End If
Las opciones “Deshacer” y “Rehacer”, tampoco tienen dificultad ya que el control RichTextBox
proporciona los métodos “Undo” y “Redo” que deshacen y rehacen la última operación en un
RichTextBox.
12
Editor. Control RichTextBox.
Unidad
8 Cuadros de diálogos
Además, el control RichTextBox dispone de los métodos “CanUndo” y “CanRedo”, que nos
indicará si se puede deshacer o rehacer la última acción realizada en un RichTextBox.
Devuelve un valor True si es posible y False si no lo es.
Vamos a utilizar estos dos métodos para activar o desactivar las opciones del menú “Deshacer”
y “Rehacer”. Por lo tanto, añadimos al evento “DropDowOpening” de la opción “Editar” las
siguientes sentencias.
….
….
….
If Me.rtxtEditor.CanUndo Then
Me.DeshacerToolStripMenuItem.Enabled = True
Else
Me.DeshacerToolStripMenuItem.Enabled = False
End If
If Me.rtxtEditor.CanRedo Then
Me.RehacerToolStripMenuItem.Enabled = True
Else
Me.RehacerToolStripMenuItem.Enabled = False
End If
End Sub
Y, para concluir el menú “Editar”, nos queda programar la opción “Seleccionar todo”, que con el
método “SelectAll” del control RichTextBox, simplemente sería una sentencia invocando a
dicho método.
El último menú de nuestro editor es el menú “Formato”. Para las opciones “Fuente” y “Color”
utilizaremos los cuadros de diálogo que nos muestran los controles FontDialog y ColorDialog
que ya tenemos en nuestro formulario.
13
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Empleamos el control FontDialog1 dentro de un bloque With…End With. Y la propiedad
“SelectionFont” del control RichTextBox, con la que podemos obtener o establecer la fuente
del texto seleccionado o la fuente del texto del punto de inserción actual, es decir, donde esté
el cursor en ese momento.
Con la primera sentencia conseguimos que el cuadro de diálogo muestre el tipo de fuente que
tiene el texto donde se encuentra el cursor o el texto que está seleccionado. A continuación se
muestra el cuadro de diálogo (con el método “ShowDialog”). Y por último, se le asigna la fuente
seleccionada (que nos devuelve la propiedad “Font” del control “FontDialog”) al texto
seleccionado o, si no hay texto seleccionado, esta será la fuente que se utilizará si
comenzamos a escribir en ese punto donde se encuentra el cursor.
Con la opción “Negrita” queremos que se incluya esta característica a la fuente del texto, o si
ya estuviese en negrita, que se quite esta característica. Para saber si un texto está en negrita
en un RichTextBox, tenemos la expresión SelectionFont.Bold que nos devuelve el valor True
Técnico Superior en Desarrollo de Aplicaciones Informáticas
If Me.rtxtEditor.SelectionFont.Bold Then….
Observamos que hemos creado una nueva fuente tomando como base la “FuenteActual”, pero
con la expresión:
14
Editor. Control RichTextBox.
Unidad
8 Cuadros de diálogos
El procedimiento quedaría:
If Me.rtxtEditor.SelectionFont.Bold Then
' a la fuente actual le quitamos la negrita
Me.rtxtEditor.SelectionFont = New Font(FuenteActual.FontFamily,
FuenteActual.Size, FuenteActual.Style And Not FontStyle.Bold)
Else
' a la fuente actual le añadimos la negrita
Me.rtxtEditor.SelectionFont = New Font(FuenteActual.FontFamily,
FuenteActual.Size, FuenteActual.Style Or FontStyle.Bold)
End If
End Sub
De similar manera serán los procedimientos para las opciones “Cursiva” y “Subrayado”.
If Me.rtxtEditor.SelectionFont.Italic Then
' a la fuente actual le quitamos la cursiva
Me.rtxtEditor.SelectionFont = New Font(FuenteActual.FontFamily,
FuenteActual.Size, FuenteActual.Style And Not FontStyle.Italic)
Else
' a la fuente actual le añadimos la cursiva
Me.rtxtEditor.SelectionFont = New Font(FuenteActual.FontFamily,
FuenteActual.Size, FuenteActual.Style Or FontStyle.Italic)
End If
End Sub
If Me.rtxtEditor.SelectionFont.Underline Then
' a la fuente actual le quitamos el subrayado
Me.rtxtEditor.SelectionFont = New Font(FuenteActual.FontFamily,
FuenteActual.Size, FuenteActual.Style And Not FontStyle.Underline)
Else
' a la fuente actual le añadimos el subrayado
Me.rtxtEditor.SelectionFont = New Font(FuenteActual.FontFamily,
FuenteActual.Size, FuenteActual.Style Or FontStyle.Underline)
End If
End Sub
Por último, vamos a programar el evento “DropDownOpening” de la opción “Formato” para que
las opciones “Negrita”, “Cursiva” y “Subrayado” del menú aparezcan activadas al desplegar el
menú Formato si la fuente del texto donde se encuentra el cursor tiene alguna de esas
características.
15
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Para activar una opción de menú, asignaremos a su propiedad Checked el valor True, y para
desactivarlas le asignamos el valor False.
El procedimiento quedaría:
If Me.rtxtEditor.SelectionFont.Italic Then
Me.CursivaToolStripMenuItem.Checked = True
Else
Me.CursivaToolStripMenuItem.Checked = False
End If
Y, para concluir este ejercicio, vamos a controlar mediante el evento “FormClosing” el cierre
del formulario cuando el usuario hace clic en la “X” (equis) de la esquina superior derecha del
formulario. Dicho evento tiene lugar antes de que se cierre el formulario, y en él vamos a
comprobar si el texto de rtxtEditor se ha modificado; si es así le preguntaremos al usuario si
descarta esos cambios. Si responde que no, cancelamos el cierre del formulario con la
expresión:
e.Cancel=True
Técnico Superior en Desarrollo de Aplicaciones Informáticas
16
Técnico Superior en
Desarrollo de Aplicaciones Informáticas
TÉCNICO SUPERIOR EN DESARROLLO DE
APLICACIONES INFORMÁTICAS
CICLO FORMATIVO DE GRADO SUPERIOR
FORMACIÓN PROFESIONAL A DISTANCIA
9
Unidad
Validación de datos
MÓDULO
Diseño y realización de servicios de
presentación en entornos gráficos
Título del Ciclo: DESARROLLO DE APLICACIONES INFORMATICAS
Dirección de la obra:
Alfonso Careaga Herrera
Antonio Reguera García
Arturo García Fernández
Ascensión Solís Fernández
Juan Carlos Quirós Quirós
Luís Mª Palacio Junquera
Yolanda Álvarez Granda
ISBN: 978-84-692-3442-6
Esta publicación tiene fines exclusivamente educativos. Queda prohibida la venta, así como la
reprodución total o parcial de sus contenidos sin autorización expresa de los autores y del Copyright
Unidad
9 Validación de datos
OBJETIVO DE LA UNIDAD
INDICE DE CONTENIDOS
PLANTEAMIENTO DE EJERCICIO................................................................................................... 4
Diseño........................................................................................................................................................4
Proceso del ejercicio. ................................................................................................................................5
3
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Planteamiento de ejercicio
Diseño
Es del tipo de objetos que aparece en la parte inferior del diseñador del formulario.
4
Unidad
9 Validación de datos
El ejercicio consistirá en validar los datos introducidos en los TextBox del formulario. Para
txtEmail, comprobaremos que el usuario tecleó los caracteres “@” y “.” (punto). Para txtFecha
que el valor introducido es una fecha válida. Y para txtEdad que tecleó valores númericos.
El evento Validating tiene lugar antes de que un control vaya a perder el foco de entrada.
Será pues, el evento apropiado para comprobar si los datos introducidos son correctos.
If Me.txtEmail.Text.Length = 0 Then…
5
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Después comprobaremos que la propiedad Text contenga los caracteres “@” y “.” (punto) que
tienen las direcciones de correo electrónico. Utilizaremos la función IndexOf de la propiedad
Text, que recibe como parámetro un carácter y ésta devuelve el valor -1 si el carácter
especificado no se encuentra en la secuencia de caracteres de la propiedad Text. Si el
carácter se encuentra en dicha secuencia, devuelve su posición dentro de ella.
Si se produce alguno de los dos errores, se ejecuta el código entre el bloque Cath …End Try. Y
en él vamos a ofrecer al usuario, mediante un MessageBox, la posibilidad de corregir el error,
para ello hará clic en el botón “Aceptar”, con lo cual se cancelarán todos los eventos que se
producirían a continuación del evento Validating, luego txtEmail no perdería el foco de
entrada. Esto se conseguiría con la expresión:
e.Cancel = True
6
Unidad
9 Validación de datos
Igual que antes, primero comprobamos si txtFecha.Text.Length es 0 (cero), generando un error
si se cumple la condición. Después comprobamos si Text contiene un valor de fecha válido.
Para ello utilizamos la función IsDate, que devuelve un valor True si se trata de una fecha
válida; devuelve False si no lo es. Para señalar el error utilizamos el control ErrorProvider1.
Mediante el procedimiento SetError, le indicamos en que control se produjo el error y el
mensaje de error asociado.
Una vez corregida la fecha, para eliminar el icono del control ErrorProvider, tendremos que
ejecutar la siguiente sentencia
Me.ErrorProvider1.SetError(Me.txtFecha, Nothing)
Y el lugar de ejecución de esta sentencia será un nuevo evento, el evento Validated, este
evento se produce cuando finaliza la validación del control, es decir, después del evento
Validating.
7
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Me.ErrorProvider1.SetError(Me.txtEdad, ex.Message)
e.Cancel = True
Me.txtEdad.SelectAll()
End Try
End Sub
En este caso, utilizamos la función IsNumeric, que devuelve True si el argumento es un valor
numérico. Y, para hacerlo de otro manera, no empleamos el evento Validated para eliminar el
icono del ErrorProvider, sino que, dentro de la instrucción If…EndIf, añadimos un Else donde
eliminaremos dicho icono si no se ha detectado ningún error.
8
Técnico Superior en
Desarrollo de Aplicaciones Informáticas
TÉCNICO SUPERIOR EN DESARROLLO DE
APLICACIONES INFORMÁTICAS
CICLO FORMATIVO DE GRADO SUPERIOR
FORMACIÓN PROFESIONAL A DISTANCIA
10
Unidad
MÓDULO
Diseño y realización de servicios de
presentación en entornos gráficos
Título del Ciclo: DESARROLLO DE APLICACIONES INFORMATICAS
Unidad 10: LOS EVENTOS DEL RATÓN. ARRASTRAR Y SOLTAR (DRAG & DROP)
Dirección de la obra:
Alfonso Careaga Herrera
Antonio Reguera García
Arturo García Fernández
Ascensión Solís Fernández
Juan Carlos Quirós Quirós
Luís Mª Palacio Junquera
Yolanda Álvarez Granda
ISBN: 978-84-692-3442-6
Esta publicación tiene fines exclusivamente educativos. Queda prohibida la venta, así como la
reprodución total o parcial de sus contenidos sin autorización expresa de los autores y del Copyright
Los eventos del ratón. Arrastrar
Unidad
10 y soltar (Drag & Drop)
OBJETIVO DE LA UNIDAD
En esta unidad veremos algunos de los eventos que se producen en el manejo del ratón y el
proceso de arrastrar y soltar (drag & drop) entre dos controles, primeramente desarrollaremos
un ejercicio de arrastre entre dos controles TextBox y luego otro entre dos controles
PictureBox.
INDICE DE CONTENIDOS
3
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Arrastre entre dos controles TextBox
Diseño
Normalmente las operaciones de arrastre comienzan con un clic del botón izquierdo del ratón
sobre el control de origen, en nuestro caso txtOrigen. Por lo tanto utilizaremos el evento
MouseDown de txtOrigen para iniciar este proceso. Este evento se produce cuando el
puntero del ratón se encuentra sobre el control y se presiona un botón.
4
Los eventos del ratón. Arrastrar
Unidad
10 y soltar (Drag & Drop)
• Los datos que se van a arrastrar. En nuestro caso el contenido de la propiedad Text de
txtOrigen.
El siguiente evento que tendremos que programar es el evento DragEnter del control de
destino, es decir de txtDestino. Este evento se produce cuando arrastramos el cursor del
ratón sobre el control durante una operación de arrastrar y soltar.
En este procedimiento comprobamos que los datos arrastrados son apropiados para el control
de destino. En nuestro caso no habrá ningún problema ya que los datos son tipo texto y
además los dos controles, origen y destino, son TextBox.
Para realizar estas comprobaciones debemos de atender al parámetro “e” del procedimiento.
Mediante la expresión
e.Data.GetDataPresent(DataFormats.Text)
Se comprueba si el tipo de dato que se arrastra sobre el control txtDestino es de tipo texto. La
expresión devuelve un valor True si esto es asi y por lo tanto aceptaremos los datos
arrastrados mediante la expresión
e.Effect = DragDropEffects.Copy
e.Effect = DragDropEffects.None
Por último nos queda programar el evento que se produce cuando soltamos el botón del
ratón sobre el control de destino, evento DragDrop.
5
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Diseño
Nos mostrará un cuadro de diálogo desde el que podremos importar una imagen para
asignársela a esta propiedad.
6
Los eventos del ratón. Arrastrar
Unidad
10 y soltar (Drag & Drop)
Como el proceso es prácticamente igual que el anterior, con la única diferencia de que los
datos arrastrados no son de tipo texto sino que son de tipo Bitmap (mapa de bits de
Windows), vamos a tener en cuenta las siguientes consideraciones:
Primeramente tendremos que modificar la propiedad AllowDrop de pbDestino para que este
control acepte la operación de arrastrar y soltar que deseamos realizar. Y lo hacemos en el
procedimiento Load del formulario, como en el ejemplo anterior.
En este caso los “efectos” del arrastre podrán ser “Copy” o “Move” dependiendo de si se pulsa
la tecla CTRL al realizar la operación de arrastre o no se pulsa.
Será en el evento DragEnter donde tendremos que averiguar si la tecla CTRL está pulsada.
Otra vez tendremos que atender al parámetro “e” del procedimiento. La propiedad KeyState
de este parámetro nos proporciona información sobre el estado actual de las teclas MAYÚS,
CTRL y ALT y de los botones del ratón. Si la tecla CTRL está pulsada, devuelve el valor 8. Y
7
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
si el botón primario o izquierdo del ratón está pulsado, devuelve 1. Luego la combinación de
ambas pulsaciones hará que KeyState devuelva el valor 9 (8+1).
En el caso de que los datos arrastrados no sean del tipo “Bitmap” se rechazan.
8
Técnico Superior en
Desarrollo de Aplicaciones Informáticas
TÉCNICO SUPERIOR EN DESARROLLO DE
APLICACIONES INFORMÁTICAS
CICLO FORMATIVO DE GRADO SUPERIOR
FORMACIÓN PROFESIONAL A DISTANCIA
11
Unidad
MÓDULO
Diseño y realización de servicios de
presentación en entornos gráficos
Título del Ciclo: DESARROLLO DE APLICACIONES INFORMATICAS
Dirección de la obra:
Alfonso Careaga Herrera
Antonio Reguera García
Arturo García Fernández
Ascensión Solís Fernández
Juan Carlos Quirós Quirós
Luís Mª Palacio Junquera
Yolanda Álvarez Granda
ISBN: 978-84-692-3442-6
Esta publicación tiene fines exclusivamente educativos. Queda prohibida la venta, así como la
reprodución total o parcial de sus contenidos sin autorización expresa de los autores y del Copyright
Acceso a bases de datos con
Unidad
11 ADO.NET (I)
OBJETIVO DE LA UNIDAD
INDICE DE CONTENIDOS
3
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Primeramente tendremos que crear con Access, la base de datos BDClientes, con la siguiente
estructura:
Técnico Superior en Desarrollo de Aplicaciones Informáticas
Y guardamos en dicha carpeta la base de datos creada, con algunos datos de prueba.
4
Acceso a bases de datos con
Unidad
11 ADO.NET (I)
En primer lugar deberemos incorporar al proyecto la base de datos creada, es decir, vamos a
“agregar un origen de datos al proyecto”.
Para ello seleccionamos la opción del menú “Datos + Agregar nuevo origen de datos…”
Y nos aparecerá la siguiente ventana:
5
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
6
Acceso a bases de datos con
Unidad
11 ADO.NET (I)
7
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
8
Acceso a bases de datos con
Unidad
11 ADO.NET (I)
Cerramos la ventana del mensaje. Y seguimos adelante haciendo clic en el botón “Aceptar”.
En esta ventana, podemos ver la cadena de conexión que utilizará el proyecto para conectar a
la base de datos.
Hacemos clic en el botón “Siguiente” y nos muestra una ventana con un mensaje en el que nos
pregunta si deseamos copiar la base de datos a la carpeta del proyecto y modificar la cadena
de conexión. Vamos a contestar que “Sí”.
9
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
En la siguiente ventana nos pregunta si se desea guardar la cadena de conexión en el archivo
de configuración de la aplicación con el nombre “BDClientesConnectionString”. Hacemos clic
en el botón “Siguiente”.
Técnico Superior en Desarrollo de Aplicaciones Informáticas
10
Acceso a bases de datos con
Unidad
11 ADO.NET (I)
Expandimos “Tablas” para ver que están identificadas las tres tablas de la base de datos
(clientes, productos y ventas).
11
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Marcamos “Tablas”, para que seleccione las tres tablas. Y hacemos clic en el botón “Finalizar”.
Ya tenemos el Dataset del proyecto creado.
Técnico Superior en Desarrollo de Aplicaciones Informáticas
12
Acceso a bases de datos con
Unidad
11 ADO.NET (I)
Qué es ADO.Net
ADO.NET es un conjunto de objetos que nos proporciona la plataforma .NET para el acceso a
datos.
Qué es un DataSet
Es una representación de datos, residentes en memoria, obtenidos de un origen de datos (en
nuestro caso, de una base de datos). Representa un componente fundamental de la
arquitectura de ADO.NET.
En nuestro ejemplo, se ha creado el DataSet “BDClientesDataSet” obtenido de los datos de la
base de datos de Access “BDClientes”. Que lo tenemos en la parte inferior del diseñador del
formulario.
El DataSet está compuesto por una colección de objetos DataTable, que cada uno de ellos
referencia a una tabla de la base de datos. En nuestro caso habrá tres DataTable, “Clientes”,
“Productos” y “Ventas”.
Continuamos con nuestro ejemplo. Ahora vamos a seleccionar y arrastrar la tabla Clientes al
formulario, desde la ventana “Orígenes de datos”.
13
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Aparecerán en el formulario un conjunto de controles relacionados con el DataTable de
Clientes.
• ClientesTableAdapter
Técnico Superior en Desarrollo de Aplicaciones Informáticas
Un TableAdapter comunica la aplicación con la base de datos. Es decir, rellena los DataTable
del DataSet del origen de datos mediante la ejecución de consultas y devuelve a la base de
datos los datos actualizados desde la aplicación.
Luego se comunica con la base de datos en ambas direcciones, ejecutando consultas o
procedimientos almacenados.
Vamos a editar el diseñador del Dataset, para ello hacemos clic en el segundo icono de la
ventana del origen de datos.
14
Acceso a bases de datos con
Unidad
11 ADO.NET (I)
Aparecen los tres DataTable, con las relaciones entre ellas, y cada uno de ellos tiene asociado
su TableAdapter, con sus métodos Fill y GetData, para comunicarse con el origen de datos.
Veamos el asistente para configurar un TableAdapter. Para ello nos situamos con el ratón
sobre la referencia que aparece en la tabla Clientes del TableAdapter con el nombre
“clientesTableAdapter”, hacemos clic en el botón derecho y seleccionamos la opción
“Configurar…”.
15
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
16
Acceso a bases de datos con
Unidad
11 ADO.NET (I)
Podemos ver la instrucción SQL utilizada para cargar los datos a la tabla clientes desde la base
de datos. No la modificamos y hacemos clic en el botón “Siguiente”.
Nos mostrará la siguiente ventana del asistente. Si leemos toda la información que contiene,
podemos comprender la utilidad del TableAdapter.
17
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Vemos que crea los métodos necesarios para su función: Fill, GetData, Insert, Update y Delete.
Al hacer clic en el botón Finalizar, nos aparece una pantalla informándonos de la correcta
configuración de todos los métodos.
Técnico Superior en Desarrollo de Aplicaciones Informáticas
Vamos a hacer otra vez clic con el botón derecho del ratón sobre “clientesTableAdapter” y
seleccionamos la opción “Vista previa de datos”.
18
Acceso a bases de datos con
Unidad
11 ADO.NET (I)
19
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Y si hacemos clic en el botón “Vista previa”. Vemos el contenido de la tabla Clientes que
tenemos en el DataSet de la aplicación, llamado “BDClientesDataSet”.
Podemos mostrar los datos de todas las tablas que contiene el DataSet. Por ejemplo,
seleccionemos la tabla productos, hacemos clic en la lista desplegable de la parte superior
izquierda de la ventana y seleccionamos los métodos Fill y GetData de la tabla productos.
Técnico Superior en Desarrollo de Aplicaciones Informáticas
Y hacemos clic en el botón “Vista previa”. Nos muestra los datos de la tabla productos del
DataSet.
20
Acceso a bases de datos con
Unidad
11 ADO.NET (I)
• ClientesBindingSource
• ClientesBindingNavigator
• ClientesDataGridView
21
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Relación entre controles
Todos estos controles están relacionados entre sí mediante sus propiedades. Veamos cómo.
El control ClientesBindingSource se enlaza con el Dataset del proyecto, “BDClientesDataset”, y
concretamente con la tabla “Clientes”, a través de sus propiedades “DataSource” y
“DataMember”.
22
Acceso a bases de datos con
Unidad
11 ADO.NET (I)
23
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
24
Acceso a bases de datos con
Unidad
11 ADO.NET (I)
Vamos añadir otro formulario a nuestra aplicación y realizar el mismo proceso de seleccionar y
arrastrar la tabla clientes de la ventana “Orígenes de datos” al formulario, pero antes vamos a
cambiar la forma en que representaremos los datos de la tabla en el formulario. Cambiaremos
a “Detalles”, en vez de “DataGridView”. Para ello, en la ventana “Orígenes de datos”, hacemos
clic en el botón izquierdo sobre la tabla clientes y seleccionamos la opción “Detalles”.
El formulario quedaría:
25
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
26
Acceso a bases de datos con
Unidad
11 ADO.NET (I)
Iniciamos la depuración y vemos como podemos editar los registros de la tabla clientes en los
controles del formulario.
27
Técnico Superior en Desarrollo de Aplicaciones Informáticas
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
28
Acceso a bases de datos con
Unidad
11 ADO.NET (I)
Tal y como diseñamos la base de datos, la tabla clientes está relacionada con la tabla ventas.
Vamos a incluir un DataGridView al formulario para ver las ventas del cliente actual. Para ello
seleccionaremos y arrastraremos al formulario la tabla ventas, pero la tabla ventas que está
dentro de clientes en el Dataset, NO la tabla ventas que está al mismo nivel que la tabla
clientes y productos. Ya que deseamos visualizar las ventas del cliente actual, NO las
ventas de todos los clientes. La entrada “ventas” dentro de “clientes” recoge la relación
entre ambas tablas (relación clientes-ventas). La entrada “ventas” que depende
directamente de “BDClientesDataSet” recoge todas las ventas existentes (OBSERVAR
DETENIDAMENTE LA FIGURA SIGUIENTE):
29
Técnico Superior en Desarrollo de Aplicaciones Informáticas
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Vemos que además del control VentasDataGridView, tenemos dos nuevos controles,
VentasBindingSource y VentasTableAdapter.
El control VentasTableAdapter comunica la aplicación con el origen de datos, lo utilizaremos
para cargar los datos de la tabla Ventas en el Dataset (Fill) y para actualizar la base de datos
(Update).
Observar que la propiedad DataMember de VentasBindingSource tiene asignado el valor
“clientesventas” ya que este elemento controla la relación existente entre las tablas clientes
y ventas.
30
Acceso a bases de datos con
Unidad
11 ADO.NET (I)
Vamos también a utilizar el VentasDataGridView sólo para ver las ventas del cliente actual, no
podremos añadir ni eliminar registros de la tabla ventas. Para ello modificaremos el valor de las
propiedades AllowUserToAddRows y AllowUserToDeleteRows a valor False.
Con lo que respecta al código, se habrá añadido la sentencia que invoca al método Fill de
VentasTableAdapter para cargar los datos de la tabla ventas al Dataset.
31
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
'TODO: esta línea de código carga datos en la tabla
'BDClientesDataSet.clientes' Puede moverla o quitarla según sea
necesario.
Me.ClientesTableAdapter.Fill(Me.BDClientesDataSet.clientes)
End Sub
Cuando nos desplazamos de cliente con los botones de navegación, si el nuevo cliente tiene
ventas, se muestran en el DataGridView.
32
Acceso a bases de datos con
Unidad
11 ADO.NET (I)
33
Técnico Superior en
Desarrollo de Aplicaciones Informáticas
TÉCNICO SUPERIOR EN DESARROLLO DE
APLICACIONES INFORMÁTICAS
CICLO FORMATIVO DE GRADO SUPERIOR
FORMACIÓN PROFESIONAL A DISTANCIA
12
Unidad
MÓDULO
Diseño y realización de servicios de
presentación en entornos gráficos
Título del Ciclo: DESARROLLO DE APLICACIONES INFORMATICAS
Dirección de la obra:
Alfonso Careaga Herrera
Antonio Reguera García
Arturo García Fernández
Ascensión Solís Fernández
Juan Carlos Quirós Quirós
Luís Mª Palacio Junquera
Yolanda Álvarez Granda
ISBN: 978-84-692-3442-6
Esta publicación tiene fines exclusivamente educativos. Queda prohibida la venta, así como la
reprodución total o parcial de sus contenidos sin autorización expresa de los autores y del Copyright
Acceso a bases de datos con
Unidad
12 ADO.NET (II)
OBJETIVO DE LA UNIDAD
INDICE DE CONTENIDOS
3
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
IMPORTANTE. Sobre el campo “prestado” de la tabla “libros”: los libros que estén
prestados tendrán el campo “prestado” a valor True. Si no están en préstamo tendrán el valor
False.
4
Acceso a bases de datos con
Unidad
12 ADO.NET (II)
Las etiquetas están enlazadas con los campos de la tabla “socios”. Si vamos a la ventana de
propiedades vemos que se han creado las etiquetas con el nombre del campo más el
literal “Label1” (por ejemplo: “CodsocioLabel1”) y que la propiedad Text tiene el icono que
identifica dicho enlace con la base de datos.
5
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Como no vamos a poder modificar los contenidos de los campos mostrados en las etiquetas.
Vamos a suprimir los botones “Agregar nuevo”, “Eliminar”, “Guardar datos” del control
“SociosBindingNavigator”. Seleccionamos con el ratón el icono de cada opción y haciendo
clic en el botón izquierdo escogemos la opción “Eliminar”.
Vamos también a mostrar los préstamos que tiene el socio que está representado en las
etiquetas en un momento dado. Para ello utilizaremos un ListBox que contendrá los códigos
de los libros en préstamo por ese socio.
Técnico Superior en Desarrollo de Aplicaciones Informáticas
6
Acceso a bases de datos con
Unidad
12 ADO.NET (II)
7
Técnico Superior en Desarrollo de Aplicaciones Informáticas
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Con esto conseguimos que se muestren en el ListBox los códigos de los libros en préstamo del
socio representado en las etiquetas en un momento dado.
8
Acceso a bases de datos con
Unidad
12 ADO.NET (II)
Vamos a añadir al formulario otro ListBox, y en él mostraremos los títulos de los libros que
“no estén prestados”, es decir los que tengan el campo prestado a “false”. Le podemos
llamar “lstLibrosDisponibles” y añadiremos también un control BingingSource que
llamaremos “LibrosSinPrestarBindingSource”. Y para que este control gestione la tabla
“libros” tendremos que realizar las siguientes asignaciones en las propiedades DataSource, y
DataMember (OBSERVAR LAS IMÁGENES SIGUIENTES):
9
Técnico Superior en Desarrollo de Aplicaciones Informáticas
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
10
Acceso a bases de datos con
Unidad
12 ADO.NET (II)
11
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
Donde ahora tendremos, en el ListBox de la derecha, los libros que no están en préstamo.
Si miramos el código necesario para todo lo que hemos incluido en el formulario hasta ahora
será simplemente:
Me.LibrosTableAdapter.Fill(Me.BibliotecaDataSet.libros)
'TODO: esta línea de código carga datos en la tabla
'BibliotecaDataSet.prestamos' Puede moverla o quitarla según sea necesario.
Me.PrestamosTableAdapter.Fill(Me.BibliotecaDataSet.prestamos)
'TODO: esta línea de código carga datos en la tabla
'BibliotecaDataSet.socios' Puede moverla o quitarla según sea necesario.
Me.SociosTableAdapter.Fill(Me.BibliotecaDataSet.socios)
End Sub
Esto es, las tres sentencias Fill para cargar los datos de las tres tablas en el DataSet del
proyecto. El procedimiento SociosBindingNavigatorSaveItem_Click, no se utiliza ya
que eliminamos la opción “Guardar” del control SociosBindingNavigator.
12
Acceso a bases de datos con
Unidad
12 ADO.NET (II)
La necesidad que tenemos de utilizar objetos de esta clase en este ejercicio, es porque
estamos empleando ListBox enlazados a datos, y cuando realizamos la selección de un
elemento en uno de estos ListBox, la propiedad SelectedItem devolverá toda la fila del
elemento seleccionado, no sólo el valor que se muestre en el ListBox. Por ejemplo, en el
ListBox lstLibrosDisponibles, si seleccionamos uno de los títulos que nos muestra, la
propiedad SelectedItem nos devuelve un objeto de la clase DataRowView, que
representa a todos los campos del registro o fila cuyo título seleccionamos. Así también,
podemos tener acceso a todos los campos del registro.
En la siguiente imagen vemos que, en la depuración del código, la propiedad SelectedItem del
control lstLibrosDisponibles (Me.lstLibrosDisponibles.SelectedItem) devuelve un
objeto de la clase DataRowView ({System.Data.DataRowView}).
Luego vamos a declarar una variable, que llamaremos “drv”, del tipo DataRowView que
almacenará la fila de datos seleccionada del ListBox “lstLibrosDisponibles”. Y de la variable
“drv” obtendremos el código del libro del registro o fila cuyo título seleccionamos, puesto
que “drv” contiene todos los campos del registro.
Las sentencias serían las siguientes:
Una vez obtenido el código de libro del título seleccionado en lstLibrosDisponibles, el proceso
de realizar un préstamo conlleva los siguientes pasos:
• Poner el campo prestado de la tabla “libros” a True, puesto que ese libro dejará de
estar disponible.
Para ello buscaremos en la tabla “libros” el código de libro seleccionado mediante el método
FindBycodlibro, la expresión es la siguiente.
' actualizamos la BD
Me.LibrosTableAdapter.Update(Me.BibliotecaDataSet.libros)
Creamos una variable del tipo DataRow (fila de datos de una tabla), la llamamos “dr”, y en ella
almacenamos la nueva fila de datos (o registro) de la tabla “préstamos” mediante la
expresión siguiente:
Después asignamos valores para los tres campos de la fila de datos nueva. El código de libro
lo obtenemos de la variable que declaramos para almacenar la selección que se realizó en
lstLibrosDisponibles (“codlibro”). El código de socio nos lo proporciona la etiqueta del formulario
que contiene dicha información (“Me.CodsocioLabel1.Text”), y la fecha del préstamo la
obtenemos con la expresión “Now.ToShortDateString”. Las sentencias serán las
siguientes:
13
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
dr("codlibro") = codlibro
dr("codsocio") = Me.CodsocioLabel1.Text
dr("fecha") = Now.ToShortDateString
Ahora añadimos la nueva fila de datos (“dr”) a la tabla préstamos con el método Add de la
colección Rows.
' actualizamos la BD
Me.PrestamosTableAdapter.Update(Me.BibliotecaDataSet.prestamos)
Recopilando todo el código visto hasta ahora, el evento doble clic de lstLibrosDisponibles sería
el siguiente:
Try
' la selección en el listbox devuelve un objeto DataRowView (fila de datos)
Dim drv As DataRowView = Me.lstLibrosDisponibles.SelectedItem
' obtenemos el codlibro de la fila devuelta
Dim codlibro As String = drv("codlibro")
Catch ex As NullReferenceException
MessageBox.Show("No hay libros disponibles", "Biblioteca",
MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch ex As Exception
MessageBox.Show(ex.Message & vbNewLine & ex.Source)
End Try
End Sub
Incluimos un bloque Try…Catch para detectar posibles errores. El primer “Catch” será para
detectar cuando el usuario haga doble clic en lstLibrosDisponibles y no haya ningún elemento
en el ListBox, es decir cuando esté vacío lstLibrosDisponibles. El error que se producirá
será NullReferenceException. Y el segundo será para el resto de posibles errores. En ambos
bloques mostramos un mensaje.
Podemos también limitar el número de préstamos que un socio pueda tener, lo limitaremos a
tres libros. Para ello utilizaremos la expresión Me.lstPrestamos.Items.Count que nos
14
Acceso a bases de datos con
Unidad
12 ADO.NET (II)
Devolver un préstamo.
La devolución de un préstamo se llevará a cabo cuando el usuario seleccione, con doble clic,
uno de los libros que tiene en préstamo, representados en el ListBox lstPrestamos. Al
igual que el proceso anterior, la propiedad SelectedItem de lstPrestamos devuelve un objeto de
la clase DataRowView, es decir toda la fila, no solamente el código de libro representado en el
ListBox. Por lo tanto creamos un objeto de esa clase para almacenar el valor devuelto de la
propiedad SelectedItem.
El proceso será el inverso que el anterior, esto es, habrá que modificar el campo prestado en la
tabla “libros” para ese libro seleccionado, estableciéndolo a valor False, y eliminar la fila
creada para recoger el préstamo en la tabla “prestamos”.
Esto último, la eliminación de la fila en la tabla “prestamo”, se conseguirá con una sola línea, en
la que realizaremos la búsqueda de la fila, en la tabla “prestamos”, mediante el método
FindBycodlibro e invocando al procedimiento Delete, conseguimos la eliminación de la fila en
dicha tabla. La sentencia será la siguiente.
Me.BibliotecaDataSet.prestamos.FindBycodlibro(codlibro).Delete()
15
¶ Módulo: Diseño y realización de servicios de
presentación en entornos gráficos
¶
También incluimos el código en un bloque Try…Catch para detectar los posibles errores. E
igual que en el procedimiento anterior, el primer “Catch” detectará el error que se producirá si
se realiza un doble clic en lstPrestamos cuando este vacío (NullReferenceException). Y el
segundo será para el resto de errores.
Técnico Superior en Desarrollo de Aplicaciones Informáticas
16
Técnico Superior en
Desarrollo de Aplicaciones Informáticas