tema 1: introducción a la programación en visual basic .net

66
Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura Escuela Politécnica Superior de Ávila 1 Universidad de Salamanca 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.

Upload: nguyenque

Post on 06-Jan-2017

230 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 1 Universidad de Salamanca

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.

Page 2: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 2 Universidad de Salamanca

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 y Formularios Web

Windows Forms

Common Language Specification

VB C++ C# J# …

Page 3: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 3 Universidad de Salamanca

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)

Page 4: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 4 Universidad de Salamanca

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.

Page 5: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 5 Universidad de Salamanca

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.

Page 6: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 6 Universidad de Salamanca

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

FormularioPropiedades del objeto seleccionado

Page 7: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 7 Universidad de Salamanca

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 End Class

Page 8: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 8 Universidad de Salamanca

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

Page 9: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 9 Universidad de Salamanca

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 End Class

Page 10: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 10 Universidad de Salamanca

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.

Page 11: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 11 Universidad de Salamanca

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. El aspecto después de los cambios sería el de la página siguiente:

Page 12: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 12 Universidad de Salamanca

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 End Class

Page 13: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 13 Universidad de Salamanca

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:

212

212 )( yyxxd

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

Page 14: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 14 Universidad de Salamanca

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

Page 15: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 15 Universidad de Salamanca

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.

Page 16: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 16 Universidad de Salamanca

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

SByte SByte 1 byte -128 a 127 (con signo)

Page 17: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 17 Universidad de Salamanca

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-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).

Page 18: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 18 Universidad de Salamanca

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)

de 0 a 65.535 (sin signo); las partes fraccionarias se redondean.

Page 19: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 19 Universidad de Salamanca

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

Page 20: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 20 Universidad de Salamanca

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

Page 21: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 21 Universidad de Salamanca

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 END SELECT

Page 22: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 22 Universidad de Salamanca

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

Page 23: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 23 Universidad de Salamanca

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

Page 24: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 24 Universidad de Salamanca

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

Page 25: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 25 Universidad de Salamanca

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:

Page 26: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 26 Universidad de Salamanca

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()

Me.Close()

Page 27: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 27 Universidad de Salamanca

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:

Page 28: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 28 Universidad de Salamanca

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() End Sub

Page 29: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 29 Universidad de Salamanca

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

Page 30: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 30 Universidad de Salamanca

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() End Sub

Page 31: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 31 Universidad de Salamanca

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() End Sub

Page 32: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 32 Universidad de Salamanca

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() End Sub

Page 33: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 33 Universidad de Salamanca

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).

Page 34: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 34 Universidad de Salamanca

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.

Page 35: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 35 Universidad de Salamanca

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 tope dgv_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 Bucle Else 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() End Sub

Page 36: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 36 Universidad de Salamanca

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.

Page 37: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 37 Universidad de Salamanca

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.

Page 38: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 38 Universidad de Salamanca

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

Page 39: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 39 Universidad de Salamanca

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. End Sub

Page 40: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 40 Universidad de Salamanca

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)

Page 41: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 41 Universidad de Salamanca

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.

Page 42: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 42 Universidad de Salamanca

7 Definición de Clases Propias.

Como hemos ido viendo todo en .Net gira entorno a las clases, a los objetos. Un formulario es una clase, un botón también, etc. Vamos a intentar crear una clase. Comenzamos creando un proyecto nuevo como en ejercicios anteriores. A este le daremos el nombre “Puntosyclases”.

7.1 Clase Punto2D. Para crear una clase en el proyecto actual, vamos al menú Proyecto/Agregar clase y elegimos como nombre Punto2d.vb en la pantalla que aparece que tendrá el aspecto:

Vamos a crear las siguientes funciones en la clase Punto2d:

Public Class Punto2d Public x, y As Double 'Variables de la clase Punto2d son públicas, permitirán acceder a ellas. 'Se podrían haber creado como propiedades Sub mostrar() 'Procedimiento mostrar que visualiza en un mensaje los valores de las coordenadas MessageBox.Show("La X del punto es " & x & " y la Y del punto es" & y, "Información del Punto") End Sub Sub New() 'Constructor por Defecto. Inicializa las Variables y muestra un mensaje cuando es invocado x = 0 y = 0 MessageBox.Show("Punto creado con el constructor por defecto", "Constructor por Defecto") End Sub

Page 43: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 43 Universidad de Salamanca

Los constructores “New” son procedimientos especiales que son invocados en el momento de crear un nuevo objeto de tipo nuestra clase. Si nosotros no definimos el constructor el programa se encarga de llamar a uno genérico. En el ejemplo hemos creado tres constructores los tres tienen el mismo nombre con lo que estarían sobrecargados. En el momento de llamar a alguno de ellos, dependiendo de los argumentos que le indiquemos sabe cuál tiene que ejecutar. El primero es el constructor por defecto. No recibe ningún argumento. El segundo es el constructor con parámetros, recibe como argumento los valores de las coordenadas, se encarga de asignar los valores recibidos a las variables. El tercero es el constructor de copia, recibe una variable del mismo tipo que la clase que estamos definiendo, se encarga de ir copiando cada valor de la clase que recibe en las variables de la clase que declaramos. También tenemos un procedimiento mostrar para visualizar los valores, y un función para calcular la distancia al punto que nos proporcionan como parámetro. En los parámetros que recibimos vemos que aparece ByVal, esto significa que los parámetros se reciben por valor. Es decir se recibe una copia de objeto que nos pasen y el original no se verá afectado por las modificaciones que se realicen en el procedimiento. Si pusiésemos ByRef, le estaríamos pasando por referencia. Es decir, pasamos la dirección de memoria del objeto original y éste podría verse modificado. Crearemos ahora un aplicación para ilustrar cómo utilizamos la clase creada. Cambiamos el nombre al formulario Form1.vb y le llamamos “frm_principal.vb”. El aspecto que debería presentar el formulario sería:

Sub New(ByVal coord_x As Double, ByVal coord_y As Double) 'Constructor de parámetros x = coord_x y = coord_y MessageBox.Show("Punto creado con el constructor de parametros", "Constructor de Parámetros") End Sub Sub New(ByVal p2 As Punto2d) 'Constructor de copia x = p2.x y = p2.y MessageBox.Show("Punto creado con el constructor de copia", "Constructor de Copia") End Sub Function distanciaA(ByVal p2 As Punto2d) As Double 'Función distancia. Calcula la distancia al 'punto que nos pasan como argumento Dim distanciax, distanciay As Double distanciax = p2.x - x distanciay = p2.y - y distanciaA = Math.Sqrt(distanciax * distanciax + distanciay * distanciay) 'Calculamos la distancia y se la asignamos al nombre de la función. Así devolvemos el valor End Function End Class

