Issuu on Google+

INDICE

CONTENIDO

PAG

Generalidades de la materia Clase 1

Introducción al Entorno de Desarrollo Integrado (IDE) de Visual Basic. NET

Clase 2

Guía Práctica No. 1

11

Introducción a la Programación Orientada a Objetos (POO)

20

Guía Práctica No. 2 Clase 3

Formularios Windows Guís Práctica No. 3

Clase 4

Clase 5 Clase 6

29 43 57

Estructuras de Control (Parte 1): Estructuras Condicionales

61

Guía Práctica No. 4

68

Estructuras de Control (Parte 2): Estructuras Repetitivas o de Bucle

72

Guía Práctica No. 5

82

Funciones complementarias del lenguaje de programación

87

Práctica No. 6 Bibliografía

1

95 99


Clase Teórica No. 1 Introducción al Entorno de Desarrollo Integrado (IDE) de Visual Basic .NET

OBJETIVOS • • •

Conocer el uso de las Herramientas de Desarrollo Visuales. Identificar los elementos del Ambiente de Desarrollo Integrado. Aprender a diseñar la Interfaz de Aplicaciones sencillas.

DESARROLLO DE CLASE

INTRODUCCIÓN Con la aparición de .NET Framework, y de Visual Basic .NET, como una de las herramientas estrella para el desarrollo sobre esta nueva plataforma de trabajo, estamos asistiendo a una evolución/revolución sin precedentes en el mundo de la informática, que sitúa a este clásico de la programación en una posición difícil de igualar y menos aún de superar. Visual Basic .NET (VB.NET a partir de ahora), como cada nueva versión de las que han aparecido en el mercado de este producto, incorpora, como es natural, un buen conjunto de novedades. Sin embargo, la inclusión de Visual Basic en el entorno de .NET, añade también un compendio de drásticos cambios para los programadores de versiones anteriores, derivados en su conjunto, de la necesidad de afrontar con garantías de éxito el desarrollo de la nueva generación de aplicaciones para Internet, objetivo perseguido por todas las herramientas de desarrollo actuales.

¿QUÉ ES .NET? .NET es toda una nueva arquitectura tecnológica, desarrollada por Microsoft para la creación y distribución del software como un servicio. Esto quiere decir, que mediante las herramientas de desarrollo proporcionadas por esta nueva tecnología, los programadores podrán crear aplicaciones basadas en servicios para la web. Las características principales que conforman .NET son las siguientes: • La plataforma .NET Framework, que proporciona la infraestructura para crear aplicaciones y el entorno de ejecución para las mismas. • Los productos de Microsoft enfocados hacia .NET, entre los que se encuentran Windows .NET Server, como sistema operativo que incluirá de forma nativa la plataforma .NET Framework; Visual Studio .NET, como herramienta integrada para el desarrollo de aplicaciones; Office .NET; b.Central para .NET, etc. • Servicios para .NET desarrollados por terceros fabricantes, que podrán ser utilizados por otras aplicaciones que se ejecuten en Internet.

.NET FRAMEWORK .NET Framework constituye la plataforma y elemento principal sobre el que se asienta Microsoft .NET. De cara al programador, es la pieza fundamental de todo este nuevo modelo de trabajo, ya que proporciona las herramientas y servicios que necesitará en su labor habitual de desarrollo.

1


.NET Framework permite el desarrollo de aplicaciones a través del uso de un conjunto de herramientas y servicios que proporciona, y que pueden agruparse en tres bloques principales: el Entorno de Ejecución Común o Common Language Runtime (CLR a partir de ahora); la jerarquía de clases básicas de la plataforma o .NET Framework Base Classes; y el motor de generación de interfaz de usuario, que permite crear interfaces para la web o para el tradicional entorno Windows, así como servicios para ambos entornos operativos. La Figura 1 muestra un diagrama con la distribución de elementos dentro del entorno de .NET Framework.

Figura 1. Esquema de componentes dentro de la plataforma .NET Framework.

EL CLR, COMMON LANGUAGE RUNTIME El Entorno de Ejecución Común de Lenguajes o CLR (Common Language Runtime), representa el alma de .NET Framework y es el encargado de la ejecución del código de las aplicaciones. A continuación se enumeran algunas de las características de este componente de la plataforma: • Proporciona un desarrollo de aplicaciones más sencillo y rápido gracias a que gran parte de las funcionalidades que tradicionalmente debía de crear el programador, vienen implementadas en el entorno de ejecución. • Administra el código en tiempo de ejecución, en todo lo referente a su carga, disposición en memoria, recuperación de memoria no utilizada a través de un recolector de memoria, etc. • Implementa características de gestión a bajo nivel (administración de memoria, por ejemplo), que en ciertos lenguajes, eran labor del programador. • Proporciona un sistema común de tipos para todos los lenguajes del entorno. • Gestiona la seguridad del código que es ejecutado. • Dispone de un diseño abierto a lenguajes y herramientas de desarrollo creadas por terceros fabricantes. • Facilita enormemente la distribución e instalación de aplicaciones, ya que en teoría, es posible instalar una aplicación simplemente copiando los ficheros que la componen en uno de los directorios del equipo en el que se vaya a ejecutar, eliminando los temibles conflictos de versiones entre librerías, problema conocido también con el nombre de Infierno de las DLL o DLL Hell. La Figura 2 muestra un esquema de la organización interna del CLR.

2


Figura 2. Esquema de elementos dentro del CLR

EL CTS, COMMON TYPE SYSTEM El Sistema Común de Tipos o CTS (Common Type System), es el mecanismo del CLR que permite definir el modo en que los tipos serán creados y manipulados por el entorno de ejecución de .NET Framework. Entre las funcionalidades que comprende, podemos destacar la integración de código escrito en diferentes lenguajes; optimización del código en ejecución; un modelo de tipos orientado a objeto, que soporta múltiples lenguajes; y una serie de normas que aseguran la intercomunicación entre objetos.

¿QUÉ ES UN TIPO DENTRO DE .NET FRAMEWORK? Al mencionar el sistema de tipos de la plataforma .NET, podemos pensar de un modo inmediato, que se trata sólo del conjunto de tipos de datos con que podemos declarar variables en nuestro código; sin embargo, el CTS, va mucho más allá y se extiende a cualquier elemento que pueda ser ejecutado dentro del entorno. Por tal motivo, en el contexto de .NET Framework, un tipo se puede definir como una entidad de código ejecutada dentro del CLR; entendiendo por entidad de código, aquella a partir de la cual creamos una instancia y manejamos posteriormente en el programa como un objeto. De todo lo anterior podemos obtener dos conclusiones: • Todas las implementaciones de clases, interfaces, estructuras, etc., ya sean nativas de la plataforma o creadas por el programador, se pueden considerar tipos válidos de .NET. • Todos los tipos que manipulamos dentro de .NET Framework son objetos.

LOS TIPOS DE DATOS SON OBJETOS Dentro de .NET Framework, todos los tipos de datos están implementados como clases, de ahí el hecho de que cuando declaremos una variable en el código, esa variable sea además, un objeto de la clase relacionada con el tipo de dato que contiene, disponiendo de propiedades y métodos al igual que cualquier otro objeto.

METADATA (METADATOS) Durante el diseño de .NET Framework, se hizo evidente que una aplicación necesitaba, además de su propio código ejecutable, información adicional sobre la propia aplicación, que pudiera ser utilizada por el entorno de ejecución para funcionalidades diversas. Los metadatos son creados por el compilador del lenguaje utilizado en cada caso y grabados dentro del fichero resultante (EXE o DLL) en formato binario, siendo el CLR el encargado de recuperarlos en el momento que los necesite.

3


Algunos de los datos proporcionados por los metadatos de una aplicación son la descripción del ensamblado (trataremos los ensamblados posteriormente) junto a su versión, clave y tipos que lo componen (clases, interfaces, etc.).

SOPORTE MULTI-LENGUAJE Uno de los puntos clave del CLR es que está diseñado para soportar múltiples lenguajes, permitiendo así unos elevados niveles de integración entre los mismos. Con tal motivo, .NET Framework proporciona los siguientes lenguajes con sus correspondientes compiladores para la escritura de aplicaciones: • VB.NET. • C#. • C++ con Extensiones Administradas. • JScript.NET.

EL CLS (COMMON LANGUAGE SPECIFICATION) La integración entre lenguajes mencionada en el anterior apartado, puede llevar a preguntarnos cómo es posible conseguir que lenguajes de distinta naturaleza y sintaxis se entiendan. La respuesta la hallamos en la Especificación Común de Lenguajes o CLS (Common Language Specification), que consiste en un conjunto de características comunes, que deben cumplir todos los lenguajes de la plataforma, para poder integrarse entre sí. Esto tiene varias finalidades, que describimos a continuación: • Independencia del lenguaje. En muchas ocasiones el programador se ve obligado a escribir el código en un lenguaje que no es de su agrado; la causa de ello es que dicho lenguaje le provee de funcionalidades de las cuales carece su lenguaje preferido. Con .NET, esto no ocurre, puesto que es la propia plataforma la que proporciona la funcionalidad de modo independiente al lenguaje, por lo que podemos escribir nuestras aplicaciones utilizando el lenguaje con el que nos sintamos más cómodos, ya que el resultado será el mismo. • Integración entre lenguajes. Es posible escribir, por ejemplo, una librería de clases en un lenguaje, y utilizarla desde otro lenguaje distinto (siempre que ambos lenguajes cumplan con las normas del CLS). Este concepto no es nuevo, hasta ahora también podíamos escribir una librería en C++ y utilizarla desde VB, pero gracias al CLS, se extiende y se potencia este modo de trabajo, ya que al basarse los lenguajes en un conjunto de reglas comunes, el acceso en el caso antes mencionado, a una librería de clases, se facilita enormemente desde cualquier otro lenguaje creado en base al CLS. • Apertura a nuevos lenguajes. Finalmente, al ser esta, una especificación abierta, es posible incorporar a .NET Framework nuevos lenguajes, aparte de los actualmente disponibles, y no sólo creados por Microsoft, sino por cualquier otro fabricante. Mediante el CLS, un fabricante de software sabe qué requisitos debe observar un nuevo lenguaje que él desarrolle, para poder integrase en el entorno de .NET Framework.

NAMESPACES Otro de los pilares que forman los cimientos de .NET Framework es el concepto de espacio de nombres o namespaces. Un namespace o espacio de nombres, también denominado nombre calificado, es el medio proporcionado por la plataforma para organizar las clases dentro del entorno, agrupándolas de un modo más lógico y jerárquico.

4


LA JERARQUÍA DE CLASES DE .NET FRAMEWORK El entorno de ejecución integra toda la funcionalidad y servicios necesarios a través de la jerarquía de clases base de la plataforma. La mayor parte de las necesidades básicas del programador están cubiertas por este amplio conjunto de clases, que permiten dotar a las aplicaciones de todas las características necesarias. El desarrollador experimentado puede estar preguntándose la necesidad de implementar una nueva jerarquía de clases si las actuales ya cumplen con su cometido. Entre las posibles razones, queremos destacar las siguientes: • El nuevo sistema de clases está mucho mejor organizado, y provee al programador de una potencia y versatilidad para sus aplicaciones nunca antes lograda en versiones anteriores de Visual Studio. • Podemos crear una nueva clase, heredando de una clase propia de la plataforma, para extender su funcionalidad. • Desplazando la funcionalidad de las clases fuera de los lenguajes, y haciéndolas por lo tanto, independientes de los mismos, simplifica el proceso de desarrollo. • Al ser las clases de .NET Framework, comunes a todos los lenguajes, se eliminan las barreras tradicionales que impedían a los programadores abordar ciertos proyectos por el hecho de usar un lenguaje que no disponía de cierta funcionalidad que sí tenía otro lenguaje. Ahora cualquier programador, con independencia del lenguaje que elija, tiene pleno acceso a todas las funcionalidades que le brinda la plataforma .NET.

ENSAMBLADOS Un ensamblado o assembly, consiste en un conjunto de tipos y recursos, reunidos para formar la unidad más elemental de código que puede ejecutar el entorno de .NET Framework. De igual forma que los edificios se crean a base de la unión de un conjunto de materiales, dentro de la tecnología .NET, los ensamblados se presentan como los bloques de construcción software, que se unen o ensamblan para crear aplicaciones. Una aplicación desarrollada para .NET Framework debe estar compuesta por uno o varios ensamblados

RESUMEN DE TERMINOLOGÍA BÁSICA DE VISUAL BASIC.NET A continuación se presenta un resumen de muchos de los términos utilizados en la programación de Visual Basic.Net: TERMINO

DEFINICION

Tiempo de Diseño

Tiempo en el cual la aplicación está siendo diseñada en el Entorno de Desarrollo de Visual Basic.NET

Tiempo de Ejecución

Tiempo en el cual la aplicación está en ejecución. En el tiempo de ejecución el programador interactúa con la aplicación como cualquier usuario.

Programación Orientada a Objetos

La programación orientada a objeto, OOP (Object Oriented Programming), se trata de una evolución de la programación procedural basada en funciones, que permite agrupar elementos de código (rutinas y datos) con funcionalidades similares, bajo un sistema unificado de manipulación y acceso a dichos elementos.

5


TERMINO

DEFINICION

Objetos

Un objeto es una agrupación de código, compuesta de propiedades y métodos, que pueden ser manipulados como una entidad independiente.

Propiedades

Clase

Las propiedades definen los datos o información del objeto, permitiendo consultar o modificar su estado; Es decir son las características de un objeto tales como tamaño o color. Una clase no es otra cosa que el conjunto de especificaciones o normas que definen cómo va a ser creado un objeto de un tipo determinado; algo parecido a un manual de instrucciones conteniendo las indicaciones para crear el objeto.

Métodos

Acciones que un objeto puede realizar o acciones que pueden ser realizadas en un objeto.

Eventos

Acciones reconocidas por un formulario o control. Los eventos pueden ocurrir según el usuario, el sistema operativo o la aplicación interactúa con los objetos en un programa.

Instancia

Es el proceso por el cuál se obtiene un objeto a partir de las especificaciones de una clase.

Abstracción

La abstracción es aquella característica que nos permite identificar un objeto a través de sus aspectos conceptuales.

Encapsulación

La encapsulación establece la separación entre el interfaz del objeto y su implementación, aportándonos dos ventajas fundamentales.

Polimorfismo

El polimorfismo determina que el mismo nombre de método, realizará diferentes acciones según el objeto sobre el que sea aplicado. Al igual que sucedía en la encapsulación, el programador que haga uso del objeto, no necesita conocer los detalles de implementación de los métodos, se limita a utilizarlos.

Herencia

Formulario

Controles

Se trata de la característica más importante de la OOP, y establece que partiendo de una clase a la que denominamos clase base, padre o superclase, creamos una nueva clase denominada clase derivada, hija, o subclase. En esta clase derivada dispondremos de todo el código de la clase base, más el nuevo código propio de la clase hija, que escribamos para extender sus funcionalidades. Es un fragmento de espacio de la pantalla, habitualmente rectangular, que puede utilizarse para presentar información al usuario y para aceptar las entradas que realice. Representación gráfica de objetos como botones de comando, cajas de lista, cajas de texto etc., que el usuario manipula para proveer información a la aplicación.

6


TERMINO

DEFINICION

Soluciones

Una Solución es un contenedor que incluye uno o varios proyectos más los archivos y metadatos que ayudan a definir la solución como un todo.

Proyecto

Un Proyecto contiene un conjunto de archivos de código fuente más los metadatos relacionados, como referencias de componentes e instrucciones de generación.

EL ENTORNO DE DESARROLLO INTEGRADO DE VISUAL STUDIO.NET INICIAR EL IDE DE VS.NET El primer paso a dar es arrancar el entorno de desarrollo de VS.NET, para lo cual, seleccionaremos en la estructura de menús de Windows, la opción de menú situada en: Inicio + Todos los programas + Microsoft Visual Studio .NET 2003 + Microsoft Visual Studio .NET 2003, que ejecutará el IDE y nos mostrará el área principal de trabajo con la pestaña Página de Inicio.

Figura 4. Pantalla Inicial del IDE de Visual Studio .NET.

OBJETOS, PROPIEDADES Y MÉTODOS Desde la versión 4.0, el lenguaje Visual Basic ha ido adoptando progresivamente principios del paradigma de la Programación Orientada a Objeto (Object Oriented Programming u OOP a partir de ahora), aunque con ciertas restricciones.

7


VB.NET es la primera versión de este lenguaje que incorpora plenas, excelentes y muy potentes características de orientación a objetos, esto es debido a que el lenguaje forma parte de la plataforma .NET, la cual está diseñada en su totalidad siguiendo un modelo de orientación a objetos, basado en un conjunto de especificaciones que obligan a todos los lenguajes que operen bajo este entorno a seguir los dictados de dichas normas. Por este motivo, todos los elementos que usemos en una aplicación VB.NET serán considerados objetos, que deberemos manipular a través de sus propiedades y métodos.

FORMULARIOS Una vez creado un proyecto, se añade un formulario al mismo, apareciendo una nueva pestaña en el área principal del IDE, que corresponde al diseñador del formulario. Ver Figura 5. Dentro de una aplicación VB.NET, el término formulario designa a una ventana estándar de las que utilizamos habitualmente en Windows para comunicarnos con el usuario, mientras que el diseñador del formulario representa a la plantilla de una ventana, sobre la cuál añadiremos controles y modificaremos si es necesario su aspecto inicial.

Figura 5. Diseñador de formulario de VB.NET.

EL FORMULARIO COMO UN OBJETO Un formulario es, al igual que la gran mayoría de elementos en el entorno de .NET, un objeto, y como tal, la forma de manipularlo pasa por asignar y obtener valores de sus propiedades, y por la ejecución de sus métodos. Debido a que un formulario dispone de un elevado número de propiedades y métodos, durante el texto nos centraremos sólo sobre los que vayamos a trabajar, pudiendo el lector, consultar el resto a través de la ayuda de VS.NET; esto es aplicable a todos los objetos con los que tratemos.

CONTROLES Los controles constituyen aquellos elementos que insertamos dentro de un formulario, y que permiten al mismo tiempo interactuar con el usuario, tales como botones de pulsación, cajas de

8


texto, casillas de verificación, cajas con listas de valores, etc.; al igual que un formulario, son objetos con sus propiedades y métodos, y se manejan de la misma forma.

PRINCIPALES ELEMENTOS EN NUESTRO ENTORNO DE TRABAJO Una vez abierto un proyecto en el IDE, los elementos básicos para nuestra tarea habitual de desarrollo se muestran en la Figura 6.

Barra de Menú Barras de Herramientas Explorador de Soluciones

Ventanas Desplegables (pestañas)

Cuadro de Herramientas

Ventana de Propiedades

Formulario Windows

Ventana Principal de Trabajo Figura 6. Elementos principales del IDE.

DESCRIPCIÓN DE ELEMENTOS PRINCIPALES DEL ENTORNO DE DESARROLLO VENTANA PRINCIPAL DE TRABAJO De forma predominante y ocupando la mayor parte del IDE, encontramos la ventana o zona principal de trabajo. Esta ventana principal contiene todos los editores de código y diseñadores que vayamos abriendo, organizados en base a unas fichas o pestañas, que nos permiten trasladarnos de uno a otro cómodamente.

EL EXPLORADOR DE SOLUCIONES Al desarrollar una aplicación en VB.NET, los elementos que contiene: formularios, módulos, clases, recursos, referencias, etc., se organizan dentro de un proyecto. También es posible tener varios proyectos abiertos simultáneamente en la misma sesión de trabajo del IDE. Dichos proyectos se organizan dentro de lo que en VS.NET se denomina una solución.

9


Una solución puede contener proyectos desarrollados en los diferentes lenguajes de la plataforma .NET, y el medio más cómodo para manejarlos es a través de la ventana Explorador de soluciones. La Figura 7 muestra el aspecto típico de esta ventana con una solución que contiene un proyecto, en el que a su vez hay contenido un formulario.

Figura 7. Explorador de soluciones del IDE. La carpeta References contiene las referencias que están establecidas dentro del proyecto, hacia los diferentes espacios de nombre que pueden ser necesarios a la hora de escribir el código. Al expandir esta carpeta tendremos referenciados entre otros: System, System.Windows.Forms, etc.

LA VENTANA DE PROPIEDADES Cuando estamos diseñando un formulario, esta ventana muestra las propiedades del objeto que tengamos seleccionado en el diseñador: bien un control o el propio formulario. La Figura 8 muestra esta ventana indicando sus elementos principales.

Figura 8. Ventana de propiedades de VS.NET.

10


Guía Práctica No. 1 Introducción al Entorno de Desarrollo Integrado (IDE) de Visual Basic .NET OBJETIVOS Al finalizar la práctica, los estudiantes serán capaces de: • Identificar la utilidad del lenguaje de programación Visual Basic.Net. • Reconocer cada uno de los elementos del entorno integrado de desarrollo de Visual Basic.Net. • Desarrollar sus primeras aplicaciones en Visual Basic.Net. INTRODUCCION Inicia el Visual Studio .NET, por defecto te mostrará la "página de inicio" desde la cual puedes crear nuevos proyectos o bien abrir alguno de los más recientemente abiertos. Pulsa en Nuevo proyecto

Esta pantalla muestra los diferentes tipos de proyectos que se pueden crear, en el panel izquierdo selecciona Proyectos de Visual Basic (Visual Basic Projects) y de los que muestra en el panel de la derecha, selecciona Aplicación para Windows

11


En esta pantalla se tendrá que especificar el directorio en el que se guardará el proyecto, así como el nombre del mismo. Después de haber especificado el nombre y la ubicación del proyecto da clic en el botón aceptar, te aparecerá la siguiente pantalla:

12


Hay tres pasos principales para crear una aplicación en Visual Basic.Net: ! Crear la interfaz. ! Establecer propiedades. ! Escribir el código. Para ver cómo se realiza esto, siga los pasos del siguiente procedimiento para crear una aplicación sencilla que consiste en un cuadro de texto y un botón de comando. Cuando haga clic en el botón de comando aparecerá el mensaje " ¡ Bienvenido A Programación II ! " en el cuadro de texto. Crear la interfaz El primer paso para generar una aplicación de Visual Basic.Net consiste en crear los formularios que van a ser la base de la interfaz de su aplicación. Después dibuje los objetos que van a componer la interfaz en los formularios que ha creado. Para esta primera aplicación, usaremos dos controles del cuadro de herramientas.

Botón

Control Cuadro de texto Botón de comando

Para dibujar un control mediante el cuadro de herramientas 1. Haga clic en la herramienta del control que ha elegido dibujar; en este caso el cuadro de texto. 2. Mueva el puntero dentro del formulario. El puntero adoptará la forma de cruz. 3. Coloque la cruz donde quiera que aparezca la esquina superior izquierda del control. 4. Arrastre la cruz hasta que el control tenga el tamaño deseado. (Arrastrar significa mantener presionado el botón primario del mouse mientras mueve un objeto con el mouse.) 5. Suelte el botón del mouse. 6. En este momento el control aparecerá en el formulario.

Otra forma sencilla de agregar un control a un formulario Es hacer doble clic en el botón de ese control en el cuadro de herramientas. Esto crea un control con un tamaño predeterminado situado en el centro del formulario; ahora puede mover el control a otra ubicación del formulario.

13


