1 Entorno de Desarrollo .NET
1.1 Introducción.
.Net es un conjunto de bibliotecas que pueden ser utilizadas por aplicaciones para acelerar el desarrollo de programas y optimizar el rendimiento. Visual .Net ofrece un entorno de ejecución de aplicaciones, compiladores, y permite el desarrollo de todo tipo de programas de escritorio, aplicaciones para Internet, para dispositivos móviles, etc.
1.2 Entorno de ejecución CLR
Visual .Net proporciona un entorno de ejecución para las aplicaciones el Common Language Runtime (CLR). CLR es la implementación de Microsoft de un estándar llamado Common Language Infrastructure (CLI).
El CLR/CLI define un entorno de ejecución virtual independiente en el que trabajan las aplicaciones escritas con cualquier lenguaje .Net(C#, J#, Basic). Este entorno virtual se encarga de aspectos importantes para una aplicación como la gestión de la memoria, la vida de los objetos, la seguridad y la gestión de subprocesos.
Todos estos servicios unidos a su independencia respecto a arquitecturas computacionales convierten la CLR en una herramienta muy útil ya que, en teoría, cualquier aplicación escrita para funcionar según la CLI puede ejecutarse en cualquier tipo de arquitectura de hardware. Por ejemplo Microsoft dispone de implementación de .NET para Windows de 32 bits, Windows de 64 bits e incluso para Windows Mobile.
1.3 El lenguaje intermedio (IL, CIL o MSIL)
La plataforma .Net no está sujeta a un determinado lenguaje de programación ni favorece a uno concreto frente a otros. Actualmente existen implementaciones para múltiples lenguajes que permiten escribir aplicaciones para .Net. Como Visual Basic .NET, C# o J#, pero existen otros muchos. Nosotros nos centraremos en Visual Basic .Net.
Una de las principales ventajas de la forma de trabajar en .Net es que cualquier componente creado en uno de estos lenguajes se puede utilizar desde otro. También es posible ejecutar código .Net en distintas arquitecturas y en diferentes sistemas operativos.
Para conseguir esto dentro del CLR existe un Lenguaje intermedio (IL) que está pensado independientemente del microprocesador en el que se ejecute. Cuando compilamos un programa escrito en .Net (independientemente de que lo escribamos en Visual Basic, en C# o en J#, etc.), el compilador nos genera un nuevo código escrito en este lenguaje intermedio. De esta forma cualquiera de los lenguajes de programación que usemos en .Net son un lenguaje de alto nivel para crear ese código intermedio. A este código intermedio se le llama CIL(Common Intermediate Language) y anteriormente se llamó MSIL(Microsoft Intermediate Language).
El CLR tiene un compilador JIT(Just in time) que se encarga de compilar el código escrito en el código intermedio(IL) a lenguaje propio del microprocesador físico en el que se va a ejecutar. En última instancia es este lenguaje propio, este código nativo, el que se ejecuta y esto nos proporciona un alto rendimiento.
1.4 La especificación común de los lenguajes (CLS).
Conseguir que se puedan utilizar componentes desarrollados en uno de los lenguajes desde otro, requiere la existencia de unas normas que definen algunas características que todos los lenguajes necesitarán incorporar. A este grupo de normas se le llama Common Language Specification (CLS). Alguna de las cosas que controla estas normas son los tipos de datos, la forma de declarar objetos, etc. Se definen unos tipos de datos comunes Common Type System (CTS) que indican qué datos podemos usar, como los declaramos, etc. Si nuestras bibliotecas admiten o devuelven datos correspondientes a la CTS podrán ser utilizados sin problemas desde otro lenguaje. Por coherencia con el lenguaje el nombre por el que hacemos referencia a un tipo de datos puede ser distinta
1.5 Biblioteca de Clases Base en .Net (BCL)
El entorno .Net nos proporciona gran cantidad de funcionalidades para gestión de entrada/salida, para seguridad, para acceso a datos, etc. Esto se implementa en librerías de enlace dinámico DLL, al conjunto de estas librerías se le llama Base Classes Library (BCL)
1.6 Arquitectura de desarrollo en .Net
En la siguiente figura se aprecia la arquitectura que se utiliza para el desarrollo de aplicaciones en .Net:
Se proporciona gran cantidad de clases definidas en la Biblioteca de Clases Base. Al comenzar a programar nos centraremos en aprender solo algunas de las más importantes.
Lenguaje Común de Ejecución (CLR)
Biblioteca de Clases Base (BCL)
ADO.NET, XML, Enterprise Services ASP.NET: Servicios yFormularios Web
Windows Forms Common Language Specification
1.7 Esquema de Desarrollo y ejecución de una Aplicación .Net
1.8 Los espacios de nombres (NameSpaces)
Un Namespace es una forma de agrupar clases, funciones, tipos de datos relacionados, y otros espacios de nombres. Se utiliza una forma jerárquica para crear un esquema que nos permita hacer referencia y organizar las clases de la BCL. Además las clases irán creciendo porque nos creemos nuestras propias clases o porque consigamos alguna de oros desarrolladores. Una misma clase puede aparecer en varios espacios de nombres.
Editores y diseñadores
Código fuente
Compilador
Código intermédio (CIL o MSIL). Ensamblado DESARROLLO VISUAL BASIC Verificación Compilación (JIT) Código nativo Ejecución (CLR) EJECUCIÓN (Plataforma .Net)
2 Programación Orientada a Objetos
2.1 Introducción.
La programación orientada a objetos trata de expresar una aplicación como un conjunto de objetos que interactúan entre ellos para resolver alguna tarea. Se persigue el desarrollo de de programas mediante módulos que faciliten el mantenimiento y la reutilización de código.
En Programación Orientada a Objetos (POO, también OOP en las siglas que se usan en inglés) cada objeto contiene una serie de propiedades que lo definen y lo identifican frente a otros y una serie de métodos que permiten la consulta y modificación de esas propiedades, así como la realización de otras operaciones.
2.2 Conceptos.
En la programación Orientada a objetos se incorporan nuevos elementos que complementan y amplían los tradicionales fundamentos de la programación estructurada.
Clase: Es la definición de un conjunto de propiedades y métodos que se corresponde con cada tipo de elemento que vamos a tener en el programa.
Objeto: Es la instancia de una clase. Formada por un conjunto de atributos y un conjunto de métodos que permiten operar sobre ellos.
Método: Es un algoritmo asociado a una clase que realiza alguna operación modificando alguna de las propiedades del objeto o generando un evento para otro objeto.
Evento: Es un suceso en el sistema, producido por un usuario (una pulsación del botón del ratón, pulsar una tecla, etc.) o por otro objeto. El sistema maneja el evento proporcionando la respuesta prevista.
Atributo o propiedad: Es cada una de las características asociadas a un objeto.
2.3 Características.
Herencia: A la hora de estructurar el programa, no tenemos clases aisladas, tenemos una jerarquía de clases que dependen unas de otras. Los objetos heredan las propiedades y los métodos de las clases a las que pertenecen. Esta propiedad nos da la posibilidad de crear objetos que extiendan o personalicen las propiedades de otros objetos existentes sin necesidad de volver a implementarlos.
Abstracción: Cada objeto de la aplicación realiza una tarea y obedece a un comportamiento sin proporcionar un detalle de su funcionamiento interno (Como están implementadas esas operaciones).
Encapsulamiento: Reunimos los elementos que pertenecen a una misma entidad al mismo nivel de abstracción. Con esto se incrementa la cohesión del sistema.
Polimorfismo: Dada una clase base, se declaran objetos distintos que hereden de la clase base. En estos objetos derivados permite definir comportamientos distintos asociados al mismo nombre. Al invocar al método por su nombre se utilizará el comportamiento que corresponda al objeto que estemos usando.
3 Comenzando a programar en Visual .NET
3.1 Introducción.
Vamos a intentar ir adentrándonos en el conocimiento de esta herramienta de desarrollo con un enfoque práctico. Iremos proporcionando los conocimientos de fundamentos de programación a medida que los vayamos necesitando.
3.2 Creación de la primera aplicación.
Para crear un proyecto en Visual .Net iremos al menú Archivo/Nuevo Proyecto.
Al hacerlo nos muestra el diálogo de nuevo proyecto en el que podemos elegir el tipo de elemento que pretendemos crear. En esta ocasión seleccionamos Aplicación para Windows. En la parte inferior escribimos el nombre “Geoprocesado1” y Aceptamos.
El aspecto de la ventana de trabajo en Visual Basic Express será algo así:
Si pulsamos sobre el cuadro de herramientas en la parte izquierda de la pantalla nos lo despliega, mostrando grupos de controles. Si pulsamos sobre el “+” de “Controles Comunes” aparecen los controles habituales que tenemos disponibles para el desarrollo de una aplicación básica. Si pulsamos en la chincheta en el título del cuadro de herramientas dejamos el diálogo anclado para que no se esconda automáticamente. Ahora vamos a probar a utilizar alguno de estos controles para realizar nuestro primer programa.
Vamos a colocar un botón en el formulario “Form1” que será la ventana de nuestra aplicación. Para hacerlo pulsamos sobre . el puntero del ratón cambia de forma. Hacemos un clic sobre el formulario para indicar la posición del botón. Después podremos ajustar gráficamente el tamaño y la posición del mismo.
Con el botón seleccionado en la parte derecha de la pantalla, en las propiedades podremos personalizar las características del mismo. Vamos a escribir en la propiedad “Text” que
Cuadro de Herramientas Explorador de Soluciones
Formulario
tendrá el valor “Button1” el texto “Mensaje”. Esa será la etiqueta que figure en el botón.
De este modo colocamos controles en el formulario configurando el diseño del mismo. Luego hay que dotar de funcionamiento a esos controles. Para asociar una acción al botón. Vamos a hacer doble-clic sobre él. Así pasamos a ver el código asociado al mismo. Al hacer el doble-clic Visual nos asocia un procedimiento que se va a ejecutar cuando se desencadene el evento hacer un clic con el ratón sobre el botón. El código que nos muestra será:
Lo primero que vemos es que Visual .Net usa programación orientada a objetos. El formulario “Form1” sería una clase. Nos ha creado el procedimiento Button1_Click que maneja el evento “hacer clic”. De momento aunque nos suene un poco raro el código vamos a probar a escribir una línea encima de “End Sub” que indica el final del procedimiento. Escribimos:
Esta línea le indica que muestre el comentario que aparece entrecomillado en un dialogo cuando se pulse el botón.
Vamos a probar como funciona el programa que hemos hecho. En la parte superior del área de trabajo aparecen unas pestañas que me permiten volver al diseño del formulario. Si pulsamos sobre la ficha “Form1.vb[Diseño]”.
Volvemos al diseño. También haciendo doble-clic sobre el formulario en el
Exploración de Soluciones de la parte derecha de la pantalla.
Para ejecutar el programa podemos pulsar el botón iniciar depuración de la barra de herramientas.
También podemos hacerlo en el menú Depuración/Iniciar depuración, o pulsando la tecla F5. Con esto se ejecuta nuestro programa y nos muestra el formulario con el botón en el centro.
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
End Sub End Class
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MsgBox("Mensaje desde Visual .NET") End Sub
Vemos que el título que muestra para el mensaje es “Geoprocesado1” que es el nombre que le dimos al proyecto al comenzar. Si pulsamos a “aceptar” el diálogo se cierra. El formulario “Form1” es similar a cualquier programa de los que estamos acostumbrados a utilizar en Windows. Tiene sus botones de control de ventana. Podemos abandonar el programa pulsando en la “X” de Salir para cerrar el formulario. También podríamos hacerlo en el menú Depurar/Detener depuración o pulsando el botón detener.
La función MSGBOX que hemos usado para mostrar el mensaje permite indicarle el tipo y número de botones que quiero mostrar y el título del diálogo en el que aparece el mensaje. Haciendo otra vez doble-clic en el botón “Mensaje” volvemos al código. Si escribimos una coma al final de la línea del Msgbox entre las comillas y el paréntesis de cierre, nos muestra la ayuda dinámica de Visual. Y os indica que el siguiente parámetro es opcional e indica la configuración de botones.
Si ponemos otra coma más le indicamos que no modificamos la configuración de botones dejando el de “Aceptar” que toma por defecto. A continuación escribimos entre comillas el título para el diálogo, ponemos “Herramientas informáticas”. La línea quedará:
Formulario
Diálogo creado con MSGBOX
Si volvemos a ejecutar al pulsar el botón aparece:
La función MSGBOX se usaba también en Visual Basic. En Visual .Net con el giro hacia la programación orientada a objetos, disponemos de una clase para realizar esta tarea. Es la clase “MessageBox” que tiene un método “Show”(Mostrar), para visualizar los mensajes. En el método “Show” cambia el orden de los parámetros, primero el mensaje, luego el título y por último los botones que se quieren que son opcionales. Si cambiamos la linea de antes del MSGBOX por la siguiente, y ejecutamos el programa comprobaremos que se obtiene la misma salida.
En .Net seguiremos la nueva forma de utilizar funciones apoyándonos en clases.
Si nos fijamos en el título del formulario “Form1” comprobamos que es el mismo que su nombre “Form1”. Volvemos al diseño del formulario pulsando en pestaña de la parte de arriba. Si pulsamos ahora sobre el fondo del formulario en la parte derecha de la pantalla en la “Ventana de Propiedades” vemos las propiedades del formulario. Localizamos la propiedad “Text” y reemplazamos “Form1” por el texto “Master en Geotecnologías”. Ejecutamos de nuevo el formulario y observamos el nuevo aspecto.
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MsgBox("Mensaje desde Visual .NET",,"Herramientas Informáticas") End Sub
End Class
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MessageBox.Show("Mensaje desde Visual .NET","Herramientas Informáticas") End Sub
Guardamos el proyecto completo en Archivo/Guardar todo. Si no le indicamos lo contrario Visual Basic Express guarda en la carpeta “Mis documentos\Visual Studio 20XX\Projects\” y luego el nombre del proyecto. Geoprocesado1.
Creamos el ejecutable en el menú “Generar/Generar Geoprocesado1”.
Vamos a localizar la carpeta desde el explorador de Windows, y vamos a abrir Geoprocesado1 y luego “bin” y “Release”. Ahí aparece un ejecutable “Geoprocesado1.exe” nuestra aplicación que podríamos ejecutar.
Si no le indicamos que genere el ejecutable, cada vez que probamos el programa desde el entorno de desarrollo Visual me crea un ejecutable en la carpeta “Debug” también dentro de “bin”.
La ruta del ejecutable y algunos otros detalles del proyecto se los indicamos en el menú “Proyecto/Propiedades de Geoprocesado1”, pero eso lo contaremos en otra ocasión. Cerramos el proyecto en Archivo/Cerrar proyecto.
3.3 Controles: Etiquetas(Label), Cuadros de Texto (TextBox).
Creamos otro proyecto nuevo en “Archivo/Nuevo proyecto”, elegimos Aplicación para Windows, en la parte inferior le ponemos como nombre “Euroconversor”, y pulsamos “Aceptar”. Ahora intentamos colocar en el formulario dos etiquetas pulsando en Label en los controles comunes y luego en el formulario, y dos cuadros de texto pulsando en TextBox y luego en el formulario. También pondremos dos botones. Colocamos los controles y cambiamos el tamaño si hace falta. El aspecto debería ser:
Para mover varios controles a la vez, podemos pinchar en un punto vacío del fondo del formulario y arrastrar recuadrando los controles que pretendemos seleccionar. Una vez seleccionados si pulsamos sobre uno de ellos y arrastramos los movemos de sitio.
Para alinear varios controles, una vez que los hemos seleccionado nos dirigimos al menú Formato/Alinear y elegimos la opción que se ajuste a lo que necesitamos.
Para igualar el tamaño de varios controles los seleccionamos igualmente, y luego en el menú Formato/Igualar tamaño.
Ahora vamos a modificar el nombre y el texto de los controles. No es obligatorio cambiar el nombre a los controles, pero se recomienda hacerlo para que en el código tengamos más claro cual es cada uno. A la hora de poner nombres, vamos a indicar primero una abreviatura del control y luego el nombre. Así usaremos “lbl” para etiquetas(label), “txt” para cuadros de texto, “btn” para botones, “lst” para listas, etc. Vamos a seleccionar la etiqueta Label1 y en la propiedad “(Name)” pongo “lbl_euros”, en la propiedad “Text” pongo “Euros”. Resaltamos aquí que en el nombre de un control no permite espacios. En el texto sí. Para Label2 en el nombre lbl_pesetas y en el texto “Pesetas”. A “TextBox1” le ponemos nombre “txt_euros” y a “TextBox2” “txt_pesetas”. En el botón 1 pongo nombre “btn_apesetas” y texto “A pesetas” y en el 2 nombre “btn_aeuros” y texto “A euros”. Al formulario le ponemos en la propiedad Text “Euroconversor”.
Como vemos es un poco laborioso el cambio de nombre. A veces se evita en botones y controles que no guardan o reciben información. Pero se recomienda usarlo en los demás. En este ejemplo para los cuadros de texto.
Ahora le intentamos programar las operaciones. Hacemos doble-clic sobre el botón “A pesetas” y escribimos la siguiente línea de código.
Le indicamos que divida el valor que se escriba en el cuadro de texto “txt_euros” entre 166.386 y el resultado se lo asigne a la propiedad text de txt_pesetas. Si ejecutamos el programa, escribimos 6 en el cuadro de los euros y pulsamos el botón “A pesetas” obtenemos:
Hacemos algo parecido para el botón “A euros”, doble-clic sobre él y escribimos:
Guardamos el proyecto y probamos a generar el ejecutable y a localizarlo como en el caso anterior. Cerramos el proyecto.
Public Class Form1
Private Sub btn_apesetas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_apesetas.Click
txt_pesetas.Text = txt_euros.Text * 166.386 End Sub
End Class
Public Class Form1
Private Sub btn_apesetas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_apesetas.Click
txt_euros.Text = txt_pesetas.Text / 166.386 End Sub
3.4 Variables y constantes.
Creamos otro proyecto nuevo en “Archivo/Nuevo proyecto”, elegimos Aplicación para Windows, en la parte inferior le ponemos como nombre “DistanciaEuclidea”, y pulsamos “Aceptar”. Vamos a intentar crear un programa para el cálculo de la distancia entre dos puntos. Dados dos puntos A(x1,y1) y B(x2,y2) se define la distancia d:
2 1 2 2 1 2)
(
x
x
y
y
d
Creamos el formulario con las etiquetas y los cuadros de texto y botones que se muestran a continuación. Vamos a utilizar el control GroupBox del grupo contenedores para crear un marco alrededor de los controles del Punto1. Del Punto 2 y del resultado. Creamos primero los cuadros de grupo y después colocamos dentro lo demás. Para el las etiquetas en la propiedad “Font” podemos cambiar el tipo de letra, el tamaño y el aspecto. A los cuadros de texto del punto 1 les llamamos txt_x1 y txt_y1, a los del 2 txt_x2 y txt_y2, al del resultado txt_distancia. En el cuadro del resultado, en la propiedad “Readonly” ponemos el valor “true”, así no se permitirá escribir en ese cuadro.
Declaración de Variables
Vamos a definir variables para recoger el valor de las coordenadas de los puntos. Para hacerlo ponemos Dim nombre as Tipo. Nosotros usamos el tipo Double para reales de doble precisión. Mas adelante ponemos una tabla con los tipos de datos de Visual. En VB 6 la declaración de variables era opcional salvo que utilizáramos la instrucción Option Explicit para obligar a su declaración. En .Net la opción está puesta por defecto con lo que la declaración de variables es obligatoria. En cualquier caso siempre es mejor hacerlo así por lo que si alguien utiliza alguna versión anterior de Visual Basic se recomienda activar esta opción. Hay otra instrucción Option Strict On que fuerza a que a una variable no le podamos asignar un valor de distinto tipo del que se ha declarado, de este modo evitamos perdida de datos al asignar información a variables de menor precisión. Por defecto esta opción está desactivada (Option Strict Off). Si se quiere activar se indica la instrucción al comienzo del código del programa. También es
posible modificar los valores de estas opciones en el entorno de desarrollo de Visual Studio 2005. Para hacerlo nos dirigimos al menú Herramientas/Opciones, en la categoría Proyectos y soluciones, en el apartado Valores predeterminados de VB, podemos cambiar los valores que se tienen que usar por defecto. La ventana que nos muestra es:
La otra opción que aparece le indica si quiero que al comparar cadenas se distingan las mayúsculas y las minúsculas. Con el valor Binary que trae por defecto si se distinguen las mayúsculas de las minúsculas. Con el valor Text no hace distinción.
Una vez aclaradas algunas cuestiones previas, volvemos a nuestro ejemplo:
Como vemos es posible declarar varias variables del mismo tipo en la misma línea separándolas por comas. Recogemos en las variables el valor que nos pongan en el cuadro de texto. Lo que se escribe en un cuadro de texto es de tipo cadena (String) las variables que hemos creado son de tipo Double. Con la función CDBL convertimos lo que nos escriban en el cuadro a doble. Si no se escribe nada en el cuadro produciría un error. Luego usamos dos funciones de la clase “Math” que agrupa funciones matemáticas. “Sqrt” calcula la raíz cuadrada, “Pow” nos sirve para hacer potencias. El primer parámetro es la base y el segundo el exponente.
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim x1, y1, x2, y2, distancia As Double
x1 = CDbl(txt_x1.Text) y1 = CDbl(txt_y1.Text) x2 = CDbl(txt_x2.Text) y2 = CDbl(txt_y2.Text)
distancia = Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2)) txt_distancia.Text = CStr(distancia) End Sub End Class Declaración de Variables Raíz Cuadrada Potencia
Si lo ejecutamos para P1(0,0) y P2(3,4) el resultado será:
Si al ejecutarlo no escribimos valores en alguna de las coordenadas de los puntos el error que nos da será:
Que quiere decir que no puede convertir una cadena vacía a número de tipo Doble. De momento lo dejamos así. Después probaremos a solucionarlo.
Declaración de Constantes
También podemos definir constantes. Para hacerlo escribiríamos algo como:
Const MAXPUNTOS As Integer=100
Así estamos creando la constante como entera y le asignamos el valor 100. También es posible asignar un valor inicial a una variable en el momento de la declaración de la misma. La diferencia es que la constante mantiene el valor fijo durante la ejecución del programa y a la variable le podemos ir cambiando el valor asignado durante la ejecución del mismo. ¿Podemos escribir el valor 100 de la constante en las posiciones dónde hacemos referencia a ella? Si. Pero si la constante se utiliza en varios puntos del programa, y en un momento dado necesitamos cambiar su valor (en tiempo de programación), nos tocará modificarlo en todas las posiciones en que aparezca. Utilizando la constante es suficiente con asignarle el nuevo valor. Para esto se usan.
3.5 Tipos de datos en Visual Basic
La siguiente tabla muestra los principales tipos de datos que tenemos disponibles e Visual Basic. La tabla está sacada de la Ayuda del programa. Si alguna vez necesitamos información sobre algún comando podemos dirigirnos a Ayuda/Índice y localizarlo, o mandárselo buscar en el panel de la izquierda.
Tipo de Visual Basic Estructura de tipo Common Language Runtime Asignación de almacenamiento nominal Intervalo de valores
Boolean Boolean En función de la plataforma de implementación
True o False
Byte Byte 1 byte 0 a 255 (sin signo) Char
(carácter individual)
Char 2 bytes 0 a 65535 (sin signo)
Date DateTime 8 bytes 0:00:00 (medianoche) del 1 de enero de 0001 a 11:59:59 p.m. del 31 de diciembre de 9999.
Decimal Decimal 16 bytes 0 a
+/-79.228.162.514.264.337.593.543.950.335 (+/-7,9... E+28) † sin separador decimal; 0 a +/-7,9228162514264337593543950335 con 28 posiciones a la derecha del decimal; el número distinto de cero más pequeño es +/-0,0000000000000000000000000001 (+/-1E-28) † Double (punto flotante de precisión doble)
Double 8 bytes 1,79769313486231570E+308 a -4,94065645841246544E-324 † para los valores negativos;
4,94065645841246544E-324 a 1,79769313486231570E+308 † para los
valores positivos
Integer Int32 4 bytes -2.147.483.648 a 2.147.483.647 (con signo) Long (entero
largo)
Int64 8 bytes -9.223.372.036.854.775.808 a
9.223.372.036.854.775.807 (9,2...E+18 †) (con signo)
Object Object (clase) 4 bytes en plataforma de 32 bits
8 bytes en plataforma de 64 bits
Cualquier tipo puede almacenarse en una variable de tipo Object
Short (entero corto)
Int16 2 bytes -32.768 a 32.767 (con signo)
Single (punto flotante de precisión simple)
Single 4 bytes -3,4028235E+38 a -1,401298E-45 † para los valores negativos;
1,401298E-45 a 3,4028235E+38 † para los valores positivos
String (longitud variable)
String (clase) En función de la plataforma de implementación
0 a 2.000 millones de caracteres Unicode aprox.
UInteger UInt32 4 bytes 0 a 4.294.967.295 (sin signo)
ULong UInt64 8 bytes 0 a 18.446.744.073.709.551.615 (1,8...E+19 † ) (sin signo) User-Defined (estructura) (hereda de ValueType) En función de la plataforma de implementación
Cada miembro de la estructura tiene un intervalo de valores determinado por su tipo de datos y es independiente de los intervalos de valores correspondientes a los demás miembros.
UShort UInt16 2 bytes 0 a 65.535 (sin signo)
3.5.1 Funciones para la conversión de tipos
Nombre de la función
Tipo de datos devuelto
Intervalo de valores del argumento expression
CBool Boolean (Tipo de datos, Visual Basic)
Cualquier expresión numérica, Char o String válida.
CByte Byte (Tipo de datos, Visual Basic)
0 a 255 (sin signo); las partes fraccionarias se redondean.
CChar Char (Tipo de datos, Visual Basic)
Cualquier expresión Char o String válida; sólo se convierte el primer carácter de String; el valor puede estar comprendido entre 0 y 65535 (sin signo).
CDate Date (Tipo de datos, Visual Basic)
Cualquier representación válida de fecha y hora.
CDbl Double (Tipo de datos, Visual Basic)
de -1,79769313486231570E+308 a -4,94065645841246544E-324 para valores negativos; de 4,94065645841246544E--4,94065645841246544E-324 a 1,79769313486231570E+308 para valores positivos.
CDec Decimal (Tipo de datos, Visual Basic)
+/-79.228.162.514.264.337.593.543.950.335 para números a partir de cero, es decir, números sin decimales. Para números con 28 posiciones decimales, el intervalo es +/-7,9228162514264337593543950335. El menor número posible distinto de cero es 0,0000000000000000000000000001 (+/-1E-28).
CInt Integer (Tipo de datos, Visual Basic)
de -2.147.483.648 a 2.147.483.647; las partes fraccionarias se redondean.
CLng Long (Tipo de datos, Visual Basic)
de -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807; las partes fraccionarias se redondean.
CObj Object (Tipo de datos) Cualquier expresión válida.
CSByte SByte (T. datos, VB) de -128 a 127; las partes fraccionarias se redondean.
CShort Short (Tipo de datos, Visual Basic)
de -32.768 a 32.767; las partes fraccionarias se redondean.
CSng String (Tipo de datos, Visual Basic)
De -3,402823E+38 a –1,401298E-45 para valores negativos; de 1,401298E-45 a 3,402823E+38 para valores positivos.
CStr String (Tipo de datos, Visual Basic)
Los valores devueltos para CStr dependen del argumento
expression. Vea Valores devueltos para la función CStr.
CUInt UInteger (Tipo de datos)
de 0 a 4.294.967.295 (sin signo); las partes fraccionarias se redondean.
CULng ULong (Tipo de datos, Visual Basic)
de 0 a 18.446.744.073.709.551.615 (sin signo); las partes fraccionarias se redondean.
CUShort UShort (Tipo de datos, Visual Basic)
4 Estructuras Condicionales. Control Lista, Forms
4.1 Estructuras de Control. Sentencia condicional IF
Cuando la ejecución de un bloque de código no es lineal, sino que dependiendo de una condición se tiene que ejecutar un fragmento u otro de código, utilizamos la sentencia de control IF. Su sintaxis es
Cuando se desean evaluar varias condiciones se puede hacer así:
En la condición se pueden evaluar expresiones utilizando operadores lógicos y relacionales. Para analizar si se cumplen 2 condiciones a la vez utilizamos el AND (Y), para ver si se cumple cualquiera de las dos el OR (O). Luego usamos:
MAYOR MENOR MAYOR O
IGUAL
MENOR O
IGUAL IGUAL DISTINTO
> < >= <= = <>
Creamos un proyecto nuevo llamado NOTAS para probar esto. Ponemos una etiqueta, un cuadro de texto y un botón. Al cuadro de texto le llamamos “txt__nota”. Así:
IF CONDICION THEN
SENTENCIAS A EJECUTAR SI LA CONDICIÓN SE CUMPLE ELSE
SENTENCIAS A EJECUTAR SI LA CONDICIÓN NO SE CUMPLE END IF
IF CONDICION1 THEN
SENTENCIAS A EJECUTAR SI LA CONDICIÓN1 SE CUMPLE
ELSEIF CONDICION2 THEN
SENTENCIAS A EJECUTAR SI LA CONDICIÓN2 SE CUMPLE ELSE
SENTENCIAS A EJECUTAR SI NO SE CUMPLEN END IF
Si hacemos doble-clic sobre evaluar y escribimos lo siguiente:
Si queremos que nos distinga entre Notable, Sobresaliente, etc… Podemos hacer algo así:
Se podrían añadir condiciones para analizar los casos fuera de rango.
Si no escribimos nada en el cuadro de texto de la nota se produce un error en la conversión a número. Para corregirlo añadimos la función Length que devuelve la longitud de lo que nos escriban en el cuadro de texto. Si no escriben nada no será mayor que cero. Quedaría:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim nota As Double
nota = CDbl(txt_nota.Text) If nota < 5 Then
MessageBox.Show("Suspenso", "Resultado") Else
MessageBox.Show("Aprobado", "Resultado") End If
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim nota As Double
nota = CDbl(txt_nota.Text) If nota < 5 Then
MessageBox.Show("Suspenso", "Resultado") ElseIf nota < 7 Then
MessageBox.Show("Aprobado", "Resultado") ElseIf nota < 9 Then
MessageBox.Show("Notable", "Resultado") Else
MessageBox.Show("Sobresaliente", "Resultado") End If
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim nota As Double
If txt_nota.Text.Length > 0 Then
nota = CDbl(txt_nota.Text) If nota < 5 Then
MessageBox.Show("Suspenso", "Resultado") ElseIf nota < 7 Then
MessageBox.Show("Aprobado", "Resultado") ElseIf nota < 9 Then
MessageBox.Show("Notable", "Resultado") Else
MessageBox.Show("Sobresaliente", "Resultado") End If
Else
MessageBox.Show("Escriba una nota", "Resultado") End If
End Sub
Compara la longitud de la nota
4.2 Estructuras de Control. Selección múltiple Select Case
Cuando necesitamos distinguir varias condiciones puede que sea más apropiada esta estructura que el uso de varios IFs. Luego al realizar el programa cada uno tiene que decidir qué estructura encaja mejor para resolver cada problema.
La sintaxis es la siguiente:
Se pueden utilizar varias expresiones para un mismo caso separándolas por comas. La línea siguiente sería válida.
Case 1 to 3, 5 to 7, 9, 15, Is >=21
Vamos a hacer la prueba. Creamos un proyecto nuevo y le damos nombre DIASSEMANA. Colocamos en el formulario una etiqueta, un cuadro de Texto y un botón dentro de una caja de grupo. Al cuadro de texto le ponemos como nombre “txt_dia”. Quedará:
SELECT CASE VARIABLE
CASE V1
SENTENCIAS A REALIZAR SI LA VARIABLE VALE V1 CASE V2 TO V3
SENTENCIAS SI LA VARIABLE VALE ENTRE V2 y V3 AMBOS INCLUIDOS
CASE V4, V5
SENTENCIAS SI LA VARIABLE VALE ENTRE V4 o V5 CASE IS >V6
SENTENCIAS SI LA VARIABLE ES MAYOR QUE V6 CASE ELSE
SENTENCIAS SI LA VARIABLE ES DISTINTA DE LOS ANTERIORES
Ahora asignamos el código al botón “Evaluar”. Haremos doble-clic sobre él y vamos a escribir lo siguiente:
Si observamos el código a parte de comprobar que se haya escrito algo en el cuadro de texto mediante la propiedad Length, usamos otro if para que no nos dé error si escribimos en el cuadro de texto una palabra en lugar de un número.
Guardamos el proyecto y lo cerramos.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim dia As Integer
If txt_dia.Text.Length > 0 Then If IsNumeric(txt_dia.Text) Then dia = CInt(txt_dia.Text) Select Case dia
Case 1
MessageBox.Show("Lunes, buen comienzo de semnana", "Hoy es")
Case 2 To 5
MessageBox.Show("Martes a Viernes", "Hoy es") Case 6, 7
MessageBox.Show("Sabado o Domingo", "Hoy es") Case Else
MessageBox.Show("No es un dia de la Semana",
"Hoy es")
End Select Else
MessageBox.Show("Escribe un número del 1 al 7", "No es un numero")
End If Else
MessageBox.Show("Escribe un número del 1 al 7", "No se ha escrito nada")
End If End Sub
4.3 Mas Controles: Control Lista (ListBox), uso de varios Forms.
Si necesitamos mostrar en pantalla un conjunto de valores podemos utilizar el control Lista(ListBox). Vamos a crear un proyecto nuevo con nombre LISTAS para ilustrar el funcionamiento de este control. Colocamos los controles según esta distribución:Como se ve, hemos usado dos cuadros de Grupo para organizar los controles. El cuadro de texto recibe el nombre de “txt_nombre” y la lista (ListBox) que colocamos en la parte derecha se llamará “lst_listado”. Una vez realizado el diseño que quiero que presentos los controles que necesitamos en el Formulario, pasamos a añadir el código. Empezamos con el botón “Agregar”. Hacemos doble-clic sobre él y escribimos el fragmento de código siguiente:
Lo que hacemos es comprobar que nos escriban algo en el cuadro de texto, si no es así mostramos un mensaje advirtiéndolo. Luego paso el contenido del cuadro a la variable “nombre”, añado la variable a la lista y pongo en el cuadro de texto el valor “”, ósea la cadena vacía para que borre el nombre del cuadro después de haberlo añadido.
Vamos con el botón “Borrar Lista”. Le asociamos el siguiente código:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim nombre As String
If txt_nombre.Text.Length > 0 Then nombre = txt_nombre.Text
lst_listado.Items.Add(nombre) txt_nombre.Text = ""
Else
MessageBox.Show("Escriba un nombre antes de dar al botón", "Geoprocesado") End If End Sub Añadimos el nombre como elemento de la lista.
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
lst_listado.Items.Clear() End Sub
Esa línea se encarga de borrar el contenido de la lista. Como vemos hay otros métodos asociados al Listbox y a Items. Se podría intentar completar el programa utilizando alguno más de ellos.
Queremos ahora que si se selecciona un elemento en la lista en la derecha, ese elemento aparezca en el cuadro de texto de la izquierda. Vamos a asociar el código a la lista. Hacemos doble-clic sobre la lista y escribimos lo siguiente:
En lo primero que nos fijamos es que el procedimiento que nos crea en la lista maneja el evento “SelectedIndexChanged”, es decir se asocia a cambiar el elemento seleccionado de la lista, frente al evento hacer clic que nos asociaba para los botones.
Lo único que le indicamos es que coloque en el cuadro de texto el valor del elemento que se seleccione en la lista.
Si quisiésemos modificar el evento que queremos que nos asocie a un botón o a un control en general, podemos seleccionar el evento que necesitemos en la parte superior de la ventana cuando estamos en una de las líneas del procedimiento al que le quiero asociar el manejador de evento distinto.
En la imagen siguiente vemos los eventos que aparecen cuando desplegamos los manejadores disponibles para la lista.
Para terminar con el ejercicio intentaremos crear un segundo formulario. Añadimos un formulario nuevo al proyecto actual desde el menú Proyecto/Agregar Windows Forms.
Nos aparece un diálogo con algunas plantillas de formularios preparados:
Private Sub lst_listado_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
lst_listado.SelectedIndexChanged
txt_nombre.Text = lst_listado.SelectedItem End Sub
Seleccionamos “Cuadro Acerca de”, ponemos como nombre “frm_acerca” y pulsamos el botón “Agregar”.
Nos aparece el nuevo formulario. Es el formulario habitual de la mayoría de aplicaciones en la que nos informa sobre la misma, versión, compañía, etc. Nosotros vamos a cambiar solo el texto que vemos asociado a las etiquetas para que se vea así:
Ahora queremos utilizar este formulario creando una instancia desde el Formulario principal. Volvemos al formulario Principal haciendo doble-clic sobre la ficha
Form1.vb[Diseño] o haciendo doble-clic sobre Form1.vb en el Exploración de Soluciones.
Hacemos doble-clic sobre el botón “Acerca de…” que habíamos añadido antes al formulario y escribimos el siguiente código:
Hay que destacar que el formulario frm_acerca que hemos creado es una clase. Para crear una instancia de la clase es necesario escribir Dim ayuda As New frm_acerca, a diferencia de la declaración de las variables de tipos valor. Luego sólo llamamos al método Show del formulario.
Si ejecutamos el programa comprobamos como al abrir el formulario “Acerca” lo hace sin crear dependencia del principal. Si pulsamos en el otro formulario nos deja cambiar a él. En las aplicaciones normales, en ocasiones necesitamos utilizar diálogos. Mientras se están realizando cambios en el diálogo no se permite utilizar las opciones del programa principal. Vamos a cerrar los formularios para volver a seguir probando cosas. Volvemos al código asociado al botón “Acerca de…”, y ahora escribimos:
En la línea en la que antes ponía “ayuda.Show()”. De este modo nos muestra el formulario en formato Modal. Intentamos pulsar en el principal durante la ejecución después de mostrar el formulario “Acerca”. Cerramos el Programa.
Si vamos al formulario “frm_acerca” y pulsamos doble-clic sobre el botón “Aceptar” vemos el código que ha escrito el programa para ese botón.
“Me” hace referencia al objeto actual, en este caso al formulario “frm_acerca”, con “close()” le indicamos que lo cierre. En la parte superior de la ventana del código observamos que hay otra función asociada a la carga del formulario “Handles MyBase.Load” es la que se encarga de actualizar las etiquetas según los valores que figuran en las propiedades del proyecto. Dejamos para vosotros la opción de eliminar la función y dejar las etiquetas estáticas, o modificar esos parámetros.
Guardamos el proyecto, y lo cerramos.
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim ayuda As New frm_acerca ayuda.Show()
End Sub
ayuda.ShowDialog()
5 Estructuras Repetitivas. Menús, DataGridView
5.1 Menús y Bucles For-Next, Do-Loop, While-Wend
Vamos a desarrollar un programa para ilustrar el uso de menús. En el programa tendremos 5 formularios. El principal, uno para ilustrar el funcionamiento de cada una de las estructuras repetitivas, y otro más para la ayuda. Comenzamos creando un proyecto nuevo de tipo “Aplicación para Windows”, en la parte inferior le damos nombre en este caso MENUSYBUCLES. Procedemos a cambiar el nombre al formulario, en la parte derecha de la pantalla, en el Explorador de Soluciones, pulsamos con el botón derecho sobre Form1.vb y seleccionamos “cambiar nombre” le asignamos el nombre “frm_principal”. Ponemos también en la propiedad Text del formulario el título “Menús y Bucles”.
5.1.1 Crear el menú.
Ahora asociamos el menú a este formulario, para ello elegimos en el cuadro de herramientas de la izquierda el grupo “menús y barras de herramientas”, al desplegarlo elegimos “MenuStrip” y pulsamos sobre el fondo del formulario, nos quedará así:
Vemos que en la parte superior del Formulario aparece la opción “Escriba aquí” y en la zona inferior nos pone “MenuStrip1”, ahí es donde aparecen los controles que no son visibles en una posición concreta del formulario.
Escribimos el siguiente menú:
&Archivo &Repeticiones Ay&uda
Salir Bucle For… Acerca de…
-
Bucle Do-Loop…
-
Bucle While-EndWhile…
El ampersand (&) delante de una de las letras de la etiqueta del menú hace que esa sea la tecla asociada para acceder a él con el teclado y la tecla “Alt”. El “-“ como etiqueta nos pone un separador en esa posición. Se ponen “…” al final de un menú para indicar que no realizan una operación directa, sino que muestran un diálogo. El menú quedaría:
Vamos a asociar código al submenú “Salir” dentro de “Archivo”. Si hacemos doble-clic sobre “Salir” como si fuera un botón, y le asociamos el código siguiente que ya usamos en el programa anterior.
Ejecutamos el programa y probamos a navegar por los menús y a usar la opción “Salir” que nos abandonará el programa.
5.1.2 Agregar formulario existente.
En lugar de volver a crear el formulario de “Acerca de…” como hicimos en el proyecto anterior, vamos a añadírselo desde el anterior. Si vamos al menú “proyecto/Agregar elemento existente.
Localizamos el proyecto “Listas” de antes, luego cogemos la carpeta “Listas” y el formulario “frm_acerca.vb”. Este formulario se copiará al proyecto actual.
Private Sub SalirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SalirToolStripMenuItem.Click
Me.Close()
Después pulsamos “Agregar”. Ahora vamos asociar al menú “Acerca de” el mismo código que en el programa anterior.
Ejecutamos el programa, probamos el funcionamiento de lo realizado hasta ahora. 5.1.3 Formulario Tabla de Multiplicar bucle FOR-NEXT.
Creamos otro formulario nuevo para la parte del programa del Bucle For. En el menú “Proyecto/Agregar Windows Forms”. Elegimos ahora un formulario normal, el primero “WindowsForms” y le ponemos nombre “frm_bucleFor.vb”. Creamos una lista, un cuadro de texto y un botón. Los distribuimos así:
Ponemos como nombre de la lista “lst_tabla” y al cuadro de texto “txt_numero”. Al botón cerrar le asociamos “Me.Close()”, y a “Crear Tabla” le asociamos lo siguiente:
Private Sub AcercaDeToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AcercaDeToolStripMenuItem.Click Dim ayuda As New frm_acerca
ayuda.ShowDialog() End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click Dim numero, i, res As Integer
Dim linea As String
If txt_numero.Text.Length > 0 Then
If IsNumeric(txt_numero.Text) Then
numero = CInt(txt_numero.Text) If lst_tabla.Items.Count > 0 Then
lst_tabla.Items.Clear() End If
For i = 1 To 10
res = numero * i
linea = numero & " por " & i & " es " & res lst_tabla.Items.Add(linea)
Next
Else
MessageBox.Show("El valor introducido no es un número",
"Tabla Multiplicar") End If
Else
MessageBox.Show("Escriba un número en el cuadro antes de pulsar el botón", "Tabla Multiplicar")
End If End Sub
Vamos a asociar código al submenú “Bucle For” dentro de “Repeticiones”. Si hacemos doble-clic sobre “Bucle For” como si fuera un botón, y le asociamos el código siguiente, para que nos muestre el formulario creado:
Ejecutamos el programa, probamos el funcionamiento de lo realizado hasta ahora. La sintaxis del bucle FOR-NEXT es:
Se repiten las sentencias de dentro del bucle desde que la variable toma el valor inicial hasta que alcance el valor final con el incremento PASO. Si no se especifica el PASO se interpreta que es 1. El PASO puede ser positivo o negativo.
Cuando el PASO es positivo o cero el bucle se ejecuta si la variable es menor o igual que fin. Cuando el PASO es negativo el bucle se ejecuta si la variable es mayor o igual que fin.
Con la instrucción EXIT FOR se abandona la ejecución del bucle sin completar las iteraciones indicadas. Se utiliza para forzar la salida del bucle cuando se da una condición. Por ejemplo que ya hemos encontrado el valor que buscábamos en una lista y no necesitamos seguir comparando el resto de elementos de la misma.
NOTA: Visual Basic evalúa las iteraciones que se realizan solo una vez al comenzar el bucle si el bloque de sentencias del bucle modificase el valor de FIN o de PASO, esas modificaciones no afectarían a la iteración del bucle.
5.1.4 Formulario bucle DO-LOOP.
Vamos a crear otro formulario nuevo como en el caso anterior. Le llamamos
“frm_doloop.vb”. Creamos un cuadro de grupo, las etiquetas, los botones el cuadro de
texto y el cuadro de lista. Al cuadro de texto le llamamos “txt_secreto”, y a la lista
“lst_lista”.
FOR variable=inicio TO fin [STEP PASO]
Sentencias [EXIT FOR] [SENTENCIAS] NEXT [variable] EJEMPLOS: FOR I=1 TO 10 Sentencias NEXT I
FOR I=1 TO 10 STEP 2
Sentencias
NEXT
FOR I=10 TO 1 STEP -1
Sentencias
NEXT
Private Sub BucleForToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
BucleForToolStripMenuItem.Click
Dim tablamultiplicar As New frm_bucleFor tablamultiplicar.ShowDialog()
Al botón cerrar le asociamos:
En el botón comenzar colocamos el siguiente fragmento de código.
Las líneas que comienzan con una comilla (‘) aparecen en verde en el compilador y son comentarios. Se utilizan para explicar algunas partes del programa y así que el código resulte más comprensible.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim secreto, num As Integer
' Inicializamos el generador de números aleatorios.
Randomize()
' Generamos número aleatorio entre 1 y 10.
secreto = CInt(Int((10 * Rnd()) + 1)) txt_secreto.Text = ""
lst_lista.Items.Clear()
Do
num = InputBox("Dime un numero del 1 al 10", "Adivinar") If secreto > num Then
MessageBox.Show("El numero es Mayor", "CASI") lst_lista.Items.Add(num)
ElseIf secreto < num Then
MessageBox.Show("El numero es Menor", "CASI") lst_lista.Items.Add(num)
End If
Loop
While
secreto <> num
'Loop Until secreto = num
MessageBox.Show("Acertaste", "RESULTADO") txt_secreto.Text = secreto
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Me.Close()
El programa genera un número aleatorio que será el secreto. Luego va pidiendo números al usuario. Si el número no es el correcto se pone un mensaje con la indicación y se añade el número a la lista. El bucle se repite mientras (While) el número sea distinto de secreto. Se produciría el mismo resultado con la línea comentada, repitiendo el bucle hasta (Until) que el número y secreto fuesen iguales.
Al terminal el bucle cuando se acierte el número se muestra un mensaje para indicarlo y se coloca el secreto en el cuadro de texto.
La sintaxis del bucle DO-LOOP es:
Se repite un bloque de sentencias mientras la condición se cumpla o hasta que la condición se cumpla. Si la condición se coloca al comienzo del bucle, puede que el bucle no se llegue a ejecutar nunca si así se desprende de la evaluación de la condición. Si la condición va al final, las sentencias al menos se ejecutan una vez antes de que se llegue a evaluar la condición. La instrucción “EXIT DO” es opcional, si aparece fuerza la salida del bucle.
Vamos a asociar código al submenú “Bucle Do-Loop” dentro de “Repeticiones”. Si hacemos doble-clic sobre él como si fuera un botón, y le asociamos el código siguiente, para que nos muestre el formulario creado:
Probamos el funcionamiento del último formulario creado.
DO { While | Until } condicion
[Sentencias] [Exit DO] [Sentencias] LOOP O DO [Sentencias] [Exit DO] [Sentencias]
LOOP { While | Until } condicion
Private Sub BucleDoLoopToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
BucleDoLoopToolStripMenuItem.Click Dim adivinar As New frm_doloop adivinar.ShowDialog()
5.1.5 Formulario bucle While-End While, DataGridView.
Completaremos el ejercicio creando otro formulario nuevo como en el caso anterior. Le llamamos “frm_while.vb”. Creamos un cuadro de grupo, la etiqueta, los botones, el cuadro de texto y un DataGridView (a continuación contaremos con detalle como se añade este control nuevo). Al cuadro de texto le llamamos “txt_tope” y en la propiedad
Text le asignamos valor 5. Que quede con este aspecto.
Para añadir la tabla el control DataGridView seleccionamos el grupo Datos en el cuadro de herramientas de la izquierda, y a continuación el componente DataGridView.
Seguidamente hacemos un rectángulo en el formulario del tamaño apropiado según lo reflejado en la imagen de distribución de controles sobre el formulario anterior. Al hacerlo nos aparece el diálogo de la página siguiente.
El DataGridView se utiliza habitualmente para visualizar el contenido de bases de datos que enlacemos desde visual. Como nosotros ahora no vamos a enlazar a ninguna base de datos sino que vamos a utilizar la tabla para colocar en ella valores generados por nosotros, en la línea Elegir origen de datos dejamos (ninguno).
Queremos crear 3 columnas en la tabla, en la primera mostraremos un número, en la segunda escribiremos el cuadrado del número y en la tercera el cubo del número que hemos situado en la primera columna. Comenzamos con la primera columna. Pulsamos sobre Agregar columna y nos aparece:
Escribimos como nombre numero y como texto del encabezado Número. Pulsamos Agregar. Repetimos escribiendo nombre cuadrado y encabezado Número Cuadrado para la segunda, y ponemos nombre cubo y encabezado Número Cubo en la tercera. Después pulsamos el botón Cerrar. Seleccionando esta tabla buscamos ReadOnly en las propiedades y le asignamos el valor True.
Vamos a asignar funcionalidad a los botones. Al de Cerrar le asignamos:
Y al de Generar:
Como se indica en los comentarios se hacen comprobaciones sobre la validez del dato introducido en el tope. Se borra lo que tuviese previamente la tabla y en el bucle while se repite mientras el contador sea menor o igual que el tope. Para calcular el cubo hacemos uso de la función Math.Pow pasándole la base i y el exponente 3.
Asociamos código al submenú “Bucle While-EndWend” dentro de “Repeticiones”. Si hacemos doble-clic sobre él y le asociamos el código siguiente:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Me.Close()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim i, tope As Integer
If txt_tope.Text.Length > 0 Then ' Comprobamos que se haya escrito algo en el cuadro de texto tope
If IsNumeric(txt_tope.Text) Then ' Nos aseguramos que hay un numero en tope
tope = CInt(txt_tope.Text) 'Asigno a la variable tope el valor del cuadro de texto
dgv_tabla.Rows.Clear() 'Borramos las filas previas si las hubiera
i = 1 'Inicializo el contador del bucle
While
i <= tope
'Repetimos el bucle mientras i sea menor que el topedgv_tabla.Rows.Add(i, i * i, Math.Pow(i, 3)) 'Añado una fila a la tabla con el número,
' su cuadrado y su cubo
i = i + 1 'incremento el contador. Cuidado no olvidarse que provocaría un bucle infinito
End
While
' Fin del BucleElse
MessageBox.Show("Solo se admiten números en Tope",
"AVISO")
End If Else
MessageBox.Show("Introduzca valor en Tope", "AVISO") End If
End Sub
Private Sub BucleWhileWendToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
BucleWhileWendToolStripMenuItem.Click
Dim factorial As New frm_while factorial.ShowDialog()
6 Arrays de una y varias dimensiones.
6.1 Arrays unidimensionales(Vectores)
En visual .Net se dispone de estructuras más avanzadas para almacenar un grupo de valores, como colecciones que veremos más adelante. Para almacenar una serie de datos del mismo tipo se utilizan tradicionalmente los Arrays. Intentaremos ilustrar el uso de un Array con un ejemplo y luego comentamos las características para trabajar con ellos en Visual Basic .Net.
Creamos un proyecto nuevo de tipo “Aplicación para Windows”, en la parte inferior le damos nombre en este caso VECTORES. Procedemos a cambiar el nombre al formulario, en la parte derecha de la pantalla, en el Explorador de Soluciones, pulsamos con el botón derecho sobre Form1.vb y seleccionamos “cambiar nombre” le asignamos el nombre “frm_principal”. Ponemos también en la propiedad Text del formulario el título “Geotecnologías: Calculo de Notas”.
Queremos diseñar el formulario para que quede con el aspecto de la imagen:
Creamos dos cuadros de grupo, las etiquetas que se ven, los botones, los cuadros de texto y la lista. Al cuadro de texto alumno le llamamos “txt_alumno”, al de nota
“txt_nota” y al de la media “txt_media”. A la lista le damos el nombre “txt_lista”. Ámbito de variables
En los programas realizados hasta ahora las variables las creábamos dentro de los procedimientos asociados al evento click de los botones, o a otros controles. En este programa necesitamos que si en la acción asociada a un botón se le asignan unos valores al vector, esos valores se mantengan cuando se realiza una operación para otro de los botones. Crearemos una variable que será visible para todos los procedimientos dentro del formulario.
Vamos a asociar al botón Salir la operación de cerrar el formulario:
Justo encima de la declaración del procedimiento declaramos el vector que nos permitirá almacenar las notas y mantenerlas o modificarlas desde todos los procedimientos de la clase frm_principal (de las clases hablaremos con más detalle en futuros ejercicios). Quedará:
La línea “Dim Vectornotas(9) As Double” crea un vector de 10 elementos, números reales (Double). Nos está creando un vector de 10 elementos, el primero está en la posición 0, y el último en la 9. En cada posición almacenaremos una nota.
Pos 0 1 2 3 4 5 6 7 8 9
Valor 5.8 8.5 6.5 7.2 9.3 7.4 6.8 5 5.5 6.5
Para asignar un valor al primer elemento del vector podríamos poner
Vectornotas(0)=5.8
La ventaja del uso de vectores frente a las variables normales es que podemos recorrer los elementos del mismo con estructuras repetitivas para agilizar el manejo de grandes cantidades de datos. Seguimos con el ejemplo, luego contamos mas detalles de la declaración de vectores.
En el botón Asignar Nota ponemos:
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Me.Close()
End Sub
Public
Class
frm_principal
Dim
Vectornotas(9)
As
Double
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Me.Close() End Sub
End
Class
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim alumno As Integer Dim nota As Double
If txt_alumno.Text.Length > 0 Then 'Comprobamos que hayan escrito algo en alumno
If IsNumeric(txt_alumno.Text) Then 'Que hayan escrito un número
alumno = CInt(txt_alumno.Text) 'Guardamos el valor númerico escrito en alumno
If alumno >= 1 And alumno <= 10 Then 'Si el número de alumno está entre 1 y 10
nota = CDbl(txt_nota.Text) 'guardo en la variable la nota. Se podrían realizar
'controles para probar que se ha escrito la nota y es un número igual que para alumno.
Asignamos al vector en la posición indicada en alumno el valor que nos ponen en nota. Luego mostramos en la lista el contenido del vector indicando la posición y la nota. Queremos que al iniciar el programa se llene la lista con la información almacenada en el vector aunque serán todos los valores 0. Para que la ejecución del código necesario se realice al comenzar el programa, lo vamos a poner asociado al evento Cargar formulario, (Load). Si hacemos doble-clic sobre el fondo del formulario, ya nos aparece el procedimiento asociado a la operación Cargar.
Le escribimos el código siguiente:
Vectornotas(alumno - 1) = nota 'el índice del vector empieza en 0 y los alumnos que
'introduce el usuario empiezan en 1 por eso restamos 1 para que los valores de 1-10
'que introduce el usuario se tomen como valores de 0-9 para el índice del vector.
Else
MessageBox.Show("El alumno debe ser un número del 1 al 10", "Error Número fuera de intervalo")
'Mensaje si el número no está entre 1 y 10
End If Else
MessageBox.Show("El alumno debe ser un número del 1 al 10", "Error de número de alumno")
'Mensaje si no es un número
End If Else
MessageBox.Show("Escriba el número de alumno", "Error de número de alumno")
' Mensaje si no se escribe nada en alumno
End If
Dim i As Integer Dim linea As String
lst_lista.Items.Clear() 'Borramos la lista
For i = 0 To 9
linea = "" & i & "==>" & Vectornotas(i) 'formamos una linea con la posición del vector y su contenido
lst_lista.Items.Add(linea) 'agregamos la linea a la lista
Next End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i As Integer Dim linea As String
lst_lista.Items.Clear() 'Borramos la lista
For i = 0 To 9
linea = "" & i & "==>" & Vectornotas(i) 'Formamos la linea con la posición y el contenido del vector
lst_lista.Items.Add(linea) 'Agregamos la linea a la lista
Next End Sub
Cuando pulsemos el botón Comprobar nota queremos que nos coloque en el cuadro de texto nota, la nota correspondiente al alumno cuyo número escribimos en el cuadro de texto alumno. Para lograr nuestro propósito escribiremos el código:
Para terminar el programa realizamos el cálculo de la media de las notas introducidas. Al botón Calcular Media le asignamos el código:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim alumno As Integer
If txt_alumno.Text.Length > 0 Then 'Miramos que se escriba algo en alumno
If IsNumeric(txt_alumno.Text) Then 'Que lo escrito sea un número
alumno = CInt(txt_alumno.Text) 'Asignamos a la variable alumno el valor de lo escrito en el cuadro
If alumno >= 1 And alumno <= 10 Then 'Comprobamos que el número esté entre 1 y 10
txt_nota.Text = CStr(Vectornotas(alumno - 1))
'Muestro en el cuadro nota el valor almacenado en
'el vector para la posición "alumno-1". Los alumnos del usuario van de 1-10 las posiciones
'del vector de 0-9, por eso le restamos 1.
Else
MessageBox.Show("El alumno debe ser un número del 1 al 10", "Error Número fuera de intervalo")
'Mensaje si no está entre 1 y 10
End If Else
MessageBox.Show("El alumno debe ser un número del 1 al 10", "Error de número de alumno")
'Mensaje si lo escrito no es un número
End If Else
MessageBox.Show("Escriba el número de alumno", "Error de número de alumno")
'Mensaje si no se escribe nada en alumno
End If End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Dim media As Double Dim i As Integer
media = 0 'Visual Basic ya da valor 0 a las variables si nosotros no se lo ponemos.
'Otros lenguajes de programación no lo hacen. En ocasiones es bueno acostumbrarse a hacerlo.
For i = 0 To 9 'Recorremos el vector de 0 a 9
media = media + Vectornotas(i) 'voy sumando en media el valor anterior mas la nota de la posición que toca del vector
Next
media = media / 10 'divido la media entre 10 que son las notas que tenemos y el resultado es la media
txt_media.Text = CStr(media) 'Asigno al cuadro de texto la media calculada.
Con esto terminamos el programa. Podemos probar su funcionamiento.
Algunos detalles a tener en cuenta cuando trabajamos con vectores:
Intentaremos exponer ahora algún detalle más de la declaración y uso de Arrays.En nuestro programa creamos un vector de tipo Double, pero es posible declarar un vector de cualquiera de los tipos disponibles, y también de clases que nosotros nos creemos. La fórmula utilizada para declarar el vector es la tradicional:
Dim Vectornotas(9) As Double ó
Dim Vectornotas() As Double
También lo podríamos declarar según la forma nueva para .NET
Dim Vectornotas As Double()
Si utilizamos la declaración clásica podemos indicarle en el momento de declarar la variable el número de elementos que tendrá el vector. Si lo hacemos por el método nuevo no le podemos indicar el número de elementos del Array al declararlo, y será necesario redimensionarlo después. Para redimensionar el Vector escribimos:
ReDim Vectornotas(9)
Es posible redimensionar la matriz si se necesitan más elementos con la cláusula
Preserve. Por ejemplo:
Dim Vectornotas(9) As Double ReDim Preserve Vectornotas(20)
ReDim Preserve Vectornotas(15)
ReDim Vectornotas(10)
En la primera redimensión le damos 20 como tamaño del vector y como tiene puesto el Preserve mantiene los elementos que pudiese tener el vector. En la segunda le dejamos en 15 perderíamos los 5 últimos elementos si tuviesen algo, pero los primeros mantendrían su contenido. Con la última redimensión le dejamos con 10 elementos y al no tener Preserve se quedarían sin el contenido previo asignándole los valores de inicialización de la variable 0 en nuestro caso.
Si necesitamos redimensionar un vector a un tamaño variable dependiendo de las circunstancias del programa, lo podremos hacer según lo indicado antes. Para recorrer un vector de este modo, puede ser interesante utilizar la función Length que me indica el número de elementos del vector.
Quedaría:
For i = 0 To Vectornotas.Length-1 Se puede ordenar un vector, lo hacemos así:
Array.Sort(Vectornotas)
6.2 Arrays multidimensionales (Matrices).
Podemos utilizar Arrays de varias dimensiones. Por ejemplo para declarar una matriz de 3 filas y 4 columnas de Double escribiríamos:
Dim Tabla(2,3) As Double
Cuando preguntamos por la longitud de un vector de una dimensión con Length nos dice cuantos elementos tiene. Si preguntamos para un vector de varias dimensiones, nos dice cuantos elementos tienen en total, pero no sabemos cuantos hay para cada dimensión. Para saber cuantos hay en cada dimensión podemos poner lo siguiente:
Tabla.GetLowerBound(0)
Esto nos diría cuantos elementos tiene en la primera dimensión (0). Para la segunda sería igual pero poniendo (1).
Si queremos saber cuantas dimensiones tiene un vector pondríamos
Dim
dimensiones
As
Integer
dimensiones = Tabla.Rank
Que en este caso serían 2.Se puede usar ReDim para cambiar el número de elementos de cada dimensión. Pero no para cambiar el número de dimensiones del Array.
Podemos usar ReDim con Preserve para cambiar el número de elementos de la última dimensión sin perder la información que tuviese previamente almacenada.