Page 44: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 44 Universidad de Salamanca

Al botón de Salir le ponemos el código de cerrar el formulario usado en otras ocasiones. Al botón de crear puntos le asociamos lo siguiente: Podemos probar el funcionamiento de este breve programa.

7.2 Clase Punto3D. Herencia Creamos una clase nueva llamada Punto3d, siguiendo los pasos indicados para la clase Punto2d. Una vez creada le realizamos las modificaciones que se observan en el código siguiente:

Public Class frm_principal Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim dista As Double

Dim p As New Punto2d 'Creamos punto con el constructor por defecto

p.x = 5 'Asignamos un valor a la variable x del punto p p.y = 8 'Asignamos un valor a la variable y del punto p p.mostrar() 'llamamos al método mostrar de la clase punto2d Dim p2 As New Punto2d(3, 7) 'Creamos otro punto p2 con el constructor por argumentos p2.mostrar() 'Mostramos el punto p2 Dim p3 As New Punto2d(p2) 'Creamos el punto p3 con el constructor de copia a partir del punto p2 p3.mostrar() 'Mostramos p3 que tendrá los mismos valores que p2 dista = p3.distanciaA(p) 'Calculamos la distancia del punto p3 al p MessageBox.Show("La distancia es " & Format(dista, "0.0000"), "DISTANCIA ENTRE PUNTOS") 'Mostramos la distancia calculada. Con format podemos indicar los decimales que queremos y en general 'el formato con el que queremos que nos muestre el valor de una variable. End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Me.Close() End Sub End Class

Page 45: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 45 Universidad de Salamanca

Con Inherits Punto2d le indicamos que herede de la clase anterior. Vamos a sobrescribir el procedimiento mostrar para que muestre los datos de 2 y 3 dimensiones. Se lo indicamos con Overrides Sub mostrar(). Para que me permita sobrescribir el procedimiento mostrar en la clase Punto3d le tengo que indicar en la clase Punto2d que el procedimiento es “sobreescribible”. Se lo indicamos con Overridable Sub

mostrar(). Con Mybase podemos llamar a los métodos de la clase base (Punto2d). Así nos ahorramos repetir código. Modificamos el formulario añadiendo otro botón.

Public Class Punto3d Inherits Punto2d 'Así le indicamos que la clase Punto3d hereda sus propiedades de Punto2D Public z As Double ' El punto3D tendrá también Z Overrides Sub mostrar() ' Declaramos el procedimiento mostrar y le indicamos que sobreescriba 'el mostrar de la clase base. MyBase.mostrar() 'Llamo al mostrar de punto2d para que muestre la X y la Y MessageBox.Show("Y la Z del punto es " & z, "Información del Punto") 'Muestro la Z End Sub Sub New() 'Constructor por Defecto. Inicializa las Variables y muestra un mensaje cuando es invocado MyBase.New() 'llamo al constructor por defecto de punto2d z = 0 MessageBox.Show("Punto 3D creado con el constructor por defecto", "Constructor por Defecto") End Sub Sub New(ByVal coord_x As Double, ByVal coord_y As Double, ByVal coord_z As Double) 'Constructor de parámetros MyBase.New(coord_x, coord_y) 'Llamo al constructor con argumentos y le paso la x e y recibidas z = coord_z 'Asigno a la Z el valor recibido MessageBox.Show("Punto 3D creado con el constructor de parametros", "Constructor de Parámetros") End Sub Sub New(ByVal otrop3d As Punto3d) 'Constructor de copia MyBase.New(otrop3d) 'Llamo al constructor de copia pasando el punto recibido. Observar que le paso un 'objeto de tipo punto 3d. Pero un punto3d también es Punto2d al ser derivada de ella. z = otrop3d.z 'Asigno la Z MessageBox.Show("Punto 3D creado con el constructor de copia", "Constructor de Copia") End Sub End Class

Page 46: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 46 Universidad de Salamanca

Y le asignamos al botón el código que se indica a continuación para que nos ilustre el funcionamiento.

Ejecutamos el programa, guardamos y cerramos el proyecto.

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Dim unpunto3d As New Punto3d unpunto3d.x = 5 'Asignamos un valor a la variable x del punto p unpunto3d.y = 8 'Asignamos un valor a la variable y del punto p unpunto3d.z = 9 'Asignamos un valor a la variable y del punto p unpunto3d.mostrar() 'llamamos al método mostrar de la clase punto2d Dim p2 As New Punto3d(3, 7, 12) 'Creamos otro punto p2 con el constructor por argumentos p2.mostrar() 'Mostramos el punto p2 Dim p3 As New Punto3d(p2) 'Creamos el punto p3 con el constructor de copia a partir del punto p2 p3.mostrar() 'Mostramos p3 que tendrá los mismos valores que p2 End Sub

Page 47: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 47 Universidad de Salamanca

8 Crear y usar Biblioteca de Clases

Una de las principales ventajas de la programación orientada a objetos es la reutilización de Código. Vamos a intentar crear una Biblioteca de Clases. Como ejemplo aprovecharemos las clases Punto2D y Punto 3D que utilizamos en el ejercicio anterior, las modificaremos levemente y generaremos la librería DLL.

Empezamos creando un proyecto como en ejercicios anteriores pero ahora eligiendo el tipo Biblioteca de Clases. En Archivo/Nuevo proyecto, le damos el Nombre Geotecnologías.

Ahora importamos las clases Punto2D y Punto3D del proyecto realizado anteriormente “PuntosyClases”. Para ello accedemos al menú Proyecto/Agregar elemento existente. Localizamos el proyecto indicado y seleccionamos las clases, pulsamos Agregar.

Page 48: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 48 Universidad de Salamanca

Procedemos a modificar las clases, comenzamos borrando la clase “Class1” que nos creó automáticamente al comenzar la creación de la Biblioteca. Para borrarla pulsamos con el botón derecho sobre ella en el “Explorador de Soluciones” en la Derecha de la pantalla, y a continuación “Eliminar”. Haciendo doble-clic sobre la clase Punto2d, vamos a borrar el procedimiento mostrar, y comentamos la instrucción “MessageBox…” de todas las demás rutinas. Cuando queremos reutilizar código, hay que intentar que la entrada y salida de información de las clases sea lo más flexible posible. Como las variables de las coordenadas son públicas, no necesitamos la función mostrar. Podemos mostrar el valor de esas variables en el programa principal en que se usen las clases, y podemos mostrar esos valores en un cuadro de texto, o imprimirlos, sin estar sujetos a que su visualización se produzca vía un mensaje. Para mejorar la clase podríamos haber creado propiedades que se encarguen de recoger o devolver controladamente los valores de las variables en lugar de haberlas dejado públicas. Guardamos la clase, el código quedará:

Public Class Punto2d Public x, y As Double 'Variables de la clase Punto2d son públicas, permitirán acceder a ellas. 'Se podrían haber creado como propiedades Sub New() 'Constructor por Defecto. Inicializa las Variables y x = 0 y = 0 'MessageBox.Show("Punto creado con el constructor por defecto", "Constructor por Defecto") End Sub Sub New(ByVal coord_x As Double, ByVal coord_y As Double) 'Constructor de parámetros x = coord_x y = coord_y 'MessageBox.Show("Punto creado con el constructor de parametros", "Constructor de Parámetros") End Sub Sub New(ByVal p2 As Punto2d) 'Constructor de copia x = p2.x y = p2.y 'MessageBox.Show("Punto creado con el constructor de copia", "Constructor de Copia") End Sub Function distanciaA(ByVal p2 As Punto2d) As Double 'Función distancia. Calcula la distancia al 'punto que nos pasan como argumento Dim distanciax, distanciay As Double distanciax = p2.x - x distanciay = p2.y - y distanciaA = Math.Sqrt(distanciax * distanciax + distanciay * distanciay) 'Calculamos la distancia y se la asignamos al nombre de la función. Así devolvemos el valor End Function End Class

Page 49: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 49 Universidad de Salamanca

Hacemos algo parecido para la clase Punto3d. Borramos la función mostrar, y comentamos los mensajes. La clase nos queda: Guardamos la clase también, le damos a Archivo/Guardar todo y almacenamos el proyecto con nombre “Geotecnologias”. Generamos la librería Geotecnologías.dll. Para hacerlo damos al menú Generar/generar Geotecnologias. Si todo ha ido bien nos habrá dejado la librería Geotecnologias.dll en la carpeta del proyecto, subcarpeta bin y luego en Release. Comprobamos que es así y cerramos el proyecto.

8.1 Utilizar la Biblioteca de clases creada. Creamos un breve proyecto para utilizar la biblioteca creada. El proyecto se llamará “UsarBiblio” y será de tipo Aplicación para windows. Para utilizar una Biblioteca de clases lo haremos desde Proyecto/Agregar referencia. En la pestaña Examinar localizamos Geotecnologias.dll, y pulsamos Aceptar. Aparentemente no pasa nada pero la biblioteca ya esta accesible desde nuestro proyecto.

Public Class Punto3d Inherits Punto2d 'Así le indicamos que la clase Punto3d hereda sus propiedades de Punto2D Public z As Double ' El punto3D tendrá también Z Sub New() 'Constructor por Defecto. Inicializa las Variables MyBase.New() 'llamo al constructor por defecto de punto2d z = 0 'MessageBox.Show("Punto 3D creado con el constructor por defecto", "Constructor por Defecto") End Sub Sub New(ByVal coord_x As Double, ByVal coord_y As Double, ByVal coord_z As Double) 'Constructor de parámetros MyBase.New(coord_x, coord_y) 'Llamo al constructor con argumentos y le paso la x e y recibidas z = coord_z 'Asigno a la Z el valor recibido 'MessageBox.Show("Punto 3D creado con el constructor de parametros", "Constructor de Parámetros") End Sub Sub New(ByVal otrop3d As Punto3d) 'Constructor de copia MyBase.New(otrop3d) 'Llamo al constructor de copia pasando el punto recibido. Observar que le paso un 'objeto de tipo punto 3d. Pero un punto3d también es Punto2d al ser derivada de ella. z = otrop3d.z 'Asigno la Z 'MessageBox.Show("Punto 3D creado con el constructor de copia", "Constructor de Copia") End Sub End Class

Page 50: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 50 Universidad de Salamanca

Creamos una variable de cada tipo y mostramos su resultado en un cuadro de Texto. Colocamos 3 botones un cuadro de texto llamado “txt_mensajes” al que le cambiamos la propiedad Multiline a True. Presentará el aspecto:

En el botón “Borrar mensajes” escribimos el Código: Para tener disponibles las clases sin poner el prefijo del Espacio de nombres al que pertenecen pondremos Imports Geotecnologías al comienzo del código fuera de la clase Form1. Nos saldrá al escribir imports nuestra biblioteca.

txt_mensajes.Clear()

Page 51: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 51 Universidad de Salamanca

De este modo para definir un punto puedo escribir Dim p1 As New Punto2d(2, 3) De no importar el espacio de nombres, habría que escribir: Dim p1 As New Geotecnologías.Punto2d(2, 3) Escribimos en el botón Crear puntos lo siguiente: Probamos su funcionamiento, guardamos y cerramos el proyecto.

Dim p1 As New Punto2d(2, 3) txt_mensajes.AppendText("Se crea el punto p1 con x=2 e y=3" & vbCrLf) txt_mensajes.AppendText("El punto tiene x=" & p1.x & " e y=" & p1.y & vbCrLf) Dim p2 As New Punto3d(100, 50, 40) txt_mensajes.AppendText("Se crea el punto p2 con x=100,y=50 y z=40" & vbCrLf) txt_mensajes.AppendText("El punto p2 tiene x=" & p2.x & ", y=" & p2.y & "y z=" & p2.z & vbCrLf)

Page 52: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 52 Universidad de Salamanca

9 Lectura y escritura de Ficheros de texto STREAMS.

Comenzamos un proyecto nuevo que se llamará “LeerFicheros”. Vamos a intentar leer ficheros de puntos en coordenadas X;Y;Z, separados por “;”. Y vamos a guardar esos puntos con formato texto pero separados por tabulaciones (X Y Z). Creamos el menú con el control MenuStrip en el grupo Menús y Barras de Herramientas.

El formulario presentará el aspecto:

Las etiquetas que vemos, un cuadro de texto con nombre “txt_ruta” para ver la ruta del archivo leído, un cuadro de texto “txt_rutaguardar” para mostrar la ruta del archivo guardado, un cuadro de texto “txt_leidos” en el que mostraremos el número de puntos que se lean, un cuadro de texto “txt_visor” en el que pondremos la propiedad Multiline a True, para mostrar las líneas que vamos leyendo del fichero y un DataGridView que encontramos en la categoría de Datos y llamamos “dgv_tabla”. Para la tabla al insertarla le agregamos tres columnas con los nombres de las coordenadas de los puntos X, Y, Z. Para el acceso al sistema de archivos utilizaremos los diálogos OpenFileDialog y SaveFileDialog del grupo de controles Diálogos.

Page 53: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 53 Universidad de Salamanca

Comenzamos con la opción la operación de leer que asociaremos al menú Archivo/Abrir. Para el utilizar las clases relacionadas con la entrada y salida, importamos el espacio de nombres Imports System.IO al comienzo del código. Escribimos el código siguiente: Se puede entender el código a partir de los comentarios. Se podría realizar un control más preciso de errores para contemplar casos en que los archivos proporcionados no se ajusten al formato previsto. Pero como comienzo lo dejamos así.

Private Sub AbrirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AbrirToolStripMenuItem.Click OpenFileDialog1.Filter = "Archivos Ascii(*.asc)|*.asc|Archivos de Texto(*.txt)|*.txt|Todos los Archivos|*.*" 'Le indicamos los filtros que aparecerán al seleccionar los archivos. asc, txt, o todos. OpenFileDialog1.ShowDialog() 'Mostramos diálogo de Abrir txt_ruta.Text = OpenFileDialog1.FileName 'Colocamos en el cuadro de texto la ruta y nombre del fichero seleccionado Dim leer As New StreamReader(New FileStream(OpenFileDialog1.FileName, FileMode.Open)) 'Creamos la variable de tipo StreamReader que nos permitirá manejar el fichero 'la variable se crea a partir otra de tipo FileStream asociada al archivo seleccionado y 'Abiendo el archivo Dim linea As String txt_visor.Clear() 'Borramos el cuadro que visionará las lineas leídas dgv_tabla.Rows.Clear() 'Borramos la tabla que muestra las coordenadas de los puntos Dim punto(2) As String 'Vector de tres cadenas para guardar la X,Y,Z de cada punto Do linea = leer.ReadLine 'Leemos una linea del fichero If Not linea Is Nothing Then 'Si la linea no está vacia punto = Split(linea, ";", 3) 'Separamos con la función Split la linea por la posición del separador ; 'Limitamos el número de trozos a 3 para no desbordar el vector If punto.Length = 3 Then 'Si no hay tres coordenadas descartamos el dato dgv_tabla.Rows.Add(punto(0), punto(1), punto(2)) 'Añado las coordenadas del punto a la tabla End If txt_visor.AppendText(linea & vbCrLf) 'Añado la linea leída al visor. vbCrLf es un salto de linea End If Loop Until linea Is Nothing 'Repetimos hasta que linea sea vacia que se habrá terminado el fichero leer.Close() 'Cerramos el fichero leer = Nothing txt_leidos.Text = dgv_tabla.Rows.Count - 1 'Pongo en txt_leidos el numero de puntos añadidos a la tabla. End Sub

Page 54: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 54 Universidad de Salamanca

Intentamos probar el código que hemos escrito hasta el momento. Abrimos el fichero “Reducidos.asc” que se proporciona como ejemplo. Luego probamos con alguno de los otros más grandes. Vamos ahora con la parte de guardar. Se lo asociamos al menú Archivo/Guardar escribiendo: Podemos entender el funcionamiento del código a partir de los comentarios en el mismo. Comprobaríamos en el bloc de notas que el archivo se ha generado correctamente. Guardamos el proyecto y lo cerramos. Nosotros sólo hemos probado alguna de las clases para ficheros de texto. En el punto siguiente vemos otras disponibles para más necesidades.

Private Sub GuardarComoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GuardarComoToolStripMenuItem.Click SaveFileDialog1.Filter = "Archivos de Texto delimitado por tabulaciones(*.txt)|*.txt" 'Establecemos el formato de archivo de salida a *.txt SaveFileDialog1.ShowDialog() 'Abrimos el diálogo de guardar Dim linea As String Dim i As Integer Dim escribir As New StreamWriter(New FileStream(SaveFileDialog1.FileName, FileMode.OpenOrCreate)) 'Usamos la variable de tipo StreamWriter para asociarsela al fichero que nos han indicado. 'Le ponemos que nos abra o nos cree el archivo si no existiese txt_rutaguardar.Text = SaveFileDialog1.FileName 'Ponemos en el cuadro la ruta de guardar el nombre y ruta del archivo. For i = 0 To dgv_tabla.Rows.Count - 2 'Recorremos las filas de la tabla del DataGridView linea = dgv_tabla.Rows(i).Cells.Item(0).Value.ToString & vbTab & dgv_tabla.Rows(i).Cells.Item(1).Value.ToString & vbTab & dgv_tabla.Rows(i).Cells.Item(2).Value.ToString 'Generamos una linea con las coordenadas de los puntos, el tabulador(vbTab) entre ellas y un salto de linea al final escribir.WriteLine(linea) 'Escribimos la linea generada en el fichero. Next escribir.Close() 'Cerramos el fichero escribir = Nothing End Sub

Page 55: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 55 Universidad de Salamanca

10 Clases de E/S.

Clase Descripción

BinaryReader Lee tipos de datos primitivos como valores binarios en una codificación específica.

BinaryWriter Escribe tipos primitivos en binario en una secuencia y admite escribir cadenas en una codificación específica.

BufferedStream Agrega una capa de almacenamiento en búfer a las operaciones de lectura y escritura en otra secuencia. No se puede heredar esta clase.

Directory Expone métodos estáticos para crear, mover y enumerar archivos en directorios y subdirectorios. Esta clase no se puede heredar.

DirectoryInfo Expone métodos de instancia para crear, mover y enumerar archivos en directorios y subdirectorios. Esta clase no se puede heredar.

DirectoryNotFoundException Excepción que se produce cuando no encuentra parte de un archivo o directorio.

DriveInfo Proporciona acceso a información sobre una unidad.

DriveNotFoundException La excepción que se produce al intentar obtener acceso a una unidad o un recurso compartido que no está disponible.

EndOfStreamException Excepción que se produce cuando se intenta realizar una operación de lectura más allá del final de una secuencia.

ErrorEventArgs Proporciona datos para el evento Error.

File Proporciona métodos estáticos para crear, copiar, eliminar, mover y abrir archivos y contribuye a la creación de objetos FileStream.