Cambiar el tamaño y posición de controles Observe que en las esquinas del control aparece unos pequeños cuadros rectangulares llamados controladores de tamaño; en el siguiente paso usará estos controladores para cambiar el tamaño del control. También puede usar el mouse, el teclado y comandos de menú para mover controles, bloquear y desbloquear la posición de los controles, y ajustar sus posiciones. Para cambiar el tamaño de un control 1. Seleccione el control que quiera cambiar el tamaño; para ello, haga clic en él con el mouse. Aparecerán en el control los controladores de tamaño. 2. Sitúe el puntero del mouse en un controlador de tamaño y arrástrelo hasta que el control tenga el tamaño elegido. Los controladores de las esquinas cambiarán el tamaño de controles horizontal y verticalmente, mientras que los controladores de los lados cambiarán el tamaño sólo en una dirección. 3. Suelte el botón del mouse. –o bien– Use MAYÚS con las teclas de dirección para cambiar el tamaño del control seleccionado. Para mover un control •

Use el mouse para arrastrar el control a otra ubicación del formulario. –o bien– Use la ventana Propiedades para cambiar las propiedades Top y Left.

Cuando seleccione un control, puede usar CTRL con las teclas de dirección para mover el control una unidad de la cuadrícula cada vez. Si la cuadrícula está desactivada, el control se mueve un píxel cada vez. Ya tiene la interfaz de la aplicación " Bienvenido A Programación II continuación.

", como se muestra a

Establecer propiedades

14


El siguiente paso consiste en establecer las propiedades de los objetos que ha creado. Para abrir la ventana Propiedades, elija el comando Ventana Propiedades del menĂş Ver, haga clic en el botĂłn Ventana Propiedades de la barra de herramientas o utilice el menĂş contextual del control. Cuadro del objeto Fichas de orden

Lista de propiedades

15


La ventana Propiedades consta de los siguientes elementos: • • •

Cuadro del objeto: presenta el nombre del objeto para el que puede establecer propiedades. Haga clic en la flecha situada a la derecha del cuadro Objeto para presentar la lista de objetos del formulario actual. Fichas de orden: elija entre una lista alfabética de propiedades o una vista jerárquica dividida en categorías lógicas, como las que tratan de la apariencia, fuentes o posición. Lista de propiedades: la columna de la izquierda presenta todas las propiedades del objeto seleccionado. Puede modificar y ver los valores en la columna de la derecha.

Para establecer propiedades desde la ventana Propiedades 1. En el menú Ver, elija Propiedades o haga clic en el botón Propiedades de la barra de herramientas. La ventana Propiedades presenta los valores del formulario o control seleccionado. 2. En la lista Propiedades, seleccione el nombre de una propiedad. 3. En la columna de la derecha, escriba o seleccione el nuevo valor de la propiedad. Las propiedades enumeradas tienen una lista predefinida de valores. Puede presentar la lista si hace clic en la flecha hacia abajo que hay a la derecha del cuadro Valores o puede recorrer la lista haciendo doble clic en un elemento de la lista. En el ejemplo "Bienvenido a Programación II" necesitará cambiar los valores de tres propiedades. Use el valor predeterminado para las demás propiedades.

Objeto

Propiedad

Valor

Forms

Text

Bienvenido A Programación II

TextBox

Text

(Vacío)

Button

Text

Aceptar

Escribir código La ventana Editor de código es el lugar donde escribe el código de Visual Basic.Net para su aplicación. El código consta de instrucciones del lenguaje, constantes y declaraciones. Mediante la ventana Editor de código puede ver y modificar rápidamente el código de su aplicación. Para abrir la ventana Código Haga doble clic en el formulario o el control para el que desea escribir código. –o bien– En la ventana Explorador de proyectos, seleccione el nombre de un formulario y elija Ver código.

16


La figura siguiente muestra la ventana Editor de código que aparece cuando hace doble clic en el control botón de comando y los eventos de ese comando.

Cuadro de lista Objeto

Cuadro de lista Procedimiento

Si te fijas aparece en la ventana de código varias instrucciones, nos vamos a concentrar en la que esta encerada en un rectángulo, ya que la otra es generada automáticamente cuando se crea cualquier control. La ventana Código incluye los siguientes elementos: • •

Cuadro de lista Objeto: presenta el nombre del objeto seleccionado. Haga clic en la flecha de la derecha del cuadro de lista para presentar una lista de todos los objetos asociados con el formulario. Cuadro de lista Procedimiento: enumera los procedimientos o eventos de un objeto. El cuadro presenta el nombre del procedimiento seleccionado. Elija la flecha que hay a la derecha del cuadro para presentar todos los procedimientos del objeto.

Crear procedimientos de evento El código en una aplicación de Visual Basic.Net se divide en bloques menores llamados procedimientos. Un procedimiento de evento, como los que creará aquí, contiene código que se ejecuta cuando se produce un evento (como cuando un usuario hace clic en un botón). Un procedimiento de evento de un control combina [nombre del control] [guión bajo] [nombre del evento] Pero esto sólo es una sugerencia que Visual Basic nos hace, en las versiones anteriores no era una sugerencia, era una imposición. Podemos dejar el nombre que Visual Basic nos sugiere o podemos poner el nombre que nosotros queramos; lo importante aquí es la parte final de la línea de declaración del procedimiento: Handles Button1.Click, con esto es con lo que el compilador/intérprete de Visual Basic sabe que este procedimiento es un evento y que dicho evento es el evento Click del objeto Button1.

17


Un detalle: el nombre Button1 es porque hemos dejado el nombre que por defecto el IDE de Visual Studio asigna a los controles que se añaden a los formularios. Si quieres que se llame de otra forma, simplemente muestra el formulario, selecciona el control al que quieres cambiarle el nombre, busca la propiedad Name en la ventana de propiedades y cambia el nombre que allí se sugiere por el que tu quieras... o casi, ya que para los nombres de los controles, así como para otras cosas que usemos en Visual Basic hay que seguir ciertas normas: • •

El nombre debe empezar por una letra o un guión bajo. El nombre sólo puede contener letras, números y el guión bajo.

Para crear un procedimiento de evento 1. En el cuadro de lista Objeto, seleccione el nombre de un objeto del formulario activo. (El formulario activo es el formulario que actualmente tiene el enfoque.) Para este ejemplo, elija el botón de comando, Button1. En el cuadro de lista Procedimiento, seleccione el nombre de un evento del objeto seleccionado. 1. Aquí, el procedimiento Click ya está seleccionado puesto que es el procedimiento predeterminado para un botón de comando. Observe que ahora se presenta en la ventana Código una plantilla para el procedimiento de evento. 2.

Escriba el siguiente código entre las instrucciones Sub y End Sub: Textbox1.Text = "Bienvenido a Programación II" El procedimiento de evento debería parecerse a éste:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextBox1.Text = "Bienvenido a Programación II" End Sub

Observará que aquí el código simplemente cambia la propiedad Text del control llamado Textbox1 para que sea "Bienvenido a Programación II“ La sintaxis de este ejemplo tiene el formato objeto.propiedad, donde Textbox1 es el objeto y Text la propiedad. Puede usar esta sintaxis para cambiar los valores de las propiedades de cualquier formulario o control como respuesta a los eventos que se producen mientras se ejecuta su aplicación. Ejecutar la aplicación Para ejecutar la aplicación, elija Iniciar en el menú Depurar, haga clic en el botón Iniciar de la barra de herramientas o presione F5. Haga clic en el botón de comando que ha creado en el formulario y verá cómo aparece "Bienvenido a Programación II“ en el cuadro de texto. EJERCICIO PROPUESTO

18


Diseñe una aplicación en Visual Basic.Net que tenga la Interfaz que se muestra:

Modifique las siguientes propiedades: Objeto Form1

Propiedad

Valor

Text

Copiar texto

Textbox1 Text

(Vacío)

Textbox2 Text

(Vacío)

Button1

Text

Copiar a Text2

Button2

Text

Limpiar

Button3

Text

Copiar a Text1

Además, la aplicación deberá responder a lo siguiente: Al hacer Click sobre button1, el contenido de Textbox1 se copie a Textbox2. Al hacer Click sobre Button3, el contenido de Textbox2 se copie a Textbox1. Al hacer Click sobre button2, se limpie el contenido de Textbox1 y Textbox2. INVESTIGACIÓN COMPLEMENTARIA: Describa qué hace cada una de las opciones de los menús desplegables de las siguientes opciones de la Barra de Menú de Visual Basic.Net: Archivo, Ver, Proyecto y Depurar.

19


Clase Teórica No. 2 Introducción a la Programación Orientada a Objetos (POO) OBJETIVOS • Conocer los conceptos básicos relacionados con la Programación Orientada a Objetos (POO).

DESARROLLO DE CLASE

LAS VENTAJAS DE LA PROGRAMACIÓN ORIENTADA A OBJETO La programación orientada a objeto, POO (Object Oriented Programming) a partir de ahora, se trata de una evolución de la programación procedural basada en funciones, que permite agrupar elementos de código (rutinas y datos) con funcionalidades similares, bajo un sistema unificado de manipulación y acceso a dichos elementos.

DEL ENFOQUE PROCEDURAL AL ENFOQUE ORIENTADO A OBJETO En la programación estructurada procedural, basada en procedimientos y funciones, el crecimiento de una aplicación hace que el mantenimiento de la misma se convierta en una tarea difícil, debido al gran número de procedimientos interrelacionados que podemos llegar a tener. El mero hecho de efectuar una pequeña modificación en un proceso, nos puede suponer el tener que recorrer un gran número de funciones del programa, no relacionadas por un nexo común.

LOS FUNDAMENTOS DE LA PROGRAMACIÓN ORIENTADA A OBJETO La organización de una aplicación en POO se realiza mediante estructuras de código. Una estructura de código contiene un conjunto de procedimientos e información que ejecutan una serie de procesos destinados a resolver un grupo de tareas con un denominador común. Una aplicación orientada a objetos tendrá tantas estructuras de código como aspectos del programa sea necesario resolver. Un procedimiento que esté situado dentro de una de estructura de este tipo, no podrá llamar ni ser llamado por otro procedimiento situado en una estructura distinta, si no es bajo una serie de reglas. Lo mismo sucederá con los datos que contenga la estructura, permanecerán aislados del exterior, y sólo serán accesibles siguiendo ciertas normas. Una estructura de código, es lo que en POO identificamos como objeto. Al ser las estructuras de código u objetos, entidades que contienen una información precisa y un comportamiento bien definido a través del conjunto de procedimientos que incluyen, pueden ser clasificados en función de las tareas que desempeñan. Precisamente, uno de los fines perseguidos por la POO es conseguir una mejor catalogación del código, en base a estructuras jerárquicas dependientes, al estilo de un árbol genealógico. Trasladando las nociones que acabamos de exponer al ejemplo anterior, en el cual se programaban los procesos de gestión de los empleados de una empresa, el resultado obtenido será una estructura de código conteniendo todos los procedimientos, funciones y variables de la aplicación, implicados en las operaciones a realizar con un empleado, o lo que es lo mismo, un objeto Empleado. Entre los elementos de este objeto encontraremos el nombre, apellidos, alta del empleado, pago de nómina, etc. Todos los elementos que forman parte de un objeto componen la clase del objeto. Una clase consiste en el conjunto de especificaciones que permiten crear los objetos; en el caso expuesto por el ejemplo anterior sería la clase Empleado.

20


Como acabamos de comprobar, las motivaciones que han llevado al desarrollo de la POO son facilitar una mejor organización y clasificación del código, que la proporcionada por la programación procedural tradicional; aproximando al mismo tiempo, el modo de programar a la manera en que nuestra mente trabaja para aplicar soluciones a los problemas planteados.

OBJETOS Un objeto es una agrupación de código, compuesta de propiedades y métodos, que pueden ser manipulados como una entidad independiente. Las propiedades definen los datos o información del objeto, permitiendo consultar o modificar su estado; mientras que los métodos son las rutinas que definen su comportamiento. Un objeto es una pieza que se ocupa de desempeñar un trabajo concreto dentro de una estructura organizativa de nivel superior, formada por múltiples objetos, cada uno de los cuales ejerce la tarea particular para la que ha sido diseñado.

CLASES Una clase no es otra cosa que el conjunto de especificaciones o normas que definen cómo va a ser creado un objeto de un tipo determinado; algo parecido a un manual de instrucciones conteniendo las indicaciones para crear el objeto. Los términos objeto y clase son utilizados en POO con gran profusión y en contextos muy similares, por lo que para intentar aclarar en lo posible ambos conceptos, diremos que una clase constituye la representación abstracta de algo, mientras que un objeto constituye la representación concreta de lo que una clase define. La clase determina el conjunto de puntos clave que ha de cumplir un objeto para ser considerado perteneciente a dicha clase o categoría, ya que no es obligatorio que dos objetos creados a partir de la misma clase sean exactamente iguales, basta con que cumplan las especificaciones clave de la clase. Expongamos ahora las anteriores definiciones mediante un ejemplo preciso: un molde para crear figuras de cerámica y las figuras obtenidas a partir del molde. En este caso, el molde representaría la clase Figura, y cada una de las figuras creadas a partir del molde, sería un objeto Figura. Cada objeto Figura tendrá una serie de propiedades comunes: tamaño y peso iguales; y otras propiedades particulares: un color distinto para cada figura. Aunque objetos distintos de una misma clase pueden tener ciertas propiedades diferentes, deben tener el mismo comportamiento o métodos. Para explicar mejor esta circunstancia, tomemos el ejemplo de la clase Coche; podemos crear dos coches con diferentes características (color, tamaño, potencia, etc.), pero cuando aplicamos sobre ellos los métodos Arrancar, Acelerar o Frenar, ambos se comportan o responden de la misma manera.

INSTANCIAS DE UNA CLASE El proceso por el cuál se obtiene un objeto a partir de las especificaciones de una clase se conoce como instanciación de objetos. En la Figura 1 volvemos al ejemplo del molde y las figuras; en dicha imagen vemos un molde para fabricar figuras rectangulares, donde la clase Figura estaría representada por el molde, y cada uno de los objetos Figura (iguales en forma pero con la propiedad Color distinta), representaría una instancia de la clase.

21


Figura 1. Instanciación de objetos a partir de una clase.

CARACTERÍSTICAS BÁSICAS DE UN SISTEMA ORIENTADO A OBJETO Para que un lenguaje o sistema sea considerado orientado a objeto, debe cumplir las características de los siguientes apartados.

ABSTRACCIÓN La abstracción es aquella característica que nos permite identificar un objeto a través de sus aspectos conceptuales. Las propiedades de los objetos de una misma clase, pueden hacerlos tan distintos que sea difícil reconocer que pertenecen a una clase idéntica. No obstante, nosotros reconocemos a qué clase pertenecen, identificando además, si se trata de la misma clase para ambos. Ello es posible gracias a la abstracción. Tomemos como ejemplo dos objetos coche, uno deportivo y otro familiar; su aspecto exterior es muy diferente, sin embargo, cuando pensamos en cualquiera de ellos, sabemos que ambos pertenecen a la clase Coche, porque realizamos una abstracción o identificación mental de los elementos comunes que ambos tienen (ruedas, volante, motor, puertas, etc.). Del mismo modo que hacemos al identificar objetos reales, la abstracción nos ayuda a la hora de desarrollar una aplicación, permitiéndonos identificar los objetos que van a formar parte de nuestro programa, sin necesidad de disponer aún de su implementación; nos basta con reconocer los aspectos conceptuales que cada objeto debe resolver. Por ejemplo, cuando abordamos el desarrollo de un programa de gestión orientado a objetos, realizamos una abstracción de los objetos que necesitaríamos para resolver los procesos del programa: un objeto Empleado, para gestionar al personal de la empresa; un objeto Factura, para gestionar las ventas realizadas de productos; un objeto Usuario, para verificar las personas que utilizan la aplicación, etc.

ENCAPSULACIÓN La encapsulación establece la separación entre el interfaz del objeto y su implementación, aportándonos dos ventajas fundamentales. Por una parte proporciona seguridad al código de la clase, evitando accesos y modificaciones no deseadas; una clase bien encapsulada no debe permitir la modificación directa de una variable, ni ejecutar métodos que sean de uso interno para la clase. Por otro lado la encapsulación simplifica la utilización de los objetos, ya que un programador que use un objeto, si este está bien diseñado y su código correctamente escrito, no necesitará conocer los detalles de su implementación, se limitará a utilizarlo. Tomando un ejemplo real, cuando nosotros utilizamos un objeto Coche, al presionar el acelerador, no necesitamos conocer la mecánica interna que hace moverse al coche, sabemos que

22


el método Acelerar del coche es lo que tenemos que utilizar para desplazarnos, y simplemente lo usamos. Pasando a un ejemplo en programación, si estamos creando un programa de gestión y nos proporcionan un objeto Cliente que tiene el método Alta, y sirve para añadir nuevos clientes a la base de datos, no precisamos conocer el código que contiene dicho método, simplemente lo ejecutamos y damos de alta a los clientes en nuestra aplicación.

POLIMORFISMO El polimorfismo determina que el mismo nombre de método, realizará diferentes acciones según el objeto sobre el que sea aplicado. Al igual que sucedía en la encapsulación, el programador que haga uso del objeto, no necesita conocer los detalles de implementación de los métodos, se limita a utilizarlos. Pasando a un ejemplo real, tomamos dos objetos: Pelota y VasoCristal; si ejecutamos sobre ambos el método Tirar, el resultado en ambos casos será muy diferente; mientras que el objeto Pelota rebotará al llegar al suelo, el objeto VasoCristal se romperá. En un ejemplo aplicado a la programación, supongamos que disponemos de los objetos Ventana y Fichero; si ejecutamos sobre ambos el método Abrir, el resultado en Ventana será la visualización de una ventana en el monitor del usuario; mientras que en el objeto Fichero, se tomará un fichero en el equipo del usuario y se dejará listo para realizar sobre él operaciones de lectura o escritura.

HERENCIA Se trata de la característica más importante de la POO, y establece que partiendo de una clase a la que denominamos clase base, padre o superclase, creamos una nueva clase denominada clase derivada, hija, o subclase. En esta clase derivada dispondremos de todo el código de la clase base, más el nuevo código propio de la clase hija, que escribamos para extender sus funcionalidades. A su vez podemos tomar una clase derivada, creando una nueva subclase a partir de ella, y así sucesivamente, componiendo lo que se denomina una jerarquía de clases, que explicaremos seguidamente. Existen dos tipos de herencia: simple y múltiple. La herencia simple es aquella en la que creamos una clase derivada a partir de una sola clase base, mientras que la herencia múltiple nos permite crear una clase derivada a partir de varias clases base. El entorno de .NET Framework sólo permite utilizar herencia simple. Como ejemplo real de herencia, podemos usar la clase Coche como clase base; en ella reconocemos una serie de propiedades como Motor, Ruedas, Volante, etc., y unos métodos como Arrancar, Acelerar, Frenar, etc. Como clase derivada creamos CocheDeportivo, en la cuál, además de todas las características mencionadas para la clase Coche, encontramos propiedades y comportamiento específicos como ABS, Turbo, etc. Un ejemplo basado en programación consistiría en disponer de la ya conocida clase Empleado. Esta clase se ocupa, como ya sabemos, de las operaciones de alta de empleados, pago de nóminas, etc.; pero en un momento dado, surge la necesidad de realizar pagos a empleados que no trabajan en la central de la empresa, ya que se trata de comerciales que pasan la mayor parte del tiempo desplazándose. Para realizar dichos pagos usaremos Internet, necesitando el número de tarjeta de crédito y la dirección email del empleado. Resolveremos esta situación creando la clase derivada CiberEmpleado, que hereda de la clase Empleado, en la que sólo tendríamos que añadir las nuevas propiedades y métodos para las transacciones electrónicas, puesto que las operaciones tradicionales ya las tendríamos disponibles por el mero hecho de haber heredado de Empleado.

JERARQUÍAS DE CLASES Como decíamos anteriormente, uno de los fines de la POO consiste en la clasificación del código; para ello se emplean jerarquías o árboles de clases, en los que a base de niveles, se

23


muestra un conjunto de clases conectadas por una relación de herencia. Observemos el esquema de la Figura 2, en el que se muestra un ejemplo de la jerarquía de clases de medios de transporte.

Figura 2. Jerarquía de clases de medios de transporte. En esta representación de ejemplo, como nivel superior de la jerarquía o clase base estaría Medios de transporte, de la que se derivarían las clases Barco, Tren, Automóvil, y a su vez, de estas últimas, partirían nuevas clases hijas.

RELACIONES ENTRE OBJETOS Los objetos existentes en una aplicación se comunican entre sí mediante una serie de relaciones que describimos a continuación.

HERENCIA Como acabamos de describir sobre características de la POO, cuando a partir de una clase existente, creamos una nueva clase derivada, esta nueva clase dispone de todas las propiedades y métodos de la clase base, más el código propio que implemente. Para reconocer si existe esta relación entre dos objetos, debemos realizar un análisis sintáctico sobre la misma usando la partícula “es un”. Tomando como ejemplo los objetos Empleado, CiberEmpleado y Factura, podemos decir que sí hay una relación de herencia entre Empleado y CiberEmpleado, ya que al analizar la frase “Un objeto CiberEmpleado es un Empleado”, el resultado es verdadero. No ocurre lo mismo entre los objetos CiberEmpleado y Factura, ya que el análisis de la frase “Un objeto CiberEmpleado es una Factura”, devuelve falso.

PERTENENCIA Los objetos pueden estar formados a su vez por otros objetos. Un objeto Factura puede estar compuesto por objetos CabeceraFactura, LineaFactura, etc. Se dice en este caso que hay una relación de pertenencia, puesto que existe un conjunto de objetos que pertenecen a otro objeto o se unen para formar otro objeto. A este tipo de relación se le denomina también Contenedora. Para reconocer si existe esta relación entre dos objetos, debemos realizar un análisis sintáctico sobre la misma usando la partícula “tiene un”. Así, por ejemplo, la frase “Un objeto Factura tiene un objeto LineaFactura” devolvería verdadero.

UTILIZACIÓN

24


Hay situaciones en que un objeto utiliza a otro para realizar una determinada tarea, sin que ello suponga la existencia de una relación de pertenencia entre dichos objetos. Por ejemplo, un objeto Ventana puede utilizar un objeto Empleado para mostrar al usuario las propiedades del empleado, sin necesidad de que el objeto Empleado sea propiedad del objeto Ventana. Nótese la importante diferencia entre esta relación y la anterior, ya que aquí, el objeto Ventana a través de código, creará, o le será pasado como parámetro, un objeto Empleado, para poder mostrarlo en el área de la ventana. Para reconocer si existe esta relación entre dos objetos, debemos realizar un análisis sintáctico sobre la misma empleando la partícula “usa un”. Así, por ejemplo, la frase “Un objeto Ventana usa un objeto Empleado” devolvería verdadero.

REUTILIZACIÓN Un objeto bien diseñado, puede ser reutilizado en otra aplicación de modo directo o creando una clase derivada a partir de él. Este es uno de los objetivos perseguidos por la POO, aprovechar en lo posible el código ya escrito, ahorrando un considerable tiempo en el desarrollo de programas.

APLICACIONES DE CONSOLA Una aplicación de consola es aquella que se ejecuta dentro de una ventana de línea de comandos. Este tipo de ventana recibe diferentes denominaciones: Símbolo del sistema, Sesión MS-DOS, Ventana de línea de comandos, etc., por lo que a lo largo de esta guía nos referiremos a ella de forma genérica como consola. Las aplicaciones de consola son muy útiles cuando necesitamos realizar pruebas que no impliquen el uso del modo gráfico del sistema operativo: formularios, controles, imágenes, etc., ya que consumen menos recursos y su ejecución es más veloz.

