#1 Gastrointestinal Tract (Misoprostol), Cytotec Misoprostol 200 Mg

Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
1
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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:
VB
C++
C#
J#
…
Common Language Specification
ASP.NET: Servicios y
Formularios Web
Windows Forms
ADO.NET, XML, Enterprise Services
Biblioteca de Clases Base (BCL)
Lenguaje Común de Ejecución (CLR)
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
2
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
1.7 Esquema de Desarrollo y ejecución de una Aplicación .Net
DESARROLLO
VISUAL BASIC
EJECUCIÓN
(Plataforma .Net)
Editores y diseñadores
Verificación
Código fuente
Compilación (JIT)
Compilador
Código nativo
Código intermédio (CIL o
MSIL). Ensamblado
Ejecución
(CLR)
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
3
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
4
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
5
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
El aspecto de la ventana de trabajo en Visual Basic Express será algo así:
Cuadro de Herramientas
Formulario
Explorador de Soluciones
Propiedades del objeto seleccionado
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
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
6
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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á:
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles Button1.Click
End Sub
End Class
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:
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
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
7
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
Formulario
Diálogo creado con
MSGBOX
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á:
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
8
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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
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.
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
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
9
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
10
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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:
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
11
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
Ahora le intentamos programar las operaciones. Hacemos doble-clic sobre el botón “A
pesetas” y escribimos la siguiente línea de código.
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
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:
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
Guardamos el proyecto y probamos a generar el ejecutable y a localizarlo como en el
caso anterior. Cerramos el proyecto.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
12
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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:
d  ( x 2  x1 ) 2   y 2  y1 
2
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
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
13
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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:
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Declaración de
Dim x1, y1, x2, y2, distancia As Double
x1 = CDbl(txt_x1.Text)
Variables
y1 = CDbl(txt_y1.Text)
Raíz Cuadrada
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
Potencia
End Class
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
14
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
15
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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
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
4,94065645841246544E-324
valores negativos;
4,94065645841246544E-324
1,79769313486231570E+308
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
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)
Asignación de
almacenamiento
nominal
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
Intervalo de valores
†
†
a
para
los
para
a
los
a
)
†
16
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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
Intervalo de valores del argumento expression
Tipo de datos
devuelto
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,94065645841246544E324 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 (+/-1E28).
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
17
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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
datos)
de
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.
(Tipo
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
18
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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
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
Cuando se desean evaluar varias condiciones se puede hacer así:
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
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 O MENOR O
MAYOR
MENOR
IGUAL
DISTINTO
IGUAL
IGUAL
>
<
>=
<=
=
<>
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í:
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
19
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
Si hacemos doble-clic sobre evaluar y escribimos lo siguiente:
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
Si queremos que nos distinga entre Notable, Sobresaliente, etc… Podemos hacer algo
así:
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
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
Compara la longitud
Dim nota As Double
de la nota
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
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
20
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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:
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
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á:
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
21
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
Ahora asignamos el código al botón “Evaluar”. Haremos doble-clic sobre él y vamos a
escribir lo siguiente:
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
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
22
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Añadimos el nombre
Dim nombre As String
If txt_nombre.Text.Length > 0 Then
como elemento de la
nombre = txt_nombre.Text
lista.
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
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 Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
lst_listado.Items.Clear()
End Sub
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
23
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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:
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
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:
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
24
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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:
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
25
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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
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:
ayuda.ShowDialog()
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.Close()
“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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
26
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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
Salir
&Repeticiones
Bucle For…
Bucle Do-Loop…
-
Ay&uda
Acerca de…
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:
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
27
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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.
Private Sub SalirToolStripMenuItem_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles
SalirToolStripMenuItem.Click
Me.Close()
End Sub
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
28
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
Después pulsamos “Agregar”. Ahora vamos asociar al menú “Acerca de” el mismo
código que en el programa anterior.
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
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 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
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
29
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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:
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
Ejecutamos el programa, probamos el funcionamiento de lo realizado hasta ahora.
La sintaxis del bucle FOR-NEXT es:
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
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”.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
30
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
Al botón cerrar le asociamos:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
Me.Close()
End Sub
En el botón comenzar colocamos el siguiente fragmento de código.
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
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
31
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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:
DO { While | Until } condicion
[Sentencias]
[Exit DO]
[Sentencias]
LOOP
O
DO
[Sentencias]
[Exit DO]
[Sentencias]
LOOP { While | Until } condicion
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:
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
Probamos el funcionamiento del último formulario creado.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
32
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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).
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
33
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
34
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
Vamos a asignar funcionalidad a los botones. Al de Cerrar le asignamos:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
Me.Close()
End Sub
Y al de Generar:
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
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 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
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
35
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
36
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
Vamos a asociar al botón Salir la operación de cerrar el formulario:
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button3.Click
Me.Close()
End Sub
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á:
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
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
Valor
0
5.8
1
8.5
2
6.5
3
7.2
4
9.3
5
7.4
6
6.8
7
5
8
5.5
9
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 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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
37
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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
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:
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
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
38
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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:
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
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 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
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
39
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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)
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
40
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
41
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
42
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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
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:
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
43
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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:
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
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:
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
44
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
45
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
Y le asignamos al botón el código que se indica a continuación para que nos ilustre el
funcionamiento.
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
Ejecutamos el programa, guardamos y cerramos el proyecto.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
46
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
47
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
48
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
Hacemos algo parecido para la clase Punto3d. Borramos la función mostrar, y
comentamos los mensajes.
La clase nos queda:
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
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
49
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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:
txt_mensajes.Clear()
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
50
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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:
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)
Probamos su funcionamiento, guardamos y cerramos el proyecto.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
51
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
52
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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:
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
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í.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
53
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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:
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
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
54
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
55
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
56
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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á:
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
57
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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.
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
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
58
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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
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:
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
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
59
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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").
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
60
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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:
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
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
61
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
62
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
63
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
64
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
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.
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
65
Herramientas Informáticas para el Geoprocesado
Geotecnologías Cartográficas en Ingeniería y Arquitectura
TABLA DE CONTENIDOS
1
ENTORNO DE DESARROLLO .NET ........................................................................................... 1
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
2
PROGRAMACIÓN ORIENTADA A OBJETOS .......................................................................... 4
2.1
2.2
2.3
3
ARRAYS UNIDIMENSIONALES(VECTORES) ............................................................................... 36
ARRAYS MULTIDIMENSIONALES (MATRICES). ......................................................................... 41
DEFINICIÓN DE CLASES PROPIAS......................................................................................... 42
7.1
7.2
8
MENÚS Y BUCLES FOR-NEXT, DO-LOOP, WHILE-WEND ........................................................ 27
ARRAYS DE UNA Y VARIAS DIMENSIONES. ....................................................................... 36
6.1
6.2
7
ESTRUCTURAS DE CONTROL. SENTENCIA CONDICIONAL IF ..................................................... 19
ESTRUCTURAS DE CONTROL. SELECCIÓN MÚLTIPLE SELECT CASE .......................................... 21
MAS CONTROLES: CONTROL LISTA (LISTBOX), USO DE VARIOS FORMS. ................................. 23
ESTRUCTURAS REPETITIVAS. MENÚS, DATAGRIDVIEW .............................................. 27
5.1
6
INTRODUCCIÓN. ......................................................................................................................... 5
CREACIÓN DE LA PRIMERA APLICACIÓN. .................................................................................... 5
CONTROLES: ETIQUETAS(LABEL), CUADROS DE TEXTO (TEXTBOX). ...................................... 11
VARIABLES Y CONSTANTES. ..................................................................................................... 13
TIPOS DE DATOS EN VISUAL BASIC .......................................................................................... 16
ESTRUCTURAS CONDICIONALES. CONTROL LISTA, FORMS ...................................... 19
4.1
4.2
4.3
5
INTRODUCCIÓN. ......................................................................................................................... 4
CONCEPTOS. ............................................................................................................................... 4
CARACTERÍSTICAS. .................................................................................................................... 4
COMENZANDO A PROGRAMAR EN VISUAL .NET............................................................... 5
3.1
3.2
3.3
3.4
3.5
4
INTRODUCCIÓN. ......................................................................................................................... 1
ENTORNO DE EJECUCIÓN CLR ................................................................................................... 1
EL LENGUAJE INTERMEDIO (IL, CIL O MSIL) ............................................................................ 1
LA ESPECIFICACIÓN COMÚN DE LOS LENGUAJES (CLS). ............................................................. 2
BIBLIOTECA DE CLASES BASE EN .NET (BCL) .......................................................................... 2
ARQUITECTURA DE DESARROLLO EN .NET ................................................................................. 2
ESQUEMA DE DESARROLLO Y EJECUCIÓN DE UNA APLICACIÓN .NET......................................... 3
LOS ESPACIOS DE NOMBRES (NAMESPACES) .............................................................................. 3
CLASE PUNTO2D. .................................................................................................................... 42
CLASE PUNTO3D. HERENCIA ................................................................................................... 44
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
12
INTERFACES Y CLASES DEL ESPACIO DE NOMBRES SYSTEM.COLLECTIONS .............................. 60
IMÁGENES Y GRÁFICOS(GDI+). ............................................................................................. 61
12.1
CLASES DEL ESPACIO DE NOMBRES SYSTEM.DRAWING ........................................................... 63
Escuela Politécnica Superior de Ávila
Universidad de Salamanca
66