FileInfo Proporciona métodos de instancia para crear, copiar, eliminar, mover y abrir archivos y contribuye a la creación de objetos FileStream. Esta clase no se puede heredar.

FileLoadException Excepción que se produce cuando se encuentra un ensamblado administrado que no se puede cargar.

FileNotFoundException Excepción que se produce cuando se produce un error al intentar tener acceso a un archivo que no existe en el disco.

FileStream Expone un objeto Stream alrededor de un archivo; se admiten operaciones de lectura y escritura sincrónica y asincrónica.

FileSystemEventArgs Proporciona datos para los eventos de directorio

Page 56: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 56 Universidad de Salamanca

Changed, Created y Deleted.

FileSystemInfo Proporciona la clase base para los objetos FileInfo y DirectoryInfo.

FileSystemWatcher Escucha las notificaciones de cambio del sistema de archivos y provoca eventos cuando cambia un directorio o un archivo de un directorio.

InternalBufferOverflowException Excepción que se produce cuando se desborda el búfer interno.

InvalidDataException Excepción que se inicia cuando el formato de una secuencia de datos no es válido.

IODescriptionAttribute Establece la descripción que los diseñadores visuales pueden mostrar cuando se hace referencia a un evento, un extensor o una propiedad.

IOException Excepción que se produce cuando se produce un error de E/S.

MemoryStream Crea una secuencia cuyo almacén de respaldo es la memoria.

Path Ejecuta operaciones en instancias de String que contienen información de rutas de archivos o directorios. Estas operaciones se ejecutan de forma adecuada para múltiples plataformas.

PathTooLongException Excepción que se produce cuando un nombre de ruta de acceso o un nombre de archivo es más largo que la longitud máxima definida por el sistema.

RenamedEventArgs Proporciona datos del evento Renamed.

Stream Proporciona una vista genérica de una secuencia de bytes.

StreamReader Implementa un TextReader que lee los caracteres de una secuencia de bytes en una codificación determinada.

StreamWriter Implementa TextWriter para escribir los caracteres de una secuencia en una codificación determinada.

StringReader Implementa TextReader que lee en una cadena.

StringWriter Implementa TextWriter para escribir información en una cadena. La información se almacena en el StringBuilder subyacente.

TextReader Representa un lector que puede leer una serie secuencial de caracteres.

TextWriter Representa un sistema de escritura que puede escribir una serie secuencial de caracteres. Esta clase es abstracta.

UnmanagedMemoryStream Proporciona acceso a los bloques de memoria no administrada desde el código administrado

Page 57: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 57 Universidad de Salamanca

11 Colecciones. Las colecciones nos permiten gestionar conjuntos de elementos de forma mucho más eficiente que los arrays. Para añadir y borrar elementos nos despreocupamos de los índices, la reserva o liberación de memoria. Tenemos colecciones basadas en iList que son más parecidas a los arrays. Se almacena un tipo de objeto y accedemos a cada elemento a partir de un índice. El ArrayList sería un ejemplo de este tipo de colecciones. Otras colecciones se basan en IDictionary, para acceder a cada elemento lo hacemos mediante una clave. Cada elemento almacenado está formado por el objeto en cuestión y una clave para acceder a él. El ejemplo más usado de este tipo es el de las tablas Hash, HashTable. En el punto siguiente después del ejercicio se presenta una lista las clases disponibles. Vamos a ilustrar el uso de la clase Arraylist que nos proporciona una matriz cuyo tamaño aumenta dinámicamente según las necesidades. Creamos un proyecto de nombre “Colecciones”. En esta clase utilizaremos la definición de puntos que vimos en el ejercicio de creación de bibliotecas de clases. Para utilizar una Biblioteca de clases lo haremos desde Proyecto/Agregar referencia. En la pestaña Examinar localizamos Geotecnologias.dll, y pulsamos Aceptar. Aparentemente no pasa nada pero la biblioteca ya esta accesible desde nuestro proyecto.

Planteamos ahora la posibilidad de Leer los puntos de un archivo de texto delimitado por “;”, en lugar de meter los puntos en el DataGridView que hicimos para otro ejercicio, los vamos a ir añadiendo al ArrayList. Luego en el programa le haremos algunas tareas como comprobar el las coordenadas de alguno de los puntos. Creamos un menú con las opciones:

El diseño del formulario quedará:

Page 58: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 58 Universidad de Salamanca

Tenemos las etiquetas, un botón, un cuadro de texto llamado “txt_ruta” para visualizar la ruta y nombre del archivo que abrimos, otro “txt_leidos” que nos servirá para mostrar el total de puntos leídos, otro “txt_numpunto” para indicarle el índice del punto que queremos visualizar, y otros tres “txt_x”, “txt_y” y “txt_z” para mostrar las coordenadas del punto leído. La principal parte del funcionamiento del programa se la asociamos al menú Archivo/Abrir. Hemos copiado parte del código utilizado para el proyecto leer de ficheros. Leeremos una línea del fichero, la partimos con “Split” por la posición del separador “;”, creamos una instancia del objeto Punto3d con cada grupo de coordenadas leídas, añadimos el punto al ArrayList. Primero cambiamos el nombre al formulario con el botón derecho del ratón en el explorador de soluciones sobre “Form1.vb” y ponemos ”frm_coleccion.vb”. Vamos a declarar una variable listado (El “ArrayList”) de ámbito en todo el formulario. Así podremos hacer referencia a ella desde el menú Abrir y también desde el botón Consultar. También importamos el espacio de nombres System.IO para clases de E/S y el nuestro Geotecnologías para las clases de Punto2d y Punto3d. El código necesario para Abrir:

Private Sub AbrirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AbrirToolStripMenuItem.Click OpenFileDialog1.Filter = "Archivos Ascii(*.asc)|*.asc|Archivos de Texto(*.txt)|*.txt|Todos los Archivos|*.*" 'Establecemos el Filtro que limitará los tipos de archivo mostrados a *.asc, *.txt y todos *.* OpenFileDialog1.ShowDialog() 'Mostramos el diálogo de Abrir que nos permitirá seleccionar el fichero. txt_ruta.Text = OpenFileDialog1.FileName 'Colocamos en el cuadro de texto la ruta y nombre del archivo seleccionado. Dim leer As New StreamReader(New FileStream(OpenFileDialog1.FileName, FileMode.Open)) 'Creamos la variable leer que nos permitira leer una secuencia de caracteres del archivo 'que le indicamos usando el modo abrir archivo. Dim linea As String Dim punto(2) As String 'Vector de 3 elementos cadena (0,1,2) Dim p As Punto3d 'Variable de tipo Punto3d aquí sólo se declara, luego crearemos una nueva instancia para cada punto.