CREACIÓN DE UN PROYECTO DE TIPO APLICACIÓN DE CONSOLA Para crear una aplicación de consola básica, después de iniciar el IDE de VS.NET, y seleccionar el menú para crear un nuevo proyecto, elegiremos Aplicación de consola en el panel derecho de la ventana Nuevo proyecto. El resto de opciones de esta ventana se configuran igual que para una aplicación con formularios Windows. Ver Figura 3.

Figura 3. Creación de un proyecto de tipo consola.

25


Después de pulsar Aceptar se creará el proyecto que contendrá un fichero de código con el nombre Module1.vb, en cuyo interior encontraremos un módulo de código conteniendo un procedimiento Main( ) vacío, por el que comenzará la ejecución del programa. Ver Código fuente 1. Module Module1 Sub Main() End Sub End Module Código fuente 1

LA CLASE CONSOLE Esta clase se encuentra dentro del espacio de nombres System, y nos proporciona a través de sus métodos, acceso a la consola para mostrar u obtener información del usuario. Debido a que los miembros de esta clase se encuentran compartidos (shared), no es necesario crear una instancia previa de la misma en una variable, pudiendo ejecutar directamente sus métodos sobre el objeto Console. Todo ello se explicará en los siguientes apartados.

ESCRITURA DE INFORMACIÓN Para mostrar texto utilizaremos el método WriteLine( ) del objeto Console. Este método escribe en la línea actual de la consola el valor que le pasemos como parámetro, añadiendo automáticamente las marcas de retorno de carro y nueva línea, por lo que la siguiente escritura se realizará en una nueva línea. Ver Código fuente 2. Sub Main() Console.WriteLine("Hola mundo desde la consola") Console.WriteLine("Esta es otra línea nueva") End Sub Código fuente 2

EL LENGUAJE EL LENGUAJE, PRINCIPIO DEL DESARROLLO Desde la llegada de los interfaces visuales basados en ventanas, los productos para el desarrollo de aplicaciones, han ido incorporando paulatinamente un mayor número de ayudas y asistentes que hacían a veces olvidar el verdadero soporte de aquello que utilizábamos para programar: el lenguaje. Con la frase olvidar el lenguaje, nos referimos a que en el caso concreto de VB6, cualquier persona con un nivel de usuario medio/avanzado, y sin una base sólida de programación, conociendo un pequeño conjunto de instrucciones del lenguaje, podía escribir programas, dada la gran cantidad de utilidades y apoyo proporcionados por el entorno de programación. Esto es claramente contraproducente, puesto que no se aprovecha todo el potencial que ofrece la herramienta al desconocer su elemento más importante, el lenguaje, del cual parten el resto de aspectos del producto. En el caso de VB.NET este aspecto se acentúa, debido al gran trabajo realizado en dotar al lenguaje de un elevado número de características que estaban siendo reclamadas desde hace ya tiempo por la comunidad de programadores. Estas mejoras no han sido realizadas exclusivamente para VB.NET, ya que este lenguaje se ha beneficiado indirectamente de ellas, puesto que al compartir ahora todos los lenguajes de .NET Framework una especificación común, Visual Basic como lenguaje, ha necesitado ser adaptado para cumplir con dicha normativa, beneficiándose así de la potencia incluida en todas las características de la plataforma .NET.

26


ESTRUCTURA DE UN PROGRAMA VB.NET En el tema Escritura de código ya hicimos una descripción de los principales elementos de que consta un programa para VB.NET de tipo Windows. En este caso vamos a crear desde el IDE un nuevo proyecto, en esta ocasión de tipo consola. Los componentes de un programa de estas características serán los mismos, salvando claro está, las diferencias de interfaz de usuario entre ambas clases tipos de aplicación. La Figura 3 muestra de una manera gráfica la estructura de una aplicación, en forma de niveles.

Figura 4. Estructura en niveles de una aplicación VB.NET.

MAIN( ) COMO PROCEDIMIENTO DE ENTRADA AL PROGRAMA Todo programa necesita una rutina o procedimiento de entrada, que sea el primero que se ejecute. En VB.NET ese procedimiento recibe el nombre especial Main( ), y debe estar contenido dentro de un módulo de código, como muestra el Código fuente 3. Module Module1 Sub Main() End Sub End Module Código Fuente 3 En el caso de una aplicación de consola creada desde VS.NET, se crea un módulo de forma automática que contiene un procedimiento Main( ) vacío.

VARIABLES Una variable es un identificador del programa que guarda un valor que puede ser modificando durante el transcurso de dicha aplicación.

DECLARACIÓN La declaración de una variable es el proceso por el cual comunicamos al compilador que vamos a crear una nueva variable en el programa. Para declarar una variable utilizaremos la palabra clave Dim, seguida del identificador o nombre que daremos a dicha variable. Ver Código fuente 4. Sub Main() Dim MiValor End Sub Código Fuente 4

27


DENOMINACIÓN Respecto al nombre de la variable, debe empezar por letra, y no puede ser ninguna de las palabras reservadas del lenguaje, ni contener caracteres como operadores u otros símbolos especiales. Ver Código fuente 5. Sub Main() Dim MiValor Dim Total2 Dim Mis_Datos Dim 7Datos Dim Nombre+Grande Dim End End Sub Código fuente 5

' nombre correcto ' nombre correcto ' nombre correcto ' nombre incorrecto ' nombre incorrecto ' nombre incorrecto

Como podemos comprobar en este fuente, incluimos comentarios en el código usando la comilla simple ( ' ) seguida del comentario correspondiente. EJEMPLO

28


Guía Práctica No. 2 Introducción a la Programación Orientada a Objetos (POO) OBJETIVOS Al finalizar la práctica, los estudiantes serán capaces de: • Crear Aplicaciones de Consola para la solución de problemas sencillos. INTRODUCCION PARADIGMAS Paradigmas por Procedimiento Son aquellas llamadas también paradigmas interactivos, representan al enfoque tradicional de la programación en donde los programas se conciben como módulos que realizan una determinada tarea o acción, para posteriormente obtener una salida o resultado. Paradigmas Declarativos Este paradigma hace hincapié a la pregunta ¿Cuál es el problema?, sin interesarle al programador, que procedimiento necesita para resolver el problema, pues así tenemos el GPS, sistemas simulados de propósitos generales, que permite modelar el problema, por ejemplo los problemas particulares como el problema de las colas de un banco, simular el programa de mantenimiento de una fábrica, el problema de producir N piezas en un determinado proceso productivo. Paradigma Funcional Plantea el proceso de creación de software, como un sistema de cajas negras, cada uno de las cuales acepta una entrada por arriba y produce salidas por abajo, desde el punto de vista matemático, dichas cajas son funciones por lo que ha de ser un paradigma funcional. Paradigma Orientado a Objetos Es un paradigma que ha adquirido popularidad en los últimos años que es el resultado de la evolución de la programación estructurada, en la cual se subdivide en módulos y que cada uno de ellos realiza una determinada tarea, ese mismo concepto se aplica a los objetos para que cumplan una determinada acción o tarea, pues así tenemos los lenguajes de programación C, C++, Java. Conduce a paradigma orientado a objetos, donde sin duda es una evolución de la programación estructurada y además los conceptos fundamentales son: clase, herencia, polimorfismo, reutilización. Los lenguajes de programación orientada a objetos son SmallTalk, Simula, C++ y Java. PROGRAMACIÓN Programación Clásica Surge por los años 50 y 60, es de tipo monolítica donde si el programa era grande, era difícil de corregir, y su mantenimiento era muy costoso. Programación Modular Surge a principios de los 70, es uno de los métodos de diseño más flexible y potentes para mejorar la productividad de un programa. Todo programa contiene un módulo denominado

29


programa principal, que controla todo lo que sucede, es decir transfiere el control a su módulo, de modo que ellos pueden ejecutar funciones, las tareas de los módulos se sigue dividiendo hasta que cada uno tenga exclusivamente una función específica, a este tipo de programación se le conoce como el método Divide y Vencerás. (Top Down).

PROGRAMACIÓN ORIENTADA A OBJETOS La programación orientada a objetos es un importante conjunto de técnicas que pueden utilizarse para hacer el desarrollo de programas eficientes en la programación orientada a objetos, los objetos son los elementos principales de construcción sin embargo el uso de objetos en un programa no significa que estén programando en un modo orientado a objetos, lo que cuenta es el sistema, en el cual los objetos se interconectan y se comunican entre sí. ¿Qué es la Programación Orientada a Objetos? La programación orientada a objetos es una técnica estructurada siendo los objetos los principales elementos de construcción. La programación orientada a objetos es el producto de la evolución de paradigma estructurada a fin de conseguir que el software sea un producto industrial, la programación orientada a objetos es una programación que envía mensajes a los objetos según Grade Booch, autor del método orientado a objetos, define a esta programación como: .Un método de implementación en el que los programas se organizan como colecciones cooperativas de objetos., cada uno de las cuales representa una instancia de alguna clase y cuyas clases son todos los miembros de una jerarquía de clases unidos mediante relación de herencia. Sea de tipo de dato abstracto (IDA). Todo .NET Framework está basado en clases (u objetos). A diferencia de las versiones anteriores de Visual Basic, la versión .NET de este lenguaje basa su funcionamiento casi exclusivamente en las clases contenidas en .NET Framework, además casi sin ningún tipo de limitaciones. Los tres pilares de la Programación Orientada a Objetos Según se dice por ahí, cualquier lenguaje basado en objetos debe cumplir estos tres requisitos: • Herencia • Encapsulación • Polimorfismo

30


Herencia La herencia es la capacidad de poder derivar una clase a partir de otra, la clase inicial se usa como clase base y la clase derivada es un nuevo tipo completamente de datos que incorpora todos los datos miembros y funciones miembros de la clase original, con cualquier dato nuevo o función miembro nueva y unidos en clase derivada. La clase base se conoce como clase padre o superclase y la clase derivada como clase hija o subclase. Para que lo entiendas mejor, veamos un ejemplo clásico: Supongamos que tenemos una clase Gato que está derivada de la clase Animal. El Gato hereda de Animal todas las características comunes a los animales, además de añadirle algunas características particulares a su condición felina. Podemos decir que un Gato es un Animal, lo mismo que un Perro es un Animal, ambos están derivados (han heredado) de la clase Animal, pero cada uno de ellos es diferente, aunque en el fondo los dos son animales. Esto es herencia: usar una clase base (Animal) y poder ampliarla sin perder nada de lo heredado, pudiendo ampliar la clase de la que se ha derivado (o heredado). Encapsulación La encapsulación es la capacidad de contener y controlar el acceso a un grupo de elementos asociados. Las clases proporcionan una de las formas más comunes de encapsular elementos. La encapsulación es la capacidad de separar la implementación de la interfaz de una clase del código que hace posible esa implementación. Esto realmente sería una especie de abstracción, ya que no nos importa cómo esté codificado el funcionamiento de una clase, lo único que nos debe interesar es cómo funciona... Para que nos vayamos entendiendo, cuando digo: la implementación de la interfaz de una clase, me refiero a los miembros de esa clase: métodos, propiedades, eventos, etc. Es decir, lo que la clase es capaz de hacer. Cuando usamos las clases, éstas tienen una serie de características (los datos que manipula) así como una serie de comportamientos (las acciones a realizar con esos datos). Pues la encapsulación es esa capacidad de la clase de ocultarnos sus interioridades para que sólo veamos lo que tenemos que ver, sin tener que preocuparnos de cómo está codificada para que haga lo que hace... simplemente nos debe importar que lo haga. Polimorfismo

El polimorfismo permite que diferentes objetos respondan de modo diferente al mismo mensaje, por lo cual se dice que adquiere su máxima potencia, cuando se utiliza en unión a la herencia, el polimorfismo permite que el mismo nombre de método emboque una operación a los objetos de una clase padre y una operación diferente en los objetos de la clase derivada. El Polimorfismo nos permite usar miembros de distintas clases de forma genérica sin tener que preocuparnos si pertenece a una clase o a otra. Siguiendo con el ejemplo de los animales, si el Gato y el Perro pueden morder podríamos tener un "animal" que muerda sin importarnos que sea el Gato o el Perro, simplemente podríamos usar el método Morder ya que ambos animales tienen esa característica "animal mordedor". LAS CLASES

Todo lo que tiene el .NET Framework, en realidad son clases. Una clase no es ni más ni menos que código. Aunque dicho de esta forma, cualquier programa sería una clase. Cuando definimos una clase, realmente estamos definiendo dos cosas diferentes: los datos que dicha clase puede manipular o contener y la forma de acceder a esos datos.

31


Por ejemplo, si tenemos una clase de tipo Cliente, por un lado tendremos los datos de dicho cliente y por otro la forma de acceder o modificar esos datos. En el primer caso, los datos del Cliente, como por ejemplo el nombre, domicilio etc., estarán representados por una serie de campos o propiedades, mientras que la forma de modificar o acceder a esa información del Cliente se hará por medio de métodos. Esas propiedades o características y las acciones a realizar son las que definen a una clase. Los Objetos

Por un lado tenemos una clase que es la que define un "algo" con lo que podemos trabajar. Pero para que ese "algo" no sea un "nada", tendremos que poder convertirlo en "algo tangible", es decir, tendremos que tener la posibilidad de que exista. Aquí es cuando entran en juego los objetos, ya que un objeto es una clase que tiene información real. Digamos que la clase es la "plantilla" a partir de la cual podemos crear un objeto en la memoria. Por ejemplo, podemos tener varios objetos del tipo Cliente, uno por cada cliente que tengamos en nuestra cartera de clientes, pero la clase sólo será una. Dicho de otra forma: podemos tener varias instancias en memoria de una clase. Una instancia es un objeto (los datos) creado a partir de una clase (la plantilla o el código). Para entender mejor todo este galimatías, desglosemos las clases: Los miembros de una clase

Las clases contienen datos, esos datos suelen estar contenidos en variables. A esas variables cuando pertenecen a una clase, se les llama: campos o propiedades. Por ejemplo, el nombre de un cliente sería una propiedad de la clase Cliente. Ese nombre lo almacenaremos en una variable de tipo String, de dicha variable podemos decir que es el "campo" de la clase que representa al nombre del cliente. Por otro lado, si queremos mostrar el contenido de los campos que contiene la clase Cliente, usaremos un procedimiento que nos permita mostrarlos, ese procedimiento será un método de la clase Cliente. Por tanto, los miembros de una clase son las propiedades (los datos) y los métodos las acciones a realizar con esos datos. Como te he comentado antes, el código que internamente usemos para almacenar esos datos o para, por ejemplo, mostrarlos, es algo que no debe preocuparnos mucho, simplemente sabemos que podemos almacenar esa información (en las propiedades de la clase) y que tenemos formas de acceder a ella, (mediante los métodos de dicha clase), eso es "abstracción" o encapsulación. Crear o definir una clase

Al igual que existen instrucciones para declarar o definir una variable o cualquier otro elemento de un programa de Visual Basic, existen instrucciones que nos permiten crear o definir una clase. Para crear una clase debemos usar la instrucción Class seguida del nombre que tendrá dicha clase, por ejemplo: Class Cliente A continuación escribiremos el código que necesitemos para implementar las propiedades y métodos de esa clase, pero para que Visual Basic sepa que ya hemos terminado de definir la clase, usaremos una instrucción de cierre: End Class

32


Por tanto, todo lo que esté entre Class <nombre> y End Class será la definición de dicha clase. Definir los miembros de una clase

Para definir los miembros de una clase, escribiremos dentro del "bloque" de definición de la clase, las declaraciones y procedimientos que creamos convenientes. Veamos un ejemplo: Class Cliente Public Nombre As String Sub Mostrar() Console.WriteLine("El nombre del cliente: {0}", Nombre) End Sub End Class En este caso, la línea Public Nombre As String, estaría definiendo una propiedad o "campo" público de la clase Cliente. Por otro lado, el procedimiento Mostrar sería un método de dicha clase, en esta caso, nos permitiría mostrar la información contenida en la clase Cliente. Esta es la forma más simple de definir una clase. Y normalmente lo haremos siempre así, por tanto podemos comprobar que es muy fácil definir una clase, así como los miembros de dicha clase. Pero no sólo de clases vive el Visual Basic... o lo que es lo mismo, ¿para que nos sirve una clase si no sabemos crear un objeto basado en esa clase...? Así que, sepamos cómo crearlos. Crear un objeto a partir de una clase

Como te he comentado antes, las clases definen las características y la forma de acceder a los datos que contendrá, pero sólo eso: los define. Para que podamos asignar información a una clase y poder usar los métodos de la misma, tenemos que crear un objeto basado en esa clase, o lo que es lo mismo: tenemos que crear una nueva instancia en la memoria de dicha clase. Para ello, haremos lo siguiente: Definimos una variable capaz de contener un objeto del tipo de la clase, esto lo haremos como con cualquier variable: Dim cli As Cliente Pero, a diferencia de las variables basadas en los tipos visto hasta ahora, para poder crear un objeto basado en una clase, necesitamos algo más de código que nos permita "crear" ese objeto en la memoria, ya que con el código usado en la línea anterior, simplemente estaríamos definiendo una variable que es capaz de contener un objeto de ese tipo, pero aún no existe ningún objeto en la memoria, para ello tendremos que usar el siguiente código: cli = New Cliente() Con esto le estamos diciendo al Visual Basic: crea un nuevo objeto en la memoria del tipo Cliente. Estos dos pasos los podemos simplificar de la siguiente forma: Dim cli As New Cliente()

33


Acceder a los miembros de una clase

Para acceder a los miembros de una clase (propiedades o métodos) usaremos la variable que apunta al objeto creado a partir de esa clase, seguida de un punto y el miembro al que queremos acceder, por ejemplo, para asignar el nombre al objeto cli, usaremos este código: cli.Nombre = "Visual Basic" Es decir, de la misma forma que haríamos con cualquier otra variable, pero indicando el objeto al que pertenece dicha variable. Como podrás comprobar, esto ya lo hemos estado usando anteriormente tanto en la clase Console como en las otras clases que hemos usado en entregas anteriores, incluyendo los arrays. Y para acceder al método Mostrar: cli.Mostrar() Ejemplo de cómo usar la herencia

Para poder usar la herencia en nuestras clases, debemos indicar al Visual Basic que esa es nuestra intención, para ello disponemos de la instrucción Inherits, la cual se usa seguida del nombre de la clase de la que queremos heredar. Veamos un ejemplo. Empezaremos definiendo una clase "base" la cual será la que heredaremos en otra clase. Ya sabemos cómo definir una clase, aunque para este ejemplo, usaremos la clase Cliente que vimos anteriormente, después crearemos otra, llamada ClienteMoroso la cual heredará todas las características de la clase Cliente además de añadirle una propiedad a esa clase derivada de Cliente. Veamos el código de estas dos clases. Para ello crea un nuevo proyecto del tipo consola y escribe estas líneas al principio o al final del fichero que el IDE añade de forma predeterminada. Class Cliente Public Nombre As String Sub Mostrar() Console.WriteLine("El nombre del cliente: {0}", Nombre) End Sub End Class Class ClienteMoroso Inherits Cliente Public Deuda As Decimal End Class Como puedes comprobar, para que la clase ClienteMoroso herede la clase Cliente, he usado Inherits Cliente, con esta línea, (la cual debería ser la primera línea de código después de la declaración de la clase), le estamos indicando al VB que nuestra intención es poder tener todas las características que la clase Cliente tiene. Haciendo esto, añadiremos a la clase ClienteMoroso la propiedad Nombre y el método Mostrar, aunque también tendremos la nueva propiedad que hemos añadido: Deuda. Ahora vamos a ver cómo podemos usar estas clases, para ello vamos a añadir código en el procedimiento Main del módulo del proyecto: Module Module1 Sub Main() Dim cli As New Cliente() Dim cliM As New ClienteMoroso()

34


cli.Nombre = "José" cliM.Nombre = "Luis" cliM.Deuda = 2000 Console.WriteLine("Usando Mostrar de la clase Cliente") cli.Mostrar() Console.WriteLine("Usando Mostrar de la clase ClienteMoroso") cliM.Mostrar() Console.WriteLine("La deuda del moroso es: {0}", cliM.Deuda) Console.ReadLine() End Sub End Module Lo que hemos hecho es crear un objeto basado en la clase Cliente y otro basado en ClienteMoroso. Le asignamos el nombre a ambos objetos y a la variable cliM (la del ClienteMoroso) le asignamos un valor a la propiedad Deuda. Fíjate que en la clase ClienteMoroso no hemos definido ninguna propiedad llamada Nombre, pero esto es lo que nos permite hacer la herencia: heredar las propiedades y métodos de la clase base. Por tanto podemos usar esa propiedad como si la hubiésemos definido en esa clase. Lo mismo ocurre con los métodos, el método Mostrar no está definido en la clase ClienteMoroso, pero si que lo está en la clase Cliente y como resulta que ClienteMoroso hereda todos los miembros de la clase Cliente, también hereda ese método. La salida de este programa sería la siguiente: Usando Mostrar de la clase Cliente El nombre del cliente: José Usando Mostrar de la clase ClienteMoroso El nombre del cliente: Luis La deuda del moroso es: 2000 Ahora veamos cómo podríamos hacer uso del polimorfismo o al menos una de las formas que nos permite el .NET Framework. Teniendo ese mismo código que define las dos clases, podríamos hacer lo siguiente: Sub Main() Dim cli As Cliente Dim cliM As New ClienteMoroso() cliM.Nombre = "Luis" cliM.Deuda = 2000 cli = cliM Console.WriteLine("Usando Mostrar de la clase Cliente") cli.Mostrar() Console.WriteLine("Usando Mostrar de la clase ClienteMoroso") cliM.Mostrar() Console.WriteLine("La deuda del moroso es: {0}", cliM.Deuda) Console.ReadLine() End Sub En este caso, la variable cli simplemente se ha declarado como del tipo Cliente, pero no se ha creado un nuevo objeto, simplemente hemos asignado a esa variable el contenido de la

35


variable cliM. Con esto lo que hacemos es asignar a esa variable el contenido de la clase ClienteMoroso, pero como comprenderás, la clase Cliente "no entiende" nada de las nuevas propiedades implementadas en la clase derivada, por tanto sólo se podrá acceder a la parte que es común a esas dos clases: la parte heredada de la clase Cliente. Realmente las dos variables apuntan a un mismo objeto, por eso al usar el método Mostrar se muestra lo mismo. Además de que si hacemos cualquier cambio a la propiedad Nombre, al existir sólo un objeto en la memoria, ese cambio afectará a ambas variables. Para comprobarlo, añade este código antes de la línea Console.ReadLine(): Console.WriteLine() cli.Nombre = "Juan" Console.WriteLine("Después de asignar un nuevo nombre a cli.Nombre") cli.Mostrar() cliM.Mostrar() La salida de este nuevo código, sería la siguiente: Usando Mostrar de la clase Cliente El nombre del cliente: Pepe Usando Mostrar de la clase ClienteMoroso El nombre del cliente: Pepe La deuda del moroso es: 2000 Después de asignar un nuevo nombre a cli.Nombre El nombre del cliente: Juan El nombre del cliente: Juan Como puedes comprobar, al cambiar en una de las variables el contenido de la propiedad Nombre, ese cambio afecta a las dos variables, pero eso no es porque haya nada mágico ni ningún fallo, es por lo que te comenté antes: sólo existe un objeto en la memoria y las dos variables acceden al mismo objeto, por tanto, cualquier cambio efectuado en ellas, se reflejará en ambas variables por la sencilla razón de que sólo hay un objeto en memoria. A este tipo de variables se las llama variables por referencia, ya que hacen referencia o apuntan a un objeto que está en la memoria. A las variables que antes hemos estado viendo se las llama variables por valor, ya que cada una de esas variables tienen asociado un valor que es independiente de los demás. LAS ESTRUCTURAS

Las estructuras o tipos definidos por el usuario, son un tipo especial de datos que veremos en otra ocasión con más detalle, pero que se comportan casi como las clases, permitiendo tener métodos, propiedades, etc., la diferencia principal entre las clases y las estructuras es que éstas últimas son tipos por valor, mientras que las clases son tipos por referencia. Las estructuras, al igual que las clases, las podemos declarar a nivel de espacios de nombres y también dentro de otras estructuras e incluso dentro de clases y módulos. LOS NOMBRE DE ESPACIOS ¿Qué es un Namespace?

Un Namespace es una forma de agrupar clases (tipos) que están relacionadas de alguna forma. El uso de los espacios de nombres nos permitirá tener nuestros ensamblados agrupados según la tarea para la que los hemos programado. De esta forma, si escribimos ensamblados que accederán al disco, los podemos agrupar para tenerlos en sitio diferente a los que, por ejemplo, accedan a una base de datos. Eso mismo es lo que se hace en las

36


clases base de .NET Framework y por esa razón existen los espacios de nombres System.IO y System.Data, por poner sólo dos. Cada vez que creamos un proyecto con Visual Studio .NET de forma automática se crea un espacio de nombres para nuestra aplicación. Por tanto todos los tipos (clases, estructuras, enumeraciones, etc.) que definamos en dicho proyecto estarán incluidos dentro de ese espacio de nombres. Aunque el editor de Visual Studio no nos muestra que todo esto es así, ya que para crear o definir un espacio de nombres debemos usar la instrucción Namespace y marcar el final de dicha definición usando End Namespace, por tanto es como si el IDE añadiera esas instrucciones por nosotros. Por tanto es importante saber que, aunque no lo veamos, todos nuestros proyectos estarán dentro de un espacio de nombres. Dicho Namespace se llamará de la misma forma que nuestro proyecto, salvo si tiene espacios, en ese caso se cambiarán los espacios (o caracteres no válidos en un nombre de .NET) por un guión bajo. El Visual Studio define el espacio de nombres "predeterminado" de nuestro proyecto en las propiedades del proyecto. Así que si quieres cambiar el Namespace predeterminado del proyecto, puedes hacerlo modificando dicho valor. Para poder hacer esto, muestra las propiedades del proyecto: # Selecciona el proyecto en el explorador de soluciones (Solution Explorer) # En el menú Proyecto (Project), selecciona Propiedades (Properties) # En la ficha General (que será la que se muestre por defecto), el espacio de nombres estará en: Espacio de nombres de la raíz (Root namespace) tal como podemos ver en la figura 1.

Figura 1: El espacio de nombres predeterminado de un proyecto de VB .NET ¿Qué finalidad tiene el uso de los Namespace?

El escribir nuestro código dentro de un bloque Namespace tiene por finalidad, el poder mantener una especie de jerarquía. Para que nos entendamos mejor, podríamos comparar los espacios de nombres con los directorios de un

37


disco. En cada directorio tendremos ficheros que de alguna forma están relacionados, de esta forma no mezclaremos los ficheros de música con los de imágenes ni con los proyectos de Visual Basic, por poner algunos ejemplos. Pues lo mismo ocurre con las jerarquías creadas con los Namespace, de forma que podamos tener de alguna forma separados unos tipos de datos (clases, etc.) de otros.

DESARROLLO DE EJEMPLOS Ejercicio # 1. CREACIÓN DE UN PROYECTO DE CONSOLA DE APLICACIÓN

El primer paso para crear una consola de aplicación, es crear un proyecto de Aplicación de Consola de Visual Basic. Para hacer esto, siga estos pasos: 1. Ingresar a Microsoft Visual Basic .Net. En la barra de estado haga clic en el botón Inicio y luego en la opción Todos los Programas, opción Microsoft Visual Studio.NET 2003 y de clic en Microsoft Visual Studio.NET 2003. 2. Dentro del visual Basic tenemos dos formas para crear un nuevo proyecto, la primera es: • Archivo -> Nuevo -> Proyecto

Y de la otra forma es mediante Página de Inicio, le damos clic en Nuevo Proyecto.

38


3. Luego nos aparecerá la ventana de Nuevo Proyecto, en la opción Tipo de Proyecto seleccionamos Proyectos de Visual Basic y en la opción Plantillas se debe seleccionar Aplicación de consola, para después introducir el nombre de Ejecicio01, Visual Basic proporciona una ruta predeterminada para el ensamblado de los archivos pero se puede cambiar haciendo clic en el botón Examinar…, bueno eso lo haremos cuando guardemos el archivo. Por ahora seleccionaremos el icono de Aplicación de consola y le ponemos el nombre que ya se mencionó. 4. Al dar clic en Aceptar nos aparecerá la ventana de código del modulo que acabamos de crear, el módulo tendrá el nombre de Module1, así que lo cambiaremos por Ejercicio01, en la ventana de propiedades. Así que todo el código que vamos a escribir lo haremos del Main. Module Ejercicio01 Sub Main() ' Salida Dim D As Integer ' Entrada Dim V, T As Integer 'Ingresa la Velocidad del Móvil Console.Write("Ingrese la Velocidad del Móvil: ") V = Console.ReadLine ' Ingresa el Tiempo Usado por el Móvil Console.Write("Ingrese el Tiempo Usado por el Móvil: ") T = Console.ReadLine ' Calculamos la Distancia Recorrida D=V*T ' Mostramos la Distancia Recorrida por el Móvil Console.WriteLine("La Distancia Recorrida por el Móvil es {0}", D) ' Esperamos que Presione una Tecla, para Finalizar el Programa Console.ReadLine() End Sub End Module En el programa se utiliza la función Write ya que se quiere que muestre el texto de “Ingrese la Velocidad del Móvil”, para que así el usuario ingrese el dato requerido, y a la vez el dato que el usuario ingresa no aparezca abajo del texto, sino al costado. Hay varias formas de realizar comentarios en pleno código, como se a hecho en este código, este comentario no se mostrara a la hora de ejecución, solo se utiliza dentro de la codificación, para que así cuando se nos haya olvidado para que es una instrucción o para que es una variable, podremos ponerle el comentario respectivo. Estos son las formas para poner un comentario: 'Comentario Mediante la Coma Flotante REM Comentario Mediante REM

39


5. Ejecutar el programa creado. Tenemos tres formas para hacerlo. $ Presionando la tecla F5 $ Eligiendo en el menú Depurar -> Iniciar $ Haciendo clic en la Barra Estándar en el icono siguiente.

La ventana que nos mostrará al ejecutar el siguiente programa será:

Por cada dato que ingresemos tendremos que presionar la tecla Enter, para que el programa reciba ese dato.

Ejercicio # 2. Crearemos un proyecto llamado Ejercicio02, y el Módulo se llamará igual. La siguiente Aplicación de Consola permite calcular el número de Disquetes 3 ½ necesarios para hacer una copia de seguridad, de la información almacenada en un disco cuya capacidad se conoce. Considerar que el disco duro esta lleno de información, además expresado en gigabyte. Un disquete tiene 1.44 megabyte y una gigabyte es igual a 1,024 megabyte. Module Ejercicio02 Sub Main() ' Salida Dim D As Double ' Entrada Dim GB As Double ' Intermedio Dim MG As Double 'Ingresa de la Capacidad del Disco Duro en GygaBytes Console.Write("Ingrese la Capacidad del Disco Duro en GygaByte: ") GB = Console.ReadLine ' Convertimos los gygaBytes en MegaBytes MG = GB * 1024 ' Calculamos la Cantidad de Disquetes a Utilizar D = MG / 1.44 ' Mostramos la Cantidad de Disquetes que vamos a Utilizar Console.Write("La Cantidad de Disquetes a Utilizar en el Backup es {0}", D) ' Esperamos que Presione una Tecla para Finalizar el Programa Console.ReadLine() End Sub End Module

40


Ejercicio # 3. Esta aplicación de Consola utiliza una estructura para realizar una cierta tarea, como es la de encontrar el Area y Perímetro de un Cuadrado. Module Ejercicio03 Structure Cuadrado Dim Lado As Double Sub Inicio(ByVal L As Double) Lado = L End Sub Function Area() As Double Area = Lado * Lado End Function Function Perimetro() As Double Perimetro = 4 * Lado End Function End Structure Sub Main() Dim X As Cuadrado X.Inicio(7) Console.WriteLine("El área del cuadrado es: {0}", X.Area) Console.WriteLine("El perímetro del cuadrado es: {0}", X.Perimetro) Console.ReadLine() End Sub End Module

Ejercicio # 4. Esta aplicación utiliza una clase para realizar una cierta tarea, como la de encontrar el área y perímetro de un cuadrado, también este sería un claro ejemplo de polimorfismo, ya que es una forma diferente de programar, pero tenga en claro siempre la diferencia entre una clase y estructura, Las clases usan parámetros por referencia, mientras que las estructuras la usan por valor.

41


Module Ejercicio04 Public Class Cuadrado Dim Lado As Double Public Sub Inicio(ByVal L As Double) Lado = L End Sub Public Function Area() As Double Return Lado * Lado End Function Public Function Perimetro() As Double Return 4 * Lado End Function End Class Sub Main() Dim X As Cuadrado Dim L As Double = 5.0 X = New Cuadrado X.Inicio(L) Console.WriteLine("El área del cuadrado es: {0}", X.Area) Console.WriteLine("El perimetro del cuadrado es: {0}", X.Perimetro) Console.ReadLine() End Sub End Module

EJERCICIOS PROPUESTOS a) Escriba una Aplicación de Consola que permita obtener el promedio simple de un estudiante a partir de sus tres notas parciales. b) Elaborar una Aplicación de Consola, que permita encontrar el valor absoluto de cualquier número. c) Se tiene los puntos A y B en el cuadrante positivo del plano cartesiano, elabore una Aplicación de Consola que permite obtener la distancia entre A y B. La distancia entre dos puntos se puede encontrar en base a la siguiente fórmula: D = [(AB - AA)^2 + (OB - OA)^2] ^ 0.50 En donde, AB = Abcisa de B, AA = Abcisa de A, OB = Ordenada de B y OA = Ordenada de A.