Imports System.IO Imports Geotecnologías Public Class frm_coleccion Dim listado As New ArrayList 'Declaramos la variable en el ámbito del formulario así será visible desde todos los procedimientos

Page 59: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 59 Universidad de Salamanca

De este modo el ArrayList listado tiene almacenados los puntos. Probamos a visualizar alguno de ellos. Escribiremos el índice del punto a consultar y al pulsar el botón Consultar, nos mostrará las coordenadas en los cuadros correspondientes. Si el índice del punto no es válido, o no ponemos índice no dice nada y no hace nada. Podríamos ponerle los mensajes de error que ya hemos usado en otros ejercicios. El código para el botón:

Do linea = leer.ReadLine 'Leemos una línea del fichero de texto If Not linea Is Nothing Then 'Si hemos leído una línea,(si no se ha acabado el archivo) linea = linea.Replace(".", ",") 'Cambio el separado decimal de . a , para que me coja bien los números 'Podríamos comprabar primero qué separador se está usando, eso para las mejoras punto = Split(linea, ";", 3) 'Separo la línea por la posición de los ";" limitando a '3 elementos para evitar desbordamientos If punto.Length = 3 Then 'Si no encontro 3 coordenadas descarto el dato p = New Punto3d(punto(0), punto(1), punto(2)) 'Creo una nueva instancia de la clase Punto3d a partir 'de las coordenadas listado.Add(p) 'Añado el punto al ArrayList End If End If Loop Until linea Is Nothing 'Repetimos hasta el final de Archivo leer.Close() 'Cerramos el fichero leer = Nothing txt_leidos.Text = listado.Count 'Coloco en el cuadro el número de elementos del ArrayList End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim numpunto As Integer Dim punto As Punto3d 'Variable de tipo punto no creamos una nueva instancia porque hará referencia al punto 'Que se creó al leer del fichero será otra variable para acceder a uno de los puntos del ArrayList If txt_numpunto.Text.Length > 0 Then 'Que escriban algo If IsNumeric(txt_numpunto.Text) Then 'Que sea un número numpunto = CInt(txt_numpunto.Text) 'Paso el número a la variable numpunto If numpunto >= 0 And numpunto <= listado.Count - 1 Then 'Que el número de punto esté entre 0 y el total -1 punto = listado.Item(numpunto) 'Asocio a la variable punto el objeto que se encuentra en la posición numpunto del ArrayList txt_x.Text = CStr(punto.x) 'Pongo en el cuadro la coordenada x del punto txt_y.Text = CStr(punto.y) 'Pongo en el cuadro la y del punto txt_z.Text = CStr(punto.z) 'Pongo en el cuadro la z del punto End If End If End If End Sub

Page 60: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 60 Universidad de Salamanca

Probamos el funcionamiento del programa. Cerramos el Proyecto.

11.1 Interfaces y clases del espacio de nombres System.Collections Hemos utilizado la clase ArrayList para alojar un grupo de puntos. En el espacio de nombres System.Collections tenemos interfaces y clases que definen varias colecciones de objetos, como listas, colas, matrices de bits, tablas hash y diccionarios.

Clase Descripción

ArrayList Implementa la interfaz IList mediante una matriz cuyo tamaño aumenta dinámicamente según se requiera.

BitArray Administra una matriz compacta de valores de bit que se representan como valores booleanos, donde true indica que el bit está activado (1) y false indica que el bit está desactivado (0).

CaseInsensitiveComparer Compara dos objetos para ver la equivalencia omitiendo la distinción entre mayúsculas y minúsculas de las cadenas.

CaseInsensitiveHashCodeProvider Proporciona un código hash para un objeto y utiliza un algoritmo hash que no distingue entre mayúsculas y minúsculas en las cadenas.

CollectionBase Proporciona la clase base abstract para colecciones con establecimiento inflexible de tipos.

Comparer Compara dos objetos para ver si son iguales teniendo en cuenta la distinción entre mayúsculas y minúsculas de las cadenas.

DictionaryBase Proporciona la clase base abstract para una colección de pares de clave y valor con establecimiento inflexible de tipos.

Hashtable Representa una colección de pares de clave y valor organizados en función del código hash de la clave.

Queue Representa una colección de objetos de tipo "primero en entrar, primero en salir".

ReadOnlyCollectionBase Proporciona la clase base abstract de una colección de sólo lectura no genérica con establecimiento inflexible de tipos.

SortedList Representa una colección de pares de clave y valor ordenados por claves a los que se puede tener acceso por clave y por índice.

Stack Representa una colección sencilla de objetos no genéricos LIFO ("último en entrar, primero en salir").

Page 61: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 61 Universidad de Salamanca

12 Imágenes y Gráficos(GDI+).

En Visual .Net tenemos un nuevo conjunto de herramientas de graficos (GDI+) como evolución del GDI(Graphics Device Interface) disponible en Visual Basic. En GDI+ vamos a tener muchas más clases disponibles, y su uso será más sencillo. El espacio de nombres con el que trabajamos será System.Drawing. Probaremos a realizar algunos trazos de gráficos vectoriales sobre el formulario utilizando el evento Paint del mismo. También podríamos hacerlo sobre un PictureBox. Hacemos la prueba para dibujar algunos objetos básicos. Creamos un proyecto con nombre “GDI”. Cambiamos las dimensiones al formulario estableciendo el ancho a 600 y el alto a 450 en la propiedad Size. Le ponemos como nombre “frm_lienzo.vb”. Vamos a definir una función. Como quiero poder usar la función en todo el proyecto actual la voy a crear en un módulo. Para crear el módulo vamos a Proyecto/Agregar modulo ponemos el nombre “Funciones.vb” y aceptamos. En el módulo creamos la función: Ahora hacemos doble-clic en el fondo del formulario. Nos aparecerá el evento Load. Localizamos el evento Paint en la parte de arriba a la derecha.

Module Funciones Public Function invertirImagen(ByVal img As Image) As Image Dim i, j As Integer 'Generamos una imagen nueva a partir de la original Dim imagen2 As New Bitmap(img) Dim c, c2 As Color 'Recorremos los pixels de la imagen en horizontal y vertical For i = 0 To imagen2.Size.Width - 1 'Recorremos el ancho For j = 0 To imagen2.Size.Height - 1 'Recorremos el alto c = imagen2.GetPixel(i, j) 'Tomamos el color del pixel c2 = Color.FromArgb(255 Xor c.R, 255 Xor c.G, 255 Xor c.B) 'Invertimos el color del pixel imagen2.SetPixel(i, j, c2) 'Asignamos el nuevo color al pixel Next Next Return imagen2 End Function End Module

Page 62: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 62 Universidad de Salamanca

En el código le asociamos:

Private Sub frm_lienzo_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint Dim pincel As New Pen(Color.Red, 4) 'Pincel de color rojo y de grosor 4 Dim rectangulo As New Rectangle(New Point(50, 50), New Size(500, 300)) 'Creamos un Rectángulo a partir de un punto y con un tamaño especificado e.Graphics.DrawRectangle(pincel, rectangulo) 'Dibujamos el rectángulo con el pincel creado Dim degradado As New Drawing2D.LinearGradientBrush(rectangulo, Color.Yellow, Color.Orange, _ Drawing2D.LinearGradientMode.ForwardDiagonal) 'Creamos un degradado con el tamaño del rectángulo, de Amarillo a Naranja, de tipo diagonal inversa e.Graphics.FillRectangle(degradado, rectangulo) 'Rellenamos el rectángulo con el degradado e.Graphics.DrawLine(pincel, New Point(50, 50), New Point(550, 350)) 'Dibujamos una linea en la diagional Principal Dim pincel2 As New Pen(Color.DarkBlue, 5) 'Creamos otro pincel de color azul oscuro y grosor 5 e.Graphics.DrawEllipse(pincel2, New Rectangle(New Point(250, 150), New Size(100, 100))) 'Pintamos un circulo hacia el centro del formulario Dim pincel3 As New Pen(Color.Black, 1) 'Creamos otro pincel de color negro y 1 pixel de grosor Dim i As Integer For i = 100 To 500 Step 20 'Con el for pintamos varios puntos separados 20 pixel e.Graphics.DrawEllipse(pincel3, New Rectangle(New Point(i, 200), New Size(1, 1))) 'Se dibujan los puntos aunque algunos no se vean con las imágenes Next Dim imagen As Bitmap 'Creo una variable imagen imagen = New Bitmap("c:\mapa.jpg") 'Instancio la variable tomando la foto mapa.jpg en el raiz c e.Graphics.DrawImage(imagen, 225, 50, 150, 100) 'Dibujamos la foto con comienzo en 225, 50 de 150 pixel de ancho y 100 de alto imagen.RotateFlip(RotateFlipType.Rotate180FlipY) 'Reflejamos la imagen en Horizontal e.Graphics.DrawImage(imagen, 375, 150, 150, 100) 'Dibujo la imagen reflejada imagen = invertirImagen(imagen) 'Negativo de la imagen usando la función definida en el módulo e.Graphics.DrawImage(imagen, 75, 150, 150, 100) 'Pinto la imagen invertida Dim miletra As New Font("Arial", 20, FontStyle.Bold) 'Creo un tipo de letra e.Graphics.DrawString("ORIGINAL", miletra, Brushes.DeepPink, 380, 60) 'Escribo con color rosa y letra mi letra en la posición indicada como esquina superior izquierda e.Graphics.DrawString("REFLEJADA", miletra, Brushes.DarkBlue, 370, 260) 'Escribo en Azul oscuro Dim textura As New TextureBrush(imagen) 'Creo una textura a partir de la imagen invertida e.Graphics.DrawString("INVERTIDA", miletra, textura, 80, 260) 'Escribo con la textura de la imagen invertida End Sub

Page 63: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 63 Universidad de Salamanca

Se puede seguir las operaciones realizadas a partir de los comentarios.

12.1 Clases del Espacio de nombres System.Drawing

Clase Descripción

Bitmap Encapsula mapas de bits de GDI+, que están formados por los datos de píxeles de una imagen de gráficos y sus atributos. Bitmap es un objeto que se utiliza para trabajar con imágenes definidas mediante datos de píxeles.

Brush Define los objetos que se utilizan para rellenar formas de gráficos, por ejemplo rectángulos, elipses, gráficos circulares y rutas.

Brushes Pinceles de todos los colores estándar. Esta clase no puede heredarse.

BufferedGraphics Proporciona un búfer gráfico para el doble búfer.

BufferedGraphicsContext Proporciona los métodos para crear búferes de gráficos que se pueden utilizar para el almacenamiento en doble búfer.

BufferedGraphicsManager Proporciona acceso al principal objeto de contexto gráfico almacenado en búfer para el dominio de aplicación.

ColorConverter Convierte colores de un tipo de datos a otro. Se obtiene acceso a esta clase a través de TypeDescriptor.

ColorTranslator Convierte colores a y de estructuras Color GDI+. No se puede heredar esta clase.

Font Define un formato concreto para el texto, incluidos el nombre de fuente, el tamaño y los atributos de estilo. No se puede heredar esta clase.

FontConverter Convierte objetos Font de un tipo de datos a otro.

FontConverter.FontNameConverter FontConverter.FontNameConverter es un convertidor de tipos que se utiliza para convertir un nombre de fuente en otras representaciones y viceversa.

FontConverter.FontUnitConverter Convierte unidades de fuente en otros tipos de unidad y viceversa.

FontFamily Define un grupo de tipos de letra que tienen un diseño básico parecido y algunas diferencias de estilo. No se puede heredar esta clase.

Graphics Encapsula una superficie de dibujo de GDI+. No se puede heredar esta clase.

Icon Representa un icono de Windows, que es una pequeña imagen de mapa de bits utilizada para

Page 64: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 64 Universidad de Salamanca

representar un objeto. Los iconos se pueden considerar como mapas de bits transparentes, aunque su tamaño lo determina el sistema.

IconConverter Convierte objetos Icon de un tipo de datos en otro. Se tiene acceso a esta clase mediante el objeto TypeDescriptor.

Image Clase base abstracta que proporciona funcionalidad para las clases descendentes Bitmap y Metafile.

ImageAnimator Da animación a una imagen que tiene marcos basados en tiempo.

ImageConverter ImageConverter es una clase que se puede utilizar para convertir objetos Image de un tipo de datos a otro. Se tiene acceso a esta clase mediante el objeto TypeDescriptor.

ImageFormatConverter ImageFormatConverter es una clase que se puede utilizar para convertir colores de un tipo de datos a otro. Se tiene acceso a esta clase mediante el objeto TypeDescriptor.