42


Clase Teórica No. 3 Formularios Windows OBJETIVOS • Conocer la Clase que contiene todos los miembros para la creación y manipulación de formularios. • Conocer los Tipos de Datos de Visual Basic.NET • Conocer la forma de Manipular las Variables en Visual Basic.NET

DESARROLLO DE CLASE

INTERFACES DE VENTANA. FORMULARIOS Y CONTROLES Es un hecho palpable el que la programación para Internet, ha ganado en los últimos tiempos una importante cuota de desarrollo, en detrimento de las aplicaciones basadas en Windows. Sin embargo, todavía existe un importante conjunto de programas que deberán seguir funcionando en Windows y que tendrán que migrarse a la plataforma .NET. Para este sector del desarrollo, .NET Framework proporciona una arquitectura renovada, en lo que a la programación de aplicaciones Windows se refiere: los nuevos formularios y controles Windows. Un formulario Windows representa la conocida ventana, que se utiliza en las aplicaciones ejecutadas bajo alguno de los sistemas operativos de la familia Windows: Windows95/98, NT, ME, 2000, XP, etc. Un control, por otra parte, es aquel elemento situado dentro de una ventana o formulario, y que permite al usuario de la aplicación Windows, interactuar con la misma, para introducir datos o recuperar información. Dentro de .NET, las ventanas clásicas Windows, reciben la denominación de Windows Forms, o WinForms, para diferenciarlas de los formularios Web o WebForms, que son los que se ejecutan en páginas ASP.NET.

SYSTEM.WINDOWS.FORMS Este espacio de nombres contiene todos los tipos del entorno, a través de los cuales podremos desarrollar aplicaciones compuestas por formularios Windows, junto a los correspondientes controles que permiten al usuario la interacción con el programa. El conjunto de clases, estructuras, enumeraciones, etc., de System.Windows.Forms, permiten la creación de aplicaciones Windows, basadas en el nuevo motor de generación de formularios (Form Engine), más potente y versátil que el disponible en anteriores versiones de VB.

LA CLASE FORM Esta clase contiene todos los miembros para la creación y manipulación de formularios. Tras instanciar un objeto de Form, mediante la configuración de las adecuadas propiedades, podemos crear formularios estándar, de diálogo, de interfaz múltiple o MDI, con diferentes bordes, etc.

EL CÓDIGO DEL FORMULARIO Cuando creamos un formulario desde Visual Studio .NET, el diseñador del formulario genera por nosotros el código del formulario, que consiste en una clase que hereda de la clase base Form. El nombre de la clase es el mismo que hemos asignado a la propiedad Name en la ventana de propiedades del diseñador, en este caso Form1. El código es grabado en un archivo con la extensión .VB, que tiene el nombre del formulario: FORM1.VB, en este ejemplo.

43


Para ver dicho código, tan sólo tenemos que hacer clic derecho sobre el formulario, y en el menú contextual seleccionar Ver código, lo que abrirá la ventana del editor de código del IDE, mostrando el código de nuestro formulario. Parte del código estará oculto por un elemento Region con el nombre Windows Form Designer generated code; para verlo al completo debemos hacer clic en el icono de expansión de esta región. Es posible modificar este código generado por el diseñador, para completar aquellos aspectos que necesitemos del formulario. Sin embargo, no debemos modificar el método InitializeComponent( ), ya que se trata de un método directamente relacionado con el aspecto visual del formulario, y su edición podría dejar el formulario inservible. El Código fuente 1 muestra el código de la clase Form1, correspondiente a un formulario de un proyecto cualquiera, que ha generado el diseñador. Public Class Form1 Inherits System.Windows.Forms.Form #Region " Windows Form Designer generated code" Public Sub New() MyBase.New() 'This call is required by the Windows Form Designer. InitializeComponent() 'Add any initialization after the InitializeComponent() call End Sub 'Form overrides dispose to clean up the component list. Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub 'Required by the Windows Form Designer Private components As System.ComponentModel.Container 'NOTE: The following procedure is required by the Windows Form Designer 'It can be modified using the Windows Form Designer. 'Do not modify it using the code editor. <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(frmPrueba)) 'frmPrueba ' Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) Me.BackgroundImage = CType(resources.GetObject("$this.BackgroundImage"), System.Drawing.Bitmap) Me.ClientSize = New System.Drawing.Size(336, 101) Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) Me.Location = New System.Drawing.Point(3200, 6000) Me.MaximizeBox = False Me.Name = "frmPrueba" Me.Text = "Ejemplo sencillo con formularios Windows" End Sub #End Region End Class Código fuente 1

44


CAMBIANDO EL NOMBRE DEL FORMULARIO Cambiar el nombre de un formulario es algo tan sencillo como acceder a la ventana de propiedades del diseñador del formulario, y asignar un nuevo nombre en la propiedad Name. Por ejemplo, asignemos frmPrueba como nuevo nombre al formulario de nuestro ejemplo. Ver Figura 1.

Figura 1. Cambio del nombre del formulario. Sin embargo, esta acción tiene más implicaciones de las que en un principio pudiera parecer, ya que si intentamos ahora ejecutar el programa, se producirá un error. Esto es debido a que al crear el proyecto, el objeto inicial del mismo era el formulario, pero tenía como nombre Form1, al cambiar el nombre a frmPrueba, el IDE no puede encontrarlo y genera el error. Para solucionarlo, debemos abrir la ventana del Explorador de soluciones; hacer clic en el nombre del proyecto, y después clic en el último botón de esta ventana, que abrirá la ventana correspondiente a las propiedades del proyecto. En dicha ventana, abriremos la lista desplegable Objeto inicial, y seleccionaremos el nombre del nuevo formulario. Ver Figura 2.

Figura 2. Cambio del objeto inicial del proyecto. Al volver a ejecutar, el programa funcionará correctamente mostrando el formulario. Un detalle a destacar consiste en que cuando cambiamos el nombre del formulario, el archivo que contiene el código fuente del mismo no cambia, ya que como sabemos, un archivo de código puede ahora albergar más de una clase o cualquier otro tipo de elemento de la aplicación: enumeración, módulo, estructura, etc. Por ese motivo, el archivo que contiene el formulario seguirá con el nombre FORM1.VB, independientemente del nombre que le hayamos dado al formulario.

45


CREACIÓN DE FORMULARIOS DESDE CÓDIGO En el ejemplo anterior hemos visto que a raíz de los valores que asignábamos a las propiedades del formulario, se generaba el código correspondiente, que es el que mostrará el formulario al ser ejecutado. Aunque en la mayor parte de las ocasiones, sino en todas, utilizaremos el diseñador de formularios para crear el interfaz de usuario, podemos perfectamente prescindir de este diseñador, y construir nuestro formulario escribiendo todo su código. A continuación, mostramos el modo de hacerlo. Después de haber creado un proyecto de tipo aplicación Windows, eliminaremos el formulario que por defecto nos proporciona el IDE, abriendo la ventana Explorador de soluciones, haciendo clic en dicho formulario, y pulsando la tecla [SUPR]. Seguidamente, añadiremos una clase al proyecto utilizando el menú del IDE, Proyecto + Agregar clase, y daremos el nombre frmManual a dicha clase, escribiendo en ella el código mostrado en el Código fuente 3. Public Class frmManual Inherits System.Windows.Forms.Form Public Sub New() Me.Name = "frmManual" Me.Text = "formulario creado desde código" Me.StartPosition = FormStartPosition.CenterScreen Me.ClientSize = New System.Drawing.Size(300, 50) End Sub End Class Código fuente 3. Como se puede comprobar, lo que hacemos en esta clase es heredar de Form, y mediante un método constructor, asignamos valores a las propiedades del formulario que será creado cuando se instancie un objeto de nuestra clase frmManual. Antes de poder ejecutar este proyecto, debemos, al igual que en el ejemplo anterior, abrir la ventana de propiedades de proyecto, y establecer como objeto inicial esta clase. Nuestro formulario en ejecución tendrá el aspecto mostrado en la Figura 3.

Figura 3. Formulario creado sin utilizar el diseñador de formularios. La posibilidad de manipular el formulario mediante código de esta manera, abre la puerta a un elevado número de posibilidades, que hasta la fecha, estaban vetadas a los programadores de VB. De esta forma, podemos construir la base principal del formulario con el diseñador, y dinámicamente, en ejecución, modificar sus propiedades, añadir y quitar controles, etc.

TIPOS DE DATOS El tipo de datos de un elemento de programación hace referencia al tipo de datos que puede contener y a cómo se almacenan éstos. Los tipos de datos se aplican a todos los valores que pueden almacenarse en la memoria del equipo o participar en la evaluación de una expresión. Cada variable, literal, constante, propiedad, argumento de procedimiento y valor devuelto por un procedimiento tiene un tipo de datos. Un tipo de datos declarado está especificado como parte de la declaración de un elemento de programación. A menos que utilice la programación sin tipos, debe declarar los tipos de datos de todos los elementos de programación. La tabla siguiente muestra los tipos de datos de Visual Basic .NET, los tipos correspondientes de Common Language Runtime, su asignación de almacenamiento nominal y sus intervalos de valores.

46


Estructura de tipo Tipo de Visual Common Language Basic Runtime Boolean System.Boolean Byte System.Byte Char System.Char

Asignación de almacenamiento nominal 2 bytes 1 byte 2 bytes

Date

System.DateTime

8 bytes

Decimal

System.Decimal

16 bytes

Double (punto flotante System.Double con precisión doble)

8 bytes

Intervalo de valores True o False 0 a 255 (sin signo) 0 a 65535 (sin signo) 0:00:00 del 1 de enero de 0001 a 11:59:59 p.m. del 31 de diciembre de 9999. 0 a +/-79.228.162.514.264.337.593.543.950.335 sin separador decimal; 0 a +/-7,9228162514264337593543950335 con 28 posiciones a la derecha del signo decimal; el número más pequeño distinto de cero es +/-0,0000000000000000000000000001 (+/-1E-28). -1,79769313486231570E+308 a -4,94065645841246544E-324 para valores negativos; 4,94065645841246544E-324 a 1,79769313486231570E+308 para valores positivos. -2.147.483.648 a 2.147.483.647 -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807. Cualquier tipo puede almacenarse en una variable de tipo Object. -32.768 a 32.767.

Integer Long (entero largo)

System.Int32

4 bytes

System.Int64

8 bytes

Object

System.Object (clase)

4 bytes

Short Single (punto flotante con precisión simple) String (cadena de longitud variable) Tipo de datos definido por el usuario (estructura)

System.Int16

2 bytes

System.Single

4 bytes

-3,4028235E+38 a –1,401298E-45 para valores negativos; 1,401298E-45 a 3,4028235E+38 para valores positivos.

System.String (clase)

En función de la plataforma de implementación

De 0 a 2.000 millones de caracteres Unicode aprox.