Pen Define un objeto utilizado para dibujar líneas y curvas. No se puede heredar esta clase.

Pens Lápices de todos los colores estándar. No se puede heredar esta clase.

PointConverter Convierte objetos Point de un tipo de datos en otro. Se tiene acceso a esta clase mediante el objeto TypeDescriptor.

RectangleConverter Convierte rectángulos de un tipo en otro tipo. Se tiene acceso a esta clase mediante TypeDescriptor.

Region Describe el interior de una forma gráfica formada por rectángulos y rutas. No se puede heredar esta clase.

SizeConverter SizeConverter es una clase que se utiliza para convertir un tipo de datos en otro. Se tiene acceso a esta clase mediante el objeto TypeDescriptor.

SizeFConverter Convierte el tipo de los objetos SizeF en otro.

SolidBrush Define un pincel de un solo color. Los pinceles se utilizan para rellenar formas de gráficos, por ejemplo rectángulos, elipses, gráficos circulares y rutas. No se puede heredar esta clase.

StringFormat Encapsula información de diseño del texto (como alineación, orientación y tabulaciones), manipulaciones de presentación (como inserción de puntos suspensivos y sustitución de dígitos nacionales) y características de OpenType. No se puede heredar esta clase.

SystemBrushes Cada una de las propiedades de la clase SystemBrushes es una estructura SolidBrush que es

Page 65: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 65 Universidad de Salamanca

el color de un elemento de presentación de Windows.

SystemColors Cada una de las propiedades de la clase SystemColors es una estructura Color que es el color de un elemento de presentación de Windows.

SystemFonts Especifica las fuentes que se utilizan para mostrar texto en los elementos representados de Windows.

SystemIcons Cada una de las propiedades de la clase SystemIcons es un objeto Icon de los iconos de todo del sistema de Windows. No se puede heredar esta clase.

SystemPens Cada una de las propiedades de la clase SystemPens es un objeto Pen que es el color de un elemento de presentación de Windows y tiene un ancho de 1 píxel.

TextureBrush Cada una de las propiedades de la clase TextureBrush es un objeto Brush que utiliza una imagen para rellenar el interior de una forma. No se puede heredar esta clase.

ToolboxBitmapAttribute Le permite especificar un icono para representar un control en un contenedor, como el Diseñador de formularios de Microsoft Visual Studio.

Page 66: Tema 1: Introducción a la programación en Visual Basic .Net

Herramientas Informáticas para el Geoprocesado Geotecnologías Cartográficas en Ingeniería y Arquitectura

Escuela Politécnica Superior de Ávila 66 Universidad de Salamanca

TABLA DE CONTENIDOS

1 ENTORNO DE DESARROLLO .NET ........................................................................................... 1

1.1 INTRODUCCIÓN. ......................................................................................................................... 1 1.2 ENTORNO DE EJECUCIÓN CLR ................................................................................................... 1 1.3 EL LENGUAJE INTERMEDIO (IL, CIL O MSIL) ............................................................................ 1 1.4 LA ESPECIFICACIÓN COMÚN DE LOS LENGUAJES (CLS). ............................................................. 2 1.5 BIBLIOTECA DE CLASES BASE EN .NET (BCL) .......................................................................... 2 1.6 ARQUITECTURA DE DESARROLLO EN .NET ................................................................................. 2 1.7 ESQUEMA DE DESARROLLO Y EJECUCIÓN DE UNA APLICACIÓN .NET......................................... 3 1.8 LOS ESPACIOS DE NOMBRES (NAMESPACES) .............................................................................. 3

2 PROGRAMACIÓN ORIENTADA A OBJETOS .......................................................................... 4

2.1 INTRODUCCIÓN. ......................................................................................................................... 4 2.2 CONCEPTOS. ............................................................................................................................... 4 2.3 CARACTERÍSTICAS. .................................................................................................................... 4

3 COMENZANDO A PROGRAMAR EN VISUAL .NET............................................................... 5

3.1 INTRODUCCIÓN. ......................................................................................................................... 5 3.2 CREACIÓN DE LA PRIMERA APLICACIÓN. .................................................................................... 5 3.3 CONTROLES: ETIQUETAS(LABEL), CUADROS DE TEXTO (TEXTBOX). ...................................... 11 3.4 VARIABLES Y CONSTANTES. ..................................................................................................... 13 3.5 TIPOS DE DATOS EN VISUAL BASIC .......................................................................................... 16

4 ESTRUCTURAS CONDICIONALES. CONTROL LISTA, FORMS ...................................... 19

4.1 ESTRUCTURAS DE CONTROL. SENTENCIA CONDICIONAL IF ..................................................... 19 4.2 ESTRUCTURAS DE CONTROL. SELECCIÓN MÚLTIPLE SELECT CASE .......................................... 21 4.3 MAS CONTROLES: CONTROL LISTA (LISTBOX), USO DE VARIOS FORMS. ................................. 23

5 ESTRUCTURAS REPETITIVAS. MENÚS, DATAGRIDVIEW .............................................. 27

5.1 MENÚS Y BUCLES FOR-NEXT, DO-LOOP, WHILE-WEND ........................................................ 27

6 ARRAYS DE UNA Y VARIAS DIMENSIONES. ....................................................................... 36

6.1 ARRAYS UNIDIMENSIONALES(VECTORES) ............................................................................... 36 6.2 ARRAYS MULTIDIMENSIONALES (MATRICES). ......................................................................... 41

7 DEFINICIÓN DE CLASES PROPIAS. ........................................................................................ 42

7.1 CLASE PUNTO2D. .................................................................................................................... 42 7.2 CLASE PUNTO3D. HERENCIA ................................................................................................... 44

8 CREAR Y USAR BIBLIOTECA DE CLASES ........................................................................... 47

8.1 UTILIZAR LA BIBLIOTECA DE CLASES CREADA. ........................................................................ 49

9 LECTURA Y ESCRITURA DE FICHEROS DE TEXTO STREAMS. .................................... 52

10 CLASES DE E/S. ............................................................................................................................ 55

11 COLECCIONES. ............................................................................................................................ 57

11.1 INTERFACES Y CLASES DEL ESPACIO DE NOMBRES SYSTEM.COLLECTIONS .............................. 60

12 IMÁGENES Y GRÁFICOS(GDI+). ............................................................................................. 61

12.1 CLASES DEL ESPACIO DE NOMBRES SYSTEM.DRAWING ........................................................... 63