(hereda de System.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 e independiente de los intervalos de valores correspondientes a los demás miembros.

VARIABLES A menudo, es necesario almacenar valores de forma temporal para efectuar cálculos en Visual Basic. Por ejemplo, puede que necesite calcular varios valores, compararlos y realizar distintas operaciones con ellos, en función del resultado de la comparación. Para poder comparar los valores, debe guardarlos, pero no es necesario que los almacene en una propiedad. Visual Basic, al igual que la mayoría de los lenguajes de programación, utiliza variables para almacenar valores. Una variable tiene un nombre (la palabra que se utiliza para referirse al valor que contiene la variable) y un tipo de datos (que determina la clase de datos que puede almacenar la variable). Una variable puede representar una matriz, si es necesario que almacene un conjunto indizado de elementos de datos estrechamente relacionados entre sí.

ALMACENAR Y RECUPERAR DATOS EN VARIABLES Para efectuar cálculos y asignar el resultado a una variable, se utilizan instrucciones de asignación, como se muestra en el siguiente código: ManzanasVendidas = 10 ' El valor 10 es asignado a la variable. ManzanasVendidas = ManzanasVendidas + 1 ' La variable es incrementada. Nota El signo igual (=) de este ejemplo es un operador de asignación, no un operador de igualdad. El valor se asigna a la variable ManzanasVendidas.

47


DECLARACIÓN DE VARIABLES Una variable se declara para especificar su nombre y sus características. La instrucción de declaración para variables es Dim. Su ubicación y contenido determinan las características de la variable.

NIVELES DE DECLARACIÓN Una variable local es aquella que se declara dentro de un procedimiento. Una variable de módulo se declara en el interior del módulo, pero no dentro de un procedimiento interno del módulo. La categoría de una variable que no sea local, en una clase o estructura, depende de que la variable esté o no compartida. Si una variable se declara con la palabra clave Shared, es una variable compartida, y existe en una única copia compartida por todas las instancias de la clase o estructura. De lo contrario, es una variable de instancia, y se crea una copia independiente de ella para cada instancia de la clase o estructura. Una copia determinada de una variable de instancia sólo está disponible en la instancia para la cual se creó.

DECLARAR EL TIPO DE DATOS La cláusula As de la instrucción de declaración permite definir el tipo de datos o de objetos de la variable que se está declarando. Se puede especificar cualquiera de los siguientes tipos para una variable: # Un tipo de datos elemental, como Boolean, Long o Decimal. # Un tipo de datos compuesto, como una matriz o una estructura. # Un tipo de objeto, o de clase, de Visual Basic u otra aplicación, como Label o TextBox. Se pueden declarar varias y distintas variables en la misma instrucción sin necesidad de repetir el tipo de datos. En las instrucciones que se muestran a continuación, las variables I, J y K se declaran como de tipo Integer, L y M como Long y X e Y como Single: Dim I, J, K As Integer ' Las tres variables son Integer. Dim L, M As Long, X, Y As Single ' L y M son Long, X y Y son Single.

DECLARAR EL PERÍODO DE DURACIÓN El período de duración de una variable representa el tiempo durante el cual la variable está disponible para que pueda ser utilizada. Una variable local declarada con una instrucción Dim sólo existe durante la ejecución del procedimiento. Cuando finaliza el procedimiento, todas sus variables locales desaparecen y sus valores se pierden. No obstante, si se declara una variable local con la palabra clave Static, ésta seguirá existiendo y conservará su valor aunque finalice el procedimiento. Las variables de módulo, compartidas y de instancia conservan sus valores mientras continúe la ejecución de la aplicación.

DECLARAR EL ÁMBITO El ámbito de una variable está formado por todo código que puede hacer referencia a la variable sin tener que especificar su nombre. El ámbito de una variable está determinado por la ubicación en la que se haya declarado la variable. El código de una región determinada puede utilizar las variables definidas en dicha región sin necesidad de especificar los nombres de las variables. Cuando se declara un ámbito, se aplican las siguientes reglas: # El ámbito de una variable de módulo es el espacio de nombres completo en el que está definido el módulo. # El ámbito de una variable de instancia o compartida es la estructura o clase en la que se ha declarado. # El ámbito de una variable local es el procedimiento en el que se ha declarado. # No obstante, si se declara una variable local dentro de un bloque, su ámbito será únicamente el propio bloque. Un bloque es un conjunto de instrucciones que terminan por una instrucción End, Else, Loop o Next; por ejemplo, una construcción For...Next o If...Then...Else...End If.

48


Como se describe anteriormente el ámbito indica en que lugar de la aplicación desea utilizar la variable y puede ser una de las siguientes palabras claves. Dim, Static, Private o Public. •

Dim: Se puede utilizar a nivel de procedimiento y a nivel del formulario. Si se declara una variable a nivel de procedimiento con la palabra Dim, Visual Basic reinicializa (borra su contenido) la variable cada vez que ejecuta el procedimiento. Ejemplo: Dim a As Integer

Static: Se utiliza solo a nivel del procedimiento. Cuando una variable se declara con la palabra Static, Visual Basic no reinicializa la variable cada vez que se ejecuta el procedimiento, solo lo hace la primera vez. Esto quiere decir que la variable conserva su valor entre una llamada al procedimiento y otra. Ejemplo: Static b As Double

Private: Se utiliza solo a nivel del modulo e indica que la variable es privada; es decir, solo va a ser reconocida dentro del módulo donde ha sido declarada. Ejemplo: Private c As String

Public: Se utiliza solo a nivel de módulo e indica que la variable es pública; es decir, va a ser reconocida en toda la aplicación. Ejemplo Public d As Date

DECLARAR LA ACCESIBILIDAD La accesibilidad de una variable viene determinada por la palabra o palabras clave, Dim, Public, Protected, Friend, Protected Friend o Private, que se utilizan en la instrucción de declaración. Con cualquiera de estas palabras clave se puede declarar una variable de módulo, estructura, clase o instancia. Dentro de un procedimiento, solamente está permitida la palabra clave Dim, y la accesibilidad siempre es privada.

DECLARACIÓN IMPLÍCITA Y EXPLÍCITA De forma predeterminada, el compilador de Visual Basic impone una declaración explícita, que requiere declarar todas las variables antes de que sean utilizadas. Puede eliminar este requisito y permitir la declaración implícita. Visual Basic proporciona un modificador que controla la declaración explícita. Si desactiva el modificador, puede utilizar variables sin declararlas. Puede activar o desactivar el modificador de declaración explícita de cualquiera de estas formas: # Estableciendo la propiedad de proyecto adecuada en la ventana Propiedades del entorno de desarrollo integrado (IDE) # Especificando la opción /optionexplicit del compilador de línea de comandos # Incluyendo la instrucción Option Explicit al principio del código Si utiliza la instrucción Option Explicit, esta configuración reemplaza las configuraciones tanto de la propiedad de proyecto como de la opción de compilador, pero únicamente para el archivo de código fuente en el cual aparece. Establecer Option Explicit On tiene la ventaja de forzar que la inferencia de tipo se realice en tiempo de compilación en lugar de en tiempo de ejecución. Esto mejora el rendimiento.

DECLARACIÓN IMPLÍCITA Si desactiva la declaración explícita, puede declarar de forma implícita una variable simplemente utilizándola en el código. A todas las variables declaradas de forma implícita se les asigna el tipo de datos Object. Sin embargo, la aplicación es más eficiente si se declaran todas las variables explícitamente y

49


con un tipo de datos específico. Esto reduce la incidencia de los errores de conflicto de nombres y de los errores de escritura. También permite al compilador detectar errores potenciales en tiempo de ejecución, como asignar un tipo Integer a un tipo Short. Puede escribir una función en la cual no se declare una variable local, como en el siguiente ejemplo: Function SafeSqrt(Num) TempVal = Math.Abs(Num) Return Math.Sqrt(TempVal) End Function Visual Basic crea automáticamente TempVal como una variable local, que puede utilizar como si la hubiera declarado de forma explícita. Aunque esto resulta cómodo, puede inducir a errores difíciles de detectar en el código si se escribe incorrectamente el nombre de una variable. Supongamos que ha escrito la función del ejemplo anterior tal como sigue: Function SafeSqrt(Num) TempVal = Math.Abs(Num) Return Math.Sqrt(TemVal) End Function A primera vista, el código parece idéntico. Pero como la variable TempVal se ha escrito incorrectamente, al igual que el argumento de Sqrt, el compilador crea una variable local adicional denominada TemVal, a la cual nunca se asigna un valor, y la función devuelve siempre cero. Cuando Visual Basic encuentra un nombre nuevo, no puede determinar si realmente se intenta declarar una nueva variable de forma implícita o si se trata simplemente de una variable ya existente mal escrita, de modo que crea una variable nueva con ese nombre. De forma alternativa, el compilador podría ya tener el nombre definido, y el código utilizaría la definición de forma no intencionada. Puede evitar los problemas derivados de las variables mal escritas mediante el uso de una declaración explícita.

DECLARACIÓN EXPLÍCITA Establece el valor predeterminado del compilador mediante el cual se obliga a utilizar declaraciones explícitas de las variables. De forma predeterminada, Option Explicit está establecida en On.

PARA DECLARAR VARIABLES DE FORMA EXPLICITA •

Incluya esta instrucción en la sección Declaraciones del Modulo de Clase, de Formulario o Estándar: Option Explicit On

En el menú Herramientas, haga clic en Opciones, a continuación seleccione la carpeta Proyectos y haga clic en Valores predeterminados de VB.

En el ejemplo anterior, si la declaración explícita hubiera estado vigente para el módulo que contenía la función SafeSqrt, Visual Basic habría reconocido TempVal y TemVal como variables no declaradas y habría generado errores relativos a ambas. Como resultado, debería declararse a continuación de forma explícita TempVal, del modo siguiente: Function SafeSqrt(Num As Single) As Single Dim TempVal As Single = Math.Abs(Num) Return Math.Sqrt(TemVal) End Function

50


Con este código revisado, se entendería inmediatamente el problema porque Visual Basic mostraría un mensaje de error para la variable TemVal, escrita de forma incorrecta. Es recomendable utilizar la declaración explícita con la totalidad del código, porque ayuda a detectar este tipo de errores. Nota. La instrucción Option Explicit funciona archivo por archivo. Debe estar al principio de cada archivo de código fuente en el cual desee controlar la imposición de una declaración de variable explícita.

INFORMACIÓN GENERAL SOBRE LAS CONSTANTES A menudo el código contiene valores constantes que vuelven a aparecer. También puede ocurrir que el código dependa de ciertos números difíciles de recordar o cuyo significado no sea evidente. En estos casos, puede mejorar considerablemente la legibilidad del código y facilitar su mantenimiento mediante constantes. Una constante es un nombre significativo que toma el lugar de un número o cadena que no cambia. Las constantes almacenan valores que, como su nombre indica, permanecen constantes durante la ejecución de una aplicación. Las constantes se declaran con la instrucción Const, utilizando las mismas directrices que en la creación de nombres de variables. Si Option Strict está On, debe declarar explícitamente el tipo de constante. El ámbito de una constante es el mismo que el de una variable declarada en la misma ubicación. Para crear una constante que exista en el ámbito de un procedimiento concreto, declárela dentro de dicho procedimiento. Para crear una constante disponible en toda la aplicación, declárela con la palabra clave Public en la sección de declaraciones de la clase. Nota. Aunque las constantes son de algún modo similares a las variables, no se pueden modificar ni asignársele valores como a éstas últimas. Las constantes que se utilizan en el código pueden ser intrínsecas al modelo de objeto para los controles o componentes con los que trabaja o definidas por el usuario, es decir, creadas por éste.

OPERADOR + El Operador + suma dos números. También se usan para concatenar dos cadenas. Cuando utilice el operador +, puede que no logre determinar si se producirá una suma o bien una concatenación de cadenas. Use el operador & de concatenación para eliminar ambigüedades y ofrecer código autoexplicativo. En el siguiente ejemplo se usa el operador + para agregar números. Este operador también puede utilizarse para concatenar cadenas. Sin embargo, y a fin de descartar ambigüedades, para el último caso se recomienda usar el operador &. Si los componentes de una expresión creada con el operador + son numéricos, se asignará el resultado aritmético. Si los componentes son exclusivamente cadenas, se concatenarán las cadenas. La expresión no puede contener componentes de varios tipos mezclados. El resultado aritmético devuelve la suma de ambos operandos. El resultado de la concatenación devuelve una cadena que representa la concatenación de ambos operandos. Dim miNumero As Integer Dim var1 As String Dim var2 As Integer miNumero = 2 + 2 ' Devuelve 4. miNumero = 4257.04 + 98112 ' Devuelve 102369.04. Option Strict On ' Inicializa variables mezcladas var1 = "34" var2 = 6 miNumero = var1 + var2 ' Genera un error. Option Strict Off Var1 = "34" Var2 = 6

51


miNumero = var1 + var2 ' Devuelve 40 (suma) después la cadena en var1 es convertida a un valor numérico.

OPERADOR & Genera la concatenación de cadena de dos expresiones. En este ejemplo se usa el operador & para forzar la concatenación de cadenas. El resultado es un valor de cadena que representa la concatenación de ambos operandos. Dim miCadena As String miCadena = "Hola" & " Mundo" ' Returns "Hola Mundo".

PRIORIDAD DE LOS OPERADORES EN VISUAL BASIC Cuando aparecen varias operaciones en una expresión, cada parte se evalúa y se resuelve en un orden predeterminado conocido como prioridad de operador. Cuando las expresiones contienen operadores de más de una categoría, dichos operadores se evalúan de acuerdo con las siguientes reglas: • Los operadores aritméticos y de concatenación tienen el orden de prioridad que se describe a continuación; todos ellos tienen mayor prioridad que los operadores lógicos, de comparación y bit a bit. • Los operadores de comparación tienen la misma prioridad; todos ellos tienen mayor prioridad que los operadores lógicos y bit a bit, pero menor prioridad que los operadores de concatenación y aritméticos. • Los operadores lógicos y bit a bit tienen el orden de prioridad que se describe a continuación; todos ellos tienen menor prioridad que los operadores aritméticos, de concatenación y de comparación. • Los operadores con la misma prioridad se evalúan de izquierda a derecha en el orden en que aparecen en la expresión. Los operadores se evalúan en el siguiente orden de prioridad: Operadores de concatenación y aritméticos Exponenciación (^) Negación unaria (–) Multiplicación y división (*, /) División de número entero (\) Módulo aritmético (Mod) Suma y resta (+, –), concatenación de cadenas (+) Concatenación de cadenas (&) Desplazamiento de bits aritmético (<<, >>) Operadores de comparación Todos los operadores de comparación (=, <>, <, <=, >, >=, Like, Is, TypeOf...Is) Operadores lógicos y bit a bit Negación (Not) Conjunción (And, AndAlso) Disyunción (Or, OrElse, Xor) El operador de concatenación de cadenas (&) no es un operador aritmético, pero en cuanto a prioridad, se agrupa con los operadores aritméticos. El operador Is es un operador de comparación de referencias de objetos. No compara objetos ni sus valores; sólo comprueba si dos variables de objetos hacen referencia al mismo objeto. Cuando aparecen operadores de la misma prioridad juntos en una expresión, por ejemplo, multiplicación y división, cada operación se evalúa según aparece de izquierda a derecha. Se pueden

52


utilizar paréntesis para alterar el orden de prioridad y obligar a evaluar algunas partes de una expresión antes que otras. Las operaciones entre paréntesis se realizan siempre antes que las de fuera del paréntesis. Sin embargo, entre paréntesis se mantiene la prioridad de los operadores.

RESUMEN DE OPERADORES Las palabras clave del lenguaje Visual Basic y los miembros de las bibliotecas en tiempo de ejecución están organizados por uso y propósito. Acción Aritméticos Asignaci��n Comparación Concatenación Operadores lógicos/bit a bit Varias operaciones

Elemento del lenguaje ^, –, *, /, \, Mod, +, = =, ^=, *=, /=, \=, +=, -=, &= =, <>, <, >, <=, >=, Like, Is &, + Not, And, Or, Xor, AndAlso, OrElse AddressOf, GetType

MOSTRAR CUADROS DE MENSAJE MESSAGEBOX.SHOW (MÉTODO) Un objeto MessageBox es un cuadro de diálogo predefinido que muestra al usuario información relacionada con la aplicación. Los cuadros de mensaje se utilizan también para pedir información al usuario. Para mostrar información al usuario en un cuadro de mensaje 1. Desplácese al lugar donde desee agregar el código para el cuadro de mensaje. 2. Agregue código mediante el método MessageBox.Show.

MSGBOX (FUNCIÓN) Muestra un mensaje en un cuadro de diálogo, espera a que el usuario haga clic en un botón y devuelve un entero que indica el botón utilizado. Public Function MsgBox( ByVal Prompt As Object, Optional ByVal Buttons As MsgBoxStyle = MsgBoxStyle.OKOnly, _ Optional ByVal Title As Object = Nothing) As MsgBoxResult Parámetros Prompt Requerido. Expresión de tipo String que se muestra como mensaje en el cuadro de diálogo. La longitud máxima de Prompt es de aproximadamente 1024 caracteres, según el ancho de los caracteres utilizados. Si Prompt va a tener más de una línea, éstas pueden separarse mediante un carácter de retorno de carro (Chr(13)), un carácter de avance de línea (Chr(10)) o la combinación retorno de carro/avance de línea (Chr(13)) & (Chr(10)) entre cada línea. Buttons Opcional. Expresión numérica que corresponde a la suma de los valores que especifican el número y tipo de botones que se han de mostrar, el estilo de icono que se va a usar, la identificación del botón predeterminado y la modalidad del cuadro de mensaje. Si se omite Buttons, el valor predeterminado será cero. Title Opcional. Expresión de tipo String que se muestra en la barra de título del cuadro de diálogo. Si se omite Title, en la barra de título aparecerá el nombre de la aplicación.

53


Configuración En la siguiente tabla se incluyen los valores de enumeración de MsgBoxStyle: Enumeración OKOnly OKCancel AbortRetryIgnore YesNoCancel YesNo RetryCancel Critical Question Exclamation Información DefaultButton1 DefaultButton2 DefaultButton3 ApplicationModal

0 1 2 3 4 5 16 32 48 64 0 256 512 0

Valor

SystemModal

4096

MsgBoxSetForeground

65536

MsgBoxRight MsgBoxRtlReading

524288 1048576

Descripción Muestra sólo el botón Aceptar. Muestra los botones Aceptar y Cancelar. Muestra los botones Anular, Reintentar y Omitir. Muestra los botones Sí, No y Cancelar. Muestra los botones Sí y No. Muestra los botones Reintentar y Cancelar. Muestra el icono Mensaje crítico. Muestra el icono Consulta de advertencia. Muestra el icono Mensaje de advertencia. Muestra el icono Mensaje de información. El primer botón es el predeterminado. El segundo botón es el predeterminado. El tercer botón es el predeterminado. Aplicación modal: el usuario debe responder al cuadro de mensaje antes de continuar trabajando en la aplicación actual. Sistema modal: se suspenden todas las aplicaciones hasta que el usuario responda al cuadro de mensaje. Especifica la ventana del cuadro de mensaje como ventana de primer plano. Texto alineado a la derecha. Especifica que el texto debe aparecer para ser leído de derecha a izquierda en los sistemas árabe y hebreo.

El primer grupo de valores (0 a 5) describe el número y tipo de botones mostrados en el cuadro de diálogo; el segundo grupo (16, 32, 48, 64) detalla el estilo de icono; el tercero (0, 256, 512) determina el botón predeterminado; el cuarto (0, 4096), la modalidad del cuadro de mensaje; y, por último, el quinto grupo especifica si la ventana del cuadro de mensaje está en primer plano o no, así como la alineación y la dirección que ha de tener el texto. A la hora de sumar números para crear el valor final del argumento Buttons, se deberá utilizar únicamente un número de cada grupo. Valores Devueltos Constante OK Cancel Abort Retry Ignore Yes No

Valor 1 2 3 4 5 6 7

54


INPUTBOX (FUNCIÓN) Muestra un mensaje en un cuadro de diálogo, espera a que el usuario escriba un texto o haga clic en un botón y devuelve una cadena con el contenido del cuadro de texto. Public Function InputBox( _ ByVal Prompt As String, _ Optional ByVal Title As String = "", _ Optional ByVal DefaultResponse As String = "", _ Optional ByVal XPos As Integer = -1, _ Optional ByVal YPos As Integer = -1 _ ) As String Parámetros Prompt Requerido. Expresión de tipo String que se muestra como mensaje en el cuadro de diálogo. La longitud máxima de Prompt es de aproximadamente 1024 caracteres, según el ancho de los caracteres utilizados. Si Prompt va a tener más de una línea, éstas pueden separarse mediante un carácter de retorno de carro (Chr(13)), un carácter de avance de línea (Chr(10)) o la combinación retorno de carro-avance de línea (Chr(13)) & (Chr(10)) entre cada línea. Title Opcional. Expresión de tipo String que se muestra en la barra de título del cuadro de diálogo. Si se omite Title, en la barra de título aparecerá el nombre de la aplicación. DefaultResponse Opcional. Expresión de tipo String que se muestra en el cuadro de texto como respuesta predeterminada en caso de que no se suministre otra entrada. Si se omite DefaultResponse, el cuadro de texto se mostrará vacío. XPos Opcional. Expresión numérica que especifica, en twips, la distancia entre el borde izquierdo del cuadro de diálogo y el borde izquierdo de la pantalla. Si se omite XPos, el cuadro de diálogo quedará centrado horizontalmente. YPos Opcional. Expresión numérica que especifica, en twips, la distancia entre el borde superior del cuadro de diálogo y el borde superior de la pantalla. Si se omite YPos, el cuadro de diálogo se situará, en sentido vertical, a aproximadamente un tercio del alto total de la pantalla.

FORMAT (FUNCIÓN) Devuelve una cadena con el formato que especifiquen las instrucciones contenidas en una expresión String de formato. Public Shared Function Format( _ ByVal Expression As Object, _ Optional ByVal Style As String = "" _ ) As String Parámetros Expression Requerido. Cualquier expresión válida. Style Opcional. Expresión String de formato con nombre o definido por el usuario que es válido. Configuración Para ver información sobre cómo crear el argumento Style, vea el tema correspondiente en la siguiente lista:

55


Para dar formato Números

Haga lo siguiente Utilice formatos numéricos predefinidos o cree formatos numéricos definidos por el usuario. Fechas y horas Utilice formatos de fecha y hora predefinidos o cree formatos de fecha y hora definidos por el usuario. Números de serie de fecha Usar formatos de fecha y hora o numéricos. y hora. Si intenta aplicar formato a un número sin especificar Style, la función Format ofrecerá una funcionalidad similar a la función Str, a pesar de admitir configuraciones internacionales. No obstante, los números positivos a los que se les da formato de cadena mediante la función Format no incluyen ningún espacio inicial reservado para el signo del valor; los que se convierten mediante la función Str sí conservan este espacio inicial. Si da formato a una cadena numérica no localizada, debería utilizar un formato numérico definido por el usuario para asegurarse de lograr la presentación deseada. El método String.Format también proporciona una funcionalidad similar. Ejemplo En este ejemplo se muestran los diversos usos de la función Format para dar formato a valores tanto con formatos String como otros definidos por el usuario. Para el separador de fecha (/), hora (:) e indicadores de a.m./p.m. (t y tt), el formato de salida que muestre su sistema dependerá de la configuración regional que use el código. Cuando las horas y fechas se muestren en el entorno de desarrollo, se utilizará el formato de fecha y hora corta de la configuración regional del código. Dim MiFechaHora As Date = #1/27/2001 5:04:23 PM# Dim MiCad As String ' Devuelve la hora actual del sistema en el formato largo de hora definido por el sistema. MiCad = Format(Now(), "Long Time") ' Devuelve la fecha actual del sistema en el formato largo de hora definido por el sistema. MiCad = Format(Now(), "Long Date") ' También puede devolver la fecha actual del sistema en el formato largo de hora definido por ‘ el sistema, usando el código de la letra simple para el formato MiCad = Format(Now(), "D") MiCad = Format(MiFechaHora, "h:m:s") ' Devuelve "5:4:23". MiCad = Format(MiFechaHora, "hh:mm:ss tt") ' Devuelve "05:04:23 PM". MiCad = Format(MiFechaHora, "dddd, MMM d yyyy") ' Devuelve "Saturday, ' Jan 27 2001". MiCad = Format(MiFechaHora, "HH:mm:ss") ' Devuelve "17:04:23" MiCad = Format(23) ' Devuelve "23". ' Formatos numéricos definidos por el usuario MiCad = Format(5459.4, "##,##0.00") ' Devuelve "5,459.40". MiCad = Format(334.9, "###0.00") ' Devuelve "334.90". MiCad = Format(5, "0.00%") ' Devuelve "500.00%".

56


Guía Práctica No. 3 Formularios Windows OBJETIVOS Al finalizar la práctica, los estudiantes serán capaces de: • Crear y usar variables. • Estructurar sentencias en Visual Basic.Net. • Desarrollar aplicaciones con estructuras secuenciales en Visual Basic.Net. PROCEDIMIENTO EJEMPLO #1 Crear una aplicación que pregunte al usuario su nombre y, una vez contestado, le dé la bienvenida. Digite las siguientes sentencias en el Procedimiento del evento Click del formulario: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim Nombre As String Nombre = InputBox("Cual es su Nombre?") MsgBox("Bienvenid@ " & Nombre, MsgBoxStyle.OKOnly + MsgBoxStyle.Information, "Saludo") End Sub EJEMPLO #2 Crear un formulario con dos botones de comando (cmdInicio y cmdParada), tres etiquetas y tres cajas de texto. Inicialmente, el botón cmdParada estará desactivado. Se pretende que, cuando el usuario pulse el botón cmdInicio, en la caja de texto asociada a la etiqueta lblHInicio, aparezca la hora actual y, al mismo tiempo, se active el botón cmdParada y se desactive el de cmdInicio. Al pulsar el botón cmdParada, se mostrará la hora de parada, el tiempo transcurrido, se desactivará el botón de cmdParada y, se habilitará el de cmdInicio. Modifique las siguientes propiedades: Objeto Form1 Label1

Label2

Label3

Textbox1

Propiedad

Valor

Text

Cronómetro

Name

lblHInicio

Text

Hora actual

Name

LblHParada

Text

Hora de parada

Name

LblTTranscurrido

Text

Tiempo Transcurrido

Name

TxtHInicio

Text

(Vacío)

57


Objeto Textbox2

Textbox3

Button1

Button2

Propiedad

Valor

Name

TxtHParada

Text

(Vacío)

Name

TxtTTranscurrido

Text

(Vacío)

Name

CmdInicio

Text

Inicio

Name

cmdParada

Text

Parada

El código asociado será: Dim HInicio As Date, HParada As Date, Tiempo As TimeSpan Private Sub CmdInicio_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdInicio.Click HInicio = Now TxtHInicio.Text = Format$(HInicio, "hh:mm:ss") CmdInicio.Enabled = False cmdParada.Enabled = True End Sub Private Sub cmdParada_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdParada.Click HParada = Now Tiempo = HParada.Subtract(HInicio) TxtHParada.Text = Format$(HParada, "hh:mm:ss") TxtTTranscurrido.Text = Tiempo.ToString.Substring(0, 8) CmdInicio.Enabled = True cmdParada.Enabled = False End Sub En este ejemplo se deben declarar las variables HInicio, HParada y Tiempo como variables a nivel de formulario (en la sección de declaraciones del formulario) para que sean accedidas desde cualquier procedimiento asociado al formulario. Por tanto, el ámbito de una variable determina qué procedimientos podrán acceder a esa variable. Cualquier sentencia Dim declarada en cualquier procedimiento tiene preferencia con respecto a variables declaradas a nivel de módulo. Siempre que una variable aparece por primera vez, es inicializada al valor por defecto (0 para variables numéricas y cadena vacía para tipo String) Para que una variable mantenga el valor en cada ejecución del procedimiento donde se utiliza, se debe declarar con la instrucción: Static Nombre_Variable [As Tipo] EJEMPLO #3 Crear un formulario con tres cajas de texto, dos etiquetas, un botón de comando y un marco con cinco botones de opción. La aplicación debe operar aritméticamente los dos valores introducidos por el usuario en las primeras dos cajas de texto y mostrarlos en la 3ª caja de texto. La aplicación debe estar preparada para que: el usuario pueda escoger la operación aritmética a realizar, la caja de texto que muestre el resultado no pueda ser accesible al pulsar la tecla TAB y deberá estar desactivada, y según la operación a realizar se muestre el operador correspondiente. El formulario deberá tener la apariencia siguiente:

58


El código a introducir deberá ser el siguiente: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click End End Sub Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load MsgBox("Asegúrese que el valor del segundo operando no sea cero.", _ vbOKOnly + vbInformation, "Advertencia") End Sub Private Sub RadioButton1__Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.Click Dim N1 As Single, N2 As Single N1 = TextBox1.Text N2 = TextBox2.Text TextBox3.Text = N1 + N2 Label1.Text = "+" End Sub Private Sub RadioButton2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadioButton2.Click TextBox3.Text = TextBox1.Text - TextBox2.Text Label1.Text = "-" End Sub Private Sub RadioButton3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadioButton3.Click TextBox3.Text = TextBox1.Text * TextBox2.Text Label1.Text = "*" End Sub Private Sub RadioButton4_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadioButton4.Click TextBox3.Text = TextBox1.Text / TextBox2.Text Label1.Text = "/" End Sub

59


EJERCICIOS PROPUESTOS Escriba una aplicación en Visual Basic.Net usando variables para lo que se pide. 1. 2. 3. 4.

Dados el largo y ancho de un rectángulo, calcule su perímetro y su área. Convertir una cantidad dada en pulgadas a centímetros, metros y kilómetros. (1 plg= 2.54 cm). Determine el promedio de tres números dados. Obtenga la edad en meses de una persona dada su edad en años y meses (por ejemplo: 3 años y 4 meses produce 40 meses como solución al problema). 5. Determine el impuesto local dado al ingreso. La regla es: el 5% de la parte del ingreso que exceda de $1000. (Suponga que el ingreso es cuando menos de $1000.) 6. Convierta una velocidad expresada en kilómetros por hora a metros por segundo. 7. Escriba un programa en Visual Basic.Net que lea el peso actual, las calorías quemadas por día, el objetivo de peso y las calorías ingeridas por día de una persona. Calcule e imprima el número de días que tardará la persona en alcanzar su objetivo de peso mediante el uso de la relación: 3,500 calorías = 1 libra.

60


Clase Teórica No. 4 Estructuras de Control (Parte 1) Estructuras Condicionales OBJETIVOS • Construir Estructuras de Decisión Simples, Dobles y Múltiples.

DESARROLLO DE CLASE

ESTRUCTURAS DE DECISIÓN Visual Basic permite probar condiciones y realizar diferentes operaciones en función de los resultados de la prueba. Puede comprobar si una condición es verdadera o falsa, los distintos valores de una expresión o las diferentes excepciones que se generan al ejecutar una serie de instrucciones. Las Instrucciones de Decisión que admite Visual Basic incluyen: • If...End If • Select Case…End Select • Try...Catch...Finally

IF...END IF La sintaxis de esta estructura puede aplicarse de diferentes formas en función del tipo de decisión a resolver.

DECISIÓN SIMPLE. La sintaxis de decisión simple se muestra en el Código fuente 1. If Expresión Then ' código ' ...... ' ...... End If Código fuente 1 Si al evaluar Expresión se devuelve como resultado Verdadero, se ejecutarán las líneas o bloque de código comprendido entre If y End If. Si Expresión es Falso, se desviará la ejecución a la primera línea de código que haya después de End If. Veamos un ejemplo en el C��digo fuente 2. Sub Main() Dim Valor As Integer Console.WriteLine("Introducir un número") Valor = Console.ReadLine() If Valor = 5 Then Console.WriteLine("Estamos dentro de la estructura If," & _ " ya que su expresión devuelve Verdadero") End If Console.ReadLine() End Sub Código fuente 2

61


DECISIÓN SIMPLE EN UNA LÍNEA. En el caso de que sólo haya que ejecutar una instrucción sencilla cuando se cumple la expresión de la estructura, podemos omitir la palabra clave End If, escribiendo la sentencia a ejecutar en la misma línea de la declaración de la estructura If, justo a continuación de la palabra Then. La sintaxis en este caso, se simplifica, como muestra el Código fuente 3. If Expresión Then Instrucción Código fuente 3 Veamos un ejemplo en el Código fuente 4. Sub Main() Dim Valor As Integer Dim Resultado As Integer Console.WriteLine("Introducir un número") Valor = Console.ReadLine() If Valor = 5 Then Resultado = Valor + 10 Console.WriteLine("La variable resultado contiene {0}", Resultado) Console.ReadLine() End Sub Código fuente 4 Como se habrá comprobado, la sentencia que hay a continuación de Then sólo se ejecutará cuando la variable Valor contenga 5.

DECISIÓN DOBLE. Además de ejecutar un bloque de código cuando la expresión valga Verdadero, podemos también ejecutar código cuando la expresión devuelva Falso. En este caso añadiremos a la estructura la palabra clave Else, como muestra la sintaxis del Código fuente 5. If Expresión Then ' código cuando Expresión es Verdadero ' ...... ' ...... Else ' código cuando Expresión es Falso ' ...... ' ...... End If Código fuente 5 Veamos un ejemplo en el Código fuente 6. Sub Main() Dim Valor As Integer Dim Resultado As Integer Console.WriteLine("Introducir un número") Valor = Console.ReadLine() If Valor = 5 Then Resultado = Valor + 10 Else Resultado = 777 End If Console.WriteLine("La variable resultado contiene {0}", Resultado) Console.ReadLine() End Sub Código fuente 6

62


En este ejemplo, cuando Valor contenga 5 se ejecutará el bloque de código que hay a continuación de If, pero cuando Valor contenga un número distinto, se ejecutará el código que hay a continuación de Else. La ejecución en cualquier caso, continuará después a partir de la siguiente línea que haya a partir de la palabra clave End If.

DECISIÓN DOBLE EN UNA LÍNEA. Al igual que ocurre con la decisión simple, si para cada resultado de la expresión, sólo necesitamos ejecutar una instrucción, podemos escribir todo el código en una sola línea. Veamos la sintaxis en el Código fuente 7. If Expresión Then InstrucciónVerdadero Else InstrucciónFalso Código fuente 7 En el Código fuente 8 tenemos un ejemplo de uso. Sub Main() Dim Valor As Integer Dim Resultado As Integer Console.WriteLine("Introducir un número") Valor = Console.ReadLine() If Valor = 5 Then Resultado = Valor + 10 Else Resultado = 777 Console.WriteLine("La variable resultado contiene {0}", Resultado) Console.ReadLine() End Sub Código fuente 8 Si bien la ejecución de la estructura If en una línea puede ser útil en ocasiones, tiene como contrapartida el que nuestro código se vuelva más difícil de leer. Por ello es más recomendable el uso de esta estructura de control en su formato If...End If.

DECISIÓN MÚLTIPLE. En el caso de que la expresión principal a evaluar devuelva Faso, podemos agregar expresiones adicionales utilizando la palabra clave ElseIf, con su bloque de código respectivo. En el caso de que ninguna de ellas se cumplan, podemos incluir un Else, para ejecutar un bloque de código por defecto. Veamos la sintaxis en el Código fuente 9. If ExpresiónA Then ' código cuando ExpresiónA es Verdadero ' ....... ElseIf ExpresiónB Then ' código cuando ExpresiónB es Verdadero ' ....... [ElseIf ExpresiónN Then] ' código cuando ExpresiónN es Verdadero ' ....... [Else] ' código cuando ninguna epxresión devuelve Verdadero ' ....... End If Código fuente 9 A continuación vemos un ejemplo en el Código fuente 10.

63


Sub Main() Dim Valor As Integer Dim Resultado As Integer Console.WriteLine("Introducir un número") Valor = Console.ReadLine() If Valor = 5 Then Resultado = Valor + 10 ElseIf Valor > 100 Then Resultado = Valor + 200 ElseIf Valor < 1 Then Resultado = -8 Else Resultado = 777 End If Console.WriteLine("La variable Resultado contiene {0}", Resultado) Console.ReadLine() End Sub Código fuente 10 En esta situación, si la primera expresión es Verdadero, se ejecutará el código situado a partir de If. Sin embargo, si If devuelve Falso, se comprobarán sucesivamente las expresiones de cada uno de los ElseIf existentes. En el caso de algún ElseIf devuelva Verdadero, se ejecutará el código que haya a partir del mismo. Si ninguna de las anteriores situaciones se cumple, se ejecutará el código que haya a partir de Else en el caso de que este se haya definido.

SELECT CASE...END SELECT Se trata de una evolución en la estructura If...End If de decisión múltiple, y su trabajo consiste en evaluar una expresión y comparar el resultado con la lista de expresiones de cada uno de los casos proporcionados. El Código fuente 11 muestra la sintaxis. Select Case Expresión Case ListaExpresionesA ' código si se cumple ListaExpresionesA ' ..... [Case ListaExpresionesB] ' código si se cumple ListaExpresionesB ' ..... [Case Else] ' código si no se cumple ninguna ListaExpresiones ' ..... End Select Código fuente 11 La lista de expresiones asociada a cada Case en esta estructura estará separada por comas y podrá tener alguno de los siguientes formatos: • Expresión. • ExpresiónMenor To ExpresiónMayor • Is OperadorComparación Expresión Tras evaluar la expresión de la estructura, si se encuentra una coincidencia con alguno de los Case, se ejecuta el bloque de código situado entre dicho Case y el siguiente. En caso de que no haya ninguna coincidencia, podemos opcionalmente, ejecutar un bloque por defecto, utilizando la palabra clave

64


Case Else. Finalizada esta estructura, la ejecución continuará a partir de la línea situada después de End Select. Veamos a continuación, en el Código fuente 12 un ejemplo de uso de esta estructura. Sub Main() Dim Valor As Integer Console.WriteLine("Introducir un número") Valor = Console.ReadLine() Select Case Valor Case 5 Console.WriteLine("El valor es 5") Case 120, 250 Console.WriteLine("El valor es 120 ó 250") Case 3000 To 4000 Console.WriteLine("El valor está en el rango de 3000 a 4000") Case Is < 10 Console.WriteLine("El valor es menor de 10") Case Else Console.WriteLine("El valor es {0}, y no se cumple ningún caso", Valor) End Select Console.ReadLine() End Sub Código fuente 12 En el caso de que tras evaluar la expresión, haya más de un Case cuya lista de expresiones se cumpla, se ejecutará el que esté situado en primer lugar. En el ejemplo anterior, cuando la variable Valor contiene 5, se cumplen dos casos. Ver Código fuente 13. Case 5 Console.WriteLine("El valor es 5") ' ..... ' ..... Case Is < 10 Console.WriteLine("El valor es menor de 10") Código fuente 13 Sin embargo sólo se ejecuta el código del primer Case. Por otro lado, la lista de expresiones puede ser una combinación de los distintos formatos disponibles. Ver Código fuente 14. Case 12 To 15, 4, 7, Is > 20 Código fuente 14

TRY...CATCH...FINALLY Puede utilizar la instrucción Try...Catch...Finally para el control estructurado de excepciones. Así puede ejecutarse un bloque concreto de instrucciones si se produce una excepción especificada mientras se ejecuta el código. Cuando esto ocurre, se dice que el código provoca la excepción, que se detecta con la instrucción Catch correspondiente. La ejecución entra en el bloque Try...Catch...Finally con el bloque de instrucciones que sigue a la instrucción Try. Si Visual Basic finaliza este bloque sin que se genere una excepción, busca la

65


instrucción opcional Finally al final del bloque. Si ha proporcionado la instrucción Finally, Visual Basic ejecuta el bloque de instrucciones que está a continuación de dicha instrucción. En cualquier caso, a continuación el control se transfiere a la instrucción que sigue a la instrucción End Try. Si se produce una excepción, Visual Basic examina las instrucciones Catch en el orden en que aparecen dentro de Try...Catch...Finally. Si encuentra una instrucción Catch que controla la excepción generada, ésta ejecuta el bloque de instrucciones correspondiente. Cuando termina de ejecutar el bloque Catch, ejecuta el bloque Finally si existe. Después, la ejecución continúa en la instrucción que sigue a End Try. Una instrucción Catch controla una excepción que es del mismo tipo que el declarado en la instrucción Catch o de un tipo derivado de éste. Si se incluye una instrucción Catch que no especifica un tipo de excepción, ésta controlará cualquier excepción derivada de la clase Exception. Si tal instrucción es la última instrucción Catch, puede detectar cualquier excepción no controlada en los bloques Catch anteriores. Una instrucción Catch puede incluir opcionalmente la cláusula When, independientemente de que especifique o no un tipo de excepción. La cláusula When va seguida de una expresión que debe poder convertirse a tipo Boolean. La excepción sólo se controla si es del tipo correcto y la expresión When se evalúa como True, como en el ejemplo siguiente: Catch Exc As System.NotSupportedException When SupportCheck >= 1 Si se incluye la instrucción opcional Finally, el bloque de instrucciones correspondiente es siempre el último código que se ejecuta inmediatamente antes de que el control abandone Try...Catch...Finally. Esto es así, aunque se produzca una excepción no controlada o se ejecute una instrucción Exit Try. Puede utilizarse cualquier número de instrucciones Catch e incluirse u omitirse una instrucción Finally. No obstante, debe utilizarse al menos una instrucción Catch o una instrucción Finally. No es posible bifurcar fuera de un bloque Try, en un bloque Catch o dentro o fuera de un bloque Finally. Puede bifurcar de un bloque Catch a un bloque Try asociado con ese bloque Catch. Por ejemplo, si una construcción Try...Catch...Finally está anidada dentro de otra, un bloque Catch puede bifurcar al bloque Try de su propio nivel de anidamiento, pero no a ningún otro bloque Try. En el Código fuente 15, Try...Catch...Finally intenta calcular la fecha y la hora de 100 años exactamente a partir del valor que se proporciona en la variable GivenDate de Object: Dim GivenDate As Object ' Should contain date/time information. Dim NextCentury As Date Try NextCentury = DateAdd("yyyy", 100, GivenDate) Catch ThisExcep As System.ArgumentException ' At least one argument has an invalid value. Catch ThisExcep As ArgumentOutOfRangeException ' The result is later than December 31, 9999. Catch ThisExcep As InvalidCastException ' GivenDate cannot be interpreted As a date/time. Catch ' An unforeseen exception has occurred. Finally ' This block is always executed before leaving. End Try Código fuente 15

66


Las excepciones que se pueden prever a partir de la función DateAdd se pueden controlar en los tres primeros bloques Catch, además se puede tratar cualquier excepción imprevista en el último bloque Catch. Con independencia de lo que suceda, el bloque Finally es siempre el código que se ejecuta en último lugar antes de abandonar Try...Catch...Finally. Si ThisExcep no aparece en una instrucción de declaración como Dim, la instrucción Catch con la cláusula As sirve como declaración de la variable de excepción.

67


Guía Práctica No. 4 Estructuras de Control (Parte 1) Estructuras Condicionales

OBJETIVOS Al finalizar la práctica, los estudiantes serán capaces de: • Elaborar condiciones simples y compuestas. • Diseñar aplicaciones con estructuras selectivas en Visual Basic.Net.

PROCEDIMIENTO EJEMPLO #1 Crear un formulario que actúe como un reloj despertador, de forma que visualice la hora actual y, si el usuario ha activado la alarma, cuando la hora actual sea la misma que la alarma, se debe emitir un pitido. Para ello, añadiremos los siguientes controles al formulario. CONTROL

PROPIEDAD

VALOR

Label

Text

(ninguno)

Name

LblPantalla

BorderStyle

Fixed Single

Label

Text

Alarma

TextBox

Text

(ninguno)

Name

TxtAlarma

Text

Alarma On

Name

OptAlarmaOn

Text

Alarma Off

Name

OptAlarmaOff

Checked

True

Interval

1000

Name

TmrReloj

Enabled

True

RadioButton

RadioButton

Timer

Inicialmente, la alarma debe estar desactivada y no se permitirán valores distintos del carácter ‘:’ o cualquier dígito. El código asociado será: Dim AlarmaOn As Bolean

68


Private Sub OptAlarmaOff_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles OptAlarmaOff.Click

AlarmaOn = False

End Sub

Private Sub OptAlarmaOn_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles OptAlarmaOn.Click

AlarmaOn = True

End Sub

Private Sub TmrReloj_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TmrReloj.Tick 'Comprobar si la alarma > hora actual On Error Resume Next If TxtAlarma.Text <> "" And TxtAlarma.Text.Length > 4 And AlarmaOn Then If (TimeOfDay() >= TxtAlarma.Text) Then Beep() End If End If LblPantalla.Text = TimeOfDay() End Sub Private Sub TxtAlarma_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtAlarma.KeyPress 'Comprobar que se escriben dígitos, el carácter : o backspace Dim CodigoAscii As Integer CodigoAscii = Asc(e.KeyChar) If Not (e.KeyChar.IsDigit(e.KeyChar)) Then If e.KeyChar <> ":" And CodigoAscii <> 8 Then Beep() e.Handled = True ' End If End If End Sub Modificar el ejercicio anterior para que suene la alarma 5 segundos. NOTA: Cada vez que el usuario presiona una tecla, se generan los eventos KeyDown, KeyUp y KeyPress. Los eventos KeyDown y KeyUp se producen cuando el usuario presiona o libera una tecla y KeyPress se produce cuando se presiona una tecla, se manejan parámetros que son sender que es un objeto y e que contiene métodos y propiedades que maneja lo que se ha digitado. EJEMPLO #2 Se desarrollará un programa que permita la entrada del salario de una persona y dependiendo de la cantidad ingresada así será el descuento aplicado. El descuento se realiza de acuerdo a la siguiente tabla: Salario Descuento 0 – 99

15%

100 – 199

20%

200 – 299

25%

300 – 399

30%

Mayor o igual a 400

35%

69


Haga un formulario como el siguiente:

En el botón Aplicar Descuento ingrese el siguiente código: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim salario As Double, descuento As Double, salario_neto As Double salario = Val(TextBox1.Text) Select Case salario Case 0 To 99.99 descuento = 0.15 Case 100 To 199.99 descuento = 0.2 Case 200 To 299.99 descuento = 0.25 Case 300 To 399.99 descuento = 0.35 Case Is >= 400 descuento = 0.4 Case Else MsgBox("La cantidad no es válida") descuento = 0 End Select salario_neto = salario - salario * descuento TextBox2.Text = Format(descuento, "0%") TextBox3.Text = Format(salario_neto, "$0.00") End Sub

EJERCICIOS PROPUESTOS. 1.

Diseñe un programa que dado el valor del ingreso de una persona calcule e imprima el impuesto que le corresponde de acuerdo a la siguiente tabla: Ingreso Menos de $10,000 $10,000 ó más, pero menos de $15,000 $15,000 ó más

Impuesto 0 7% del ingreso superior a los $10,000 $700, más el 10% del ingreso superior a los $15,000

70


2.

Calcule la cuenta de un cliente para un pedido de cierta cantidad de un producto. Se supone que sólo se dispone de cuatro productos, entre ellos: Código de producto Precio unitario 100 24.03 247 105.00 16 10.35 240 16.00 Se puede hacer un descuento en un pedido grande: Si la Cuenta total es de $1,000.00 ó más, se hace un descuento del 2%; de $800.00 a $999.99 obtiene un descuento del 1%.

3.

Escribir un programa que determine si un año es bisiesto. Un año es bisiesto si es múltiplo de 4 (por ejemplo, 1984). Los años múltiplos de 100 no son bisiestos, salvo si ellos son también múltiplos de 400 (2000 es bisiesto, 1800 no lo es).

4.

Dados tres números enteros distintos, determinar cuál es el mayor, el menor y el intermedio. Plantee dos soluciones: ! Usando s��lo operadores relacionales. ! Usando operadores relacionales y lógicos.

5.

Dados tres números enteros que representan un triángulo. Escriba un programa que determine el tipo de triángulo que es y calcule su área por medio de las siguientes fórmulas: S=(A+B+C)/2 AREA=Sqr(S*(S-A)*(S-B)*(S-C)) Tome en cuenta que: ! Para que sea triángulo, la suma de sus dos lados menores debe ser mayor que su lado más grande. ! Si tres lados son iguales, es equilátero. ! Si dos lados son iguales, es isósceles. ! Si ningún lado es igual, es escaleno.

71


Clase Teórica No 5 Estructuras de Control (Parte 2) Estructuras Repetitivas o de Bucle OBJETIVOS • Desarrollar lógica de programación con estructuras repetitivas y en función del tiempo. • Estructurar aplicaciones en las que se conoce o no la cantidad de iteraciones a efectuar en determinados procesos

DESARROLLO DE CLASE

ESTRUCTURAS DE BUCLES Las estructuras de bucles permiten ejecutar una o más líneas de código repetitivamente. Una instrucción puede repetirse hasta que una condición sea verdadera, hasta que sea falsa, un número de veces especificado o una vez para cada objeto de una colección. Las estructuras de bucles que admite Visual Basic incluyen: • • • •

While… End While Do...Loop For...Next For Each...Next

WHILE … END WHILE Se trata del tipo más sencillo, ejecuta las líneas de código que contiene, mientras que la expresión situada junto a While devuelva Verdadero. Veamos su sintaxis en el Código fuente 1. While Expresión ‘ código ' ..... End While Código fuente 1 Se puede utilizar la instrucción While para ejecutar un bloque de instrucciones, un número de veces indefinido, dependiendo del valor de tipo Boolean de una condición. Las instrucciones se repiten mientras la condición sea True. Generalmente, la condición es el resultado de comparar dos valores, pero también puede ser cualquier expresión que da como resultado un valor de tipo Boolean (True o False). Esto incluye los valores de otros tipos de datos, como los numéricos, que han sido convertidos a valores de tipo Boolean. La instrucción While comprueba siempre la condición antes de iniciar el bucle. La ejecución en bucle continúa mientras el valor de la condición permanezca en True. En el Codigo fuente 2, el procedimiento ChequearWhile comprueba la condición antes de entrar en el bucle. Si Numero se hubiera inicializado en 6 y no en 10, las instrucciones del bucle nunca se ejecutarían. Sub ChequearWhile() Dim Contador As Integer = 0 Dim Numero As Integer = 10 While Numero > 6 Numero = Numero - 1 Contador = Contador + 1 End While MsgBox("El proceso se ejecuto " & Contador & " veces.") ' Ejecuta 4 veces. End Sub

72


Código fuente 2 Puede transferirse el control fuera de una instrucción While mediante la instrucción Exit While. Un uso de esta instrucción consiste en comprobar una condición que pudiera ocasionar un bucle sin fin; es decir, un bucle que pudiera ejecutarse un número extremadamente elevado de veces e incluso infinitamente. Si la condición es True, utilice Exit While para salir. Si la condición es False, el bucle continúa ejecutándose. En el Codigo fuente 3 se asigna a Numero un valor que podría ocasionar que el bucle se ejecutara más de 2 ^ 31 veces. La instrucción If realiza esta comprobación y sale si existe el valor para evitar un bucle sin fin. Sub ExitWhileExample() Dim Contador As Integer = 0 Dim Numero As Integer = 8 While Numero <> 10 If Numero < 0 Then Exit While Numero = Numero - 1 Contador = Contador + 1 End While MsgBox("El proceso se ejecuto " & Contador & " veces.") ' Ejecuta 9 veces. End Sub Código fuente 3 Nota. Para detener un bucle sin fin, presione ESC o CTRL+INTER.

DO … LOOP Esta estructura ejecuta un conjunto de líneas de código, en función del valor devuelto por una expresión, que a modo de condición, podemos situar al comienzo o final de la estructura. Puede utilizar instrucciones Do...Loop para ejecutar un bloque de instrucciones un número de veces indefinido dependiendo del valor de tipo Boolean de una condición. Las instrucciones pueden repetirse mientras el valor de la condición sea True o hasta que sea True. Generalmente, la condición es el resultado de comparar dos valores, pero también puede ser cualquier expresión que da como resultado un valor de tipo Boolean (True o False). Esto incluye los valores de otros tipos de datos, como los numéricos, que han sido convertidos a valores de tipo Boolean.

REPETIR INSTRUCCIONES MIENTRAS UNA CONDICIÓN ES TRUE Hay dos maneras de utilizar la palabra clave While para comprobar una condición en un bucle Do. Puede comprobar la condición antes de entrar en el bucle o comprobarla después de que el bucle se haya ejecutado al menos una vez. La ejecución en bucle continúa mientras el valor de la condición permanezca en True. En el Código fuente 4, el procedimiento CheckWhileFirst comprueba la condición antes de entrar en el bucle. Si Numero se hubiera inicializado en 6 y no en 10, las instrucciones del bucle nunca se ejecutarían. En el procedimiento CheckWhileLast, las instrucciones del bucle se ejecutan una vez antes de comprobar la condición, que es False en la primera prueba. Sub CheckWhileFirst() Dim Contador As Integer = 0 Dim Numero As Integer = 10 Do While Numero > 6 Numero = Numero - 1 Contador = Contador + 1 Loop MsgBox("El proceso se ejecuto " & Contador & " veces.") ' Ejecuta 4 veces. End Sub ' ... ' ...

73


' ... Sub CheckWhileLast() Dim Contador As Integer = 0 Dim Numero As Integer = 5 Do Numero = Numero - 1 Contador = Contador + 1 Loop While Numero > 6 MsgBox("El proceso se ejecuto " & Contador & " veces.") ' Ejecuta 1 vez. End Sub Código fuente 4

REPETIR INSTRUCCIONES HASTA QUE UNA CONDICIÓN SEA TRUE Hay dos maneras de utilizar la palabra clave Until para comprobar una condición en un bucle Do. Puede comprobar la condición antes de entrar en el bucle o comprobarla después de que el bucle se haya ejecutado al menos una vez. La ejecución en bucle continúa mientras la condición permanezca en False. En el Codigo fuente 5, el procedimiento CheckUntilFirst comprueba la condición antes de entrar en el bucle. Si Numero se hubiera inicializado en 15 y no en 20, las instrucciones del bucle nunca se ejecutarían. En el procedimiento CheckWhileLast, las instrucciones del bucle se ejecutan una vez antes de comprobar la condición, que es False en la primera prueba. Sub CheckUntilFirst() Dim Contador As Integer = 0 Dim Numero As Integer = 20 Do Until Numero = 15 Numero = Numero - 1 Contador = Contador + 1 Loop MsgBox("El proceso se ejecuto " & Contador & " veces.") ' Ejecuta 5 veces. End Sub ' ... Sub CheckUntilLast() Dim Contador As Integer = 0 Dim Numero As Integer = 20 Do Numero = Numero - 1 Contador = Contador + 1 Loop Until Numero = 15 MsgBox("El proceso se ejecuto " & Contador & " veces.") ' Ejecuta 5 veces. End Sub Código fuente 5

SALIR DE UN BUCLE DO DESDE DENTRO DEL BUCLE Puede transferirse el control fuera de un bucle Do mediante la instrucción Exit Do. Un uso de esta instrucción consiste en comprobar una condición que pudiera ocasionar un bucle sin fin; es decir, un bucle que pudiera ejecutarse un número extremadamente elevado de veces e incluso infinitamente. Si la condición es True, utilice Exit Do para salir. Si la condición es False, el bucle continúa ejecutándose. En el siguiente ejemplo se asigna a Numero un valor que podría ocasionar que el bucle se ejecutara más de 2 ^ 31 veces. La instrucción If realiza esta comprobación y sale si existe el valor para evitar un bucle sin fin. Sub ExitDoExample() Dim Contador As Integer = 0 Dim Numero As Integer = 8

74


Do Until Numero = 10 If Numero <= 0 Then Exit Do Numero = Numero - 1 Contador = Contador + 1 Loop MsgBox("El proceso se ejecuto " & Contador & " veces.") ' Ejecuta 8 veces. End Sub Código fuente 6 Nota. Para detener un bucle sin fin, presione ESC o CTRL+INTER.

REEMPLAZAR LA INSTRUCCIÓN CONTINUE Visual Basic .NET no admite la instrucción Continue de anteriores versiones de Visual Basic. Sin embargo, es posible obtener la misma funcionalidad si se utiliza una etiqueta de instrucción en la instrucción Loop y se bifurca hacia ella desde el interior del bucle: Dim LoopCounter As Integer = 0 Do While LoopCounter < 100 LoopCounter += 1 Dim SaltarProximaIteracion As Boolean If SaltarProximaIteracion = True Then GoTo EndOfLoop EndOfLoop: Loop ' Acts like Continue. Código fuente 7

FOR … NEXT Los bucles Do funcionan bien cuando no se sabe de antemano cuántas veces se necesitan ejecutar las instrucciones en el bucle. No obstante, si tiene previsto ejecutar el bucle un número específico de veces, un bucle For...Next es una opción mejor. A diferencia de un bucle Do, un bucle For utiliza una variable denominada contador cuyo valor aumenta o disminuye cada vez que se repite el bucle. La sintaxis es la siguiente: For contador [ As datatype ] = inicio To fin [ Step paso ] ' código ' ...... [Exit For] ' código ' ...... Next [ contador ] La variable contador debe ser un tipo de datos numérico que admita los operadores mayor o igual que (>=), menor o igual que (<=) y suma (+); generalmente es de tipo Integer. Los valores de iteración inicio, fin, y paso son expresiones que deben evaluarse como tipos de datos que se amplían al tipo de contador. Normalmente también son Integer. El valor opcional paso puede ser positivo o negativo. Si se omite, se considera que es 1. Si contador no está declarado fuera del bucle, puede utilizar la cláusula As para declararla como parte de la instrucción For. Al iniciarse la ejecución del bucle For...Next, Visual Basic evalúa inicio, fin, y paso. Después asigna inicio a contador. Antes de ejecutar el bloque de instrucciones, compara contador con fin. Si contador ya ha superado el valor final, el bucle For finaliza y el control pasa a la instrucción que sigue a Next. En caso contrario, se ejecuta el bloque de instrucciones. Cada vez que Visual Basic encuentra la instrucción Next, incrementa el contador según el valor de step y vuelve a la instrucción For. Vuelve a comparar el contador con fin, y una vez más ejecuta el

75


bloque o termina el bucle dependiendo del resultado. Este proceso continúa hasta que el contador supera fin o se ejecuta una instrucción Exit For. El bucle no termina hasta que contador haya superado el valor final. Si contador es igual a fin, el bucle continúa. La comparación que determina si se ejecuta el bloque es contador <= fin si step es positivo y contador >= fin si step es negativo. Opcionalmente, puede especificarse contador en la instrucción Next. De este modo mejora la legibilidad del programa. La variable que especifique debe ser igual a la que aparece en la instrucción For. El procedimiento siguiente preestablece todos los elementos de una matriz en 128. La instrucción For especifica la variable contadora I y sus valores inicio y fin. La instrucción Next incrementa el contador en 1, porque no se proporciona step. Sub Preset(ByRef A() As Integer) Dim I As Integer For I = 0 To UBound(A) A(I) = 128 Next I End Sub Código fuente 8 Los valores de iteración start, end y step sólo se evalúan una vez, antes de iniciarse el bucle. Si el bloque de instrucciones cambia end o step, estos cambios no afectan a la iteración del bucle. En el ejemplo anterior, la función UBound sólo se invoca cuando la instrucción For se ejecuta por primera vez. Si el bloque de instrucciones hubiera cambiado posteriormente la longitud de la matriz A, el bucle For seguiría utilizando la longitud original como valor final, puesto que no vuelve a llamar a la función UBound

AUMENTAR Y DISMINUIR LA VARIABLE DE CONTADOR Mediante la palabra clave Step, puede aumentar o disminuir el contador en el valor que especifique. En el siguiente ejemplo, la variable de contador J se incrementa en 2 cada vez que se repite el bucle. Cuando finaliza el bucle, Total es la suma de 2, 4, 6, 8 y 10. Sub TwosTotal() Dim J, Total As Integer For J = 2 To 10 Step 2 Total = Total + J Next J MsgBox("El total es " & Total) End Sub Código fuente 9 Para disminuir la variable de contador, utilice un valor negativo para Step. Cuando haga esto, debe especificar un valor final que sea menor que el valor de inicio. En el siguiente ejemplo, la variable de contador N disminuye en 2 cada vez que se repite el bucle. Cuando finaliza el bucle, Total es la suma de 16, 14, 12, 10, 8, 6 y 4. Sub NewTotal() Dim N, Total As Integer For N = 16 To 4 Step -2 Total = Total + N Next N MsgBox("El total es " & Total) End Sub Código fuente 10

76


SALIR DE UN BUCLE FOR...NEXT ANTES DE QUE EL CONTADOR SUPERE SU VALOR FINAL Puede salir de un bucle For...Next antes de que el contador supere su valor final utilizando la instrucción Exit For. Por ejemplo, puede desear salir de un bucle si detecta una condición que hace que sea innecesario o no se pueda continuar la iteración, como puede ser un valor erróneo o una solicitud de finalización. Asimismo, si detecta una excepción en Try...Catch...Finally, puede utilizar Exit For al final del bloque Finally.

FOR EACH...NEXT El bucle For Each...Next es parecido al bucle For...Next, pero ejecuta el bloque de instrucciones una vez por cada elemento de una colección, en vez de un número de veces especificado. La sintaxis es la siguiente: For Each variable_elemento [ As datatype ] In collection ' código ' ...... [Exit For] ' código ' ...... Next [variable_elemento ] Los elementos de collection pueden ser de cualquier tipo de datos. El tipo de datos de variable_elemento ha de ser tal que cada elemento de la colección pueda ser convertido al mismo. Si variable_elemento no está declarada fuera del bucle, puede utilizar la cláusula As para declararla como parte de la instrucción For Each. Para cada iteración del bucle, Visual Basic establece la variable variable_elemento en uno de los elementos de la colección y ejecuta el bloque de instrucciones. Cuando todos los elementos de la colección han sido asignados a variable_elemento, el bucle For Each finaliza y el control pasa a la instrucción que sigue a Next. Opcionalmente, puede especificarse la variable de elemento en la instrucción Next. De este modo mejora la legibilidad del programa. La variable que especifique debe ser igual a la que aparece en la instrucción For Each. El siguiente procedimiento acepta un formulario y establece el color de fondo de cada control del formulario en azul claro: Sub LightBlueBackground(ByVal ThisForm As System.Windows.Forms.Form) Dim ThisControl As System.Windows.Forms.Control For Each ThisControl In ThisForm.Controls ThisControl.BackColor = System.Drawing.Color.LightBlue Next ThisControl End Sub Código fuente 11 La colección debe ser un objeto que implemente la interfaz IEnumerable del espacio de nombres System.Collections. IEnumerable define el método GetEnumerator, que devuelve un objeto enumerador para la colección. El objeto enumerador expone la propiedad Current y el método MoveNext. Visual Basic utiliza éstos para recorrer la colección. El tipo de datos de los elementos devueltos por Current debe ser convertible al tipo de datos de variable_elemento.

MODIFICAR ELEMENTOS La propiedad Current del objeto enumerador es ReadOnly y devuelve una copia local de cada elemento de la colección. Esto significa que no es posible modificar los propios elementos en un bucle For Each...Next. Cualquier modificación que haga afectará sólo a la copia local de Current y no se verá reflejada de nuevo en la colección. Sin embargo, si un elemento es un tipo de referencia, es posible

77


modificar los miembros de la instancia a los que apunta. Esta es la razón por la cual, en el ejemplo anterior, se puede modificar el miembro BackColor de cada elemento ThisControl, aunque no se pueda modificar el propio ThisControl.

ACCESO A MATRICES Dado que System.Array implementa la interfaz IEnumerable, todas las matrices exponen el método GetEnumerator. Esto significa que es posible recorrer una matriz con un bucle For Each...Next. Sin embargo, sólo podrá leer los elementos de la matriz, no modificarlos. El propósito del siguiente procedimiento es calcular la suma de los elementos de una matriz y reiniciar cada elemento a cero: Function SumAndReset(ByRef A() As Integer) As Integer Dim Elt As Integer Dim Sum As Integer = 0 For Each Elt In A Sum += Elt Elt = 0 Next Elt Return Sum End Function Código fuente 12 La suma funciona según lo esperado, porque se basa sólo en leer los elementos. Sin embargo, la reinicialización a cero no funciona según lo esperado, porque sólo se reinicia a cero la copia local mientras los elementos originales permanecen sin modificar en la colección.

ALTERAR LA COLECCIÓN El objeto enumerador no permite alterar la colección mediante la adición, eliminación, sustitución o reordenación de elementos. Si altera la colección después de haber iniciado un bucle For Each...Next, el objeto enumerador deja de ser válido y el siguiente intento de acceso a un elemento produce una excepción InvalidOperationException.

RECORRER LA COLECCIÓN Cuando se ejecuta un bucle For Each...Next, el recorrido de la colección está bajo el control del objeto enumerador devuelto por el método GetEnumerator. El orden de recorrido no lo determina Visual Basic, sino el método MoveNext del objeto enumerador. Esto significa que tal vez no pueda predecir qué elemento de la colección es el primero que se devuelve en variable_elemento o qué elemento es el siguiente en ser devuelto tras un elemento dado. Si el código utilizado depende del recorrido de una colección en un orden concreto, un bucle For Each...Next no es la mejor opción a menos que conozca las características del objeto enumerador que expone la colección. Es posible que obtenga resultados más confiables si utiliza un bucle diferente, tal como For...Next o Do...Loop.

SALIR DE UN BUCLE FOR EACH...NEXT ANTES DE TERMINAR CON LA COLECCIÓN Puede salir de un bucle For Each...Next antes de que haya recorrido la colección mediante la instrucción Exit For. Por ejemplo, puede desear salir de un bucle si detecta una condición que hace que sea innecesario o no se pueda continuar la iteración, como puede ser un valor erróneo o una solicitud de finalización. Asimismo, si detecta una excepción en Try...Catch...Finally, puede utilizar Exit For al final del bloque Finally.

78


BUCLES FOR...NEXT MÁS RÁPIDOS La actualización de las variables Integer es un poco más rápida que en el caso de las variables Short o Long. Esta diferencia sólo es apreciable si se realizan muchos miles de operaciones. No obstante, la diferencia entre Integer y Single o Decimal se aprecia más rápidamente. El ejemplo siguiente muestra algunas variaciones posibles: Dim Fastest As Integer ' First case -- Integer is fastest. For Fastest = 0 to 100000 ' Statements to execute for each value of Fastest. Next Fastest ' ... Dim NotAsFast As Long ' Second case -- Long is not as fast. For NotAsFast = 0 to 100000 ' Statements to execute for each value of NotAsFast. Next NotAsFast ' ... Dim MuchSlower As Decimal ' Third case -- Decimal is slower. For MuchSlower = 0 to 100000 ' Statements to execute for each value of MuchSlower. Next MuchSlower Código fuente 13 En el primer caso anterior, la ejecución tarda un poco menos que en el segundo caso. Sin embargo, si Fastest supera 2.147.483.647 se produce un error. Esto se soluciona en los casos segundo y tercero, puesto que los tipos Long y Decimal aceptan una gama más amplia de enteros, aunque se ejecutan más lentamente. Para tipos de datos que utilizan 4 o más bytes, la manipulación de tipos más pequeños suele requerir menos tiempo que la de tipos más grandes.

WITH...END WITH En Visual Basic generalmente se debe especificar un objeto en cada instrucción que llame a uno de sus métodos o que tenga acceso a una de sus propiedades. Sin embargo, si tiene una serie de instrucciones que operan en un mismo objeto, puede utilizar una instrucción With...End With para especificar el objeto solo una sola vez para todas las instrucciones. De este modo puede acelerar la ejecución de los procedimientos y evitar la escritura repetitiva. El ejemplo siguiente establece el color del primer plano y el estilo de fuente de una etiqueta según el valor de un argumento de procedimiento. Dim AlertLabel As New System.Windows.Forms.Label ' ... Sub AlertUser(ByVal Value As Long) With AlertLabel If Value = 0 Then .ForeColor = Color.Red .Font = New Font(.Font, FontStyle.Bold Or FontStyle.Italic) Else .Forecolor = Color.Black .Font = New Font(.Font, FontStyle.Regular) End If End With End Sub Código fuente 14

79


Puede anidar instrucciones With...End With para conseguir mayor eficacia. En el siguiente ejemplo se inserta una fórmula en la celda A1 y después se da formato a la fuente. Sub MyInput() With Workbooks("Book1").Worksheets("Sheet1").Cells(1, 1) .Formula = "=SQRT(50)" With .Font .Name = "Arial" .Bold = True .Size = 8 End With End With End Sub Código fuente 15

EXIT La instrucción Exit permite salir directamente de cualquier estructura de decisión, bucle o procedimiento. Transfiere inmediatamente la ejecución a la instrucción que sigue a la última instrucción de control. La sintaxis de la instrucción Exit especifica el tipo de instrucción de control desde la que se transfiere la ejecución. Son posibles las siguientes versiones de la instrucción Exit: • • • • •

Exit Select Exit Try Exit Do Exit While Exit For

También puede salir directamente de un procedimiento Function, Sub o Property; la sintaxis es parecida a la de Exit For y Exit Do: • • •

Exit Sub Exit Function Exit Property

Exit Sub, Exit Function y Exit Property pueden aparecer todas las veces que sea necesario, en cualquier punto del cuerpo del procedimiento. Incluso pueden aparecer dentro de una instrucción de control como If...Then...Else. Estas instrucciones son útiles cuando un procedimiento ha completado su cometido y puede volver inmediatamente.

SALIR DE INSTRUCCIONES DE CONTROL ANIDADAS Si se encuentra una instrucción Exit dentro de instrucciones de control anidadas, la ejecución continúa con la instrucción que sigue al final de la instrucción de control más interna del tipo especificado en la instrucción Exit. En el ejemplo siguiente, la instrucción Exit For se encuentra en el bucle For interno, de modo que pasa el control a la instrucción que sigue al bucle y continúa con el bucle For externo. Public Sub InvertElements(ByRef A(,) As Double) Dim I, J As Integer For I = 0 To UBound(A, 1) For J = 0 To UBound(A, 2) If A(I, J) = 0 Then Exit For ' Cannot complete this row. Else A(I, J) = 1 / A(I, J) End If ' Control comes here if the Exit For is executed. Next J

80


Next I End Sub Código fuente 16 MÚLTIPLES INSTRUCCIONES EXIT La instrucción Exit en cualquiera de sus formas puede aparecer tantas veces como sea necesaria dentro del bucle o instrucción apropiados. En el siguiente ejemplo se muestra esto dentro de un bucle Do: Dim x, y, z As Double Do Until y = -1 If x < 0 Then Exit Do x = Math.Sqrt(x) If y > 0 Then Exit Do y=y+3 If z = 0 Then Exit Do z=x/z Loop Código fuente 17 La instrucción Exit Do funciona con todas las versiones de sintaxis del bucle Do (con While o Until) y Exit For funciona con todas las versiones de sintaxis del bucle For (con o sin Each).

81


Guía Práctica No 5 Estructuras de control (Parte 2) Estructuras Repetitivas OBJETIVOS • • •

Conocer el uso de las estructuras repetitivas. Aprender a diferenciar los bucles. Manejar el Ambiente de Desarrollo Integrado.

DESARROLLO DE CLASE Estas estructuras, también denominadas bucles, ejecutan un bloque de código de forma repetitiva mientras se cumpla una condición asociada a la estructura. A cada una de las veces en que se ejecuta el código contenido en estas estructuras se le denomina iteración.

Practica ► Creando Estructuras Repetitivas 1. Cree un nuevo proyecto en VB.net y nómbrelo Estructura_Repetitiva 2. Modifique las propiedades del formulario. Property Name Width Height BackColor Text

Value fmBucles 216 300 Tan Bucles

3. Adicione un Label y modifique las propiedades Property Text AutoSize X Y

Value Numero True 16 27

4. Adicione un TextBox y modifique las propiedades Property Name Width Height X Y

Value txtNum 128 20 64 24

5. Adicione cuatro Button y modifique las propiedades Property Value Name First Button btnFor X 16 Y 72 Text &For Name Second Button btnWhile

82


Third Button

Fourth Button

X Y Text Name X Y Text Name X Y Text

120 72 &While btnForEach 16 104 For&Each btnDoWhile 120 104 &DoWhile

6. Adicione un ListBox y modifique las propiedades Property Name Width Height X Y

Value lsbDatos 176 69 16 152

7. Adicione un Button y modifique las propiedades Property Name Text X Y

Value btnSalir &Salir 120 232

8. En el btnFor button´s Click event Handler, adicione el código siguiente. Dim contador As Integer Me.lsbDatos.Items.Clear() For contador = 1 To 10 Me.lsbDatos.Items.Add("Variable : " & contador) Next 9. En el btnWhile button´s Click event Handler, adicione el código siguiente. Dim contador As Integer = 0 Me.lsbDatos.Items.Clear() If Me.txtNum.Text <> "" Then While contador < Me.txtNum.Text Me.lsbDatos.Items.Add("*" & contador) contador += 1 End While Else MessageBox.Show("Digite un numero") Me.txtNum.Focus() End If

10. En el btnForEach button´s Click event Handler, adicione el código siguiente. Dim s As String Me.lsbDatos.Items.Clear() For Each s In "Escribe tu nombre" Me.lsbDatos.Items.Add(s) Next

83


11. En el btnDoWhile button´s Click event Handler, adicione el código siguiente. Dim dato As Integer Do dato = MessageBox.Show("Presione Cancel para Terminar", _ "Do While", MessageBoxButtons.YesNoCancel, _ MessageBoxIcon.Stop) Loop Until dato = 2 12. En el btnSalir button´s Click event Handler, adicione el código siguiente. Me.Close() 13. En el Explorador de Soluciones dar click derecho sobre el proyecto Estructura_Repetitiva – Propiedades. En Startup object seleccionar fmBucles y luego Aceptar. 14. Corra el proyecto, presionando F5.

Ejercicio 1 Creando un Formulario para las Tablas de Multiplicar ► Utilizar Estructuras Repetitivas Do While 1. Cree un nuevo proyecto en VB.net y nómbrelo Tablas_de_Multiplicar 2. Diseñe el formulario de manera parecida ha la ilustración.

3. En el btnMul button´s Click event Handler, adicione el código siguiente

84


Dim num, total As Integer Dim mulstr As String num = 1

'Declaración de variables

'Asignación de datos a las variables

If Me.txtnum.Text <> "" Then Me.lsbMulti.Items.Clear() Do While num <= 10 'Comenzaremos con el bucle hasta que el numero sea mayor a 10. total = num * Me.txtnum.Text 'Realiza la multiplicación 'Genera la cadena a mostrar mulstr = CType(Me.txtnum.Text, String) + " X " + _ CType(num, String) + " = " + CType(total, String) 'Agrega la cadena al listbox Me.lsbMulti.Items.Add(mulstr) num = num + 1 'Aumentamos el contador Loop 'Finalizamos el bucle mientras. Else MessageBox.Show("Digite un numero, Por favor", _ "ADVERTENCIA", MessageBoxButtons.OK, MessageBoxIcon.Error) End If Me.txtnum.Focus() 4. En el btnClear button´s Click event Handler, adicione el código siguiente Me.lsbMulti.Items.Clear() 5. En el btnSalir button´s Click event Handler, adicione el código siguiente. Me.Close() 6. Corra el proyecto, presionando F5.

Ejercicio 2 Creando un Formulario para las Contar Vocales ► Utilizar Estructuras Repetitivas For Each

85


1. Cree un nuevo proyecto en VB.net y nómbrelo Contar_Vocales 2. Diseñe el formulario de manera parecida ha la ilustración

3. En el btnoOk button´s Click event Handler, adicione el código siguiente 'Declaración de variables Dim conA, conE, conI, conO, conU As Integer Dim s As String 'Asignación de datos a las variables conA = conE = conI = conO = conU = 0 'Comenzaremos con el bucle leyendo letra por letra y la asignamos a un contador de vocales For Each s In Me.txtPalabra.Text If s = "a" Or s = "A" Then conA += 1 ElseIf s = "e" Or s = "E" Then conE += 1 ElseIf s = "i" Or s = "I" Then conI += 1 ElseIf s = "o" Or s = "O" Then conO += 1 ElseIf s = "u" Or s = "U" Then conU += 1 End If Next 'Finalizamos el bucle 'Asignamos los Me.txtA.Text = Me.txtE.Text = Me.txtI.Text = Me.txtO.Text = Me.txtU.Text =

contadores a los textbox. conA conE conI conO conU

4. Corra el proyecto, presionando F5.

86


Clase teórica No. 6 Funciones complementarias del lenguaje de programación

OBJETIVOS • • •

Conocer los diferentes tipos de funciones del lenguaje Conocer la sintaxis de las diferentes funciones Aprender a usar y aplicar las funciones

DESARROLLO

Funciones de comprobación de tipos de datos Si tenemos desactivada la comprobación de tipos con Option Strict, pero en ciertas situaciones necesitamos comprobar si determinada variable o expresión contienen un valor numérico, fecha, etc., el lenguaje nos proporciona para ello, algunas funciones con las que podremos comprobar el tipo de dato, para evitar posibles errores. IsNumeric( ). Esta función devuelve un valor lógico indicando si la expresión que pasamos como parámetro contiene un número o una cadena que pueda ser convertida a número. Ejemplo. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Valor As Object Dim Total As Integer Valor = InputBox("Introducir un número") If IsNumeric(Valor) Then Total = Val(Valor) + 100 MsgBox("El valor es: " & Total, , "Respuesta") Else MsgBox("El valor introducido no es numérico") End If End Sub IsDate( ). Esta función devuelve un valor lógico indicando si la expresión que pasamos como parámetro contiene una fecha o una cadena que pueda ser convertida a fecha. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Valor As Object Dim UnaFecha As Date Valor = InputBox("Introducir una fecha") If IsDate(Valor) Then UnaFecha = Valor MsgBox("La fecha es: " & UnaFecha, ) Else MsgBox("El valor introducido no es una fecha") End If End Sub

87


IsArray( ). Esta función devuelve un valor lógico indicando si la expresión que pasamos como parámetro contiene un array. Ejemplo Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Colores() As String = {"Verde", "Azul", "Rojo"} Verificar(Colores) Verificar("prueba") End Sub Public Sub Verificar(ByVal ValorPasado As Object) ' comprobar si el parámetro contiene un array If IsArray(ValorPasado) Then MsgBox("El parámetro pasado es un array") Else MsgBox("El parámetro pasado no es un array") End If End Sub

Funciones del lenguaje Cada lenguaje dispone de un grupo de funciones de apoyo, para ayudar al programador en su trabajo cotidiano. Las versiones anteriores de Visual Basic contenían un gran número de funciones para realizar operaciones aritméticas, manipular cadenas, fechas, etc. Numéricas Int(Número), Fix(Número). Estas funciones devuelven la parte entera del parámetro Número. La diferencia entre ambas reside en que cuando el parámetro pasado es negativo, Int( ) devuelve el entero negativo menor o igual que Número, mientras que Fix( ) devuelve el entero negativo mayor o igual que Número. Ejemplo: Dim Resultado As Integer Resultado = Int(66.87) ' 66 Resultado = Fix(66.87) ' 66 Resultado = Int(-66.87) ‘-67 Resultado = Fix(-66.87) '-66 Randomize([Número]). Inicializa el generador de números aleatorios, que utilizaremos posteriormente en la función Rnd( ). Opcionalmente recibe un número como parámetro que sirve al generador como valor inicial o semilla para la creación de estos números. Rnd([Número]). Devuelve un número aleatorio de tipo Single, que será menor que 1, peromayor o igual a cero. Podemos, opcionalmente, variar el modo de generación del número pasando un valor al parámetro de esta función. En función de si el parámetro es mayor, menor de cero, o cero, el comportamiento de Rnd( ) a la hora de generar el número será diferente. Ejemplo: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Contador As Integer Dim Aleatorio As single Randomize() For Contador = 1 To 10 Aleatorio = Rnd() MsgBox("Número generado: " & Aleatorio, ) Next End Sub

88


Primeros 3 numero generados:

Si necesitamos que el número aleatorio esté comprendido en un intervalo de números enteros, utilizaremos la fórmula del codigo siguiente: Int((LímiteSuperior - LímiteInferior + 1) * Rnd() + LímiteInferior) Ejemplo Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Contador As Integer Dim Aleatorio As Single Randomize() For Contador = 1 To 10 Aleatorio = Int((12 - 7 + 1) * Rnd() + 7) MsgBox("Número generado: " & Aleatorio, , "Numero Aleatorio") Next End Sub Cadena de caracteres Len(Cadena). Devuelve un número con la longitud de la cadena pasada como parámetro. Ejemplo: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Longitud As Integer Longitud = Len("comprobar cuantos caracteres hay") MsgBox("La cadena tiene " & Longitud, , ) ' 32 End Sub Space(Número). Devuelve una cadena de espacios en blanco, de una longitud igual al número pasado como parámetro. Ejemplo: Dim ConEspacios As String ConEspacios = "Hola" & Space(7) & "a todos" MsgBox("La cadena con espacios tiene el valor:" & _ ControlChars.CrLf & ConEspacios) ' Hola a todos InStr([Comienzo, ]CadenaBuscar, CadenaBuscada [, TipoComparación]). Busca dentro de CadenaBuscar la cadena contenida en el parámetro CadenaBuscada. Opcionalmente podemos establecer en Comienzo, la posición en la que comienza la búsqueda y el tipo de comparación (texto, binaria) en el parámetro TipoComparación.

89


Ejemplo: Dim CadBuscar As String Dim CadBuscada As String Dim PosComienzo As Integer CadBuscar = "El castillo del bosque" PosComienzo = InStr(CadBuscar, "tillo") MsgBox("La posición de comienzo de la cadena encontrada es: " & PosComienzo, , "InStr") ' 7 Left(Cadena, Longitud). Esta función extrae, comenzando por la parte izquierda de Cadena, una subcadena de Longitud de caracteres. • Right(Cadena, Longitud). Esta función extrae, comenzando por la parte derecha de Cadena, una subcadena de Longitud de caracteres. El Código fuente siguiente muestra ejemplos de Left( ) y Right( ). Dim CadIzquierda As String Dim CadDerecha As String CadIzquierda = Left("Especial", 3) Console.WriteLine("Resultado de la función Left(): {0}", CadIzquierda) ' Esp CadDerecha = Right("Especial", 3) Console.WriteLine("Resultado de la función Right(): {0}", CadDerecha) ' ial Console.ReadLine() Mid(Cadena, Inicio [, Longitud]). Extrae de Cadena, comenzando en la posición Inicio, una subcadena. Opcionalmente podemos utilizar el parámetro Longitud, para indicar el largo de la subcadena. En caso de no utilizar este último parámetro, la subcadena se obtendrá hasta el final. Ejemplo: Dim MiCadena As String Dim SubCadena As String MiCadena = "El bosque encantado" SubCadena = Mid(MiCadena, 6) MsgBox("Subcadena hasta el final: " & SubCadena, , "MID") ' sque encantado SubCadena = Mid(MiCadena, 6, 3) MsgBox("Subcadena de 3 caracteres: " & SubCadena, , "MID") ' squ Replace(Cadena,CadOrigen,CadNueva[,Inicio] [,Sustituciones] [,TipoComparación]). Esta función toma la cadena situada en el primer parámetro y busca la cadena CadOrigen, sustituyendo las ocurrencias encontradas por la cadena CadNueva. Opcionalmente, el parámetro Inicio especifica la posición en la que comenzará la sustitución; el parámetro Sustituciones indica el número de sustituciones a realizar; y TipoComparación indica como se realizarán las comparaciones (texto, binaria). Ejemplo: Dim MiCadena As String Dim CadSustituida As String MiCadena = "Este coche es especial" CadSustituida = Replace(MiCadena, "es", "xx") ' resultado: Este coche xx xxpecial MsgBox("Resultado del reemplazo en la cadena: " & CadSustituida, , "Ejemplo") ' en el anterior ejemplo los dos primeros caracteres ' no se sustituyen porque no se ha especificado el tipo ' de comparación, que a continuación sí indicaremos CadSustituida = Replace(MiCadena, "es", "xx", , , CompareMethod.Text) ' resultado: xxte coche xx xxpecial ' ahora sí se han sustituido todas las ocurrencias de "es" MsgBox("Resultado del reemplazo en la cadena: " & CadSustituida, , "ejemplo")

90


LTrim(Cadena), RTrim(Cadena), Trim(Cadena). Estas funciones eliminan de una cadena, los espacios en blanco a la izquierda en el caso de LTrim( ); los espacios en blanco a la derecha en el caso de RTrim(); o los espacios en blanco a ambos lados Trim( ). Ejemplo: Dim CadEspacios As String Dim CadResultante As String CadEspacios = " Barco " CadResultante = LTrim(CadEspacios) ' "Barco " CadResultante = RTrim(CadEspacios) ' " Barco" CadResultante = Trim(CadEspacios) ' "Barco” UCase(Cadena), LCase(Cadena). Estas funciones, convierten la cadena pasada como parámetro a mayúsculas y minúsculas respectivamente. Ejemplo: Dim Cadena As String Dim CadMay As String Dim CadMin As String Cadena = "Vamos a Convertir En Mayúsculas Y MinúscuLAS" CadMay = UCase(Cadena) CadMin = LCase(Cadena) ' "VAMOS A CONVERTIR EN MAYÚSCULAS Y MINÚSCULAS" MsgBox("Conversión a mayúsculas: " & CadMay, , "Ejemplo") ' "vamos a convertir en mayúsculas y minúsculas" MsgBox("Conversión a minúsculas: " & CadMin, , "Ejemplo") Format(Expresión [,CadenaFormato] [,PrimerDíaSemana] [,PrimeraSemanaAño]). Formatea la expresión pasada en el primer parámetro, empleando de forma opcional una cadena para especificar el tipo de formateo a realizar. Si el valor a formatear es una fecha,podemos utilizar los dos últimos parámetros para especificar el primer día de la semana y la primera semana del año; estos dos últimos parámetros son enumeraciones, cuyos valores aparecen automáticamente al asignar su valor. Como cadena de formato, podemos utilizar los nombres predefinidos de formato, o una serie de caracteres especiales, tanto para formateo de números como de fechas. En lo que respecta a los nombres predefinidos, la Tabla siguiente muestra algunos de los utilizados. Nombre de formato

Descripción

General Date

Muestra una fecha con el formato largo del sistema.

Short Date

Muestra una fecha empleando el formato corto del sistema.

Short Time

Muestra un valor horario con el formato corto del sistema.

Standard

Muestra un número utilizando los caracteres de separador de miles y decimales.

91


Currency

Muestra un número con los caracteres correspondientes a la moneda establecida en la configuración regional del sistema.

Percent

Muestra un número multiplicado por 100 y con el carácter de tanto por ciento.

El Código fuente siguiente muestra algunos ejemplos de formateo con nombre: Dim MiFecha As Date Dim MiNumero As Double Dim ValorFormato As String MiFecha = #7/19/2002 6:25:00 PM# MiNumero = 1804 ValorFormato = Format(MiFecha, "Long Date") ' "viernes, 19 de julio de 2002" ValorFormato = Format(MiFecha, "Short Date") ' "19/07/2002" ValorFormato = Format(MiFecha, "Short Time") ' "18:25" ValorFormato = Format(MiNumero, "Standard") ' "1.804,00" ValorFormato = Format(MiNumero, "Currency") ' "1.804 pta" ValorFormato = Format(MiNumero, "Percent") ' "180400,00%"

92


El Código fuente siguiente muestra algunos ejemplos de formato con caracteres especiales: Ejemplo: Dim MiFecha As Date Dim MiNumero As Double Dim ValorFormato As String MiFecha = #7/19/2002 6:25:00 PM# MiNumero = 16587.097 ValorFormato = Format(MiFecha, "dddd d/MMM/yyyy") ' "viernes 19/jul/2002" ValorFormato = Format(MiFecha, "HH:mm") ' "18:25" ValorFormato = Format(MiNumero, "#,#.00") ' "16.587,10" como parámetro, utilizando algunos de los valores de la enumeración TipoConversión. Opcionalmente podemos pasar también un valor correspondiente al identificador local del sistema. Ejemplo: Dim MiCadena As String Dim Conversion As String MiCadena = "el tren llegó puntual" ' convertir a mayúscula Conversion = StrConv(MiCadena, VbStrConv.UpperCase) ' convertir a minúscula Conversion = StrConv(MiCadena, VbStrConv.LowerCase) ' convertir a mayúscula la primera letra ' de cada palabra Conversion = StrConv(MiCadena, VbStrConv.ProperCase)

93


Fecha y hora Now( ). Devuelve un valor de tipo Date con la fecha y hora del sistema. DateAdd(TipoIntervalo, ValorIntervalo, Fecha). Suma o resta a una fecha, un intervalo determinado por el parámetro TipoIntervalo. El intervalo a utilizar pueden ser días, semanas, meses, etc. Para determinar si se realiza una suma o resta, ValorIntervalo deberá ser positivo o negativo respectivamente. DateDiff(TipoIntervalo, FechaPrimera, FechaSegunda). Calcula la diferencia existente entre dos fechas. En función de TipoIntervalo, la diferencia calculada serán días, horas, meses, años, etc. DatePart(TipoIntervalo, Fecha). Extrae la parte de una fecha indicada en TipoIntervalo. Podemos obtener, el día, mes, año, día de la semana, etc. El Código fuente 199 muestra un conjunto de ejemplos que utilizan las funciones para manipular fechas. Ejemplo: Dim MiFecha As Date Dim FechaPosterior As Date Dim DiasDiferencia As Long Dim ParteFecha As Integer MiFecha = Now() ' #1/19/2002 12:27:08 PM# FechaPosterior = DateAdd(DateInterval.Month, 2, MiFecha) ' #3/19/2002 12:27:08 PM# DiasDiferencia = DateDiff(DateInterval.Day, MiFecha, FechaPosterior) ' 59 ParteFecha = DatePart(DateInterval.Year, MiFecha) ' 2002

94


Guía practica No 6 Funciones complementarias del lenguaje de programación

OBJETIVOS • •

Incorporar funciones de cadena, numéricas y de fecha y hora en las expresiones. Diseñar aplicaciones que involucren el uso de funciones y estructuras de control anidadas

DESARROLLO Ejemplo #1: Diseñar una aplicación que determine si un valor dado por el usuario es de tipo numérico o de fecha utilizando funciones. 1. Crear un nuevo proyecto con el nombre Funciones_complementarias 2. Crear un formulario con un control Button 3. modificar las propiedades siguientes: Control

Text

Name

Button1

Determinar valor

Cmd1

Button2

Limpiar

Cmd2

4. Agregar el siguiente codigo en el evento click del control Button1 Dim Valor As Object Dim Total As Integer Valor = InputBox("Introducir un número o una fecha") If IsNumeric(Valor) Then MsgBox("El valor introducido es un numero") ElseIf IsDate(Valor) Then MsgBox("El valor introducido corresponde a una fecha") Else MsgBox("El valor introducido no es numérico ni de fecha") End If

Ejemplo #2: Crear un programa que solicite en un cuadro de texto una frase, en otro cuadro de texto solicite un carácter, en un tercer cuadro de texto despliegue cuantas veces se repite el carácter en la frase y finalmente en una etiqueta muestre un histograma de asteriscos según la cantidad de caracteres encontrados.

95


1. Adicione los siguientes controles: Control

Text

Name

TextBox1

Text1

TextBox2

Text2

Button1

Operar

Cmd1

Button2

Limpiar

Cmd2

Label1 2. Agregue el siguiente codigo al evento click del control Button Dim i As Integer, c As Integer For i = 1 To Len(Text1.Text) If Mid(Text1.Text, i, 1) = Text2.Text Then c=c+1 End If Next i MsgBox("El Caracter " & Text2.Text & " se repite " & c & " veces") Me.Label1.Text = "Histograma=" For i = 1 To c Me.Label1.Text = Label1.Text & " *" Next i 3. Agregar el siguiente c贸digo al evento click del control Button2 Text1.Clear() Text2.Clear() El formulario seria similar al siguiente:

96


Ejemplo #3 Diseñe un programa que dada una fecha en formato dd/mm/yyyy, retorne la misma fecha en formato largo. Por ejemplo 10/09/2006 devolverá: lunes, 10 de septiembre de 2001. Agregar los siguientes controles: Control

Text

name

TextBox1

Text1

TextBox2

Text2

Button1

Operar

Cmd1

Button2

Limpiar

Cmd2

1. Agregar el siguiente código al evento click del Button1 Dim fecha As DateTime fecha = DateValue(Text1.Text) Text2.Text = WeekdayName(Weekday(fecha)) & "," & Format(fecha, "d ") & " de " & MonthName(Month(fecha)) & Str(Year(fecha)) 2. Agregar el siguiente codigo al evento click de Button2 Text1.Clear() Text21.Clear() El formulario será similar al siguiente:

97


Ejercicios Propuestos: 1. Elaborar un programa que permita al usuario buscar dentro de un cuadro de texto una palabra y reemplazarla cuantas veces se encuentre por otra. Las dos palabras no son necesariamente iguales. 2. Diseñe un programa que determine si una palabra es palindroma o no. Una palabra es palindroma si puede leerse de igual forma de izquierda a derecha y viceversa. Ejemplo: Oso, Ana, anona, sugus, etc. 3. Desarrolle un programa que determine la edad de una persona en años, meses y días. Por Ejemplo, si hoy fuera 10 de marzo de 2000 y la fecha de nacimiento de la persona es 15 de marzo de 1980, su edad será: 19 años, 11 meses, 24 días. 4. Diseñe un programa que lea una frase y sustituya cualquier número de espacios en blanco contiguos o no por un asterisco. Desplegar la frase resultante.

98


BIBLIOGRAFÍA

Programación en Visual Basic .NET Blanco, Luis Miguel Grupo EIDOS Conltoría y Documentación Informática, S.L. 2002 Microsoft Visual Basic .Net: Referencia del Lenguaje Bühler, Erich R. 1a. Edición, 2002 Visual Basic.NET: Manual de Referencia Shapiro, Jeffrey R. 1ª. Edición, 2002 Edición especial Visual Basic .NET Siler, Brian. Spotts, Jeff 1a. edición, 2002. Microsoft Visual Basic.Net Gómez Jiménez, Enrique 2002 Superutilidades para Visual Basic .NET Jamsa, Kris 1a. edición, 2003

99


DEPARTAMENTO DE ING. EN COMPUTACIÓN TÉCNICO EN ING. EN SISTEMAS Y REDES INFORMÁTICAS

Lic. Ana María de Lazo Parte I

SANTA TECLA, JULIO 2007

DOCENTE: __________________________________________ ALUMN@: ___________________________________________ SECCIÓN: _________________

GRUPO: ________________

CICLO: _____________________

AÑO: __________________

100


Manual ITKA