Está en la página 1de 261

1

LENGUAJE VISUAL BASIC NET


Indice:
1.- Elementos bsicos de Visual Basic NET 1.1.-Introduccion a Visual Basic NET 1.2.- Plataforma .NET 1.3.- Entorno de ejecucin CLR 1.4.- El Lenguaje Intermedio y el CLS 1.5.- La biblioteca de clases de .NET 1.6.-Los espacios de nombres 1.7.- Acceso a datos con ADO.NET 1.8.- Aplicaciones Windows Forms 2.- Elementos del Lenguaje Visual Basic 2.1.- Variables Visual Basic NET 2.2.- Constantes en Visual Basic NET 2.3.- Listas enumeradas 2.4.- Estructuras 2.5.- Ambito de variables 2.6.- Operadores aritmticos 2.7.- Jerarqua de las operaciones 2.8.- Orden de las operaciones 2.9.- Comentarios en Visual Basic NET 3.- Programas, formas y componentes de Visual Basic NET 3.1.- Programa ejemplo de Visual Basic NET 3.2.- Otros componentes 3.3.- Dos o ms forms en Visual Basic NET 4.- Estructuras, ciclos, decisiones en visual Basic NET 4.1.-Instrucciones condicionales en Visual Basic 4.2.- Operadores relacionales en Visual Basic 4.3.- Instrucciones If Then Else en Visual Basic 4.4.- Condiciones compuestas en Visual Basic 4.5.- Instrucciones de control 4.6.- Ciclos For To Next 4.7.- Ciclo Do Loop While 4.8.- Arreglos en Visual Basic 4.9.- Funciones del lenguaje integradas 4.10.- Procedimientos o sub rutinas en Visual Basic pagina 4

pagina 10

pagina 17

pagina 27

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

5.- Programando con controles en Visual Basic 5.1- El cuadro de herramienta 5.2.-Controles Window Basicos 5.3.- Control Label 5.4.- Control TextBox 5.5. Control Button 5.6.- Foco de entrada 5.7.- Funciones para presentar mensajes 5.8.- Funcion InputBox() 5.9- Funcion MsgBox() 5.10.- Codificando con los eventos de controles 5.11.- Codificando otros eventos de control 5.12.- Orden de tabulacin de los controles 5.13.- Control ListBox 5.14.- Control Combobox 5.15.- Control CheckBox 5.16.- Controles RadioButton y GroupBox 5.17.- Controles tipo men 5.18.- Controles avanzados de Visual Basic Control temporizadores (Timer) Control ImageList Control ToolBar Control StatusBar Control DateTimePiker Control NumericUpDown Control DomainUpDown Control MonthCalender Control LinkLabel Control NotifyIcon 6.- Programacion Orientada a Objeto (POO) en Visual Basic 6.1.- Que es una clase 6.2.- Crear la primea clase 6.3.- Propiedades de solo lectura y escritura 6.4.- Agregar mtodos a una clase 6.5.- Agregar evento a una clase 6.6.- Crear una instancia de clase 6.7.- Como utilizar los constructores 6.8.- Como utilizar los destructores 6.9.- Como utilizar los miembros datos compartidos 6.10.- Como utilizar los mtodos compartidos

pagina 67

pagina 119

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

6.11.- Polimorfismo en Visual Basic NET 6.12.- Probar controladores de eventos 6.13.- Herencia de clases en Visual Basic NET

7.- Impresin en Visual Basic pagina 172 7.1.- La solucion: Como imprimier en .NET 7.2.- Las clases para imprimir en .NET Clase PrintDocument Clase PrintSetting Clase PrintDialog Clase PrintPreviewDialog Calse PrintPreviewControl 7.4.- Conclusion Imprimir en .NET es fcil 7.5.-Hacer Crystal Report con DataSet en Visual Basic.NET 8.- Acceso a Datos con ADO.NET en Visual Basic pagina 184 8.1.- Acercandonos a ADO.NET 8.2.- SystemData 8.3.- Los proveedores de acceso a datos 8.4.- El concepto DataBinding 8.5.- Otras consideraciones 8.6.- El paradigama de conexin 8.7.- Conociendo el objeto DataReader 8.8.- Un primer contacto con el objeto DataReader 8.9.- Trabaja DatReader en un ambiente conectado realmente? 8.10.- Usando DataSource con DataReader 8.11.- Usando componentes de acceso a datos de .NET 8.12.- Esquema general de la estrucutra desconectada de acceso a datos 8.13.- Conociendo el objeto DataAdapter 8.14.- Insertando datos a travs del Objeto DataAdapter 8.15.- Actualizando datos a travs del objeto DataAdapter 8.16.- Eliminando datos a travs del objeto DataAdapter 8.17.- Qu son los datos Maestro Detalle? 8.18.- Configurando la fuente de datos 8.19.- Preparando el origen de datos 8.20.- Inscrustando los datos Maestro Detalle 8.21.- Manipulando los datos.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

1.- ELEMENTOS BASICOS DE VISUAL BASIC NET


1.1.- Introduccion a Visual Basic NET
Informacin y Conocimiento son los dos elementos claves del nuevo milenio ninguna sociedad podr alcanzar ni puede ignorar este nuevo esquema ya las naciones no se miden por su riqueza industrial, ni sus activos fsicos, ni por su poder militar, sino por la cantidad de informacin que produce y consume, as como por la recombinacin de informacin nueva en un conocimiento de grado superior. Nuevos sistemas de informacin, tienden a ser cada vez de mayor alcance y complejidad sobre todo cuando se toman en cuenta las nuevas necesidades de informacin y conocimiento que demandan las nuevas organizaciones. VISUAL BASIC NET es un lenguaje de programacion desarrollado por Microsoft muy apropiado para construir sistemas de informacion basados en red o mejor aun en internet.

1.2.- Plataforma .NET


Es un amplio conjunto de bibliotecas o libreras de desarrollo que pueden ser utilizadas por otras aplicaciones para acelerar enormemente el desarrollo y obtener de manera automtica caractersticas avanzadas de seguridad, rendimiento, etc... .NET permite compilar, depurar,y ejecutar aplicaciones .NET. Desde que apareci la primera versin de Microsoft.NET Framework 1.0 en Visual Studio 2002, hasta la ultima versin del 2010 se vienen realizando mejoras continuas que permiten realizar una mejor integracin de todos los componentes en aplicaciones mas robustas y completas del mercado para la tecnologa de desarrollo de Microsoft. Microsoft.Net Framework es una apliacion que se iintegra en el entorno de desarrollo de forma fcil y transparente al programador, el cualse utiliza para ayudarnos a desarrollar de forma rpida, correcta, segura y en el menor tiempo posible nuestras aplicaciones.

1.3.- Entorno de ejecucin CLR


.NET ofrece un entorno de ejecucin para sus aplicaciones conocido como Common Language Runtime o CLR. La CLR es la implementacin de Microsoft de un estndar llamado Common Language Infrastructure o CLI. ste fue creado y promovido por la propia Microsoft pero desde hace aos es un estndar reconocido mundialmente por el ECMA. El CLR/CLI esencialmente define un entorno de ejecucin virtual independiente en el

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

que trabajan las aplicaciones escritas con cualquier lenguaje .NET. Este entorno virtual se ocupa de multitud de cosas importantes para una aplicacin: desde la gestin de la memoria y la vida de los objetos hasta la seguridad y la gestin de subprocesos.

1.4.- El Lenguaje Intermedio y el CLS


Al contrario que otros entornos, la plataforma .NET no est atada a un determinado lenguaje de programacin ni favorece a uno determinado frente a otros. En la actualidad existen implementaciones para varias decenas de lenguajes que permiten escribir aplicaciones para la plataforma .NET. Los ms conocidos son Visual Basic .NET, C# o J#, pero existen implementaciones de todo tipo, incluso de COBOL!.

Lo mejor de todo es que cualquier componente creado con uno de estos lenguajes puede ser utilizado de forma transparente desde cualquier otro lenguaje .NET. Adems, como ya se ha comentado, es posible ejecutar el cdigo .NET en diferentes plataformas y sistemas operativos

1.5.- La biblioteca de clases de .NET


Todo lo que se ha estado comentando hasta ahora en el curso constituye la base de la plataforma .NET. Si bien es muy interesante y fundamental, por s mismo no nos servira de mucho para crear programas si debisemos crear toda la funcionalidad desde cero. Obviamente esto no es as, y la plataforma .NET nos ofrece infinidad de funcionalidades "de fbrica" que se utilizan como punto de partida para crear las aplicaciones. Existen funcionalidades bsicas (por ejemplo todo lo relacionado con la E/S de datos o la seguridad) y funcionalidades avanzadas en las que se fundamentan categoras enteras de aplicaciones (acceso a datos, creacin de aplicaciones Web...). Toda esta funcionalidad est implementada en forma de bibliotecas de funciones que fsicamente se encuentran en diversas DLL (bibliotecas de enlazado dinmico). A su conjunto se le denomina Base Classes Library (Biblioteca de clases base o BCL) y forman parte integral de la plataforma .NET, es decir, no se trata de aadidos que se deban obtener o adquirir aparte.

La siguiente figura ilustra a vista de pjaro la arquitectura conceptual de la plataforma .NET. En ella se pueden observar los elementos que se han mencionado en apartados anteriores (lenguajes, CLR, CLS...) y en qu lugar de se ubican las bibliotecas de clases base:

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

Todo lo que se encuentra en la BCL forma parte de la plataforma .NET. De hecho existe tal cantidad de funcionalidad integrada dentro de estas bibliotecas (hay decenas de miles de clases) que el mayor esfuerzo que todo programador que se inicia en .NET debe hacer es el aprendizaje de las ms importantes. De todos modos Visual Studio ofrece mucha ayuda contextual (documentacin, Intellisense...) y una vez que se aprenden los rudimentos resulta fcil ir avanzando en el conocimiento de la BCL a medida que lo vamos necesitando.

1.6.- Los espacios de nombres


Dada la ingente cantidad de clases que existen debe existir algn modo de organizarlas de un modo coherente. Adems hay que tener en cuenta que podemos adquirir ms funcionalidades (que se traducen en clases) a otros fabricantes, por no mencionar que crearemos continuamente nuevas clases propias. Para solucionar este problema existen en todos los lenguajes .NET los espacios de nombres o namespaces. Un espacio de nombres no es ms que un identificador que permite organizar de modo estanco las clases que estn contenidas en l as como otros espacios de nombres.

As, por ejemplo, todo lo que tiene que ver con el manejo de estructuras de datos XML en la plataforma .NET se encuentra bajo el espacio de nombres System.Xml. La funcionalidad fundamental para crear aplicaciones Web est en el espacio de nombres System.Web. ste a su vez contiene otros espacios de nombres ms

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

1.7.- Acceso a datos con ADO.NET


El acceso a fuentes de datos es algo indispensable en cualquier lenguaje o lataforma de desarrollo. La parte de la BCL que se especializa en el acceso a datos se denomina de forma genrica como ADO.NET.

Si usted ha programado con Visual Basic 6.0 o con ASP, ha empleado en su cdigo con total seguridad la interfaz de acceso a datos conocida como ADO (ActiveX Data Objects), puede que combinado con ODBC (Open Database Connectivity). Si adems es usted de los programadores con solera y lleva unos cuantos aos en esto es probable que haya usado RDO o incluso DAO, todos ellos mtodos mucho ms antiguos.

ADO.NET ofrece una funcionalidad completamente nueva, que tiene poco que ver con lo existente hasta la fecha en el mercado. Sin embargo, con el nimo de retirar barreras a su aprendizaje, Microsoft denomin a su nuevo modelo de acceso a datos con un nombre similar y algunas de sus clases recuerdan a objetos de propsito anlogo en el vetusto ADO.

ADO.NET es un modelo de acceso mucho ms orientado al trabajo desconectado de las fuentes de datos de lo que nunca fue ADO. Si bien este ltimo ofreca la posibilidad de desconectar los Recordsets y ofreca una forma de serializacin de estos a travs de las diferentes capas de una aplicacin, el mecanismo no es ni de lejos tan potente como el que nos ofrece ADO.NET.

El objeto ms importante a la hora de trabajar con el nuevo modelo de acceso a datos es el DataSet. Sin exagerar demasiado podramos calificarlo casi como un motor de datos relacionales en memoria. Aunque hay quien lo asimila a los clsicos Recordsets su funcionalidad va mucho ms all como se ver en el correspondiente mdulo.

1.8.- Aplicaciones Windows Forms


Las aplicaciones de escritorio son aquellas basadas en ventanas y controles comunes de Windows que se ejecutan en local. Son el mismo tipo de aplicaciones que antes construiramos con Visual Basic 6 u otros entornos similares.

En la plataforma .NET el espacio de nombres que ofrece las clases necesarias para construir aplicaciones de escritorio bajo Windows se denomina Windows Forms. Este es tambin el nombre genrico que se le otorga ahora a este tipo de programas basados en ventanas.
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

Windows Forms est constituido por multitud de clases especializadas que ofrecen funcionalidades para el trabajo con ventanas, botones, rejillas, campos de texto y todo este tipo de controles habituales en las aplicaciones de escritorio. Visual Studio ofrece todo lo necesario para crear visualmente este tipo de programas, de un modo similar aunque ms rico al que ofreca el entorno de desarrollo integrado de Visual Basic.

Diseador de interfaces de aplicaciones de escritorio con Windows Forms en Visual Studio

Este es el aspecto que presenta parte del cdigo que genera la interfaz mostrada en la anterior figura:

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

2.- Elementos del Lenguaje Visual Basic


2.1.- VARIABLES VISUAL BASIC NET
Identificadores son conjuntos de letras y/o numeros que se utilizan para simbolizar todos los elementos que en un programa, son definibles por el usuario (programador o ingeniero de software) del mismo, como son las variables donde se almacenan datos, funciones (pequenos modulos con codigo), etiquetas, clases, objetos, etc. En VISUAL BASIC NET un identificador es una palabra compuesta de letras y/o numeros de hasta 32 caracteres significativos, empezando siempre con una letra. Una variable se define como un identificador que se utiliza para almacenar todos los datos generados durante la ejecucion de un programa. Existen ciertas reglas en cuanto a variables: Claras y con referencia directa al problema. No espacios en blanco, ni simbolos extranos en ellas. Se pueden usar abreviaturas, pero solo de caracter general. No deben ser palabras reservadas del lenguaje. Ejemplos de buenas variables: Nombre, Edad, SdoDiario, IngMensual, Perimetro, Calif1, etc.

2.1.1.- Declaracion y tipos de datos


En Visual Basic NET a toda variable que se use en un programa, se le debe asociar (generalmente al principio del programa) un tipo de dato especifico. Un tipo de dato define todo el posible rango de valores que una variable puede tomar al momento de ejecucion del programa y a lo largo de toda la vida util del propio programa. Los tipos de datos ms comunes en Visual Basic NET son: Tipo Rango BYTE 0-255 INTEGER(%) +-2,147,483,698 SINGLE(!) 3.4E+-38(7 DECIMALES) DOUBLE(#) 1.8E+308(16 DECIMALES) CURRENCY 15 DIG IZQ 4 DIG DEECHA STRING($) 2 BILLONES CHARS BOOLEAN TRUE, FALSE DATE FECHA

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

10

VARIANT

TODOS LOS TIPOS y mas usado en este curso

Recordar Tambien que en Visual Basic NET toda variable usada en un programa se debera declarar al principio del programa el formato de declaracion mas sencillo es: DIM VARIABLE AS TIPO Ejemplos DIM ALFA AS INTEGER DIM ALFA AS LONG, BETA AS LONG DIM ALFA AS INTEGER, NOMBRE AS STRING DIM CIUDAD AS STRING * 20, ALFA AS DOUBLE Observar ltimo caso de ciudad asi de esta manera se consigue una string de tamano definido. En Visual Basic NET un problema comun a lo largo de este curso, es la necesidad de convertir variables numericas a strings y tambien el problema inverso es decir convertir strings a su representacion numerica. Para este ltimo problema por ejemplo se tiene: DIM ALFA AS STRING ALFA = 3.1416 Como se observa del ejemplo anterior, se puede dar en algun momento la necesidad de convertir la string ALFA a su valor numerico, para resolver este problema se deberan usar las siguientes funciones de conversion numerica que proporciona Visual Basic NET. En Visual Basic NET para el ejemplo anterior se tendria: DIM ALFA AS STRING DIM BETA AS SINGLE ALFA = 3.1416 BETA= CINT (ALFA)
Nota: Estamos usando una funcin de Visual Basic para tomar solo el valor entero de ALFA

Tambien podemos declarar variables utilizando unos smbolos o caracteres detrs de las variables que indiquen el tipo de variable utilizada, la tabla muestra estos smbolos: Tipo de dato Short Integer Long Single Double Simbolo % & ! # Caracter S I L F R

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

11

Decimal UShort UInteger Ulong String

D US UI UL $

Tipos de datos Objetos


Object es un tipo de datos de forma implicitay del cual heredan el resto de tipos de datos

2.2.- Constantes en Visual Basic NET


Formato: Const variables As tipo = valor Ejemplos Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click Const PI as double = 3.1416 Dim valor As decimal Valor = (2 * PI) ^2 MessageBox.show(Valor) End sub As System.Object, ByVal e As

2.3.- Listas enumeradas


Son listas de variables o datos que hacen referencia a ndices y estos empiezan desde 0 en adelante. El formato que se utiliza es el siguiente: Private Enum <Nombre_Variable> As <Tipo_Dato> <Variable> = Valor_asignado End Enum Observemos el siguiente ejemplo: Private Enum valores As Integer Valor1 = 3 Valor2 = 5 Valor3 = 7 End Enum

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

12

Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click Dim valor As valores Valor = valores.valor2 MessageBox.show(Valor) End sub

As

System.Object,

ByVal

As

Nota: Si deseamos conocer el nombre de la variable seleccionada de la lista enumerada, podemos utilizar: Dim valor As valores Valor = valores.valor2 MessageBox.show(Valor.ToString() & : & Valor) Se presentara: valor2: 5

2.4.- Estructuras en Visual Basic


Las estructuras estn formadas por uno o mas miembros y cada miembro puede ser de un tipo de datos determinado. El formato a utilizar es: Structure <nombre> Public <nombre> As <tipo> End Structure Ejemplo de uso de estructura: Private Structure Alumno Public nombre As String Public Edad As Integer Public Id As String End Structure Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click As System.Object, ByVal e As

Dim MiAlumno As Alumno MiAlumno.nombre = Carlos MiAlumno.edad = 23 Mialumno.Id = 2011-23056 MessageBox.show(MiAlumno.nombre & tiene & MiAlumno.edad & aos) End sub

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

13

Se presentara en pantalla: Carlos tiene 23 aos Tambien podemos utilizar la palabra reservada With para realizar acciones que se repiten, evitando escribir una parte del cdigo, analicemos el siguiente ejemplo: Private Structure Alumno Public nombre As String Public Edad As Integer Public Id As String End Structure Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click As System.Object, ByVal e As

Dim MiAlumno As Alumno With MiAlumno .nombre = Carlos .edad = 23 .Id = 2011-23056 MessageBox.show(MiAlumno.nombre & tiene & MiAlumno.edad & aos) End sub

2.5.- Ambito de variables en Visual Basic


El lugar donde sea declarada una variable afectara el uso que el programa quiera hacer de esa variable. Las reglas basicas que determinan como una variable puede ser usada depende del lugar donde se puede declarar una variable. Veamos la siguiente tabla:
Declaracin Lugar de Declaracin Alcance o mbito

Public Protected Friend Private Dim Static

Mdulo o Clase Clase Clase Mdulo Procedimiento Procedimiento

Global, en todo el proyecto. En la clase declarada o en una derivada. En el Assemblie. Solo en el mdulo. Solo en el Procedimiento. Solo en el Procedimiento.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

14

En escencia una variable local solo es conocida por el codigo de esa funcion o procedimiento y es desconocida por otras funciones o procedimientos. En la programacion formal no es acostumbrado usar muchas variables globales por varias razones, una de ellas es que variables globales estan vivas todo el tiempo de ejecucion del programa. Si una variable global solo la ocupa unos cuantos procedimientos no tiene caso que este viva para todo el resto, otra razon es que es peligroso tener variables globales porque todo el conjunto de procedimiento y funciones que componen un programa tienen acceso o comparten su valor y se corre el riesgo de que inadvertidamente alguno de ellos modifique su valor. Programa ' Creando y cargando una variable global Dim varglobaluno as integer = 50 Fuera de todo procedimiento Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Este es un ' creando, cargando y mandando una var local procedimiento en Dim varlocaldos = 20 Call PROC1(varlocaldos) Visual Basic NET End Sub

Sub PROC1(ByVal varlocaltres As Single) 'aqui se puede usar varglobaluno por ser global 'y varlocaltres por ser local pero no se puede usar varlocaldos ' porque es local en otro procedimiento Label1.Text = varglobaluno + varlocaltres End Sub

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

15

2.6.-- Operadores aritmeticos


En Visual Basic NET un operador es un simbolo especial que indica al compilador que debe efectuar una operacion matematica o logica. Visual Basic reconoce los siguientes operadores aritmeticos: OPERADOR + * / \ ^ MOD OPERACIN Suma Resta Multiplicacion Division flotante Division Entera Potencia Modulo

El Operador (/) Division Flotante es el operador de division normal. El Operador (\) tambien es division pero los datos: a) Primero son redondeados al entero ms cercano (byte, integer, long) b) Al final visual basic trunca la parte residual. El Operador (^), resuelve dos problemas: a) Ejemplo 5 2 se resuelve enVisual Basic NET: dim alfa as integer alfa = 5 ^ 2 Desplegar alfa, sale 9 en pantalla b) Ejemplo para Raices solo recordar la ley de exponentes que dice: Para estos casos:
9

= 5^8/3 = 9^1/2 En Visual Basic el operador (MOD) devuelve el residuo entero de una division entre enteros, ejemplo: Dim alfa As Single alfa = 23 MOD 4 Visualizar alfa; El resultado en pantalla es 3
3

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

16

Otro ejemplo; alfa = 108 MOD 10; Visualizar alfa; El resultado en pantalla es 8
8

Actividades de reforzamiento de lo aprendido

Ejercicios de programacion
Resolver algebraicamente en papel las siguientes ecuaciones expresndolas en formato de Visual Basic NET 1.2.3.-

2.7.- Jerarquia de operaciones


En Visual Basic NET el problema de no tomar en cuenta la jerarquia de los operadores al plantear y resolver una operacion casi siempre conduce a resultados muchas veces equivocados como estos: Ejemplos: a) 2 + 3 * 4 = 20 (incorrecto) 2 + 3 * 4 = 14 (correcto)

b) si calif1 = 60 y calif2 = 80 ; Entonces si en programa se usa promedio = calif1 + calif2/2 ; Da como resultado promedio = 100 En Visual Basic NET recordar siempre, que antes de plantear una formula en un programa se debera evaluar respecto al orden siguiente:

2.8.- Orden de operaciones:


1.- Parentesis 2.- Potencias y raices
Ordenes de operacion

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

17

3.- Multiplicaciones y divisiones 4.- Sumas y restas 5.- Dos o ms de la misma jerarquia u orden, entonces resolver de izquierda a derecha Nota: Si se quiere alterar el orden normal de operaciones, entonces usar parentesis. Nota: Tampoco es bueno usar parentesis cuando no es necesario en una operacion, esto solo indica que no se evaluo bien la formula

Ejemplo: area = ( base * altura ) / 2 Aqui los parentesis estan de mas porque por orden de operaciones, multiplicacion y division tienen la misma jerarquia y entonces se resuelven de izquierda a derecha en otras palabras en visual basic NET ni que falten parentesis ni que sobren parentesis

2.9.- Comentarios en Visual Basic NET


Para agregar comentarios a nuestro cdigo de programa podemos hacerlo de variasm maneras: 1.- Utilizando el carcter area = base * altura / 2 Encontramos el rea del cuadrado 2.- Utilizando la palabra reservada REM, se utiliza al comienzo de una lnea: Rem Encontramos el rea del cuadrado area = base * altura / 2 3.- Cuando queremos utilizar pequeas porciones de regiones de comentarios y cdigo que se puede contraer y expandir, el formato a utilizar es: #Region < texto > Aqu se escribe lo que quermos poner como comentario en varia lneas Se puede escribir lneas de codigo #End Region Ejemplo: #Region Problema 1 El problema permite encontrar el Mayor de los nmeros de una lista Proporcionada por el usuario
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

18

Dim IValor As Integer = 0 #En Region

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

19

3.- PROGRAMAS, FORMAS y COMPONENTES VISUAL BASIC NET


Recordar que programas visuales, se construyen usando los siguientes elementos: 1.- Un objeto ventana o form1 2.- Objetos que permitan capturar y desplegar datos, de momento se usaran los dos objetos de entrada / salida ms comunes: 2.1 Objeto label Permite desplegar textos o mensajes estaticos 2.2 Objeto textbox Permite tanto capturar datos, asi como desplegar el resultado de operaciones (recordar que textbox's) solo capturan o despliegan un dato a la vez, recordar tambien que todos los datos que entren y salgan de un textbox o un label son de tipo string. 2.3.- Objetos InputBox() Para obtener datos directos y sencillos del usuario 2.4.- Objetos MessageBox() Para presentar informacion relevante al usuario 3.- Objeto Button Es el componente principal de la forma, contiene el cdigo principal del programa y su activacin por el usuario provoca que se realicen los principales procesos del problema planteado (aqu es donde se capturan datos, se realizan operaciones, etc.). De este componente se maneja su propiedad Text para etiquetarlo con la palabra OK o ACEPTAR o EXE y su evento Click para activarlo, es en dicho evento donde se construir muchas veces el cdigo del programa.

Nota importante: Recordar que aunque no es un componente necesario en los programas ya que el cdigo se puede asociar o pegar a cualquier evento de cualquier forma o componente del programa, Microsoft ya acostumbro a todos los usuarios al boton OK, de acuerdo, OK. RECORDAR que todos los componentes vistos incluyendo el propio form y ventana estos tienen muchas propiedades que se pueden asignar o modificar y tambien tienen muchos eventos a los cuales les podemos asociar o cargar el codigo del programa, todos estas propiedades y eventos las podemos accesar dentro de la ventana de propiedades. No olvidar que las palabras reservadas del lenguaje NO se deben utilizar como variables, esto producir un error en al aplicacion Regresando a Form1, es sobre esta forma donde se construira el programa y esta forma se convierte en ventana al momento de ejecutarse el programa.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

20

Es decir sera la primera ventana que el usuario ve al momento de ejecutarse el programa, su nombre es Form1. Esta forma o ventana es un objeto de VISUAL BASIC NET y como todos los objetos de Visual Basic y del universo, la forma o ventana tiene asociados propiedades y eventos.

Propiedades: Son todas las caracteristicas particulares que diferencian un objeto de


otro objeto, las propiedades o caracteristicas mas comunes son forma, tamano, color, etc., para objetos en visual basic, estas propiedades se modifican o individualizan usando la PAGINA DE PROPIEDADES, que es la parte del programa que las contiene. Recordar que se pueden modificar las propiedades dentro de un programa, usando instrucciones apropiadas, mismas que llevan el siguiente formato:

NomObjeto.Propiedad = nvovalor;
Ejemplo: Form2.BackColor = Yellow

Eventos: son todos aquellos sucesos de caracter externo que afectan o llaman la
atencion del objeto, para estos casos la forma o ventana u objeto: 1. Debe tener capacidad de detectar el evento 2. Aun ms importante debe tener capacidad de reaccionar y emitir una respuesta, mensaje o conducta apropiada al evento detectado. Evento es por ejemplo que otro objeto llamado humano pulse el objeto tecla ESC, o haga click derecho con el objeto raton en alguna parte de la ventana, etc. es en estos casos, cuando la ventana u objeto detecte un evento de estos la propia forma u objeto debera responder de manera apropiada. Nota: Esta respuesta no es automatica, sino son la serie de instrucciones del lenguaje (o programa) que los ingenieros de software disean (o programan) en otras palabras son los eventos quienes contendran los programas.

Es tambien la VENTANA DE PROPIEDADES, quien contiene todos los posibles eventos asociados a la forma. Para los primeros programas en VISUAL BASIC solo se usaran propiedades sencillas como color, font, etc. de Form1 y los objetos ya mencionados (LABEL, TEXTBOX, BUTTON, INPUTBOX, MESSAGEBOX, LISTBOX, COMBOBOX) y no se usan de momento los eventos que puede detectar Form1.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

21

3.1.- Programa ejemplo Visual Basic NET


Resolvemos el problema de calcular el rea de un triangulo con la formula rea = base * altura /2 Para resolver este problema se ocuparan los siguientes objetos. (para realizar el diso) 1.- Una ventana de windows (form1) para contener a todo el resto de componentes. 2.- Tres label's o etiquetas para desplegar mensajes apropiados al problema. 3.- Tres componentes TEXTBOX dos para capturar datos (base y altura) y el tercero para desplegar el resultado (area). 4.- Un componente BUTTON para que active y contenga el codigo del problema y/o programa.

Procedimiento detallado
1.- Crear un folder o directorio en su disco duro C:\ llamado PROGRAM1 2.- Cargar VISUAL BASIC desde la barra de start de windows 3.- Usar la opcin FILE > NEW PROJECT > WINDOWS APPLICATION 4.-Usar Ahora la opcion FILE > SAVEALL De la pantalla de grabacin que sale ponerle un nombre al proyecto (dejar el default ) y apuntarlo al directorio que se hizo de programas:

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

22

5.- Queda ahora la pantalla de trabajo o diseno o construccion del programa

Recordar que pueden agregar TOOLBOX, (VENTANA DE PROPIEDADES Y EXPLORADOR DE SOLUCIONES) usando la opcin VIEW de la barra del men. 6.- Observar que en grafica de arriba esta seleccionada la propia forma o ventana. Dentro del programa se estarn cargando todos los objetos que usa el programa y por ejemplo Visual Basic NET a los dos textbox's que se estarn usando los nombra por DEFAULT como TextBox1 y TextBox2, con esas maysculas y minsculas as que estar dificil estar recordando su nombre por defecto Es conveniente estar usando la propiedad NAME de todos los objetos sobre todo textbox y label que se coloquen en una forma o ventana.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

23

Es decir es mas fcil construir una formula que diga num1.Text = num2.Text + 5 a el original que seria TextBox1.Text = TextBox2.Text + 5 por esta razn es conveniente asignarle un nombre relevante a cada TextBox usando la propiedad NAME de la pagina de propiedades, en este curso se les asigna NAME a todos los textbox's y muchos de los otros componentes que se usan. 7.- Arrastrar y acomodar desde la CAJA DE HERRAMIENTAS a FORM1 3 (tres) compontes LABEL y cargarles su PROPIEDAD TEXT con las palabras BASE, ALTURA y AREA respectivamente para escribir esto solo hacerlo usando la cajita que esta a un lado de la propiedad dentro dela pagina de propiedades.

NOTA: si de alguna manera el editor los manda al cdigo del programa, observar que arriba de FORM1 hay tres pestaas: FORM1.VB la que contiener el codigo del programa en los procedimientos y eventos FORM1 DESIGN que contiene el diseo START PAGE contiene las caracteristicas de la pagina de inicio De solo click en form1 design para regresar al ambiente visual.

8.- Arrastrar y acomodar ahora tres componentes textBox de los cuales en su propiedad TEXT, limpiarla y dejarla en blanco y en su propiedad (NAME) cargarlos con las palabras BASE, ALTURA y AREA respectivamente. 9.- Arrastrar y acomodar ahora un componente o control BUTTON, poner su propiedad text=OK. La pantalla diseada es: 10.-Colocaremos el siguiente codigo dentro del evento click de BUTTON Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click AREA.Text=(BASE.Text*ALTURA.Text / 2) End Sub

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

24

Para escribir este cdigo solo haga CLIK dentro de BUTTON1 y VISUAL BASIC los mandara a la pantalla de cdigo, donde ya estar cargado el evento button1_clik(){}.

Atencin solo se escribe el cdigo en rojo, el evento button1.click(){} ya lo escribe visual basic por default y respetar todas las mayusculas y minusculas dentro del codigo. Los dos parmetros que van dentro de button_click (OBJETO, variable e)> son para indicarle al compilador que se estarn enviando OBJETOS entre la forma o ventana y el usuario del programa ( LOS TEXTBOXS son los objetos y primero se mandan vacios al usuario y luego el sistema los recoge con datos desde el usuario). La VARIABLE e (environment) es donde el sistema o compilador los va almacenando temporalmente, si ya vieron algo de msdos y conocen el comando set ah observaran los textbox's con sus datos. Regresando al cdigo: a.- Son las propiedades TEXT de los TEXTBOX'S quienes contienen los datos tanto capturados como los de salida. b.- Recordar adems que cualquier propiedad TEXT de cualquier CONTROL o COMPONENTE solo maneja datos de tipo TEXTO o STRING y por tanto para poder realizar operaciones con los TEXTBOX.TEXT visual basic NET internamente los convierte a los tipos apropiados. c.- [VARNUMERICA COMPONENTE EXPRESION] .ToString() > se uso para convertir el valor numrico a tipo string Y PODERLO FORMATEAR para que salga el resultado con dos decimales ( este tema de formateo se ve en el tema siguiente), para poderlo almacenar en la propiedad TEXT del TEXTBOX. 11.- Ya cargada la forma con sus componente y el evento click con su cdigo respectivo, grabar el programa con la opcin FILESAVE o usar el icono de grabacin (el disquito o disquitos que esta en la barra de iconos arriba) y luego ejecutar el programa usando el icono de RUN que tambin se encuentra en la barra de herramientas arriba o DEBUG START o F5. 12.- El programa en ejecucion:

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

25

Nota: Si buscan muy bien dentro del folder project1 se encontraran con muchos archivos que creo VISUAL BASIC, dos de ellos son los interesantes: FORM1.VB que contiene todo el cdigo fuente, es decir el programa original y WINDOWSAPPLICATION1.EXE (dentro del folder bin\debug) que es el archivo ejecutable, basta darle un click desde el explorer de windows y se ejecutara solo sin necesidad de que este cargado el compilador de visual basic.

3.2.- Otros componentes Visual Basic


En este tema analizamos algunas instrucciones de VISUAL BASIC que nos permitirn facilitar algunas tareas que estn pendientes y tambin algunos controles y componentes que tambin nos darn buena ayuda.

Formateo de datos numericos


Como se observa en los aplicaciones ya construidas los formatos numricos de salida dejan mucho que desear, para corregir esta situacin, solo basta agregar una string de control dentro del parntesis de ToString(strcontrol) que son una serie de caracteres especiales que proporciona la plataforma NET. Ejemplo; Double alfa = 3456.678 * 21.456 / 73.78902 Es claro que cuando esta variable alfa se mande a un textbox o un label el valor numrico desplegado contendr un montn de valores decimales, para mandar solo la cantidad de decimales apropiados, solo usar la string de control con los caracteres apropiados ej; Label1.Text = alfa.ToString(#.##) Esta instruccin desplegara el resultado con solo dos decimales como resultado, si buscamos la documentacin de Visual Basic, esta nos muestra todos los posibles caracteres que se pueden incluir en la string de control.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

26

User-Defined Numeric Formats (Format Function)

3.3.-Dos o ms forms en Visual Basic NET


El siguiente problema comn, con el manejo de programas en VISUAL BASIC, es el de poder crear, controlar y administrar mas de dos forms a la vez. En este ejemplo o tema se crea un segundo form en diseo.

IMPORTANTE: TODOS LOS COMPONENTES LABEL'S TEXTBOX'S BUTTON'S, etc. que


se coloquen dentro de una forma o ventana deberan de asignarles su propiedad (NAME), es decir VISUAL BASIC por default si se pone un label en la primera ventana (Form1) le asigna el nombre de label1, si tambin se coloca otra label en la segunda ventana (Form2) tambin le asignara el nombre de label1 y cuando se este ejecutando el programa y se codifique una referencia a label1 visual basic tendr problemas para conocer de cual label se est tratando. Para resolver este problema la referencia deber realizarse usando el formato NOMBREFORMA.NOMBRECOMPONENTE.NOMBREPROPIEDAD Tambin es recomendable usar la propiedad NAME para todos los componentes que se usen dentro de una forma. a) Crear un proyecto normal con su FORM1 normal. b) Ahora se crea un segundo FORM2 o ventana, para lograr esto solo usar la opcin PROJECTADD NEWWINDOWSFORM y seleccionar windowsform y observar y tratar de usar algunos de los otros tipos de forma que ya trae incorporado visual basic . Esta opcin solo se muestra cuando ya se cre un proyecto, observar tambin que en el ADMINISTRADOR DE PROYECTOS aparece registradas los dos forms FORM1.vb y FORM2.vb.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

27

c) Solo hacer click en form2.vb en el administrador de proyectos (o usar la pestaa arriba en el compilador que ya debe mostrar las dos formas o ventanas) para tener en la pantalla de diseno la segunda ventana, cargarle con sus propios label's, textbox's y buttons, es decir contruirle su programa, recordar tambien asignarles sus propios NAME'S. d) El codigo del BUTTON1 de la primera ventana Form1 es: Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click Form2.Show() End Sub As System.Object, ByVal e As

Solo usar propiedad SHOW() con la ventana2 o FORM2 Recordar que si se quiere que FORM1 haga otro proceso u operacin solo agregarle componentes y mas BUTTON's El Cdigo del botn OK de la segunda ventana Form2, es: Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click Me.Close() End Sub As System.Object, ByVal e As

Estamos viendo ahora un nuevo operador de visual basic NET, el operador ME, este operador es una referencia o enlace directo al objeto activo, el evento button1_Clic() est contenido dentro de esta FORM2 por tanto el objeto activo es FORM2 Me.Close() sera equivalente a FORM2.CLOSE() pero visual basic prefiere trabajar mejor con referencias o enlaces a objetos, por eso es mejor usar THIS. Corrida: form1 Nota:
Recordar que si se quiere que FORM2 haga otro proceso u operacin solo agregarle componentes y mas BUTTON's

Recordar que les indique que windowsforms tiene muchos y valiosos controles o componentes en esta ventana se uso CALENDAR y se ve elegante

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

28

Corrida form2: Recordar otra vez que windowsforms tiene muchos y valiosos controles o componentes en esta ventana se uso WEBBROWSER y se ve elegante

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

29

4.- Estructuras, ciclos, decisiones, en Visual Basic


4.1.-Instrucciones condicionales Visual Basic
Instrucciones de control de programa que permiten alterar la secuencia normal de ejecucin de un programa. Estas instrucciones se dividen en tres grandes categoras: 1.- Instrucciones Condicionales que en VISUAL BASIC NET se implementan con las instrucciones if y select case. Instrucciones de ciclos con for do while loop do loop while Muchas de ellas con sus correspondientes componentes visuales, tanto en html como en activex, htmlcontrols y webcontrols, pero para propsito del curso solo se usaran los Controls ASP NET Una de las ms poderosas caracteristicas de cualquier computador es la capacidad que tiene de tomar decisiones. Es decir al comparar dos alternativas diferentes el computador puede tomar una decision basandose en la evaluacion que hace de alguna condicion. Ejemplo de instrucciones condicionales: si sueldo > 3000 desplegar rico si no desplegar pobre Fin-si si sexo = 'm' imprime mujer si no imprime hombre Fin-si De los ejemplos observar que los caminos a seguir por el computador dependeran de la evaluacion que el computador hace con la condicion. Todo lenguaje de programacion debe tener instrucciones que permitan formar condiciones e instrucciones que pueden evaluar esas condiciones. Pero recordar que lenguajes modernos y orientados a clientes-servidores de igual forma tienen componentes que permiten del mismo modo al usuario tomar decisiones incluso directamente en pantalla, es decir tambien existen los objetos, controles o componentes de seleccion y decision en html, htmlcontontrols, activex, webcontrols.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

30

El formato general de una instruccion condicional es:

Como se observa, son cuatro partes bien diferenciadas entre si; La propia instruccion condicional en si La condicion El grupo cierto de instrucciones El grupo falso de instrucciones Cuando el computador evalua una condicion el resultado de esa evaluacion solo es evaluado de dos maneras o la condicion es CIERTA o la condicion es FALSA. Esto depender del valor que tenga asignado o que se haya capturado para la variable que est en la condici Por ejemplo si se capturo 8000 en sueldo en el ejemplo a) entonces el computador indicara que la condicion es CIERTA pero en otro caso si a la variable sueldo primero se le asigno un valor de 250 entonces el computador indicara que la condicion es FALSA. Dependiendo del resultado de la evaluacion, el programa realiza las instrucciones contenidas en el grupo de cierto o falso respectivamente. Empezaremos el anlisis por la CONDICION presentada. CONDICIONES SIMPLES VISUAL BASIC En general todas las condiciones se forman con tres elementos los cuales son: Variables sexo sueldo Carrera Operadores relacionales = > = Constantes o variables m 30000 informatica

Una condicion simple en visual basic NET se define como el conjunto de variables y/o constantes unidas por los llamados operadores relacionales.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

31

4.2- OPERADORES RELACIONALES EN VISUAL BASIC


Los operadores relacionales que reconoce Visual Basic NET se presentan en la siguiente tabla: Operador = < > <> <= >= Significado Igual Menor que Mayor que Diferente que Menor o igual que Mayor o igual que Descripcion Es verdadero si las expresiones comparadas son iguales Es verdadero si la expresin de la izquierda es menor que la expresin de la derecha Es verdadero si la expresin de la izquierda es mayor que la expresin de la derecha Es verdadero si la expresin de la izquierda es diferente de la expresin de la derecha Es verdadero si la expresin de la izquierda es menoro igual que la expresin de la derecha Es verdadero si la expresin de la izquierda es mayor o igual que la expresin de la derecha

4.3.- INSTRUCCION IF Then Else en VISUAL BASIC


Es la instruccin condicional ms usada en los diversos lenguajes de programacin, su formato completo y de trabajo en VISUAL BASIC es:

If condicion Then Instrucciones cuando la condicion sea cierta Else Instrucciones cuando la condicion sea falsa End If

Si un if no ocupa un grupo falso de instrucciones entonces no usar la clausula else Private Sub Button1_Click(ByVal sender As System.Object, ByVal e System.EventArgs) Handles Button1.Click If SUELDO.Text > 3000 Then MessageBox.Show("RICO") Else MessageBox.Show("POBRE") End If End Sub Si lo corremos veremos algo asi: As

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

32

En Visual Basic NET es valido usar mas de una instruccion dentro del grupo cierto o falso del if.

Actividades de reforzamiento de lo aprendido

EJERCICIOS DE PROGRAMACION EN VISUAL BASIC NET 1.- Capturar un nmero cualesquiera e informar si es o no es mayor de 100 2.- Capturar un nmero entero cualesquiera e informar si es o no es multiplo de 4 (recordar el operador mod analizado en el tema de operadores aritmeticos). 3.- Capturar los cinco datos ms importantes de un Empleado, incluyendo el sueldo diario y los dias trabajados desplegarle su cheque semanal solo si gano mas de $500.00 en la semana, en caso contrario desplegarle un bono de despensa semanal de $150.00, PUEDEN USAR PANELS PARA SEPARAR O MEJOR AUN OTRAS VENTANAS O FORMAS. 4.- Capturar los datos mas importantes de un estudiante incluyendo tres calificaciones construir una boleta de calificaciones en un PANEL O VENTANA de respuesta bien bonita si el estudiante es de la carrera de medicina, en caso contrario construir un PANEL O VENTANA mas bonita todavia que despliega un oficio citando a los padres del estudiante a una platica amistosa con los maestros de la escuela. 5.- Capturar los datos ms importantes de un producto cualesquiera, incluyendo cantidad, precio, etc. desplegar una orden de compra, solo si el producto es de origen nacional, en caso contrario no hacer nada.
Nota: Es muy importante realizar siempre un diseo visual de lo que queremos realizar en el grograma y como esto se vera en la aplicacin, Visual Basic NET facilita mucho esta situacion

4.4.- CONDICIONES COMPUESTAS EN VISUAL BASIC


En muchas ocasiones es necesario presentar ms de una condicion para su evaluacion al computador. Por ejemplo se necesita un programa que el computador muestre la boleta de un alumno si este estudia la carrera de medicina y su promedio de calificaciones es mayor de 70.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

33

Una condicion compuesta se define como dos o ms condiciones simples unidas por los llamados operadores lgicos. Los operadores logicos que VISUAL BASIC NET reconoce son: OPERADOR AND OR NOT Xor AndAlso DESCRIPCION Es verdadera si las dos expresiones comparadas son verdadera Es verdadera si una de las dos expresiones es verdadera Invierte el valor de la expresin. Dos negaciones es una afirmacin y negar una afirmacin es el valor contrario de la afirmacion Es verdadera si una de las dos expresiones comparadas es verdadera Es verdadera si las dos expresiones comparadas son verdadera, con al particularidad de que evalua la segunda parte de la expresin si la primera la cumple Es verdadera si una de las dos expresiones comparadas son verdadera, con al particularidad de que si cumple la primera expresin no continua la siguientedando como verdadera la comparacin logica

OrElse

La cantidad total de casos posibles cuando se unen dos o mas condiciones simples esta dada por la relacion 2n donde n es la cantidad de condiciones, la primera mitad de ellos empieza en cierto y la segunda mitad en falso. Ejemplo, si formamos una condicion compuesta con dos condiciones simples y el operador logico y, la cantidad total de casos posibles serian 22 = 4, y se puede construir la siguiente tabla de verdad. Tabla de verdad con AND PRIMERA SIMPLE C C F F CONDICION SEGUNDA SIMPLE C F C F CONDICION EVALUACION C F F F

La evaluacion final, se obtiene usando la regla anteriormente descrita para una condicion compuesta, que contiene el operador AND. Esta tabla significa lo siguiente: 1.- Cualquiera que sean la cantidad de datos procesados, siempre caera en uno de estos cuatro casos generales. La tabla de verdad para una condicion compuesta con OR es la siguiente:

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

34

PRIMERA SIMPLE C C F F

CONDICION SEGUNDA SIMPLE C F C F

CONDICION EVALUACION C C C F

Otro ejemplo: Construir una tabla de verdad para una condicion compuesta de tres o mas condiciones simples es tambien tarea sencilla, solo recordar que; 1.- La cantidad posible de casos es 23 = 8 casos posibles, la mitad empiezan con Cierto y la otra mitad empiezan con Falso. 2.- Para evaluar esta condicion triple primero se evaluan las dos primeras incluyendo su operador bajo las reglas ya descritas y luego se evalua el resultado parcial contra la ultima condicion y ultimo operador para obtener la evaluacion final. Ejemplo una condicion compuesta de tres condiciones simples, donde el primer operador logico es el AND y el segundo operador logico es el OR, daria la siguiente tabla de verdad. PRIMERA CONDICION SIMPLE C C C C F F F F SEGUNDA CONDICION SIMPLE C C F F C C F F EVALUACION TERCERA DE PRIMERA Y CONDICION SEGUNDA SIMPLE CONDICION C C C F F C F F F C F F F C F F EVALUACION OR DE TERCERA Y CUARTA COL. C C C F C F C F

Programa ejemplo: Determinar de acuerdo a la edad si los datos del ususario son de un joven o de una persona anciana, (edad limite = 30) Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click If EDAD.Text < 30 And SEXO.Text = "H" Then Label3.Text = "Muchacho Joven" Else Label3.Text = "Anciano" End If End Sub As System.Object, ByVal e As

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

35

Salida del programa

Actividades de reforzamiento de lo aprendido

EJERCICIOS DE PROGRAMACION 1.- Construir un programa que capture un nmero cualesquiera e informe si es o no es mayor de 50 y mltiplo de tres. (Solo escribir el mensaje de respuesta de manera muy clara y esto resuelve el problema) 2.- Construir un programa que indique si un nmero es un par positivo. 3.- Capturar los datos de un producto incluyendo su cantidad en existencia, desplegar una orden de compra si la cantidad en existencia del producto es menor que el punto de reorden, o si el origen del producto es nacional. 4.- Construir un programa que capture los datos de un empleado, desplegar en un panel o ventana su cheque semanal si gana mas de $500.00 y si esta en el departamento de produccin en caso contrario desplegarle en otro panel o ventana un bono de despensa del 25% de su sueldo semanal.

4.5.-Instrucciones de control en visual basic.


INSTRUCCION SELECT CASE VISUAL BASIC Tambin existen ocasiones o programas donde se exige evaluar muchas condiciones a la vez, en estos casos o se usa una condicion compuesta muy grande o se debe

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

36

intentar convertir el problema a uno que se pueda resolver usando la instruccin SELECT CASE.

Select Case variableopcion case const1 instruccion(es) case const2 instruccion(es) case const3 Instruccion(es) case Else instruccion(es) End Select

Esta instruccin es una instruccin de decisin mltiple donde el compilador prueba o busca el valor contenido en una variable ENTERA, CHARACTER, STRING contra una lista de constantes apropiadas, cuando el computador encuentra el valor de igualdad entre variable y constante entonces ejecuta el grupo de instrucciones asociados a dicha constante, si no encuentra el valor de igualdad entre variable y constante, entonces ejecuta un grupo de instrucciones asociados a un default, aunque este ultimo es opcional. El formato de esta instruccin es el siguiente:

Programa ejemplo : Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click As System.Object, ByVal e As

Select Case LETRA.TEXT Case "A" ANIMALITO.TEXT = "AGUILA" Case "B", "b" ANIMALITO.TEXT = "BESTIA" Case "C" Dim ALFA As Integer ALFA = 100 + 5 ' observar como se encadenan strings usando simbolo & ANIMALITO.TEXT = ALFA & " CABALLOS" Case Else ANIMALITO.TEXT = "NO HAY" End Select End Sub

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

37

Observar el caso b, se pueden usar ms de dos constantes. En el caso C recordar que cada CASE puede llevar un conjunto de instrucciones que se ejecutaran hasta que el compilador encuentre el siguiente case. Observar y recordar en caso C como se unen dos o mas strings, usando el signo &.

4.6.-Ciclo FOR TO NEXT


Instrucciones para ciclos resuelven el problema de repetir todo el programa o cierta parte del programa ms de una vez. Este ciclo es uno de los ms usados para repetir una secuencia de instrucciones sobre todo cuando se conoce la cantidad exacta de veces que se quiere que se ejecute una instruccion simple o compuesta. El formato es el siguiente: FOR VARCICLO = VALINICIAL TO VALFINAL [STEP INCR O DECR] INSTRUCCION(ES) NEXT Ejemplo: Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click Dim X As Integer LISTA.Items.Clear() For X = 1 To 10 LISTA.Items.Add(X & "= MAMA") Next X End Sub Notas: Se esta usando un objeto listbox con NAME = LISTA para procesar el conjunto de datos. O se usan muchos webcontrols label o textbox para desplegar todo lo que despliega el ciclo for o se esta usando mejor un objeto listbox para procesar el conjunto de datos. Se esta usando la propiedad add de la coleccion items del control listbox (lista). Observar que para encadenar strings en visual basic se usa el signo & El metodo items.clear, es porque cuando el usuario usa el click ms de una vez, el control listbox los va agregando de nuevo abajo, por eso en cuanto se activa el onclick lo primero que se realiza es limpiar el listbox.
Docente: Univ. Nac. De Ingenieria, Managua

As

System.Object,

ByVal

As

MSc. Ing. Jorge J. Prado D.

38

El ciclo for es muy sencillo y no ocupa mucha explicacion, solo empieza en UNO y se va incrementando de UNO en UNO

Casos Particulares del ciclo for:


1.- El ciclo comienza en uno y se incrementa de uno en uno, este es el caso ms general. 2.- Pero el valor inicial puede se diferente de uno, ejemplo; FOR X=5 TO 28 Desplegar X NEXT 3.- Incluso el valor inicial puede ser negativo, ejemplo; FOR X= -5 TO 18 Desplegar X NEXT 4.- Los incrementos tambien pueden ser diferentes al de uno en uno, ej.; FOR X=1 TO 50 STEP 4 Desplegar X NEXT 5.- Incluso pueden ser decrementos, solo que en este caso, recordar; 5.1.- el valor inicial de la variable debe ser mayor que el valor final y usar un step negativo. FOR X=100 TO 20 STEP - 5 Desplegar X NEXT El uso, gestin y manipulacin de matrices (Que estudiaremos adelante) utilizan el bucle : For Each Instrucciones Next Veamos este ejemplo: Private Sub Button2_Click(ByVal sender System.EventArgs) Handles Button2.Click As System.Object, ByVal e As

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

39

Dim MiArreglo() As String = {Uno,Dos,Tres} Dim SCadena As String Dim Smensaje As String = For Each SCadena In MiArreglo Smensaje += SCadena &

Next
MessageBox.Show(Smensaje.trim) End Sub

Actividades de reforzamiento de lo aprendido

EJERCICIOS DE PROGRAMACION 1.- Construir un programa que despliegue los numeros del 20 al 30. 2.- Desplegar los enteros entre 50 y 30 acompaados de su potencia cuadrada y raiz cubica respectiva (revisar tema de operadores aritmeticos y buscar la libreria de funciones matematicas de Visual Basic). 3.- Desplegar los multiplos de 5, entre 10 y 50, acompaados de su factorial y logaritmo respectivo (La misma recomendacion del ejercio anterior). 4.- Desplegar la tabla de multiplicar que el usuario indique 5.- Evaluar la funcion y = 5x2 + 3x + 8 cuando x= -310 (rango de -3 hasta 10)

4.5.-Ciclo DO WHILE LOOP


En este ciclo el cuerpo de instrucciones se ejecuta mientras una condicion permanezca como verdadera en el momento en que la condicion se convierte en falsa el ciclo termina. Su formato general es : DO WHILE CONDICION(ES) INSTRUCCION(ES) CIERTAS INSTRUCCION(ES) DE SALIDA DE CICLO LOOP

Programa
Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click As System.Object, ByVal e As

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

40

Dim X As Integer X=1 LISTA.Items.Clear() Do While X <= 10 LISTA.Items.Add(X & "= GATO") X=X+1 Loop End Sub

Corrida
Nota:
While puede llevar dos condiciones; en este caso inicializar 2 variables de condicion y cuidar que existan 2 de rompimiento o terminacion de ciclo. El grupo cierto de instrucciones puede ser una sola instruccion o todo un grupo de instrucciones. La condicion puede ser simple o compuesta.

A este ciclo tambien se le conoce tambien como ciclo de condicion de entrada o prueba por arriba porque este ciclo evalua primero la condicion y posteriormente ejecuta las instrucciones.

Actividades de reforzamiento de lo aprendido EJERCICIOS DE PROGRAMACION 1.- Desplegar enteros entre 50 y 80 2.- Desplegar multiplos de 4 entre 60 y 20 acompanados de su logaritmos de base 10 y base e respectivos (revisar tema operadores atitmeticos) 3.- Construir la tabla de dividir que el usuario indique 4.- Evaluar una funcin cualesquiera para el rango de valores de x de -3 a +5

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

41

4.7.-Ciclo DO LOOP WHILE


Su diferencia bsica con el ciclo do while loop es que la prueba de condicin es hecha al finalizar el ciclo, es decir las instrucciones se ejecutan cuando menos una vez porque primero ejecuta las instrucciones y al final evala la condicin. Tambin se le conoce por esta razn como ciclo de condicin de salida. Su formato general es: DO INSTRUCCION (ES) CIERTAS INSTRUCCION (ES) DE SALIDA DE CICLO LOOP WHILE CONDICION (ES) Programa Private Sub EVENTO1(ByVal sender As Object, ByVal e As System.EventArgs) Dim X As Integer X=1 LISTA.Items.Clear() Do LISTA.Items.Add(X & " perico") X=X+1 Loop While X <= 10 End Sub Otra diferencia bsica con el ciclo do while loop es que aunque la condicin sea falsa desde un principio el cuerpo de instrucciones se ejecutara por lo menos una vez. CONCLUSIONES CICLOS VISUAL BASIC En Visual Basic NET dado un problema o programa cualesquiera que sea el tipo de ciclo que se utilice, se resuelve con: 1. Si se conoce la cantidad exacta de veces que se quiere que se ejecute el ciclo o si el programa de alguna manera puede calcularla usar for..net. 2. Si se desconoce la cantidad de veces a repetir el ciclo o se quiere mayor control sobre la salida o terminacion del mismo entonces usar do while loop. 3. Si se quiere que al menos una vez se ejecute el ciclo entonces usar do loop while.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

42

4.7.-Arreglos en Visual Basic NET


Uno de los problemas ms comunes en los diversos sistemas de informacin es el tratamiento o procesamiento de una gran volumen de datos o de informacin. Las variables usadas hasta ahora reciben propiamente el nombre de variables escalares porque solo permiten almacenar o procesar un dato a la vez. Por ejemplo si se quiere almacenar nombre y edad de 15 personas con el mtodo tradicional se ocuparan 30 variables y solo es nombre y edad de 15 personas, agreguen ms datos y ms personas y ya es tiempo de empezar a analizar otro tipo de variables. Es decir, en problemas que exigen manejar mucha informacin o datos a la vez, variables escalares no son suficientes ya que su principal problema es que solo permiten almacenar y procesar un dato a la vez. Se ocupan entonces variables que sean capaces de almacenar y manipular conjuntos de datos a la vez. Variables de tipo arreglo si permiten almacenar y procesar conjuntos de datos del mismo tipo a la vez. Cada dato dentro del arreglo se le conoce como elemento del arreglo y se simboliza y procesa (captura, operacin, visualizar) usando el nombre del arreglo respectivo y un subndice indicando la posicin relativa del elemento con respecto a los dems elementos del arreglo, solo recordar que en VISUAL BASIC NET la primera posicin, elemento o rengln es el 0 (cero), ej. NOMBRES Juan >nombres(0) Pedro nombres(1) Rosa > nombres(2) Jose > nombres(3)
Cada sub ndice nos da la posicin de la variable en los arreglos y las listas de dTOS

Sin embargo sus problemas son similares a los de variables normales es decir hay que declararlos, capturarlos, hacer operaciones con ellos, desplegarlos, compararlos, etc. En programacion tradicional siempre se manejan dos tipos de arreglos los arreglos tipo listas, vectores o unidimensionales y los arreglos tipo tablas, cuadros, concentrados, matrices o bidimensionales en ambos casos son variables que permiten almacenar un conjunto de datos del mismo tipo a la vez, su diferencia es en la cantidad de columnas que cada uno de estos tipos contiene, como en los siguientes ejemplos: a) LISTAS EDAD
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

43

18 34 22 15 22 45

B) TABLAS CIA ACME S.A. INGRESOS MENSUALES DE VENTAS (MILES DE $) SUCURSAL SUCURSAL A SUCURSAL B SUCURSAL D ENERO 10 60 100 FEBRERO 20 70 110 MARZO 30 80 90 ABRIL 40 90 120

Como se observa la diferencia principal entre un arreglo tipo lista y un arreglo tipo tabla son las cantidades de columnas que contienen. En algebra matricial, si son importantes los conceptos de vectores y matrices, pero las operaciones y metodos son precisamente los del algebra matricial.

ARREGLOS TIPO LISTA


Un arreglo tipo lista se define como una variable que permite almacenar un conjunto de datos del mismo tipo organizados en una sola columna y uno o mas renglones. Tambien reciben el nombre de vectores en algebra o arreglos unidimensionales en programacion. Los procesos normales con una lista o con sus elementos incluyen declarar toda la lista, capturar sus elementos, desplegarlos, realizar operaciones con ellos, desplegarlos, etc. Para declarar una lista se usa el siguiente formato; SHARED DIM NOMLISTA(CANT ELEMENTOS -1) AS <TIPODATO> Shared (compartido), se usa cuando la lista se tenga que compartir entre varias subutinas, observar que cada boton de comando en un programa empieza con sub-end sub, si un programa tiene varias subrutinas que compartan la misma lista, dicha lista debera ser SHARED. La cantidad de elementos-1, significa que si se quiere una lista de 5 ciudades por ejemplo su declaracion sera shared dim ciudad(4) as string, la razon de esto es que visual basic empieza una lista por el elemento o renglon cero(0), por tanto cuando se pide crear una lista de 4 ciudades, visual basic net le agrega el renglon o elemento 0, que en total darian 5 ciudade. Es tambien importante recordar que un arreglo en visual basic net es realmente un objeto derivado de la clase SYSTEM.ARRAY.
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

44

Recordar tambien que como objeto arreglo, tambien puede usar una serie de metodos pertenecientes a dicha clase system.array, los metodos principales de dicha clase y por tanto de los arreglos derivados de la misma puede estudiarlos en la ayuda del lenguaje. En visual Basic recordar que la primera posicion o renglon en una lista es la posicion o renglon 0 (cero). La captura del dato, puede venir de momento de un objeto textbox y/o se usan tantos de estos controles como elementos tenga el arreglo o mas facil aun se debera controlar la captura de elementos usando algun algoritmo sencillo de validacion como lo muestra el programa ejemplo. Private Sub Button2_Click(ByVal sender System.EventArgs) Handles Button2.Click As System.Object, ByVal e As

Dim MiArreglo(10) As Integer Dim I As Integer LISTA2.Items.Clear() ' CARGANDO EL ARREGLO LISTA ORIGINAL CON DATOS For I = 0 To 10 MiArreglo(I) = I * 2

Next
' DESPLEGANDO Dim SValores As String = For I = 0 To 10 SValores += MiArreglo(I) Next MessageBox.Show(SValores.trim) End Sub Otro Ejemplo: ' DECLARANDO LISTA GLOBAL Y ESTA DECLARACION ESTAN FUERA DEL SUB Shared EDADARR(4) As Integer ' DECLARANDO RENG COMO GLOBAL Dim RENG As Integer
0 2 4 6 8 10 12 14 16 18 20

PROCESO

Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'En este modulo solo se trabaja con el arreglo en memoria If RENG <= 5 Then EDADARR(RENG) = EDAD.Text RENG = RENG + 1 EDAD.Text = "" End If

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

45

If RENG >= 5 Then EDAD.Visible = False RENG = 0 End If End Sub Private Sub Button2_Click(ByVal sender System.EventArgs) Handles Button2.Click As System.Object, ByVal e As

' LIMPIANDO LISTAS LISTA1.Items.Clear() LISTA2.Items.Clear() ' CARGANDO LISTA ORIGINAL CON EDAD CAPTURADA For RENG = 0 To 4 LISTA1.Items.Add(EDADARR(RENG))

Next
' A MESES Y Y DESPLEGANDO For RENG = 0 To 4 EDADARR(RENG) = EDADARR(RENG) * 12 LISTA2.Items.Add(EDADARR(RENG)) Next End Sub Corrida
Observar que en el programa el arreglo edad y la variable renglon se declararon de tipo GLOBAL porque los dos metodos el de captura y el de operacion-despliegue, las estan compartiendo.

Ademas observar que se declararon antes de los eventos clickButton, para crearlos como objetos globales.

Para el caso de operaciones y comparaciones con todos los elementos de la lista a la vez se debera usar un ciclo for con una variable entera llamada renglon, misma que tambien se usa como indice de la lista. Recordar que todos los datos internos de la lista estaran almacenados en la memoria ram del computador, para despliegues se usa un componente visual que permite manipular un conjunto de datos a la vez, el ListBox con sus metodos apropiados pero

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

46

se tiene que usar un ciclo for para ir anadiendo o agregando elemento por elemento como se observa en el problema ejemplo que se ha venido desarrollando, en este caso se quiere desplegar las cinco edades convertidas a meses. La ultima intruccion y muy importante es poner en cero las variables de control de ciclos o indice de arreglos, esto es porque el servidor mantiene el programa ejecutandose continuamente en memoria y si se vuelve a pedir la ejecucion del programa, en cuento se intente capturar un nuevo dato va a marcar el error arreglo fuera de limite o arrayofbound, estan avisados. Para inicializar una lista con valores se debe usar el siguiente formato: Shared Dim nomlista() As <tipodato> = {lista de valores separados por comas} Ejemplo: Shared Dim edad() as Integer = {15,16,17,18} Shared Dim sueldo() as Double = {40.85, 65.30, 33.33} Shared Dim ciudad() as String = {Managua, Leon, Masaya, Granada} EJERCICIOS DE PROGRAMACION DE ARREGLOS TIPO LISTA 1.- Capturar y desplegar 5 precios de productos cualesquiera usando dos panel uno para capturar y uno para desplegar 2.- Capturar 4 sueldos en un panel desplegarlos aumentados en un 25% en otro panel 3.- Capturar los datos de 5 productos comprados en una tienda, incluyendo nombre, precio y cantidad en sus 3 listas respectivas, despues calcular una cuarta lista con el gasto total por cada producto desplegarlo todo en un segundo panel e incluir tambien el gran total 4.- Capturar en una lista solamente 6 numeros multiplos de 5, se debe de estar capture y capture numeros hasta que se completen los 6 multiplos de 5

Arreglos tipo tabla


Un arreglo tipo tabla se define como un conjunto de datos del mismo tipo organizados en dos o ms columnas y uno o ms renglones. Para procesar (recordar solo operaciones y comparaciones) internamente todos los elementos de la tabla se ocupan dos ciclos for uno externo para controlar renglon y uno interno para controlar columna. Los elementos de la tabla se deberan simbolizar con el nombre de la tabla y 2 subindices, el primer subindice referencia al renglon y el siguiente subindice referencia la columna los dos dentro del mismo corchete.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

47

La declaracion de una tabla sera de acuerdo al siguiente formato: SHARED DIM NOMTABLA(RENG-1,COL-1) AS <TIPODATO> Ejemplo: SHARED DIM SUELDO(3,4) AS DOUBLE Recordar que va a generar una matriz que tendra cuatro renglones y cinco columnas empieza en sueldo(0,0) Para capturar sus elementos, usaremos un textbox y un boton de captura, solo tener cuidado o mucho control sobre los indices rEN y col como lo muestra el ejemplo. Para efectuar otros procesos tales como operaciones, despliegues con todos los elementos de la tabla se deberan usar 2 ciclos un for externo para controlar renglon y un for interno para controlar columna. Programa ' DECLARANDO LISTA GLOBAL ' RECORDAR QUE SON 3 RENG Y 4 COLUMNAS Shared CALIFICACION(2, 3) As Integer ' DECLARANDO RENG Y COL COMO GLOBAL Dim R, C As Integer Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' EN ESTE MODULO SOLO SE TRABAJA CON EL ARREGLO ' EN MEMORIA CALIFICACION(R, C) = CALIF.Text C=C+1 CALIF.Text = "" If C = 4 Then R=R+1 C=0 End If If R = 3 Then CALIF.Visible = False End If End Sub Private Sub Button2_Click(ByVal sender System.EventArgs) Handles Button2.Click As System.Object, ByVal e As

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

48

Dim TEMP As String ' PROCESANDO Y REGALANDO 50 PUNTOS A TODOS For R = 0 To 2 For C = 0 To 3 CALIFICACION(R, C) = CALIFICACION(R, C) + 50 Next C Next R ' desplegando For R = 0 To 2 TEMP = CALIFICACION(R, 0) & " " & CALIFICACION(R, 1) & " " & CALIFICACION(R, 2) & " " & CALIFICACION(R, 3) LISTA1.Items.Add(TEMP) ' limpiando temporal antes de otro renglon TEMP = " " Next End Sub Notas: Observar el formato de declaracion y como se controlan los indices de captura r, c Para procesar los elementos se usan dos ciclos for y el formato tabla (reng,col). En este problema se usa el objeto LISTBOX para presentar el resultado mas adelante se usara un objeto mas apropiado. Diseo: Corrida:

Las matrices en Visual Basic tienen la capacidad de cambiar o modificar su tamao, es decir su dimensin en memoria, utilizando las palabras reservadas: ReDim ReDim Preserve Ejemplo:

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

49

Dim MiArreglo() As String Declaro mi arreglo ReDim MiArreglo(2) Declaro nuevamente mi arreglo de dimension 3 MiArreglo(0) = Uno : MiArreglo(1) = Dos : MiArreglo(2) = Tres ReDim Preserve MiArreglo(3) Declaro nueva dimensin preservando los valores MiArreglo(3) = Cuatro MessageBox.Show(MiArreglo(0)) Muestro el valor del primer dato

Nota : Podemos concatenar varias lneas de cdigo separadas por : Importante: Si deseamos conocer el tamao o dimensin, podemos utilizar unmetodo de los arreglos : MiArreglo.Length Ejemplo, utilizando el anterior podemos escribir MessageBox.Show(MiArreglo.Length) Nos visualizara 4, que es la dimensin del arreglo Importante: Si deseamos eliminar los elementos de un arreglo de forma rpida utilizamos la palabra rservada Nothing, ejemplo: MiArreglo = Nothing If MiArreglo IsNothing then MessageBox.Show( Nada) Else MessageBox.Show(MiArreglo.Length) presenta la dimension Endif Importante: Si deseamos copiar una matriz en otra podemos hacerlo de esta forma: MiArreglo.CopyTo(OtroArreglo,0) Ejemplo: Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim MiArreglo() As String = {Mercurio,Venus,Tierra} Dim OtroArreglo() As String ReDim OtroArreglo(MiArreglo.Lenght 1) MiArreglo.CopyTo(OtroArreglo,0) MessageBox.Show(OtroArreglo(0)) End Sub

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

50

Actividades de reforzamiento de lo a aprendido

TAREAS PROGRAMACION DE TABLAS 1.- Construir un cuadro que contenga los costos fijos de cuatro productos cualesquiera, que se producen en tres plantas diferentes de una empresa maquiladora (2 prog uno capturado y otro inicializado). 2.- Construir un cuadro que contenga los ingresos mensuales por ventas durante los tres primeros meses del ano de cuatro sucursales de una cadena de auto refacciones, agregar al final una lista que muestre los ingresos mensuales totales por meses y una segunda lista que muestre los ingresos mensuales totales por sucursal(2 progs uno capturado y otro inicializado). 3.-Construir un cuadro que contenga las comisiones ganadas por tres vendedores, de los 5 tipos de linea blanca de conocida muebleria, ademas listas de comisiones totales y promedios ganadas por los vendedores, asi como listas de comisiones totales y promedios por tipo de linea blanca Analizar este codigo: ' PARA TOTALES Y PROMEDIOS POR RENGLON (FILAS) FOR R = 0 TO 3 FOR C = 0 TO 2 TOTRENG(R) = TOTRENG(R) + TABLA(R,C) NEXT C PROMRENG(R) = TOTRENG(R)/3 NEXT R 'PARA TOTALES Y PROMEDIOS POR COLUMNA FOR C = 0 TO 2 FOR R = 0 TO 3 TOTCOL(C)=TOTCOL(C) + TABLA(R,C) NEXT R PROMCOL(C) = TOTCOL(C) / 4 NEXT C

4.9--Funciones del lenguaje integradas


Cada lenguaje dispone de un grupo de funciones de apoyo, para ayudar al programador en su trabajo cotidiano. Las versiones anteriores de Visual Basic

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

51

contenan un gran nmero de funciones para realizar operaciones aritmticas, manipular cadenas, fechas, etc. VB.NET tambin tiene funciones para las operaciones antes comentadas. No obstante, debido a la orientacin a objetos sobre la que est construida la plataforma .NET, la gran potencia a la hora de resolver cualquier situacin la encontraremos en el gran nmero de clases proporcionadas por el entorno para resolver las ms variadas situaciones, lo que veremos en el tema dedicado a OOP. En este apartado y organizadas por categoras, vemos una pequea muestra de las funciones disponibles en VB.NET. Consulte el lector la documentacin de la plataforma, para obtener informacin ms detallada de todas las funciones disponibles.

Funciones Numricas
Int(Nmero), Fix(Nmero). Estas funciones devuelven la parte entera del parmetro Nmero. La diferencia entre ambas reside en que cuando el parmetro pasado es negativo, Int() devuelve el entero negativo menor o igual que Nmero, mientras que Fix( ) devuelve el entero negativo mayor o igual que Nmero. Ver el Cdigo 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([Nmero]). Inicializa el generador de nmeros aleatorios, que utilizaremos posteriormente en la funcin Rnd( ). Opcionalmente recibe un nmero como parmetro que sirve al generador como valor inicial o semilla para la creacin de estos nmeros. Rnd([Nmero]). Devuelve un nmero aleatorio de tipo Single, que ser menor que 1, pero mayor o igual a cero. Podemos, opcionalmente, variar el modo de generacin del nmero pasando un valor al parmetro de esta funcin. En funcin de si el parmetro es mayor, menor de cero, o cero, el comportamiento de Rnd( ) a la hora de generar el nmero ser diferente. Ver el Cdigo Dim Contador As Integer Dim Aleatorio As Single Randomize() For Contador = 1 To 5 Aleatorio = Rnd()
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

52

MsgBox("Nmero generado: es "&, Aleatorio) Next

El anterior cdigo produce una salida similar a la mostrada en la Figura

Numero generado: 0,706402 Numero generado: 0,4058605 Numero generado: 0,337209 Numero generado: 0,8914912 Numero generado: 0,8711619

Generacin de nmeros aleatorios con Rnd( ). Si necesitamos que el nmero aleatorio est comprendido en un intervalo de nmeros enteros, utilizaremos la frmula del Cdigo para generarlo. Int((LmiteSuperior - LmiteInferior + 1) * Rnd() + LmiteInferior) El ejemplo del Cdigo crea nmeros aleatorios comprendidos entre el intervalo de los nmeros 7 y 12. Dim Contador As Integer Dim Aleatorio As Single Randomize() For Contador = 1 To 10 Aleatorio = Int((12 - 7 + 1) * Rnd() + 7) MsgBox("Nmero generado: "& Aleatorio) Next

Funciones Cadena de caracteres


Len(Cadena). Devuelve un nmero con la longitud de la cadena pasada como parmetro. Ver el Cdigo Dim Longitud As Integer Longitud = Len("comprobar cuantos caracteres hay") MsgBox("La cadena tiene caracteres " & Longitud) ' 32 Space(Nmero). Devuelve una cadena de espacios en blanco, de una longitud igual al nmero pasado como parmetro. Ver el Cdigo.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

53

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 [, TipoComparacin]). Busca dentro de CadenaBuscar la cadena contenida en el parmetro CadenaBuscada. Opcionalmente podemos establecer en Comienzo, la posicin en la que comienza la bsqueda y el tipo de comparacin (texto, binaria) en el parmetro TipoComparacin. Ver el Cdigo Dim CadBuscar As String Dim CadBuscada As String Dim PosComienzo As Integer CadBuscar = "El castillo del bosque" PosComienzo = InStr(CadBuscar, "tillo") MsgBox("La posicin de comienzo de la cadena encontrada es: " & ,PosComienzo) '7 Left(Cadena, Longitud). Esta funcin extrae, comenzando por la parte izquierda de Cadena, una subcadena de Longitud de caracteres. Right(Cadena, Longitud). Esta funcin extrae, comenzando por la parte derecha de Cadena, una subcadena de Longitud de caracteres. El Cdigo muestra ejemplos de Left( ) y Right( ). Dim CadIzquierda As String Dim CadDerecha As String CadIzquierda = Left("Especial", 3) MsgBox("Resultado de la funcin Left(): "& CadIzquierda) ' Esp CadDerecha = Right("Especial", 3) MsgBox("Resultado de la funcin Right(): "& CadDerecha) ' ial Mid(Cadena, Inicio [, Longitud]). Extrae de Cadena, comenzando en la posicin Inicio, una subcadena. Opcionalmente podemos utilizar el parmetro Longitud, para indicar el largo de la subcadena. En caso de no utilizar este ltimo parmetro, la subcadena se obtendr hasta el final. Ver Cdigo Dim MiCadena As String Dim SubCadena As String MiCadena = "El bosque encantado" SubCadena = Mid(MiCadena, 6)

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

54

MsgBox("Subcadena hasta el final: "& SubCadena) ' sque encantado SubCadena = Mid(MiCadena, 6, 3) MsgBox("Subcadena de 3 caracteres: "& SubCadena) ' squ
Replace(Cadena,CadOrigen,CadNueva [,Inicio] [,Sustituciones] [,TipoComparacin]).

Esta funcin toma la cadena situada en el primer parmetro y busca la cadena CadOrigen, sustituyendo las ocurrencias encontradas por la cadena CadNueva. Opcionalmente, el parmetro Inicio especifica la posicin en la que comenzar la sustitucin; el parmetro Sustituciones indica el nmero de sustituciones a realizar; y TipoComparacin indica como se realizarn las comparaciones (texto, binaria). Veamos unos ejemplos en el Cdigo 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) ' en el anterior ejemplo los dos primeros caracteres no se sustituyen porque ' no se ha especificado el tipo de comparacin, que a continuacin 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) 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( ). Ver el Cdigo 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 parmetro a maysculas y minsculas respectivamente. Ver el Cdigo . Dim Cadena As String : Dim CadMay As String: Dim CadMin As String Cadena = "Vamos a Convertir En Maysculas Y MinscuLAS" CadMay = UCase(Cadena) CadMin = LCase(Cadena) ' "VAMOS A CONVERTIR EN MAYSCULAS Y MINSCULAS" MsgBox("Conversin a maysculas: " & CadMay)

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

55

' "vamos a convertir en maysculas y minsculas" MsgBox("Conversin a minsculas: " & CadMin) Format(Expresin[,CadenaFormato][,PrimerDaSemana[,PrimeraSemanaAo]). Formatea la expresin pasada en el primer parmetro, 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 parmetros para especificar el primer da de la semana y la primera semana del ao; estos dos ltimos parmetros son enumeraciones, cuyos valores aparecen automticamente al asignar su valor. Consulte el lector, la documentacin de ayuda para ms informacin. Como cadena de formato, podemos utilizar los nombres predefinidos de formato, o una serie de caracteres especiales, tanto para formateo de nmeros como de fechas. En lo que respecta a los nombres predefinidos, la Tabla 23 muestra algunos de los utilizados. Nombre de formato General Date Short Date Short Time Standard Currency Descripcin Muestra una fecha con el formato largo del sistema. Muestra una fecha empleando el formato corto del sistema. Muestra un valor horario con el formato corto del sistema. Muestra un nmero utilizando los caracteres de separador de miles y decimales. Muestra un nmero con los caracteres correspondientes a la moneda establecida en la configuracin regional del sistema. Muestra un nmero multiplicado por 100 y con el carcter de tanto por ciento. Nombres de formato para la funcin Format( ). El Cdigo fuente 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 2004

Percent

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

56

ValorFormato = Format(MiFecha, "Short Date") ValorFormato = Format(MiFecha, "Short Time") ValorFormato = Format(MiNumero, "Standard") ValorFormato = Format(MiNumero, "Currency") ValorFormato = Format(MiNumero, "Percent")

' "19/07/2002" ' "18:25" ' "1.804,00" ' "1.804 pta" ' "180400,00%"

Para los caracteres especiales, la Tabla muestra un conjunto de los ms habituales. Carcter de formato : / d dd ddd dddd M MM MMM MMMM yy yyyy H HH m mm s ss 0 # Descripcin

Separador de hora. Separador de fecha. Visualiza el nmero de da sin cero a la izquierda. Visualiza el nmero de da con cero a la izquierda. Visualiza el nombre del da abreviado. Visualiza el nombre del da completo. Visualiza el nmero de mes sin cero a la izquierda. Visualiza el nmero de mes con cero a la izquierda. Visualiza el nombre del mes abreviado. Visualiza el nombre del mes completo. Visualiza dos dgitos para el ao. Visualiza cuatro dgitos para el ao. Visualiza la hora sin cero a la izquierda. Visualiza la hora con cero a la izquierda. Visualiza los minutos cero a la izquierda. Visualiza los minutos con cero a la izquierda. Visualiza los segundos cero a la izquierda. Visualiza los segundos con cero a la izquierda. En valores numricos, muestra un dgito o cero. En valores numricos, muestra un dgito o nada.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

57

, .

Separador de millar. Separador decimal. Caracteres de formato para la funcin Format( ).

El Cdigo muestra algunos ejemplos de formato con caracteres especiales. 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" StrConv(Cadena, TipoConversin [,IDLocal]). Realiza una conversin de la cadena pasada como parmetro, utilizando algunos de los valores de la enumeracin TipoConversin. Opcionalmente podemos pasar tambin un valor correspondiente al identificador local del sistema. Ver el Cdigo fuente Dim MiCadena As String Dim Conversion As String MiCadena = "el tren lleg puntual" ' convertir a mayscula Conversion = StrConv(MiCadena, VbStrConv.UpperCase) ' convertir a minscula Conversion = StrConv(MiCadena, VbStrConv.LowerCase) ' convertir a mayscula la primera letra de cada palabra Conversion = StrConv(MiCadena, VbStrConv.ProperCase)

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 parmetro TipoIntervalo. El intervalo a utilizar pueden ser das, 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 funcin de TipoIntervalo, la diferencia calculada sern das, horas, meses, aos, etc. DatePart(TipoIntervalo, Fecha). Extrae la parte de una fecha indicada en TipoIntervalo. Podemos obtener, el da, mes, ao, da de la semana, etc. El Cdigo fuente muestra un conjunto de ejemplos que utilizan las funciones para
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

58

manipular fechas. 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

4.10.-PROCEDIMIENTOS O SUBRUTINAS EN VISUAL BASIC NET


Recordar que un objeto presenta tres aspectos, propiedades, metodos y eventos, en esta unidad se analizan algunos elementos que intervienen en la definicion de un metodo. Estamos hablando de los llamados procedimientos y funciones, que quede claro que procedimientos y funciones son solo algunos aspectos (importantes) de la definicion de un metodo, pero que existen elementos tan o mas importantes que los analizados en esta unidad. Un procedimiento es un grupo de instrucciones, variables, constantes, etc, que estan disenados con un proposito particular y tiene su nombre propio. Es decir un procedimiento es un modulo de un programa que realiza tareas especificas y que no puede regresar valores al programa principal u a otro procedimiento que lo este invocando. Despues de escribir un procedimiento se usara su propio nombre como una sola instruccion o llamada al procedimiento usando el formato: CALL NOMPROC() El formato para construir un procedimiento o subrutina en VISUAL BASIC NET es: Sub NomProc() Instrucciones End Sub Un programa puede tener tantos procedimientos o subrutinas como se deseen, para hacer una llamada o invocacion al procedimiento durante la ejecucion de un programa solo se debera escribir el nombre del procedimiento y los parentesis en blanco. Programa Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click As System.Object, ByVal e As

' llamando, invocando o activando procedimiento uno Call PROC1()

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

59

End Sub Sub PROC1() Label2.Text = EDAD.Text * 12 End Sub Corrida

Como se observa un procedimiento puede ser un programa completo.

Actividades de reforzamiento de lo aprendido

EJERCICIOS DE PROGRAMACION DE FUNCIONES Construir tres programas que contengan los procedimientos abajo del sub buttonclick(). a) Convertir $800.00 Cordobas a dolares. b) Calcular el Area de un triangulo c) Deplegar una Boleta de calificaciones. PARAMETROS EN VISUAL BASIC Un parametro es una variable que puede pasar su valor a un procedimiento desde el principal o desde otro procedimiento. Existen ocasiones en que es necesario mandar al procedimiento ciertos valores para que los use en algun proceso.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

60

Estos valores que se pasan del cuerpo principal del programa o de un procedimiento a otros procedimientos se llaman parametros. Entonces la declaracion completa de un procedimiento es : SUB NOMPROC(lista de parametros) cuerpo de instrucciones END SUB Donde lista de parametros es una o mas variables separadas por comas como lo muestra el pograma ejemplo. Programa Private Sub Button1_Click(ByVal sender As System.Object, ByVal System.EventArgs) Handles Button1.Click Dim nom As String nom = "pepe" 'Se puede mandar como parametro un dato, variable 'o expresion algebraica Call PROC1(3.75, nom, 4 + 8) End Sub Sub PROC1(ByVal deci As Single, ByVal nom As String, ByVal suma As Integer) ' pero siempre se recibe en una variable Label2.Text = EDAD.Text + deci + suma Label3.Text = nom End Sub Observar que en el procedimiento los parametros crean dos variables de manera local, es decir variables que solo se pueden usar dentro del procedimiento estas variables son quienes reciben los datos o valores. REGLAS PARA EL USO DE PARAMETROS: 1.- Cuando se usan variables como parametros la variable que se manda debe ser declarada dentro del principal o del procedimiento de donde se esta enviando. 2.- La variable que se manda tiene un nombre, la que se recibe puede tener otro nombre o el mismo nombre por claridad de programa, pero recordar que internamente en la memoria del computador existiran dos variables diferentes. 3.- La cantidad de variables que se envian deben ser igual en cantidad, orden y tipo a las variables que reciben. 4.- La variable que se recibe tiene un ambito local dentro del procedimiento, es decir solo la puede usar ese procedimiento. 5.- Se puede mandar a un procedimiento un dato, una variable (como lo muestran los ejemplos) o una expresion algebraica (no ecuacion o formula) pero siempre se deberan recibir en una variable. Corrida e As

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

61

Actividad de reforzamiento de lo aprendido

EJERCICIOS DE PROGRAMACION DE FUNCIONES 1.- En una VENTANA recoger 3 calificaciones en el onclick, calcular promedio en procedimiento uno y desplegar nombre y promedio en un segundo procedimiento 2,- Construir una tabla de multiplicar que el usuario indique, captura y control de ciclo en button_click, calculo y despliegue en un procedimiento usar un solo listbox para la tabla resultado. 3.- Construir un procedimiento que reciba un numero entero y que mande llamar a un segundo procedimiento pasando el letrero PAR O IMPAR FUNCIONES EN VISUAL BASIC NET Una funcion es un modulo de un programa separado del cuerpo principal que realiza una tarea especifica y que puede regresar un valor a la parte principal del programa u otra funcion o procedimiento que la invoque. La forma general de una funcion es: Function NOMFUNCION(parametros) instrucciones NOMFUNCION = cargarlo porque es quien regresa el dato End Function La lista de parametros formales es una lista de variables separadas por comas (,) que almacenaran los valores que reciba la funcion estas variables actuan como locales dentro del cuerpo de la funcion. Aunque no se ocupen parametros los parentesis son requeridos. Dentro del cuerpo de la funcion deber haber una instruccion que cargue el NOMFUNCION para regresar el valor, de esta manera se regresan los datos.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

62

Sin embargo es de considerar que NOMFUNCION puede regresar un dato, una variable o una expresion algebraica (no ecuacion o formula) como lo muestran los siguientes ejemplos: a) NOMFUNCION = 3.1416 b) NOMFUNCION = area c) NOMFUNCION = x + 15 / 2 Recordar ademas: a) Una funcion no se llama usando CALL b) Cuando se llame a una funcion debera haber una variable que reciba el valor que regresara la funcion, es decir generalmente se llama una funcion mediante una sentencia de asignacion, por ejemplo resultado = funcion(5, 3.1416) Programa Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'Creando variable que recibira el valor que regrese la funcion Dim alfa as integer 'llamando la funcion y mandandole datos o parmetros observar que se llama por 'igualdad alfa = FUNCION1(500) ' Aunque se puede llamarla directamente y cuantas veces sea necesario Label1.Text = FUNCION1(100) - alfa End Sub Function FUNCION1(ByVal varuno As Integer) ' cargando y regresando el nomfuncion FUNCION1 = 100 + varuno End Function Corrida
Nota: Es permitido cargar ms de un NOMFUNCION en el cuerpo de instrucciones sobre todo en condiciones, pero solo uno de ellos se ejecutara

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

63

Ejemplo; if suma >= 10 then funcion50 = 300 else funcion50 = 20 end if

TIPOS USUALES DE FUNCIONES.


Las primeras son de tipo computacional que son diseadas para realizar operaciones con los argumentos y regresa un valor basado en el resultado de esa operacion. Las segundas funciones son aquellas que manipulan informacion y regresan un valor que indican la terminacion o la falla de esa manipulacion. Las terceras son aquellas que no regresan ningun valor, es decir son estrictamenta procedurales. Esto quiere decir que en general toda operacion o calculo en un programa debera convertirse a una o muchas funciones y el resto deberan ser procedimientos.

ARREGLOS COMO PARAMETROS


Para pasar un arreglo completo como parametro a un procedimiento o a una funcion solo se manda el nombre del arreglo sin corchetes e indices, en el procedimiento o funcion que recibe solo se declara un arreglo del mismo tipo y se puede usar el mismo o diferente nombre del arreglo sin corchetes e indices. Sin embargo es conveniente aclarar, que a diferencia de variables escalares normales visual basic no genera una nueva variable en memoria ni tampoco copia los datos al arreglo que recibe, en su lugar visual basic sigue usando los datos que estan en el arreglo original, es por esta razon que cambios que se le hagan a los datos del arreglo que recibe realmente se esta haciendo al arreglo original como lo muestra el siguiente ejemplo: Programa Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click As System.Object, ByVal e As

' creando y cargando una lista local con 5 elementos Dim lista1() As Integer = {1, 2, 3, 4, 5} ' pasandola a un procedimiento observar que se pasa sin parentesis Call PROC1(lista1) ' desplegando lista original y observar el resultado Dim r As Integer For r = 0 To 4

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

64

LISTA.Items.Add(lista1(r)) Next r End Sub Sub PROC1(ByVal vector) ' recibiendola con otro nombre y ' sumando a vector + 100 Dim r As Integer For r = 0 To 4 vector(r) = vector(r) + 100 Next r End Sub Corrida Es de recordar que los cambios que le hagan al arreglo dentro del procedimiento se reflejaran en el arreglo original, es por esto que si se quiere modificar un arreglo en un procedimiento funcion no hay necesidad de regresar ningun valor y por tanto no se ocupan funciones. Solo para los casos que se quiera regresar algun dato especial del arreglo, por ejemplo regresar el primer dato par, o la suma de todos los elementos del arrreglo o el promedio de todos sus elementos, etc etc etc, solo en casos como estos se mandara una arreglo a una funcion.

Actividades de reforzamiento de lo aprendido

EJERCICIOS DE PROGRAMACION DE FUNCIONES 1.- Capturar 3 calificaciones y nombre en un procedimiento, calcular promedio en una funcion, desplegar en otro procedimiento, BUTTONCLICK SOLO ACTIVA EL PRIMER PROCEDIMIENTO 2.- Crear una tabla de multiplicar, captura y control de ciclo en el principal (BUTTONCLICK), operaciones en una funcion, despliegue en el principal. 3.- Inicializar 10 edades en el principal(buttonclick) mandar la lista a un procedimiento que la convierte a meses, desplegar en principal.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

65

4.- Capturar un arreglo de 7 ciudades en un primer procedimiento, sortear en un segundo y desplegar en un tercero, la lista original y la lista ordenada.

Funciones de comprobacin de tipos de datos


Si tenemos desactivada la comprobacin de tipos con Option Strict, pero en ciertas situaciones necesitamos comprobar si determinada variable o expresin contienen un valor numrico, 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 funcin devuelve un valor lgico indicando si la expresin que pasamos como parmetro contiene un nmero o una cadena que pueda ser convertida a nmero. Ver el Cdigo Private Sub Button1_Click(ByVal sender As System.EventArgs) Handles Button1.Click Dim Valor As Object Dim Total As Integer Valor = Inputbox( Introduzca un valor) If IsNumeric(Valor) Then Total = Valor + 100 MsgBox("Resultado: "& Total) Else MsgBox("El valor introducido no es numrico") End If End Sub System.Object, ByVal e As

IsDate( ). Esta funcin devuelve un valor lgico indicando si la expresin que pasamos como parmetro contiene una fecha o una cadena que pueda ser convertida a fecha. Ver el Cdigo Private Sub Button1_Click(ByVal sender As System.Object, System.EventArgs) Handles Button1.Click Dim Valor As Object Dim UnaFecha As Date Valor = Inputbox( Introduzca un valor) If IsDate(Valor) Then UnaFecha = Valor MsgBox("La fecha es: "& UnaFecha) Else MsgBox("El valor introducido no es una fecha") End If End Sub ByVal e As

IsArray( ). Esta funcin devuelve un valor lgico indicando si la expresin que

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

66

pasamos como parmetro contiene un array. Ver el Cdigo . Private Sub Button1_Click(ByVal sender As System.Object, 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 parmetro contiene un array If IsArray(ValorPasado) Then MsgBox("El parmetro pasado es un array") Else MsgBox("El parmetro pasado no es un array") End If End Sub

ByVal

As

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

67

5.- Programando con controles en Visual Basic


Los controles proporcionan al usuario el medio para comunicarse con nuestro formulario, y en definitiva, con la aplicacin. Por ello, en los siguientes apartados, mostraremos los principales aspectos que debemos tener en cuenta a la hora de su creacin, manipulacin y codificacin. Tambin realizaremos una revisin de los principales controles, mostrando algunas de sus caractersticas ms destacadas.

5.1.-El Cuadro de herramientas


Una vez creado un proyecto, o despus de aadir un nuevo formulario, para utilizar controles en el mismo, tendremos que tomarlos de la ventana Cuadro de herramientas disponible en el IDE de VS.NET, y aadirlos al formulario. Ver Figura

Insertar un control en el formulario


Para aadir un control en el formulario, proceso que tambin se conoce como dibujar un control, debemos seleccionar primeramente el control a utilizar de la lista que aparece en el cuadro de herramientas. Una vez localizado el control, haremos doble clic sobre l, o pulsaremos [INTRO], lo que aadir una copia del mismo en el formulario, que despus, mediante el ratn o teclado, situaremos en la posicin adecuada. Otra tcnica, esta ms habitual, consiste en hacer clic sobre el control, situar el cursor del ratn en la superficie del formulario y hacer clic en l, arrastrando hasta dar la forma deseada; de esta manera, proporcionamos al control en un solo paso la ubicacin y tamao iniciales. Dibujemos, a modo de prctica, un control Button sobre el formulario, con un aspecto similar al mostrado en la

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

68

Un control, al igual que un formulario, dispone a su alrededor de un conjunto de guas de redimensin, de modo que si despus de situarlo en el formulario, queremos modificar su tamao, slo tenemos que hacer clic sobre alguna de estas guas, y arrastrar modificando las dimensiones del control. Adems de utilizando el ratn, podemos desplazar un control, manteniendo pulsada la tecla[CONTROL], y pulsando adems, algunas de las teclas de direccin.

Ajuste de la cuadrcula de diseo del formulario


La cuadrcula de diseo del formulario, consiste en el conjunto de lneas de puntos que surcan la superficie del formulario, y nos sirven como ayuda, a la hora de realizar un ajuste preciso de un control en una posicin determinada. Si el lector ya ha realizado algunas prcticas situando controles en el formulario, se percatar de que cuando movemos un control con el ratn, dicho control se ajusta a la cuadrcula obligatoriamente, por lo que no podemos ubicarlo entre dos lneas de puntos de la cuadrcula. Para solventar este problema tenemos algunas soluciones que proponemos a continuacin: La ms simple y directa, consiste en acceder a la ventana de propiedades del formulario, y en la propiedad GridSize, cambiar los valores de espaciado de puntos que tiene la rejilla. Cuanto menor sea ese valor, ms junta estar la trama de puntos de la rejilla, con lo que podremos ajustar de forma ms exacta el control. Este ajuste es vlido slo para el formulario sobre el que lo aplicamos. Probemos por ejemplo, a introducir 5 en cada valor, como muestra la Figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

69

Cambiando el tamao de la cuadrcula de diseo del formulario.

El otro modo consiste en asignar en el formulario, a la propiedad SnapToGrid, el valor False; esto deshabilita el ajuste a la cuadrcula automtico de los controles, con lo que perdemos en precisin de ajuste, pero ganamos en libertad de ubicacin para el control. Si no queremos que la cuadrcula se visualice, asignaremos False a la propiedad DrawGrid del formulario. Los anteriores ajustes los podemos realizar tambin de modo genrico para todos los formularios. Seleccionaremos para ello, la opcin de men del IDE Herramientas + Opciones, y en la ventana Opciones, haremos clic sobre el elemento Diseador de Windows Forms. En el panel derecho de esta ventana, podremos configurar estas propiedades de modo general para todo el IDE. Ver Figura

Ajuste general de las propiedades para la cuadrcula de diseo de formularios.

Organizacin-formato mltiple de controles


Cuando tenemos un grupo numeroso de controles en el formulario, que necesitamos mover de posicin, o cambiar su tamao, para redistribuir el espacio; podemos optar por cambiar uno a uno los controles, tarea pesada y nada aconsejable; o bien, podemos seleccionar todos los controles a modificar, y realizar esta tarea en un nico paso, mediante las opciones del men Formato del IDE. Supongamos que en el formulario tenemos dos controles Button y un ListBox distribuidos como muestra la Figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

70

En primer lugar, para seleccionarlos todos, debemos hacer clic sobre el formulario y arrastrar, de modo que el rectngulo de seleccin que aparece, abarque a los controles, que quedarn con sus correspondientes marcas de redimensin visibles, seal de que estn seleccionados. En este punto, podemos hacer clic en uno de los controles y desplazarlos todos conjuntamente por el formulario, o bien, hacer clic en una de las guas de redimensin y cambiar su tamao, lo que afectar a todos los controles seleccionados. Si necesitamos de alguna accin especial, utilizaremos las opciones del men Formato del IDE. Por ejemplo, podemos ejecutar la opcin Formato + Alinear + Lados izquierdos, de modo que todos los controles se alinearn por la izquierda, tomando como referencia el control que tiene las marcas de redimensin negras. Ver Figura

Despus ejecutaremos la opcin de men Formato + Igualar tamao + Ambos, que ajustar tanto el ancho como el alto de todos los controles seleccionados. Ver Figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

71

Igualando tamao de controles. Para evitar que, una vez completado el diseo y ajuste de todos lo controles, accidentalmente podamos modificar alguno, seleccionaremos la opcin de men Formato + Bloquear controles, que bloquear los controles seleccionados, impidiendo que puedan ser movidos o modificado su tamao. Para desbloquear los controles del formulario, debemos seleccionar al menos uno y volver a utilizar esta opcin de men, que desbloquear todos los controles. Una caracterstica interesante del bloqueo de controles, consiste en que una vez que tengamos bloqueados los controles del formulario, si aadimos un nuevo control, este no estar inicialmente bloqueado, lo que facilita su diseo. Una vez que hayamos finalizado de disear el ltimo control, lo seleccionaremos en el formulario y seleccionaremos la opcin de bloqueo de controles, de modo que ya estarn bloqueados todos de nuevo. El men Formato de VS.NET consta de un numeroso conjunto de opciones. Acabamos de ver una muestra de sus posibilidades, por lo que recomendamos al lector, que realice pruebas con el resto de opciones, para ver todas las posibilidades en cuanto a la disposicin de los controles dentro del formulario.

5-2-Controles Windows Basicos


Como habr comprobado el lector, el nmero de controles del cuadro de herramientas es muy numeroso, por lo que en los prximos apartados, vamos a trabajar con los que se consideran controles bsicos o estndar, dada su gran frecuencia de uso. La Tabla relaciona este conjunto de controles bsico, junto a una breve descripcin.
Control Button Label Descripcin Botn de pulsacin Etiqueta de literal

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

72 TextBox ListBox Cuadro de texto Lista de valores Lista de valores desplegable, y cuadro de texto Casilla de verificacin Botn autoexcluyente Caja de agrupacin de controles

ComboBox CheckBox RadioButton

GroupBox

Controles bsicos de formularios Windows.

5.3.-Control Label
El control Label o Etiqueta, muestra un texto informativo al usuario. Podemos utilizar este control como complemento a otro control, por ejemplo, situndolo junto a un TextBox, de modo que indiquemos al usuario el tipo de dato que esperamos que introduzca en la caja de texto. Se trata de un control esttico; esto quiere decir que el usuario no puede interaccionar con l, a diferencia, por ejemplo, de un control Button, sobre el que s podemos actuar pulsndolo; o de un TextBox, en el que podemos escribir texto. Una de sus propiedades es BorderStyle, que permite definir un borde o recuadro alrededor del control, o que dicho borde tenga un efecto 3D; por defecto se muestra sin borde. Veamos unos ejemplos en la Figura

Controles Label.

5.4.-Control TextBox
Un control TextBox muestra un recuadro en el que podemos introducir texto. Para poder escribir texto en un control de este tipo, debemos darle primeramente el foco, lo que detectaremos cuando el control muestre el cursor de escritura en su interior.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

73

Entre las propiedades disponibles por este control, destacaremos las siguientes. Text. Cadena con el texto del control. Multiline. Permite establecer si podemos escribir una o varias lneas. Por defecto contiene False, por lo que slo podemos escribir el texto en una lnea. WordWrap. En controles multilnea, cuando su valor es True, al llegar al final del control cuando estamos escribiendo, realiza un desplazamiento automtico del cursor de escritura a la siguiente lnea de texto. Enabled. Contiene un valor lgico mediante el que indicamos si el control est o no habilitado para poder escribir texto sobre l. ReadOnly. Permite indicar si el contenido del control ser de slo lectura o bien, podremos editarlo. CharacterCasing. Esta propiedad, permite que el control convierta automticamente el texto a maysculas o minsculas segn lo estamos escribiendo. MaxLength. Valor numrico que establece el nmero mximo de caracteres que podremos escribir en el control. PasswordChar. Carcter de tipo mscara, que ser visualizado por cada carcter que escriba el usuario en el control. De esta forma, podemos dar a un cuadro de texto el estilo de un campo de introduccin de contrasea. AutoSize. Cuando esta propiedad tenga el valor True, al modificar el tamao del tipo de letra del control, dicho control se redimensionar automticamente, ajustando su tamao al del tipo de letra establecido. La Figura muestra un formulario con varios controles TextBox, a los cuales se han aplicado diferentes efectos mediante sus propiedades.

Pruebas con controles TextBox.

Al comenzar a ejecutar el programa, observaremos que el foco de entrada no est situado en el primer TextBox del formulario. Para asignar por cdigo el foco a un determinado control, disponemos del mtodo Focus( ). En este caso, al pulsar el

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

74

botn Foco nombre, desviamos el foco al primer TextBox del formulario. Ver Cdigo fuente Private Sub btnFoco_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFoco.Click Me.txtNombre.Focus() End Sub Observe el lector, que en el botn Foco nombre, que acabamos de mencionar, la letra F se encuentra subrayada, actuando de acelerador o hotkey. De este modo, no es necesario pulsar con el ratn sobre ese botn para ejecutarlo, basta con pulsar la tecla [CONTROL] junto a la letra subrayada para conseguir el mismo efecto. Para definir una tecla aceleradora en un control, debemos anteponer el carcter & a la letra que vamos a definir como acelerador, en este ejemplo se ha logrado con &Foco nombre. Por otro lado, mediante el botn btnSoloLectura conseguimos activar/desactivar la propiedad ReadOnly del TextBox txtNombre, cambiando el estado de dicha propiedad en cada pulsacin del botn. Ver Cdigo fuente Private Sub btnSoloLectura_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSoloLectura.Click If (Me.txtNombre.ReadOnly) Then Me.txtNombre.ReadOnly = False Else Me.txtNombre.ReadOnly = True End If End SubSin embargo, hay otro modo mucho ms eficiente de cambiar el estado de una propiedad que contiene un tipo Boolean: utilizando el operador Not. Con el botn btnActivar, cambiamos el valor de la propiedad Enabled del cuadro de texto que contiene los apellidos. Para ello, aplicamos el operador Not a dicha propiedad, y el resultado lo asignamos a esa misma propiedad. Ver Cdigo fuente Private Sub btnActivar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnActivar.Click ' utilizando operador Not simplificamos Me.txtApellidos.Enabled = Not (Me.txtApellidos.Enabled) End Sub Finalizando con este ejemplo, y aunque no tiene relacin directa con el control TextBox, el formulario se muestra con un tipo de borde especial que no permite su redimensin. La propiedad del formulario con la que podemos establecer el tipo de

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

75

borde es FormBorderStyle, y en este caso, su valor es Fixed3D. Alterando los valores de esta propiedad, conseguiremos distintos bordes y tipos de redimensin para el formulario.

Seleccin de texto en un TextBox


La seleccin de texto en un control TextBox es un proceso que funciona de modo transparente al programador, en el sentido en que este no necesita aadir cdigo adicional para las operaciones de seleccin, cortar, copiar, etc., al ser tareas integradas en el sistema operativo. Sin embargo, podemos necesitar en un determinado momento, tener informacin acerca de las operaciones de seleccin que est realizando el usuario en nuestros controles de texto. Para ello, el control TextBox dispone de las siguientes propiedades. SelectionStart. Posicin del texto del control, en la que comienza la seleccin que hemos realizado. SelectionLength. Nmero de caracteres seleccionados en el control. SelectedText. Cadena con el texto que hemos seleccionado en el control. Mediante estas propiedades, no slo averiguamos la seleccin que pueda tener un control TextBox, sino que tambin podemos utilizarlas para establecer por cdigo una seleccin; teniendo el mismo efecto que si la hubiera efectuado el usuario con el ratn o teclado. Para comprobar el funcionamiento de las propiedades de seleccin del TextBox, crearemos un proyecto Windows, y en su formulario aadiremos varios controles para manipular la seleccin de texto que hagamos en un TextBox. La Figura muestra el formulario del ejemplo.

. Formulario para realizar seleccin en el control TextBox

El control de este formulario, que vamos a emplear para las operaciones de seleccin

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

76

es txtOrigen. En primer lugar, y aunque no se trata de una seleccin de texto, veremos su evento TextChanged, el cual se produce cada vez que cambia el contenido del cuadro de texto; lo usaremos por tanto, para contar lacantidad de caracteres escritos y mostrarlos en un Label. Ver Cdigo fuente ' al cambiar el texto del control se produce este evento Private Sub txtOrigen_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtOrigen.TextChanged ' calculamos la longitud del texto escrito Me.lblContador.Text = Me.txtOrigen.TextLength End Sub Los eventos MouseMove y KeyDown del TextBox, se producen respectivamente, cuando movemos el ratn sobre el control, o cada vez que pulsamos una tecla para escribir texto. Detectaremos en este caso, si existen teclas o botones especiales presionados, que nos indiquen que se est realizando unaseleccin de texto, y mostraremos en el formulario el texto seleccionado, el nmero de caracteres y la posicin del carcter de inicio de la seleccin. Veamos los procedimientos manipuladores de estos eventos en el Cdigo fuente ' al mover el ratn por el TextBox se produce este evento Private Sub txtOrigen_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles txtOrigen.MouseMove ' comprobamos si al mover el ratn est pulsado su botn izquierdo ' en caso afirmativo es que se est seleccionando texto, por lo que obtenemos la ' informacin de seleccin con las ' propiedades de seleccin del TextBox If e.Button.Left Then Me.lblTextoSelec.Text = Me.txtOrigen.SelectedText Me.lblLongitud.Text = Me.txtOrigen.SelectionLength Me.lblPosicion.Text = Me.txtOrigen.SelectionStart End If End Sub ' este evento se produce cuando se pulsa una tecla en el TextBox Private Sub txtOrigen_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtOrigen.KeyDown ' comprobamos las teclas pulsadas si est pulsada la tecla maysculas, ' y adems se est pulsando la tecla flecha derecha, quiere decir que se est ' seleccionando texto; obtener la informacin de las propiedades de ' seleccin del control TextBox If e.Shift Then If e.KeyCode.Right Then Me.lblTextoSelec.Text = Me.txtOrigen.SelectedText Me.lblLongitud.Text = Me.txtOrigen.SelectionLength Me.lblPosicion.Text = Me.txtOrigen.SelectionStart

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

77

End If End If End Sub Finalmente, tras introducir un valor en los controles txtPosicion y txtLongitud, pulsaremos el botn btnSeleccionar. Con ello conseguiremos realizar una seleccin de texto en el TextBox txtOrigen, y pasar el texto seleccionado al control txtDestino. El efecto ser el mismo que si lo hubiera realizado el usuario, pero en este caso sin su intervencin. Veamos en el Cdigo fuente, el evento Click del botn btnSeleccionar. ' al pulsar este botn, seleccionar por cdigo texto del control txtOrigen y ' pasarlo al control txtDestino Private Sub btnSeleccionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSeleccionar.Click Me.txtOrigen.SelectionStart = Me.txtPosicion.Text Me.txtOrigen.SelectionLength = Me.txtLongitud.Text Me.txtDestino.Text = Me.txtOrigen.SelectedText End Sub La Figura muestra este ejemplo en ejecucin.

Pruebas de seleccin de texto con el control TextBox

5.5.-Control Button
Este control representa un botn de pulsacin, conocido en versiones anteriores de VB como CommandButton. Entre el nutrido conjunto de propiedades de este control, destacaremos las siguientes. Text. Cadena con el ttulo del botn. TextAlign. Alineacin o disposicin del ttulo dentro del rea del botn; por defecto aparece centrado. BackColor. Color de fondo para el botn. Cursor. Permite modificar el cursor del ratn que por defecto tiene el botn.
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

78

Image. Imagen que podemos mostrar en el botn como complemento a su ttulo, o bien, en el caso de que no asignemos un texto al botn, nos permitir describir su funcionalidad. ImageAlign. Al igual que para el texto, esta propiedad nos permite situar la imagen en una zona del botn distinta de la central, que es en la que se ubica por defecto. BackgroundImage. Imagen de fondo para el botn. FlatStyle. Tipo de resaltado para el botn. Por defecto, el botn aparece con un cierto relieve, que al ser pulsado, proporciona el efecto de hundirse y recuperar nuevamente su estado, pero podemos, mediante esta propiedad, hacer que el botn se muestre en modo plano, con un ligero remarcado al pulsarse, etc. Font. Cambia el tipo de letra y todas las caractersticas del tipo elegido, para el texto del botn. La Figura muestra un ejemplo de control Button, sobre el que se han modificado algunos valores por defecto de sus propiedades.

5.6.-Foco de entrada
Para que las pulsaciones de teclado puedan ser recibidas por un determinado control, dicho control debe tener lo que se denomina el foco de entrada. El modo de dar a un control el foco de entrada, consiste en hacer clic sobre l, o bien, pulsar la tecla [TAB], pasando el foco hasta el control deseado. Cuando un control recibe el foco, el sistema operativo lo remarca visualmente o en el caso de controles de escritura, muestra el cursor de escritura en su interior. Otra forma es realizar la codificacin del foco de entrada, de la siguiente manera Private Sub btnActivar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnActivar.Click ' utilizando la propiedad focus para el control textbox1

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

79

Textbox1.focus End Sub

5.7.-Funciones para presentar mensajes


Visual Basic posee 2 tipos de funciones para presentar mensajes, ellas son MsgBox e InputBox.

5.8.-Funcin InputBox:
La funcin InputBox presenta un mensaje al usuario, permitindole ingresar un valor en una caja de texto:

Como se dijo la funcin InputBox presenta un cuadro de dilogo donde el usuario puede ingresar un texto y luego aceptar o cancelar dicho cuadro de dilogo. Los parmetros principales de esta funcin son: InputBox (Promt,Title, Default) El parmetro Prompt especfica la leyenda que mostrar la caja de mensajes. El parmetro Title especifica el ttulo que llevar el cuadro de dilogo. El parmetro Default es el texto que mostrar la caja de texto. El aspecto ms importante de InputBox es que nos devuelve una cadena con lo que haya ingresado el usuario en la caja de texto. Luego podemos realizar una tarea especfica dependiendo del valor devuelto. Ejemplo: Dim retorno As String retorno = InputBox("Ingrese algo en la caja de texto", "Ejemplo") MsgBox "Usted ingres:" & retorno En el ejemplo anterior, en la variable Retorno se almacenar el valor que haya ingresado el usuario cuando haga Click en el botn de Aceptar.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

80

Cuando el usuario presiona Candelar, el InputBox devuelve una cadena vaca. Esto es importante tenerlo en cuenta para realizar una o tal accin Si quiseramos por ejemplo desplegar un InputBox, y que este no se cierre hasta que el usuario si o si haya ingresado un valor, podemos hacerlo de la siguiente forma, utilizando una condicin en un bucle Do Loop Cdigo fuente en el formulario
Private Sub Form_Load() Dim Dato As String 'Hasta que no se ingrese un dato, el InputBox no se cerrar Do Dato = InputBox("Ingresar algun dato", " Ejemplo ") Loop Until Dato <> "" 'Muestra el valor MsgBox Dato, vbInformation End Sub

5.9.-Funcin MsgBox:
La funcin MsgBox, es muy fcil de usar y se utiliza para mostrar distintos tipos de mensajes. La sintaxis completa de la funcin MsgBox es: MsgBox(mensaje[, botones][, ttulo][, archivoAyuda, contexto]) Ejemplos de mensajes o cajas de texto con la funcin MsgBox que podemos mostrar:

Como se ve en los grficos anteriores, con MsgBox podemos tener variedad a la hora de mostrar un determinado mensaje, utilizando para ello las diferentes constantes que incorpora la funcin. Los parmetros ms importantes son: Title : Es la leyenda que aparecer en el ttulo del mensaje.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

81

Texto : Es el Texto que mostrar el mensaje. Botones: En este parmetro se colocan las constantes que determinarn si la caja tiene uno o varios botones y el tipo de mensaje: informativo, de exclamacin de alerta etc... Cuando escribimos la coma dentro de la funcin en el parmetro botones, Visual Basic despliega una lista con las opciones o constantes que podemos utilizar. Ejemplo de msgbox un poco ms elaborado para entender un poco mejor esto; este ejemplo enva un mensaje de alerta con dos botones como opciones: En vez de utilizarse las palabras mensaje, estilo, etc se podran utilizar otras, pero siempre hay que respetar el orden Private Sub Command1_Click() Dim Mensaje, Estilo, Ttulo, Respuesta, MiCadena as String Mensaje = "Estas totalmente seguro de lo que vas a hacer?" ' cuerpo del mensaje. Estilo = vbYesNo + vbCritical ' Define el estilo, los botones, lo que est despus del mas es el circulo rojo ' con la cruz. Ttulo = "error grave (mentira)" ' es el ttulo. Respuesta = MsgBox(Mensaje, Estilo, Ttulo) 'el parntesis se pone tambin If Respuesta = vbYes Then ' El usuario eligi el botn S. MiCadena = "S" ' Ejecuta una accin. Else ' El usuario eligi el botn No. MiCadena = "No" ' Ejecuta una accin. Form1.Visible = False 'Aca puse una accin que usted ya conoce End If End Sub En estilo podran ir por ejemplo las siguientes opciones:

VbOKOnly: Slo muestra el botn Aceptar. VbOKCancel: Muestra los botones Aceptar y Cancelar. VbAbortRetryIgnore: Muestra los botones Anular, Reintentar e Ignorar. VbYesNoCancel: Muestra los botones S, No y Cancelar. VbYesNo: Muestra los botones S y No. VbRetryCancel: Muestra los botones Reintentar y Cancelar. VbCritical: Muestra el icono Mensaje crtico. VbQuestion: Muestra el icono Consulta de advertencia. VbExclamation: Muestra el icono Mensaje de advertencia. VbInformation: Muestra el icono Mensaje de informacin.
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

82

5.10.-Codificacin de los eventos de controles


Windows es un sistema operativo orientado a eventos, por lo que cualquier mnima interaccin que realicemos sobre un formulario o control, generar el oportuno evento, para el que si estamos interesados, deberemos responder. Prosiguiendo con el control Button, cuando pulsamos sobre el mismo, se origina el evento Click de dicho control. Si dibujamos un Button en un formulario y pulsamos en l, no ocurrir nada, ya que aunque el evento se produce, no existe cdigo que le proporcione respuesta. Para dar oportuna respuesta a un evento emitido por un control, debemos escribir un procedimiento manipulador del correspondiente evento. La creacin de manipuladores de evento es un aspecto que ya hemos visto en detalle en el tema Delegacin de cdigo y eventos. De igual modo, los aspectos bsicos de la escritura de cdigo para un evento se comentaron en el tema Una aplicacin con funcionalidad bsica; sugerimos por lo tanto al lector, la consulta de estos temas para cualquier referencia bsica que necesite al respecto. No obstante, en el presente apartado, y para reforzar conceptos, realizaremos un repaso del proceso de creacin del manipulador de evento para un control. Como ejemplo, insertaremos en un formulario un control Button, al que daremos el nombre btnMensaje, y en su propiedad Text asignaremos la cadena Mostrar mensaje. Seguidamente haremos doble clic sobre el Button; esta accin abrir la ventana del editor de cdigo, creando al mismo tiempo, la declaracin o esqueleto del procedimiento manipulador de evento Click del botn, listo para ser codificado. Ya que necesitamos que se muestre un mensaje al ser pulsado este control, utilizaremos el objeto MessageBox de la plataforma, llamando a su mtodo compartido Show( ), para visualizar el mensaje. En definitiva, el manipulador de este evento quedara como muestra el Cdigo fuente Private Sub btnMensaje_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMensaje.Click MessageBox.Show("Se acaba de pulsar el botn del formulario") End Sub El resultado en ejecucin, sera el que muestra la Figura Observando con ms detalle el procedimiento del evento, vemos que al final de su declaracin, aparece la palabra clave Handles, que como vimos en el tema sobre eventos, nos sirve para asociar esta rutina de cdigo con un evento de un objeto. En el ejemplo que nos ocupa, asociamos el procedimiento

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

83

btnMensaje_Click( ), con el evento Click del objeto btnMensaje, perteneciente a la clase Button.

Resultado de la ejecucin del evento Click de un control Button, al ser pulsado. Como ya sabemos, el enlace procedimiento-evento de objeto mediante la palabra Handles, se producede modo esttico. Esto requiere que en el cdigo, el identificador que contenga el objeto del control, deba ser declarado con mbito a nivel de clase, y utilizando adems la palabra clave WithEvents. Dicha tarea es realizada automticamente por el diseador del formulario cuando genera el cdigo del mismo. Veamos en el Cdigo fuente , el fragmento de cdigo generado por el diseador que realiza esta labor. ' esta declaracin es situada a nivel del cdigo de la clase del formulario, es decir, ' fuera de cualquier mtodo Friend WithEvents btnMensaje As System.Windows.Forms.Button

5.11.-Codificando otros eventos de un control


En un control Button, el evento por defecto es Click; esto supone, como acabamos de ver, que al hacer doble clic sobre el control en el formulario, el procedimiento de evento sobre el que nos situar el editor ser precisamente este. Sin embargo, un control Button, al igual que el resto de controles de los formularios Windows, disponen de un gran nmero de eventos que podemos codificar para adaptar a nuestras necesidades. Por ejemplo, el evento MouseEnter, se produce cuando se detecta que el ratn entra en el rea de un control, en este caso Button. Como este no es el evento por defecto, debemos buscar su declaracin vaca manualmente en el editor. Para ello, abriremos la lista desplegable Nombre de clase, situada en la parte superior izquierda del editor de cdigo, y seleccionaremos el nombre de nuestro control: btnMensaje. Ver Figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

84

Lista de clases del editor de cdigo. A continuacin, abriremos la otra lista desplegable del editor de cdigo: Nombre de mtodo, situada en la parte superior derecha del editor. En ella aparecern los nombres de todos los eventos de que dispone el control. Localizaremos el evento MouseEnter, y lo seleccionaremos. Ver Figura

Lista de eventos de una clase-control en el editor de cdigo.

De igual modo que sucedi con el evento Click en el apartado anterior, el editor de cdigo crear el procedimiento manipulador de evento vaco, para el evento que acabamos de seleccionar. Lo que vamos a hacer a continuacin, es escribir el cdigo que permita cambiar el color del botn cuando el ratn entre al mismo. Veamos el Cdigo fuente Private Sub btnMensaje_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnMensaje.MouseEnter Me.btnMensaje.BackColor = Color.Cyan End Sub Cuando al ejecutar, situemos el ratn en el botn, este cambiar su color, mostrando el aspecto de la Figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

85

Resultado de la ejecucin del evento MouseEnter sobre un Button.

5.12.-Orden de tabulacin de controles


Los controles disponen de la propiedad TabIndex, que contiene un nmero que ser utilizado para pasar el foco entre ellos al pulsar la tecla [TAB] durante la ejecucin del programa. Segn vamos aadiendo nuevos controles, el IDE va asignando automticamente nuevos nmeros a esta propiedad; de forma que, cuando comencemos la ejecucin, el primer control que tomar el foco ser el que tiene el menor nmero en su TabIndex. En el ejemplo anterior, el primer control que tomaba el foco era el TextBox de la contrasea, lo cual no era nada lgico, ya que dicho control era el ltimo en el formulario para el que debamos introducir datos. Para solucionar este problema, simplemente tenemos que cambiar los valores de la propiedad TabIndex de los controles, de modo que el orden de tabulacin sea el que mejor se adapte a nuestras necesidades. Podemos obtener un mapa del orden de tabulacin de los controles del formulario seleccionando el men del IDE Ver + Orden de tabulacin; esto mostrar los controles con el nmero de TabIndex que les hemos asignado. Como ventaja adicional, en esa situacin, podemos hacer clic en los controles y cambiar tambin el nmero de tabulacin. Ver Figura

Diseador del formulario mostrando el orden de tabulacin de controles. Si por el contrario, no queremos dar el foco a un control pulsando [TAB], debemos asignar a la propiedad TabStop de dicho control el valor False. Por

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

86

defecto, TabStop vale True, permitiendo de esta el paso de foco entre controles mediante la tecla [TAB].

5.13.-Control ListBox
Un control ListBox contiene una lista de valores, de los cuales, el usuario puede seleccionar uno o varios simultneamente. Entre las principales propiedades de este control, podemos resaltar las siguientes. Items. Contiene la lista de valores que visualiza el control. Se trata de un tipo ListBox.ObjectCollection, de manera que el contenido de la lista puede ser tanto tipos carcter, como numricos y objetos de distintas clases. Al seleccionar esta propiedad en la ventana de propiedades del control, y pulsar el botn que contiene, podemos introducir en una ventana elementos para el control. Ver Figura

Introduccin de valores para un ListBox en tiempo de diseo.

El control quedara por lo tanto con valores asignados en la etapa de diseo, como muestra la Figura

ListBox en diseo con valores en su lista. Sorted. Cuando esta propiedad contiene el valor True, ordena el contenido de la lista. Cuando contiene False, los elementos que hubiera previamente ordenados, permanecen con dicho orden, mientras que los nuevos no sern ordenados.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

87

IntegralHeight. Los valores de la lista son mostrados al completo cuando esta propiedad contiene True. Sin embargo, al asignar el valor False, segn el tamao del control, puede que el ltimo valor de la lista se visualiza slo en parte. La Figura 253 muestra un ListBox con esta propiedad a False.

ListBox mostrando parte del ltimo elemento debido a la propiedad IntegralHeight.

MultiColumn. Visualiza el contenido de la lista en una o varias columnas en funcin de si asignamos False o True respectivamente a esta propiedad. SelectionMode. Establece el modo en el que vamos a poder seleccionar los elementos de la lista. Si esta propiedad contiene None, no se realizar seleccin; One, permite seleccionar los valores uno a uno; MultiSimple permite seleccionar mltiples valores de la lista pero debemos seleccionarlos independientemente; por ltimo, MultiExtended nos posibilita la seleccin mltiple, con la ventaja de que podemos hacer clic en un valor, y arrastrar, seleccionando en la misma operacin varios elementos de la lista. SelectedItem. Devuelve el elemento de la lista actualmente seleccionado. Selecteditems. Devuelve una coleccin ListBox.SelectedObjectCollection, que contiene los elementos de la lista que han sido seleccionados. SelectedIndex. Informa del elemento de la lista seleccionado, a travs del ndice de la coleccin que contiene los elementos del ListBox. PROPIEDAD ACCION O SIGNIFICADO Items.Add(dato): Inserta un elemento al final del listbox. Items.Clear(): Elimina todos los elementos de la lista. Items.Count(): Regresa la cantidad de elementos en lista. Items.Sorted = true; Ordena los elementos de la lista usada solo al tiempo de diseno. Items.Contains(dato): Regresa true o false, si el dato se encuentra o no se encuentra en la lista. Items.IndexOf(dato): Regresa el indice del objeto dentro del listbox.
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

88

Items.Insert(indice,dato): Inserta el dato en la posicion indicada. Items.Remove(dato): Elimina el dato de el listbox. Items.RemoveAt(indice): Elimina el dato que esta en la posicion indicada. Items[indice]: get or set el dato en la posicion indicada (ver primera nota abajo). Observacion: Como ya se indico anteriormente GET y SET son propiedades asociadas a todos los objetos o controles y sus propiedades en microsoft net, por ejemplo para un textbox, si en un programa se dice alfa = text5.text; se esta usando get, si se dice text5.text=500; se esta usando set. Otro ejemplo alfa = listbox2.Items(2); se esta usando (get) listbox2.Items(4 )= mama Para mostrar algunas de las funcionalidades de este control, utilizaremos el proyecto de ejemplo ListBoxPru. La Figura muestra esta aplicacin en ejecucin.

Ejemplo de uso del control ListBox.

El ejemplo, como puede comprobar el lector, consiste en un formulario que contiene un ListBox principal, con el nombre lstValores, que dispone de una serie de valores asignados en tiempo de diseo. Cada vez que hacemos clic en alguno de los valores, se produce el evento SelectedIndexChanged, que utilizamos para mostrar en este caso, el nombre del elemento en el ttulo del formulario, como muestra el Cdigo fuente, de la clase frmListas, correspondiente al formulario. ' declaramos esta constante a nivel de clase, para poner como ttulo
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

89

' del formulario junto al elemento seleccionado de la lista Public Const TITULO As String = "Elemento seleccionado: " ' este evento se produce cada vez que se cambia el ndice seleccionado del ListBox Private Sub lstValores_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstValores.SelectedIndexChanged ' mostrar en el ttulo del formulario el valor actualmente seleccionado de la lista Me.Text = TITULO & Me.lstValores.SelectedItem End Sub A travs de los RadioButton, cambiamos el tipo de seleccin que podemos efectuar en el control lstValores. Ver Cdigo fuente Private Sub rbtUno_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtUno.CheckedChanged ' establecer tipo de seleccin en el ListBox a un elemento Me.lstValores.SelectionMode = SelectionMode.One End Sub Private Sub rbtMultiple_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtMultiple.CheckedChanged ' establecer tipo de seleccin en el ListBox a un mltiples elementos Me.lstValores.SelectionMode = SelectionMode.MultiSimple End Sub Private Sub rbtExtendida_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtExtendida.CheckedChanged ' establecer tipo de seleccin en el ListBox a mltiples ' elementos de modo extendido Me.lstValores.SelectionMode = SelectionMode.MultiExtended End Sub Mediante los controles chkOrdenar y chkColumnas, ordenaremos y mostraremos en columnas respectivamente el ListBox. Ver Cdigo fuente. Private Sub chkOrdenar_CheckedChanged(ByVal sender As System.Object, ByVal e As, System.EventArgs) Handles chkOrdenar.CheckedChanged ' segn el valor del CheckBox, ordenamos o quitamos ' la opcin de ordenar del ListBox Me.lstValores.Sorted = Me.chkOrdenar.Checked End Sub Private Sub chkColumnas_CheckedChanged(ByVal sender As System.Object, ByVal e
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

90

As System.EventArgs) Handles chkColumnas.CheckedChanged ' segn el valor del CheckBox, mostramos el ListBox ' en varias columnas o en una Me.lstValores.MultiColumn = Me.chkColumnas.Checked End Sub El TextBox de este formulario lo usaremos para aadir nuevos elementos al ListBox lstValores, y buscar tambin elementos existentes, pulsando los botones btnAgregar y btnBuscar en cada caso. Observemos el miembro NoMatches del ListBox, mediante el que averiguamos si la bsqueda tuvo xito. Ver el Cdigo fuente Private Sub btnAgregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAgregar.Click ' aadimos el contenido del TextBox como un elemento a la lista Me.lstValores.Items.Add(Me.txtValor.Text) End Sub Private Sub btnBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscar.Click Dim iPosicion As Integer ' el mtodo FindString() de la lista busca un valor iPosicion = Me.lstValores.FindString(Me.txtValor.Text) ' el campo NoMatches indica si no existe el valor buscado If iPosicion = Me.lstValores.NoMatches Then MessageBox.Show("No existe el valor") Else ' si encontramos el valor en la lista,lo seleccionamos por cdigo Me.lstValores.SelectedIndex = iPosicion End If End Sub La seleccin de los elementos de un ListBox no es competencia exclusiva del usuario. El programador puede tambin, si lo necesita, seleccionar valores de la lista mediante el cdigo del programa. Al pulsar el botn btnSelecCod, utilizaremos el mtodo SetSelected( ) del ListBox para realizar esta tarea. En este mtodo pasamos como parmetro el ndice de la lista con el que vamos a operar, y el valor True para seleccionarlo, o False para quitarle la seleccin. Ver el Cdigo fuente Private Sub btnSelecCod_Click(ByVal sender As System.Object, ByVal e As

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

91

System.EventArgs) Handles btnSelecCod.Click ' para seleccionar elementos de un ListBox por cdigo ' podemos utilizar el mtodo SetSelected() Me.rbtMultiple.Checked = True Me.lstValores.SetSelected(1, True) Me.lstValores.SetSelected(3, True) Me.lstValores.SetSelected(5, True) End Sub El botn btnTraspasarSelec lo usaremos para tomar los elementos seleccionados de lstValores, y pasarlos al otro ListBox del formulario. La propiedad SelectedItems del control lstValores, devuelve una coleccin con sus elementos seleccionados. Por otra parte, podemos eliminar los elementos de un ListBox llamando al mtodo Clear( ) de la coleccin de valores del control, cosa que hacemos pulsando el botn btnLimpiar. Ver Cdigo fuente Private Sub btnTrapasarSelec_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTrapasarSelec.Click Dim oSeleccion As ListBox.SelectedObjectCollection ' obtenemos con SelectedItems los elementos seleccionados de un ListBox oSeleccion = Me.lstValores.SelectedItems ' si existen elementos seleccionados, los traspasamos a otro ListBox del ' formulario If oSeleccion.Count > 0 Then Dim oEnumerador As IEnumerator oEnumerador = oSeleccion.GetEnumerator() While oEnumerador.MoveNext() Me.lstTraspaso.Items.Add(oEnumerador.Current) End While End If End Sub Private Sub btnLimpiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLimpiar.Click ' con el mtodo Clear() de la coleccin de elementos ' de un ListBox, borramos los elementos del controls Me.lstTraspaso.Items.Clear() End Sub Ejemplo programa

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

92

Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click LISTA.Items.Add(DATO.Text) DATO.Text = "" End Sub Private Sub Button2_Click(ByVal sender System.EventArgs) Handles Button2.Click Dim r, cant, meses As Integer cant = LISTA.Items.Count For r = 0 To cant - 1 meses = LISTA.Items(r) meses = meses * 12 LISTA.Items(r) = meses Next r End Sub

As

System.Object,

ByVal

As

As

System.Object,

ByVal

As

Recordar que el primer indice en un ListBox es el cero por eso el ciclo va desde el cero hasta la cantidad de elementos menos uno. Corrida:

Actividades de reforzamiento de lo aprendido EJERCICIOS PROGRAMACION DE LISTBOX 1.- Capturar en una lista los sueldos de 6 empleados y desplegarlos en una segunda lista aumentados en un 30%

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

93

2.- Capturar en una lista los pesos en kilogramos de 6 personas desplegarlos en una segunda lista convertidos a libras y ademas solo los mayores de 100 libras. 3.- Capturar en sus 4 listas respectivas matricula, nombre y dos calificaciones de 5 alumnos, despues calcular una lista de promedios de calificaciones. 4.- Capturar en sus listas respectivas numempleado, nomempleado, dias trabajados y sueldo diario de 5 empleados, desplegar en otra pantalla o panel la nomina pero solo de aquellos empleados que ganan mas de $300.00 a la semana.

5.14.-Control ComboBox
El ComboBox es un control basado en la combinacin (de ah su nombre) de dos controles que ya hemos tratado: TextBox y ListBox. Un control ComboBox dispone de una zona de edicin de texto y una lista de valores, que podemos desplegar desde el cuadro de edicin. El estilo de visualizacin por defecto de este control, muestra el cuadro de texto y la lista oculta, aunque mediante la propiedad DropDownStyle podemos cambiar dicho estilo. La Figura muestra un formulario con diversos ComboBox, cada uno con diferente estilo.

Controles ComboBox de distintos estilos. La propiedad DropDownStyle tambin influye en una diferencia importante de comportamiento entre el estilo DropDownList y los dems, dado que cuando creamos un ComboBox con el mencionado estilo, el cuadro de texto slo podr mostrar informacin, no permitiendo que esta sea modificada. En el caso de que la lista desplegable sea muy grande, mediante la propiedad MaxDropDownItems, asignaremos el nmero de elementos mximo que mostrar la lista del control. El resto de propiedades y mtodos son comunes con los controles TextBox y ListBox. En el Cdigo fuente se muestra el cdigo del botn btnAgregar, mediante el que llenamos de valores los controles de este ejemplo.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

94

Private Sub btnAgregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAgregar.Click Me.cboColores.Items.AddRange(New String() {"AZUL", "VERDE", "AMARILLO", "ROJO", "BLANCO", "MARRN", "GRANATE"}) Me.cboNombres.Items.AddRange(New String() {"ELENA", "JOSE", "ANA", "ALFREDO", "LUIS", "ANGEL", "RAQUEL"}) Me.cboCiudades.Items.AddRange(New String() {"SEVILLA", "VALENCIA", "ALICANTE", "TOLEDO", "SEGOVIA"}) End Sub

5.15.-Control CheckBox
Este control muestra una casilla de verificacin, que podemos marcar para establecer un estado. Generalmente el estado de un CheckBox es marcado (verdadero) o desmarcado (falso), sin embargo, podemos configurar el control para que sea detectado un tercer estado, que se denomina indeterminado, en el cual, el control se muestra con la marca en la casilla pero en un color de tono gris. Las propiedades remarcables de este control son las siguientes. Checked. Valor lgico que devuelve True cuando la casilla est marcada, y False cuando est desmarcada. CheckState. Valor del tipo enumerado CheckState, que indica el estado del control. Checked, marcado; Unchecked, desmarcado; e Indeterminate, indeterminado. ThreeState. Por defecto, un control de este tipo slo tiene dos estados, pero asignando True a esta propiedad, conseguimos que sea un control de tres estados. CheckAlign. Permite establecer de modo visual la ubicacin de la casilla de verificacin dentro del rea del control. Como detalle destacable de las propiedades Checked y CheckState, si modificamos desde cdigo sus valores, conseguiremos alterar el estado de la casilla del control. El ejemplo CheckBoxPru, muestra un formulario con dos controles CheckBox. El control chkPonColor asigna un color de fondo al formulario o restablece el color original. Esto lo conseguimos codificando el evento CheckedChanged del control. Ver Cdigo fuente. ' Este evento se produce cuando se hace clic en el CheckBox y cambia el contenido ' de la casilla Private Sub chkPonColor_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkPonColor.CheckedChanged If Me.chkPonColor.CheckState = CheckState.Checked Then

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

95

Me.BackColor = Color.LightBlue Else Me.ResetBackColor() End If End Sub Por su parte, el control chkMostrar, definido con tres estados, muestra, al estar marcado, una cadena en un control Label; elimina la cadena al desmarcarlo; y muestra la mitad al entrar en el estado indeterminado. El evento CheckStateChanged es el que debemos de utilizar para detectar el estado del CheckBox en cada ocasin. Para mantener el valor de la cadena a mostrar, utilizamos una variable a nivel de la clase que inicializamos en el constructor del formulario. Ver Cdigo fuente Public Class Form1 Inherits System.Windows.Forms.Form Private sCadenaOriginal As String Public Sub New() '.... ' inicializar la variable que contiene la cadena ' a mostrar en el label y asignarla sCadenaOriginal = "Estamos visualizando una cadena" Me.lblMuestra.Text = sCadenaOriginal End Sub '.... ' este evento se produce cuando cambia el estado de la casilla Private Sub chkMostrar_CheckStateChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkMostrar.CheckStateChanged Select Case Me.chkMostrar.CheckState Case CheckState.Checked Me.lblMuestra.Text = sCadenaOriginal Case CheckState.Unchecked Me.lblMuestra.Text = "" Case CheckState.Indeterminate Me.lblMuestra.Text = sCadenaOriginal.Substring(0,(sCadenaOriginal.Length / 2)) End Select End Sub La Figura muestra este ejemplo en ejecucin.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

96

Controles CheckBox en ejecucin.

5.16.-Controles RadioButton y GroupBox


Los controles RadioButton nos permiten definir conjuntos de opciones autoexcluyentes, de modo que situando varios controles de este tipo en un formulario, slo podremos tener seleccionado uno en cada ocasin. Vamos a crear un proyecto de ejemplo con el nombre RadioButtonPru, en el que situaremos dentro de un formulario, una serie de controles RadioButton y un TextBox, de modo que mediante los RadioButton cambiaremos el tipo de fuente y color del cuadro de texto. La Figura 249 muestra un diseo inicial del formulario.

Pruebas con el control RadioButton.

Al ejecutar el proyecto, sin embargo, no podemos conseguir establecer simultneamente un tipo de letra y color, puesto que al pulsar cualquiera de los botones de radio, se quita el que hubiera seleccionado previamente. Para solucionar este problema, disponemos del control GroupBox, que nos permite, como indica su nombre, agrupar controles en su interior, tanto RadioButton como de otro tipo, ya que se trata de un control contenedor. Una vez dibujado un GroupBox sobre un formulario, podemos arrastrar y soltar sobre l, controles ya existentes en el formulario, o crear nuevos controles dentro de dicho control. De esta forma, podremos ya, en este ejemplo, seleccionar ms de un RadioButton del formulario, como vemos en la Figura .

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

97

Seleccin de varios RadioButton en un formulario. El evento CheckedChanged, al igual que ocurra con los controles CheckBox, ser el que tendremos que escribir para ejecutar el cdigo en respuesta a la pulsacin sobre un control RadioButton. El Cdigo fuente muestra los eventos correspondientes a los controles de radio de este ejemplo. Para cambiar el tipo de fuente, instanciamos un objeto Font y lo asignamos a la propiedad Font del TextBox; mientras que para cambiar el color, utilizamos la estructura Color y la propiedad BackColor, tambin del TextBox. Private Sub rbtTahoma_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtTahoma.CheckedChanged Me.txtNombre.Font = New Font("Tahoma", 12) End Sub Private Sub rbtGaramond_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtGaramond.CheckedChanged Me.txtNombre.Font = New Font("Garamond", 8) End Sub Private Sub rbtComic_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtComic.CheckedChanged Me.txtNombre.Font = New Font("Comic Sans MS", 15) End Sub Private Sub rbtVerde_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtVerde.CheckedChanged Me.txtNombre.BackColor = Color.Green End Sub Private Sub rbtAzul_CheckedChanged(ByVal sender As System.Object, ByVal e As

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

98

System.EventArgs) Handles rbtAzul.CheckedChanged Me.txtNombre.BackColor = Color.Blue End Sub Private Sub rbtAmarillo_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtAmarillo.CheckedChanged Me.txtNombre.BackColor = Color.Yellow End Sub

5.17.-Controles de tipo men


El men es uno de los tipos de control ms frecuentemente utilizados en los formularios Windows. Consiste en un conjunto de opciones, a travs de las cuales, el usuario ejecutar algunos procesos de la aplicacin. Disponemos de tres tipos de control men: MainMenu, ContextMenu y MenuItem. MainMenu y ContextMenu actan como contenedores de grupos de controles MenuItem, representando este ltimo control, la opcin de men sobre la que el usuario pulsa o hace clic. El proyecto MenuPru que se acompaa como ejemplo, muestra los diferentes tipos de men . A continuacin, describiremos los principales pasos a dar en el proceso de su construccin.

Men Principal. MainMenu


Un control MainMenu, consiste en un conjunto de opciones que se sitan horizontalmente debajo del ttulo del formulario. A partir de cada opcin, podemos asociar a su vez, grupos de opciones que se mostraran verticalmente al hacer clic en la opcin principal o situada en la barra horizontal. Para crear un men principal, seleccionaremos del cuadro de herramientas el control MainMenu, y tras dibujarlo en el formulario, se aadir una referencia del control al panel de controles especiales situado bajo el diseador. La Figura muestra un control de este tipo al que le hemos dado el nombre mnuPrincipal.

Men de tipo MainMenu aadido al diseador del formulario.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

99

La creacin de las diferentes opciones que compondrn el men es un proceso que se ha mejorado y simplificado al mximo respecto a versiones anteriores de VB. El proceso de edicin del men se realiza directamente en el formulario, en el mismo lugar en el que el men aparecer en tiempo de ejecucin. Al hacer clic en la primera opcin del men, podemos dar nombre y propiedades a esa opcin. Al mismo tiempo, de un modo muy intuitivo, veremos las prximas opciones disponibles, tanto las desplegables a partir de dicho men, como las de la barra principal. Slo hemos de movernos en la direccin que necesitemos y dar nombre a las opciones, y valores a sus propiedades. Ver Figura

Creacin de las opciones de un men principal de formulario. Cada una de las opciones que componen el men es a su vez un control MenuItem. Si durante su creacin slo proporcionamos el nombre, el IDE va asignando a dicho control valores por defecto en sus propiedades. Para modificar las propiedades de una opcin de men, slo hemos de seleccionarlo en la estructura de men que estamos creando en el diseador del formulario, y pasar a la ventana de propiedades. Entre las propiedades disponibles para un MenuItem, podemos destacar las siguientes. Text. Contiene una cadena con el literal o texto descriptivo de la opcin de men. Enabled. Permite habilitar/deshabilitar la opcin de men. Cuando se encuentra deshabilitada, se muestra su nombre en un tono gris, indicando que no puede ser seleccionada por el usuario. DefaultItem. Permite establecer opciones por defecto. En una opcin de men por defecto, su texto se resalta en negrita. Checked. Marca/desmarca la opcin. Cuando una opcin est marcada, muestra junto a su nombre un pequeo smbolo de verificacin o punteo. RadioCheck. En el caso de que la opcin de men se encuentre marcada, si asignamos True a esta propiedad, en lugar de mostrar el smbolo de verificacin estndar, se muestra uno con forma de punto.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

100

ShortCut. Se trata de un atajo de teclado, o combinacin de teclas que nos van a permitir ejecutar la opcin de men sin tener que desplegarlo. Al elegir esta propiedad, aparecer una lista con todos los atajos disponibles para asignar. ShowShortCut. Permite mostrar u ocultar la combinacin de teclas del atajo de teclado que tenga asignado una opcin de men. Visible. Muestra u oculta la opcin de men. MdiList. Esta propiedad se utiliza habitualmente en opciones situadas en la barra de men, y permite establecer que dicha opcin al desplegarse, muestre, adems de las opciones de men que le hayamos asignado, la lista de ventanas secundarias MDI, en el caso de que el men principal est contenido en un formulario de tipo MDI. Los formularios MDI sern tratados posteriormente. Podemos adicionalmente, asignar una tecla de acceso rpido o hotkey a una opcin de men, anteponiendo el carcter & a la letra que deseemos, de las que se encuentran en la propiedad Text del control MenuItem. Al igual que sucede con los dems tipos de controles, en el texto de la opcin de men, aparecer subrayada la mencionada letra. De este modo, cuando despleguemos un men, no ser necesario posicionarnos en una de ellas para ejecutarla, sino que simplemente pulsando la tecla rpida, se ejecutar el cdigo de dicha opcin. Tambin podemos establecer separadores entre las opciones de men simplemente creando una opcin y asignando a su propiedad Text el carcter de guin ( - ). En nuestro formulario de ejemplo, vamos pues a disear un men con la estructura del esquema mostrado en la Figura Para todas las opciones se ha asignado una tecla de acceso rpido, y adicionalmente, para las opciones que se indican a continuacin, se han modificado algunas propiedades por defecto. Guardar. Deshabilitada. Salir. Atajo de teclado en Ctrl. + S. Copiar. Opcin por defecto. Pegar. Marcada con smbolo normal. Cortar. Marcada con smbolo de crculo. Elipse. Opcin no visible.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

101

Esquema del men de ejemplo.

La Figura muestra el formulario en ejecucin con una parte del men abierta.

Men desplegado a varios niveles, mostrando opciones.

Una vez finalizada la fase de diseo del men, debemos proceder a escribir el cdigo para sus opciones. El evento Click es el que permite a un control MenuItem ejecutar cdigo cuando la opcin de men es seleccionada. Abriendo por tanto, el men desde el diseador del formulario, y haciendo doble clic en la opcin correspondiente, nos situaremos en el editor de cdigo, dentro del procedimiento manipulador del evento Click para esa opcin. El Cdigo fuente muestra el cdigo que se ejecutar cuando seleccionemos las opciones de men Abrir y Salir de nuestro ejemplo. Private Sub mnuAbrir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuAbrir.Click MessageBox.Show("Opcin Abrir del men") End Sub Private Sub mnuSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuSalir.Click Me.Close() End Sub

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

102

Puesto que muchas de las propiedades de un control MenuItem son manipulables en tiempo de ejecucin, aadiremos al formulario varios botones, mediante los cuales realizaremos operaciones sobre las opciones del men tales como habilitar y deshabilitar, mostrar y ocultar, cambiar el nombre, etc. La Figura muestra el formulario con estos nuevos botones.

Controles Button para manipular por cdigo las propiedades de las opciones del men. En el Cdigo fuente podemos ver los manipuladores de evento de estos botones. Private Sub btnHabilitar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHabilitar.Click Me.mnuGuardar.Enabled = Not Me.mnuGuardar.Enabled End Sub Private Sub btnMarcar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMarcar.Click Me.mnuPegar.Checked = Not Me.mnuPegar.Checked End Sub Private Sub btnMostrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMostrar.Click Me.mnuElipse.Visible = Not Me.mnuElipse.Visible End Sub Private Sub btnNombre_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNombre.Click If Me.mnuAbrir.Text = "A&brir" Then Me.mnuAbrir.Text = "HO&LA" Else Me.mnuAbrir.Text = "A&brir" End If End Sub

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

103

Private Sub btnDefecto_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDefecto.Click Me.mnuCopiar.DefaultItem = Not Me.mnuCopiar.DefaultItem End Sub

Men Contextual. ContextMenu


El control ContextMenu representa un men contextual o flotante. Este tipo de men se asocia al formulario o a uno de sus controles, de modo que al hacer clic derecho, se mostrar sobre el elemento al que se haya asociado. El modo de aadir un control ContextMenu y sus correspondientes opciones al formulario, es el mismo que para un MainMenu; situndose tambin una referencia del men contextual en el panel de controles especiales del diseador. Antes de poder disear las opciones de un ContextMenu, debemos pulsar la referencia de dicho men que existe en el panel de controles especiales, ya que por defecto, el formulario muestra el men principal en caso de que tenga uno definido. La Figura muestra el men contextual mnuContexto, que hemos aadido al formulario. Para asociar este men con un control o formulario, utilizaremos la propiedad ContextMenu de que disponen la mayora de los controles Windows. En este ejemplo, insertaremos el control txtValor, de tipo TextBox, y le asociaremos el men de contexto que acabamos de crear.

Como resultado, cuando ejecutemos la aplicacin, al hacer clic derecho sobre el TextBox, aparecer el men contextual que hemos asignado, mediante el que cambiaremos el tipo de fuente de la caja de texto, transformaremos el texto a maysculas y minsculas. El Cdigo fuente muestra el cdigo de los eventos Click correspondiente a las opciones del men contextual. Private Sub mnuFuente_Click(ByVal sender As System.Object, ByVal e As
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

104

System.EventArgs) Handles mnuFuente.Click Dim oFuente As New Font("Comic", 15) Me.txtValor.Font = oFuente End Sub Private Sub mnuMayusculas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuMayusculas.Click Me.txtValor.Text = Me.txtValor.Text.ToUpper() End Sub Private Sub mnuMinusculas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuMinusculas.Click Me.txtValor.Text = Me.txtValor.Text.ToLower() End Sub La Figura muestra el aspecto del men contextual, cuando es utilizado desde el control TextBox.

Control ContextMenu asociado a un TextBox.

5.18.- Controles avanzados de Visual Basic


Control Temporizadores (Timer)
En VB.NET disponemos al igual que en anteriores versiones, del control Timer, que nos permite la ejecucin de cdigo a intervalos de tiempo predeterminados. Este control ha sufrido una importante reestructuracin, ya que internamente hace uso de la clase Timer, perteneciente al conjunto de clases del sistema. El hecho de poder acceder a esta clase, nos proporciona una gran flexibilidad en nuestros desarrollos, ya que, a partir de ahora tambin crearemos temporizadores

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

105

por cdigo, sin necesidad de utilizar el control Timer. En el ejemplo TimerPru que comentamos a continuacin, vamos a construir un formulario en el que utilizaremos ambos tipos de temporizadores, el propio control Timer y un objeto de la clase. El primer proceso a codificar, consistir en traspasar a intervalos de tiempo, el contenido de un TextBox del formulario, a otro control de este mismo tipo. El formulario del proyecto se muestra en la Figura

Figura Formulario para ejemplo con temporizadores.

Tras incluir los controles de usuario en el formulario, aadiremos un control Timer, al que daremos el nombre tmrTemporizador. Esta accin abrir, bajo el diseador del formulario, un panel para controles especiales, como es el caso de Timer, en el que se mostrar dicho control. En este panel se depositan los controles del formulario que no tienen una interaccin directa con el usuario, o cuyo diseo es diferente al de los controles habituales. Para especificar el espacio de tiempo en el que este control ser ejecutado cuando lo activemos, utilizaremos la propiedad Interval, a la que tenemos que asignar un valor numrico, que establece dicho tiempo en milisegundos. En nuestro caso, asignaremos 500, con lo que el control se ejecutar cada medio segundo.

Panel para controles especiales del diseador de formularios.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

106

El control Timer lo activaremos llamando a su mtodo Start( ), cosa que hacemos al pulsar el botn btnTraspasar. Private Sub btnTraspasar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTraspasar.Click ' iniciar el temporizador Me.tmrTemporizador.Start() End Sub Una vez activado un temporizador, cada vez que transcurre el tiempo indicado en Interval, genera un evento Tick. Es precisamente en este evento en el que debemos escribir el cdigo que necesitamos que se ejecute a intervalos regulares de tiempo. Haremos, por consiguiente, doble clic en el control Timer del diseador, para acceder al procedimiento manipulador de este evento, cuyo contenido lo podemos ver ' Este evento se produce en el intervalo especificado en el control Timer Private Sub tmrTemporizador_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmrTemporizador.Tick ' quitamos una letra del TextBox de origen... Dim sLetra As String sLetra = Me.txtOrigen.Text.Substring(0, 1) Me.txtOrigen.Text = Me.txtOrigen.Text.Remove(0, 1) ' ...y lo pasamos al TextBox de destino Me.txtDestino.Text &= sLetra ' cuando se haya traspaso todo el texto detener el temporizador If Me.txtOrigen.Text.Length = 0 Then Me.tmrTemporizador.Stop() MessageBox.Show("Traspaso finalizado") End If End Sub

Control ImageList
Este control acta como repositorio de imgenes, del que se alimentarn otros controles del formulario que necesiten mostrar grficos en su interior. Una vez aadido este control en el formulario, se situar en el panel de controles especiales del diseador, y haciendo clic en su propiedad Images, se abrir la ventana de la Figura, en la que podremos aadir y quitar las imgenes que van a formar parte de la lista del control, as como ver en el panel complementario, la informacin sobre cada imagen asignada.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

107

Ventana de administracin de imgenes del control ImageList. Las imgenes que insertamos en el control tienen un tamao por defecto, en el caso de que necesitemos modificarlo, expandiremos la propiedad ImageSize en la ventana de propiedades y asignaremos nuevos valores en Width y Height. Otra ventaja de este control es que nos permite manipular las imgenes por cdigo, por ejemplo, para aadir nuevas imgenes, debemos usar el mtodo Add( ) de su propiedad Images, como muestra el Cdigo fuente Me.imlImagenes.Images.Add(New Bitmap("tutorias.gif"))

Control ToolBar
Este control representa la barra de herramientas o botones de acceso rpido que facilitan al usuario la ejecucin de los procesos principales del programa, evitndole la navegacin por el men del formulario. Al ser dibujado, este control queda acoplado a la parte superior del formulario. Despus de ponerle tbrBarra como nombre, asignaremos a su propiedad ImageList, el control de ese mismo tipo que acabamos de crear; esto nos permitir asignar los grficos de la lista a los botones que vayamos creando en el ToolBar. Para establecer el tamao de los botones de la barra utilizaremos la propiedad ButtonSize de este control. Seguidamente haremos clic en la propiedad Buttons, que abrir una ventana con la coleccin de botones de la barra, en la que podremos crear y configurar dichos botones.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

108

Editor de botones del control ToolBar. Cada botn en un ToolBar es un objeto de tipo ToolBarButton, del que podemos destacar las siguientes propiedades. Text. Cadena con el texto que muestra el botn. ImageIndex. En el caso de asociar el ToolBar con un control ImageList, en esta propiedad asignamos para un botn una de las imgenes del ImageList, indicando el nmero de orden de la imagen. Style. Permite establecer el estilo del botn: de pulsacin; separador; o de tipo desplegable, que abre un subconjunto de opciones. DropDownMenu. Si asociamos el botn con una opcin de la barra de men del formulario, y configuramos su estilo como DropDownButton, al pulsar el botn desplegable, se mostrarn las opciones de men; el efecto ser el mismo que si hubiramos desplegado directamente el men del formulario. La Figura muestra la ventana principal de la aplicacin con la barra de herramientas

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

109

Formulario con ToolBar. Una vez terminado el diseo del ToolBar, debemos codificar su evento ButtonClick, que ser provocado cada vez que se pulse un botn de la barra. Dentro del procedimiento de este evento, comprobaremos qu botn ha sido pulsado y ejecutaremos las acciones oportunas. Tanto el botn Abrir como la opcin de men del mismo nombre realizan la misma tarea, por lo que llaman al mtodo AbrirArchivo( ), que es quien realmente muestra el formulario necesario. Private Sub tbrBarra_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles tbrBarra.ButtonClick ' comprobar qu botn de la barra se ha pulsado If e.Button Is Me.btnAbrir Then ' llamamos al mtodo que abre el formulario para abrir un archivo Me.AbrirArchivo() End If If e.Button Is Me.btnSalir Then ' cerrar la aplicacin Me.Close() End If End Sub Private Sub mnuAbrir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuAbrir.Click ' al seleccionar esta opcin de men llamar al mtodo que ' abre el formulario que permite abrir un archivo Me.AbrirArchivo() End Sub Private Sub AbrirArchivo() Dim ofrmAbrirArchivo As New frmAbrirArchivo() ofrmAbrirArchivo.MdiParent = Me ofrmAbrirArchivo.Show() End Sub Al haber asignado al botn btnPersonal uno de los mens de la barra del formulario, no ser necesario escribir cdigo para detectar este botn en el evento ButtonClick, ya que se ejecutar directamente el cdigo del evento Click de las opciones de men. El Cdigo fuente 523 muestra el cdigo perteneciente a la opcin de men Personal + Datos.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

110

Private Sub mnuDatos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuDatos.Click Dim ofrmPersonal As New frmDatosPersonal() ofrmPersonal.MdiParent = Me ofrmPersonal.Show() End Sub

Control StatusBar
Para mostrar una barra informativa de estado recurriremos a este control, que al dibujarse queda situado en la parte inferior del formulario; como nombre le daremos sbrEstado. De forma similar al ToolBar, un control StatusBar est compuesto de una coleccin de objetos Panel, que iremos aadiendo al control mediante la propiedad Panels, la cual mostrar una ventana para la creacin y configuracin de tales paneles.

Editor de paneles del control StatusBar. Entre las propiedades destacables de un objeto Panel podemos mencionar las siguientes. BorderStyle. Muestra el panel con efecto resaltado, hundido o normal. Icon. Permite asociar un icono al panel. AutoSize. Con esta propiedad podemos conseguir que el panel se redimensione ajustndose a su contenido o que tenga un tamao fijo. En este ejemplo, hemos aadido dos paneles a la barra de estado del formulario. En uno mostramos un texto fijo; mientras que en el otro, visualizamos la hora actual a travs de un objeto Timer que ponemos en marcha en el evento Load del formulario. Veamos los mtodos implicados, en el Cdigo fuente 524.
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

111

Private Sub frmPrincipal_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load ' al cargar el formulario, creamos un temporizador ' le asociamos un manejador para su evento Tick y lo iniciamos Dim oTiempo As New Timer() oTiempo.Interval = 1000 AddHandler oTiempo.Tick, AddressOf PonerHoraActual oTiempo.Start() End Sub Private Sub PonerHoraActual(ByVal sender As Object, ByVal e As EventArgs) ' actualizamos a cada segundo la hora de un panel de la barra de estado Me.sbrEstado.Panels(1).Text = DateTime.Now.ToString("HH:mm:ss") End Sub La Figura muestra el formulario con la barra de estado.

Formulario con StatusBar. Finalizada la creacin del StatusBar, aadiremos al proyecto un formulario con el nombre frmDatosPersonal, en el dibujaremos un conjunto de nuevos controles que iremos describiendo seguidamente.

Control DateTimePicker
Este control permite la seleccin e introduccin de fechas en una caja de texto con capacidades extendidas, o bien mediante un calendario desplegable que se mostrar al pulsar el botn de expansin que contiene. Ver Figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

112

Control DateTimePicker. Para modificar la fecha en el cuadro de texto, debemos situarnos en la parte a modificar de la fecha y teclear el nuevo valor, o bien, con las flechas de direccin arriba-abajo, cambiar esa parte de la fecha. Si expandimos el calendario, podremos realizar la seleccin de un modo ms grfico. Por defecto el control muestra la fecha actual, pero con la propiedad Text podemos cambiar la fecha por cdigo, cosa que hacemos al cargar el formulario, asignando una fecha distinta de la actual. Ver Cdigo. Private Sub frmDatosPersonal_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load ' modificar fecha del DateTimePicker Me.dtpFNacim.Text = "15/06/2002" '.... End Sub Podemos restringir el rango de fechas a mostrar por este control con las propiedades MinDate y MaxDate. Si queremos, por otra parte, que la fecha se muestre con un formato personalizado, aplicaremos dicho formato mediante la propiedad CustomFormat, teniendo en cuenta que no se har efectivo hasta que a la propiedad Format no le asignemos el valor Custom. El botn btnCambiosFecha del formulario realiza algunas modificaciones por cdigo sobre el control DateTimePicker dtpFNacim del formulario, que vemos en el Cdigo Private Sub btnCambiosFecha_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCambiosFecha.Click ' configurar por cdigo el control DateTimePicker Me.dtpFNacim.MinDate = "1/4/2002" Me.dtpFNacim.MaxDate = "1/10/2002" Me.dtpFNacim.CustomFormat = "d-MMM-yy" Me.dtpFNacim.Format = DateTimePickerFormat.Custom

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

113

End Sub

Control NumericUpDown
Control que muestra una caja de texto con un valor numrico que podremos ir aumentando- disminuyendo al pulsar los botones para esta labor de que dispone el control. La Figura muestra este control en nuestro formulario de pruebas.

Control NumericUpDown. Entre las propiedades de este control destacaremos las siguientes. Increment. Nmero en el que se incrementar el valor del control cuando pulsemos sus botones o teclas de direccin. InterceptArrowKeys. Permite que las flechas de direccin arriba-abajo tengan el mismo efecto que si pulsamos los botones para incrementar o disminuir, de este control. Maximum, Minimun. Contienen los lmites superior e inferior en cuanto al nmero que podr contener el control. TextAlign. Permite alinear el nmero dentro la caja de texto del control. UpDownAlign. Permite situar los botones del control a la izquierda o derecha de la caja de texto que contiene el valor. Entre los eventos de que dispone este control, ValueChanged se produce cada vez que cambia el valor del control, de modo que en este caso, vamos a cambiar el color de fondo en funcin del nmero que contenga. Private Sub nupEdad_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles nupEdad.ValueChanged Select Case Me.nupEdad.Value Case 20 To 30 Me.nupEdad.BackColor = Color.Gold Case 30 To 40 Me.nupEdad.BackColor = Color.LimeGreen Case Else Me.nupEdad.BackColor = Me.nupEdad.DefaultBackColor End Select End Sub

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

114

Control DomainUpDown
Este control nos permite desplazarnos por una lista de valores, al mismo estilo que el control anterior. Dicha lista de valores la crearemos mediante la propiedad Items, en tiempo de diseo o ejecucin. El Cdigo muestra como al cargar el formulario frmDatosPersonal, con la propiedad Items y su mtodo AddRange( ), aadimos los valores que seleccionaremos en el control en tiempo de ejecucin. Private Sub frmDatosPersonal_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load '.... ' crear la lista del DomainUpDown Me.dudCategoria.Items.AddRange(New String() {"Auxiliar", "Jefe departamento","Coordinador"}) End Sub La Figura muestra el control dudCategora, de este tipo al ser utilizado en el formulario. En el caso de que necesitemos los valores ordenados, asignaremos True a su propiedad Sorted.

Control DomainUpDown.

Control MonthCalendar
Este control muestra en modo grfico un calendario por el que podemos desplazarnos para seleccionar una fecha. El control DateTimePicker utiliza internamente un MonthCalendar para mostrar su calendario desplegable. Por defecto se visualiza un mes, pero si asignamos a su propiedad CalendarDimensions un objeto Size, podemos expandir el tamao del calendario para que muestre varios meses. El Cdigo muestra el cdigo de un botn del formulario mediante el que cambiamos el tamao del calendario. Private Sub btnTamCalendario_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTamCalendario.Click Me.mclCalendario.CalendarDimensions = New Size(2, 2) End Sub En la Figura vemos el resultado de expandir el tamao del control.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

115

Control MonthCalendar con el tamao ampliado. Para detectar la seleccin de una fecha utilizaremos el evento DateChanged. Debido a que en un control MonthCalendar podemos seleccionar un rango de fechas, las propiedades que tenemos que manipular para averiguar la fechas seleccionadas son: SelectionStart, SelectionEnd y SelectionRange, aunque en muchas ocasiones slo ser necesario utilizar una de ellas. Private Sub mclCalendario_DateChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DateRangeEventArgs) Handles mclCalendario.DateChanged ' mostrar en un Label la fecha seleccionada en el control MonthCalendar Me.lblCalendario.Text = Me.mclCalendario.SelectionStart End Sub

Control LinkLabel
Este control permite tener en un formulario Windows un enlace hacia una pgina de Internet, con un comportamiento similar al que encontramos en un hiperenlace de una pgina web. Su propiedad Text muestra un literal, de modo que al hacer clic sobre el mismo, se provocar el evento LinkClicked en el que escribiremos el cdigo a ejecutar. En nuestro formulario de ejemplo, hemos creado un control de este tipo con el nombre lnkEidos, que tiene el aspecto de la Figura 322, ya que adems del enlace, le hemos asignado una imagen.

Control LinkLabel.
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

116

Para conseguir que al hacer clic en este enlace, se abra Internet Explorer y navegue hacia una determinada pgina, vamos a utilizar la clase Process, que como su nombre indica, nos permite la gestin de procesos del sistema, tales como su inicio y finalizacin. En este caso, el mtodo compartido Start( ), de Process, va a ejecutar el navegador al pasarle como parmetro una direccin web en forma de cadena. Veamos el Cdigo Private Sub lnkEidos_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles lnkEidos.LinkClicked ' inicia Internet Explorer y navega hacia una pgina Process.Start("http://www.eidos.es") End Sub

Creacin y manipulacin de elementos en ejecucin


El conjunto de controles que acabamos de ver, al igual que los bsicos permiten ser creados no slo mediante el diseador de formularios, sino tambin desde cdigo. Como muestra de ello, la opcin de men Varios + Aadir botn y panel, aade dos imgenes al control ImageList del formulario frmPrincipal, creando un nuevo botn para el ToolBar y un panel para el StatusBar Ver el Cdigo Private Sub mnuAgregaElementos(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuAgregar.Click ' aadir por cdigo imgenes a la lista Me.imlImagenes.Images.Add(New Bitmap("tutorias.gif")) Me.imlImagenes.Images.Add(New Bitmap("camera1.gif")) Dim oBoton As New ToolBarButton() oBoton.Text = "TUTORIAS" oBoton.ImageIndex = 4 Me.tbrBarra.Buttons.Add(oBoton) Dim oPanel As New StatusBarPanel() oPanel.Text = "BUSCAR" oPanel.BorderStyle = StatusBarPanelBorderStyle.Raised oPanel.ToolTipText = "Informacin sobre bsquedas" oPanel.Icon = New Icon("magnify.ico") Me.sbrEstado.Panels.Add(oPanel) End Sub Para detectar la pulsacin del nuevo botn de la barra de herramientas, aadimos el siguiente cdigo en su evento ButtonClick, que vemos en el Cdigo

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

117

Private Sub tbrBarra_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles tbrBarra.ButtonClick '.... If e.Button.Text = "TUTORIAS" Then MessageBox.Show("Se ha pulsado el botn de tutoras") End If End Sub La Figura muestra este formulario en ejecucin tras aadir los nuevos elementos.

Nuevos controles aadidos al formulario en tiempo de ejecucin.

Control NotifyIcon
Este control permite aadir un icono asociado con nuestra aplicacin en el panel de iconos del sistema (Windows System Tray) situado en la parte derecha de la barra de tareas de Windows. Tales iconos suelen utilizarse por aplicaciones que permanecen ocultas, y al hacer clic derecho sobre su icono en este panel, aparece un men contextual que permite mostrar la aplicacin. En nuestro caso vamos a utilizar este control para ejecutar y parar la calculadora del sistema empleando la clase Process, comentada en un apartado anterior. Despus de agregar un control de este tipo al formulario, asignaremos un icono a su propiedad Icon y una cadena a su propiedad Text, que ser mostrada al situar el ratn encima de este control en tiempo de ejecucin. Crearemos despus un men contextual con las opciones Abrir y Cerrar, que asignaremos a la propiedad ContextMenu del control NotifyIcon. Para poder controlar la calculadora de Windows cuando est en ejecucin, declararemos una variable de tipo Process a nivel de la clase. Al ejecutar la calculadora mediante el mtodo Start( ) de la clase Process, obtendremos un objeto de dicho tipo, que pasaremos a esta variable, y nos permitir posteriormente,

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

118

cerrar el proceso en el que se est ejecutando la calculadora mediante el mtodo Kill( ). Veamos esta parte en el Cdigo Public Class frmPrincipal Inherits System.Windows.Forms.Form Private oCalculadora As Process '.... Private Sub mnuCalcAbrir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuCalcAbrir.Click ' iniciar la calculadora oCalculadora = Process.Start("calc.exe") End Sub Private Sub mnuCalcCerrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuCalcCerrar.Click ' cerrar la calculadora oCalculadora.Kill() End Sub End Class Al ejecutar el programa, se mostrar un nuevo icono en la lista del panel de iconos del sistema de la barra de tareas, como muestra la Figura 324.

Control NotifyIcon en el panel de iconos del sistema de la barra de tareas. Como se puede comprobar, la clase Process ampla enormemente nuestra capacidad de manipulacin de los procesos del sistema.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

119

6.- PROGRAMACIN ORIENTADA A OBJETOS (POO) DE VISUAL BASIC.NET Introduccin:


Todo .NET Framework est basado en clases (u objetos). A diferencia de las versiones anteriores de Visual Basic, la versin .NET de este lenguaje basa su funcionamiento casi exclusivamente en las clases contenidas en .NET Framework, adems casi sin ningn tipo de limitacin. La POO es una evolucin de la programacin por procedimientos llamada tambin estructurada. Se basaba en funciones y procedimientos y el cdigo que controlaba el flujo de las llamadas a estos. En Visual Basic, sobre todo en versiones anteriores se sigue programando mucho as. A veces por desconocimiento y otras por "miedo" no se da el salto a la POO, aunque un programador con experiencia en VB puede hacer magnficas aplicaciones sin utilizar la POO (y sin aprovecharse de sus ventajas), y sobre todo, en un tiempo relativamente reducido.

6.1.-Qu es una clase?


Los programas de Visual Basic se generan con objetos como formularios y controles. Los objetos tambin se pueden utilizar para representar cosas reales como personas, equipos informticos o incluso algo ms abstracto, como una cuenta bancaria. Una clase es simplemente una representacin de un tipo de objeto. Se puede pensar en ella como un plano que describe el objeto. As como un plano puede utilizarse para construir varios edificios, una clase podemos usarla para crear varias copias de un objeto. Por ejemplo, el control TextBox lo define una clase TextBox, que define su aspecto y sus funciones. Cada vez que arrastramos un control TextBox a un formulario, realmente est creando una nueva instancia de la clase TextBox. Cada control TextBox es una copia exacta, aunque distinta, de la clase que lo define, la clase TextBox. Puesto que cada objeto es una "instancia" independiente de una clase, la accin de crear una clase se denomina creacin de instancias. Hasta ahora hemos agregado los controles TextBox a su formulario arrastrndolos desde el Cuadro de herramientas, pero tambin puede crear instancias de un objeto TextBox en su cdigo si utiliza la palabra clave New.
Dim Textbox1 As New TextBox

Qu hay dentro de una clase?


Todos los objetos tienen propiedades que describen sus atributos, mtodos que definen sus acciones y eventos que definen sus respuestas. Igualmente, la clase que

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

120

define un objeto tiene sus propias propiedades, mtodos y eventos (a veces llamados miembros) que se pasan a todas las instancias de esa clase. Por ejemplo, una clase que representa una cuenta bancaria podra tener propiedades como: NumeroCuenta BalanceCuenta CtaBancaria Mtodos como: CalculaInteres () Eventos : CambioBalance.
NumeroCuenta BalanceCuenta CambioBalance

CalculaInteres()

Hacer click

Una vez creada la instancia de un objeto de cuenta bancaria, puede tener acceso a sus propiedades, mtodos y eventos de igual manera que si se tratara de un objeto TextBox. Algunos miembros de una clase son privados; slo se tiene acceso a ellos mediante cdigo dentro de la clase. Por ejemplo, una clase de cuenta bancaria puede tener un mtodo para calcular un saldo. Lo lgico es permitir que un programa lea ese balance pero no que pueda cambiarlo directamente. Puede ocultar los miembros de una clase si los declara como Private o exponerlos si los declara como Public. Tambin puede permitir el acceso a una propiedad y a la vez impedir que el programa cambie su valor declarndolo como ReadOnly. El cdigo siguiente muestra cmo podra ser una clase CuentaBanco, por ejemplo:
'Declaramos la clase CuentaLimpia Class CuentaLimpia 'La hacemos privada Private NumeroCuenta As String Private BalanceCuenta As Decimal 'Y la ponemos publica para que calcule el balance Public Sub ActualizaBalance() End Sub ReadOnly Property Balance() As Decimal Get Return BalanceCuenta End Get End Property End Class

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

121

6.2.- Crear la primera clase


Una de las mejores razones para utilizar clases es que una vez que ha creado una clase para cierto tipo de objeto, se puede reutilizar esa clase en cualquier proyecto. Por ejemplo, muchos de los programas que escribimos pueden involucrar personas: Un programa de administrador de contactos para los contactos comerciales o un programa para realizar un seguimiento de empleados. Aunque los programas pueden ser considerablemente diferentes, los atributos que se aplican a cada persona seran los mismos. Todas tienen nombre, edad, direccin, nmero de telfono, etc. Para empezar a ver mejor crear clases,y usarlas crearemos una clase que represente a una persona; Podemos guardar esta clase y utilizarla en otros programas que escribamos en el futuro. Las clases se pueden crear de tres maneras: como parte del cdigo en un mdulo de formulario en un proyecto de aplicacin para Windows, como un mdulo de clase separado agregado a un proyecto de aplicacin para Windows o como un proyecto de bibliotecas de clase independiente.

Crear clases
Al hacer doble clic en un formulario y abrir el Editor de cdigo se ve algo parecido a lo siguiente:
Public Class Form1 Private Sub Form1_Load... End Sub End Class

Podemos observar que el formulario realmente es una clase, marcada por instrucciones Class y End Class y cualquier cdigo que se haya escrito entre las dos instrucciones es parte de la clase. Aunque de manera predeterminada un mdulo de formulario contiene slo una clase nica, puede crear mdulos adicionales agregando cdigo debajo de la instruccin End Class, tal como se ilustra a continuacin:
Public Class Form1 ' El cdigo de vuestro Form AQUI End Class Public Class MyFirstClass ' El cdigo de vuestra clase AQUI End Class

La desventaja de crear clases de esta manera es que slo estn disponibles dentro del proyecto donde se crearon. Si deseamos compartir una clase con otros proyectos, puede colocarla en un mdulo de clase.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

122

Mdulos de clase
Un mdulo de clase es un archivo de cdigo, separado del resto, que contiene una o ms clases. Como es un archivo independiente, se puede reutilizar en otros proyectos. Los mdulos de clase se pueden crear de dos maneras: Como un mdulo agregado a un proyecto de aplicacin para Windows. Como un proyecto de bibliotecas de clase independient Puede agregar un nuevo mdulo de clase a un proyecto existente seleccionando Clase en el cuadro de dilogo Agregar nuevo elemento, disponible en el men Proyecto. Para trabajar en durante el tutorial, crearemos un proyecto de bibliotecas de clases independientes. Vamos a ver cmo crear un proyecto de de biblioteca de clases: En el men Archivo, seleccionamos Nuevo proyecto. En el panel Plantillas, del cuadro de dilogo Nuevo proyecto, hacemos clic en Biblioteca de clases.

En el cuadro Nombre, escribimos Persons y hacemos clic en Aceptar.

Se abrir un nuevo proyecto de bibliotecas de clase y el Editor de cdigo mostrar el mdulo de clase Class1.vb.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

123

En el Explorador de soluciones, hacemos clic con el botn secundario del ratn en Class1.vb y seleccionamos Cambiar nombre y, a continuacin, cambiamos el nombre a "Persons.vb".

Observamos que el nombre en el Editor de cdigo tambin cambia a Persons.vb. En el men Archivo, elegimos Guardar todo. En el cuadro de dilogo Guardar proyecto, hacemos clic en Guardar. Nota: En lugar de guardar el proyecto en la ubicacin predeterminada, podramos crear un directorio en el cual podemos almacenar todas las clases para reutilizarlas mas tarde. se puede especificar esa carpeta en el campo Location del cuadro de dilogo Guardar proyecto antes de guardar. De momento, mantendremos el proyecto abierto, porque lo utilizaremos durante todo el tutorial, e iremos ampliando la informacin.

Agregar propiedades a una clase


Ahora, aprenderemos a agregar propiedades a la clase que creamos en la seccin anterior. Todos los objetos tienen atributos y las propiedades representan atributos. Antes, hicimos la clase "Persons", que representa a una persona; las personas tienen atributos como el nombre y la edad, por lo que la clase Persons necesita propiedades que representen dichos atributos. Se pueden agregar propiedades a una clase de dos maneras:

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

124

Como campo. Como procedimiento de propiedad. Tambin podemos determinar cmo funciona una propiedad utilizando los modificadores Public, ReadOnly o WriteOnly.

Campos y procedimientos de propiedad


Los campos son variables pblicas dentro de una clase que se pueden establecer o leer desde fuera de la clase. Resultan de utilidad para propiedades que no se tienen que validar, por ejemplo, un valor "Boolean" (True o False). En el caso de la clase Personas, se puede tener una propiedad Boolean denominada Casado, que especifica si una persona est soltera o casada, puesto que hay slo dos valores posibles. Para agregar un campo a una clase, el cdigo podra ser como el que sigue. Public Casado As Boolean La mayora de las propiedades, sin embargo, son ms complejas; en la mayor parte de los casos utilizaremos procedimientos de propiedad para agregar una propiedad a una clase. Los procedimientos de propiedad tienen tres partes: Una declaracin de una variable privada para almacenar el valor de la propiedad. Un procedimiento Get que expone el valor. Un procedimiento Set que, como indica su nombre, establece el valor en la clase. Por ejemplo, un procedimiento de propiedad para una propiedad Name, de la clase Personas, podra ser como el que sigue:
Private ValorNombre As String Public Property Nombre() As String Get Nombre = ValorNombre End Get Set(ByVal valor As String) ValorNombre = valor End Set End Property

Recibe el dato en la variable ValorNombre de La clase

Devuelve el contenido de la variable ValorNombre

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

125

La primera lnea de cdigo declara una variable String privada, ValorNombre que almacenar el valor de la propiedad. El procedimiento de propiedad en s comienza con Public Property y termina con End Property. El procedimiento Get contiene el cdigo que se ejecutar cuando desee leer su valor; por ejemplo, si lee la propiedad Personas.Nombre, el cdigo devolver el valor almacenado en la variable ValorNombre El procedimiento Set contiene cdigo que se utiliza para asignar un nuevo valor a la variable ValorNombre usando un valor pasado como argumento Valor. Por ejemplo, si escribimos el cdigo Personas.Nombre = "Wyrm" El valor String Wyrm se pasar como argumento Valor; el cdigo del procedimiento Set lo asignar a la variable ValorNombre para su almacenamiento. Por qu complicarnos tanto, en lugar de utilizar un campo que represente la propiedad Nombre? En el mundo real, hay ciertas reglas para los nombres: por ejemplo, los nombres normalmente no contienen nmeros. Puede agregar cdigo al procedimiento Set para comprobar el argumento Valor y devolver un error si contiene nmeros. Siguiendo con la Clase Personas, ahora agregaremos un campo y tres propiedades: 1. Abrimos el proyecto Personas que hicimos en la seccin anterior. Si no lo guardaste, primero debers regresar a la seccin anterior, crear la primera clase, y realizar hasta el final los procedimientos de esa seccin. 2. En el Explorador de soluciones, seleccionamos Personas.vb y en el men Ver elegimos Cdigo.

3. Agregamos el siguiente cdigo de declaracin debajo de la lnea Public Class Personas.


MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

126

Private ValorPrimerNombre As String Private ValorSegundoNombre As String Private ValorApellido As String Public Casado As Boolean 4. Agregamos los siguientes procedimientos de propiedad debajo del cdigo de declaracin anterior. Public Property PrimerNombre() As String Get PrimerNombre = ValorPrimerNombre End Get Set(ByVal valor As String) ValorPrimerNombre = Valor End Set End Property Public Property SegundoNombre() As String Get SegundoNombre = ValorSegundoNombre End Get Set(ByVal valor As String) ValorSegundoNombre = Valor End Set End Property Public Property Apellido() As String Get Apellido = ValorApellido End Get Set(ByVal valor As String) ValorApellido = Valor End Set End Property Quedar as: 5. En el men Archivo, elegimos Guardar todo para guardar el trabajo.

Propiedades de slo lectura y escritura


A veces una propiedad se establece una vez y no cambia nunca mas durante la ejecucin del programa. Por ejemplo, una propiedad que representa un nmero de empleado nunca debe cambiar, de modo que otro programa si lo pueda leer, pero no se permitir que ese programa cambie su valor. La palabra clave ReadOnly se utiliza para especificar que un valor de propiedad se pueda leer pero no modificar.
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

127

Nota: Si intentamos asignar un valor a una propiedad ReadOnly, aparecer un error en el Editor de cdigo. Para crear una propiedad de slo lectura, deberemos crear un procedimiento de propiedad con un procedimiento Get, pero sin procedimiento Set, como se muestra a continuacin. Private IDValue As Integer ReadOnly Property ID() As Integer Get ID = IDValue End Get End Property De igual forma, la palabra clave WriteOnly permite establecer un valor de propiedad pero no permite que se lea; por ejemplo, no permite que otros programas lean una propiedad de contrasea. Podemos utilizar ese valor para realizar acciones dentro de la clase, pero desear que sigan siendo privadas. Para crear una propiedad de slo escritura, se crear una propiedad con un procedimiento Set pero sin procedimiento Get, como a continuacin: Private passwordValue As String WriteOnly Property Password() As String Set(ByVal value As String) passwordValue = value End Set End Property Los procedimientos de propiedad ReadOnly y WriteOnly tambin son tiles cuando deseamos tomar un valor de propiedad y convertirlo en un valor diferente. Por ejemplo, pensemos en la edad de una persona. A diferencia del nombre, la edad cambia con el tiempo, si ha asignado la edad a una clase y la lee de nuevo un ao despus, sera incorrecta. En la clase Persons, podemos evitarlo agregando dos propiedades: una propiedad "WriteOnly BirthYear" que representa el ao de nacimiento, que nunca cambia, y una propiedad "ReadOnly Age" que devuelve un valor calculando la diferencia entre el ao en curso y el ao de nacimiento. Siguiendo con la Clase Persons, ahora agregaremos propiedades ReadOnly y WriteOnly a la clase: 1. Agregamos el siguiente cdigo de declaracin debajo de las otras declaraciones en la parte superior del mdulo de clase. Private birthYearValue As Integer

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

128

2. Introducimos los siguientes procedimientos de propiedad debajo del cdigo de declaracin. WriteOnly Property BirthYear() As Integer Set(ByVal value As Integer) birthYearValue = value End Set End Property ReadOnly Property Age() As String Get Age = My.Computer.Clock.LocalTime.Year birthYearValue End Get End Property 3. En el men Archivo, elegimos Guardar todo para guardar el trabajo.

6.4.- Agregar mtodos a una clase


Agregaremos mtodos a una clase, para que puedan realizar acciones. Vimos que la mayora de los objetos tienen acciones que pueden realizar; estas acciones se conocen como mtodos. La clase Persons que creamos en la seccin anterior,tiene muchas acciones que pueden realizar las personas y, estas acciones se pueden expresar como mtodos de clase.

Mtodos de una clase


Los mtodos de una clase son simplemente procedimientos Sub o Function, declarados en la clase. Por ejemplo, una clase Cuenta puede tener un procedimiento Sub denominado Recalcular, que actualizar el balance o un procedimiento Function denominado CurrentBalance para devolver el ltimo balance. El cdigo para declarar esos mtodos puede ser similar al siguiente: Public Sub Recalcular() 'Aqui el codigo para recalcular Cuenta. End Sub Ejemplo: Public Function BalanceCuenta(ByVal AccountNumber As Integer) As Double 'Codigo para volver a Balance End Function

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

129

Si bien la mayora de los mtodos de clase son pblicos, tambin se pueden agregar mtodos que slo la clase en s puede utilizar. Por ejemplo, la clase Personas puede tener su propia funcin para calcular la edad de una persona. Si declara la funcin como Private, no se puede ver o llamar desde fuera de la clase. El cdigo para una funcin privada puede ser similar a ste otro: Private Function CalcuEdad(ByVal year As Integer) As Integer CalcuAge = My.Computer.Clock.LocalTime.Year - year End Function Ms tarde podremos cambiar el cdigo que calcula el valor CalcAge y el mtodo seguir funcionando bien sin cambiar ningn cdigo que utilice el mtodo. Ocultar el cdigo que realiza el mtodo, se conoce como la "encapsulacin", ya explicada al comienzo. Ahora, para agregar un mtodo a la clase Persons, hacemos lo siguiente: Abrimos el proyecto Personas (si no lo tenemos abierto ya de antes) que hicimos en las secciones anteriores. Si no lo guardaste, o no lo creaste, primero debers volver a las secciones anteriores, agregar propiedades a la clase, y completar los procedimientos. En el Explorador de soluciones, seleccionamos Personas.vb y, en el men Ver, hacemos clic en Cdigo. Agregamos el siguiente cdigo bajo los procedimientos de propiedad. Public Function NombreComplet() As String If ValorSegundoNombre <> "" Then NombreCompleto = ValorPrimerNombre & " " & ValorSegundoNombre & " " & ValorApellido Else NombreCompleto = ValorPrimerNombre & " " & ValorApellido End If End Function Private Function CalcuEdad(ByVal year As Integer) As Integer CalcuEdad = My.Computer.Clock.LocalTime.Year - year End Function Modificamos el cdigo en el procedimiento de la propiedad Age para utilizar la funcin privada: ReadOnly Property Age() As String Get 'Age = My.Computer.Clock.LocalTime.Year birthDateValue
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

130

Age = CalcuEdad(birthYearValue) End Get End Property Antes, el cdigo era as: ReadOnly Property Age() As String Get Age = My.Computer.Clock.LocalTime.Year birthYearValue End Get End Property

En el men Archivo, hacemos clic en Guardar todo para guardar el trabajo.

6.5.- Agregar eventos a una clase


Un programa puede responder a eventos externos, como por ejemplo, un usuario que hace clic en un botn. En esta seccin, obtendremos informacin sobre cmo agregar eventos a una clase. Primero, debemos declarar el evento. A continuacin, debemos provocarlo. Provocar un evento significa que estamos sealizando la aparicin del evento. Para agregar un evento a una clase, lo declaramos con la instruccin Event. sto indica que el objeto puede provocar el evento que especificamos. Por ejemplo, quizs deseemos agregar un evento AgeCalculated a la clase Persons que hicimos. Podemos provocar a continuacin el evento en el mtodo CalcAge. Despus de hacer esto, cuando se llama al mtodo, podemos ejecutar algn cdigo adicional en cuanto se haya calculado la edad de la persona.

Para agregar un evento a la clase Persons


Abrimos el proyecto Persons. En el Explorador de soluciones, seleccione Persons.vb y, en el men Ver, hacemos clic en Cdigo. Agregamos el siguiente cdigo encima de los procedimientos de propiedad.
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

131

Public Event AgeCalculated(ByVal Age As Single) En el mtodo CalcAge, reemplazamos el cdigo existente por el siguiente cdigo para provocar el evento. Private Function CalcAge(ByVal year As Integer) As Integer Dim Age = My.Computer.Clock.LocalTime.Year - year RaiseEvent AgeCalculated(Age) CalcAge = My.Computer.Clock.LocalTime.Year - year End Function En el men Archivo, hacemos clic en Guardar todo para guardar el trabajo.

Probar una clase


Creamos una clase llamada "Persons" y le proporcionamos propiedades, mtodos y eventos. Lo que hemos hecho hasta ahora es agregar cdigo, ahora es el momento de utilizar la clase Persons y asegurarse de que funciona segn lo esperado.

6.6.- Crear una instancia de una clase


Los formularios y controles son en realidad clases; cuando arrastramos un control Button a un formulario, estamos creando realmente una instancia de la clase Button. Tambin podemos crear instancias de cualquier clase en el cdigo utilizando una declaracin con la palabra clave New. Por ejemplo, para crear una nueva instancia de la clase Button, agregaremos el cdigo siguiente.
Dim aButton As New Button

Para utilizar y probar la clase Persons, debemos crear primero un proyecto de prueba y agregar una referencia al mdulo de clase. Para crear un proyecto de prueba para la clase Persons Abrimos el proyecto Persons que creamos en las secciones anteriores. En el men Archivo, elegimos Agregar y, a continuacin, hacemos clic en Nuevo proyecto.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

132

En el panel Plantillas, en el cuadro de dilogo Nuevo proyecto, hacemos clic en Aplicacin de Windows Forms. En el cuadro Nombre, escribimos PersonsTest y hacemos clic en Aceptar.

Se agregar un nuevo proyecto de Windows Forms al Explorador de soluciones y aparecer un nuevo formulario.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

133

En el Explorador de soluciones, seleccionamos el proyecto PersonsTest y, en el men Proyecto, hacemos clic en Establecer como proyecto de inicio.

En el Explorador de soluciones, seleccionamos el proyecto PersonsTest y, en el men Proyecto, hacemos clic en Agregar referencia. Aparecer el cuadro de dilogo Agregar referencia.

Hacemos clic en la ficha Proyectos, seleccionamos Personas y hacemos clic en Aceptar.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

134

Hacemos doble clic en el formulario para abrir el editor de cdigo y escribimos la siguiente declaracin justo debajo de la lnea Public Class Form1.
Dim person1 As New Persons.Persons

Esto declara una nueva instancia de la clase Persons. Quizs os preguntis por qu tuvimos que escribir dos veces Persons, pues porque la primera instancia es el mdulo de clase Persons.vb y la segunda instancia es la clase Persons de ese mdulo. En el men Archivo, hacemos clic en Guardar todo. El siguiente paso es agregar una interfaz de usuario y un cdigo que utilice la clase Persons. Agregaremos cuadros de texto donde el usuario especificar los valores para cada una de las propiedades (excepto la propiedad de slo lectura "Age"), una casilla para el campo "Married" y botones para probar cada uno de los mtodos pblicos.

Para probar la clase Persons:


En el Explorador de soluciones, seleccionamos Form1 y, en el men Ver, hacemos clic en Diseador. En el Cuadro de herramientas, arrastramos cuatro controles TextBox, un control CheckBox y dos controles Button al formulario.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

135

Seleccionamos el primer control Button y, a continuacin, en la ventana Propiedades establecemos la propiedad Text en Update. Seleccionamos el segundo control Button y en la ventana Propiedades establecemos la propiedad Text en Full Name. Hacemos doble clic en el primer botn (Update) para abrir el Editor de cdigo y en el controlador de eventos Button1_Click, agregamos el siguiente cdigo: With person1 .FirstName = Textbox1.Text .MiddleName = Textbox2.Text .LastName = Textbox3.Text .BirthYear = Textbox4.Text .Married = CheckBox1.Checked End With En el controlador de eventos Button2_Click, agregamos lo siguiente: MsgBox(person1.NombreCompleto) MsgBox(CStr(person1.Edad) & " aos") If person1.Casado = True Then MsgBox(person1.PrimerNombre & " es casado") Else MsgBox(person1.Primernombre & " es soltero") End If Presionamos F5 para ejecutar el proyecto y mostrar el formulario:

-En el primer cuadro de texto, escribimos nuestro nombre. -En el segundo cuadro de texto, escribimos nuestro segundo nombre. -En el tercer cuadro de texto, escribimos nuestro apellido. -En el cuarto cuadro de texto, escribimos el ao de nuestro nacimiento con cuatro dgitos (por ejemplo, 1983). -Activamos la casilla de si estamos casados/as.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

136

Hacemos clic en el botn "Update" para establecer las propiedades de la clase y clic en el botn "Full Name". Se muestran tres cuadros de mensaje. Estos cuadros de mensaje muestran su nombre completo, edad y estado civil.

En el men Archivo, hacemos clic en Guardar todo.

6.7.-Cmo utilizar los constructores


Introduccin En Visual Basic .NET, la inicializacin de nuevos objetos se controla utilizando constructores. Para crear un constructor para una clase, se crea un procedimiento denominado Sub New en cualquier lugar de la definicin de la clase. Caractersticas de Sub New El constructor Sub New tiene las siguientes caractersticas: El cdigo del bloque Sub New siempre se ejecutar antes de cualquier otro cdigo de una clase.
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

137

El constructor Sub New solo se ejecutar una vez, cuando se cree un objeto. Ejemplo de Sub New El siguiente ejemplo muestra cmo utilizar el constructor Sub New: Public Sub New( ) ' Perform simple inicializacin intValue = 1 End Sub La siguiente lnea de cdigo crea un objeto desde una clase denominada BankAccount, ya definida en la aplicacin. Dim myAccount As New BankAccount( ) Podemos sobrecargar New y crear tantos constructores de clases como sean necesarios. Esto resulta til si deseamos inicializar nuestro objeto cuando lo creemos. Sobrecarga de constructores Podemos sobrecargar constructores del mismo modo que se sobrecarga cualquier otro mtodo de una clase. No obstante, no podemos utilizar la palabra clave Overloads cuando sobrecargamos constructores. El siguiente ejemplo muestra cmo sobrecargar New y crear mltiples constructores de clase: Class BankAccount Private balance as Double Sub New( ) ' Initialize balance balance = 0.0 End Sub Sub New(ByVal amount As Double) balance = amount End Sub End Class Uno de los constructores del ejemplo anterior toma un parmetro. Si estamos creando un objeto desde tal clase, podemos incluir sus parmetros en la declaracin. El siguiente ejemplo muestra cmo invocar el mtodo New que toma un parmetro. Dim myAccount As New BankAccount(120.00) Para escribir nuestros propios constructores de clase, crearemos un mtodo con el nombre New( ), como vemos en el Cdigo. En dicho ejemplo, al instanciarse un objeto de la clase Empleado, se asignar a una de sus propiedades la fecha actual. Interfase grafica cliente Public class form1.. Private Sub Botton_Click Dim loEmp As Empleado loEmp = New Empleado()

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

138

MsgBox("El objeto se ha creado el da "& loEmp.FechaCrea) End Sub End class Public Class Empleado Private mdtFechaCrea As Date Public Property FechaCrea() As Date Get Return mdtFechaCrea End Get Set(ByVal Value As Date) mdtFechaCrea = Value End Set End Property ' mtodo constructor Public Sub New() ' asignamos un valor inicial a una variable de propiedad Me.FechaCrea = Now End Sub End Class Al igual que ocurre en un mtodo normal, New( ) admite parmetros; esto nos sirve para asignar valores de inicio al objeto en el momento de su instanciacin. La denominacin para este tipo de mtodos es constructor parametrizado. El Cdigo nos muestra una variacin del fuente anterior, utilizando un constructor de este tipo. Interfase grafica cliente Public class form1.. Private Sub Botton_Click Dim loEmp As Empleado loEmp = New Empleado("5/7/2002") MsgBox("El objeto se ha creado el da "& loEmp.FechaCrea) ' este es otro modo de instanciar ' un objeto con un constructor parametrizado Dim loEmp2 As New Empleado("08/4/2002") End Sub End Class Public Class Empleado Private mdtFechaCrea Public Property FechaCrea() As Date Get Return mdtFechaCrea End Get Set(ByVal Value As Date)
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

139

mdtFechaCrea = Value End Set End Property ' mtodo constructor con parmetro Public Sub New(ByVal ldtFecha As Date) ' asignamos el valor del parmetro a una variable de propiedad Me.FechaCrea = ldtFecha End Sub End Class Combinando las caractersticas de mtodos constructores junto a las de sobrecarga, podemos crear un conjunto de constructores sobrecargados para la clase. Public Class Empleado Public psNombre Public psApellidos Public psCiudad Private mdtFechaCre ' en este constructor sin parmetros, asignamos la fecha actual Public Sub New() mdtFechaCrea = Now() End Sub ' en este constructor, asignamos valores a todos los campos de la clase Public Sub New(ByVal lsNombre As String, ByVal lsApellidos As String, ByVal lsCiudad As String) psNombre = lsNombre psApellidos = lsApellidos psCiudad = lsCiudad End Sub End Class

6.8.-Cmo utilizar los destructores


Introduccin En Visual Basic .NET, podemos controlar qu ocurre durante la destruccin de objetos utilizando procedimientos denominados destructores. Finalize y Dispose El sistema invoca al destructor Finalize antes de liberar el objeto. Puede utilizarse para limpiar recursos abiertos, como conexiones a bases de datos, o para liberar otros

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

140

recursos. Sin embargo, existe una demora entre el momento en que un objeto pierde su alcance y el momento en que se invoca al destructor Finalize. La ejecucin de Sub Finalize provoca una ligera prdida en el rendimiento, por ello nicamente debera definirse un mtodo Sub Finalize cuando sea necesario liberar objetos explcitamente. Visual Basic .NET permite un segundo tipo de destructor, denominado Dispose, que puede ser invocado explcitamente en cualquier momento para liberar recursos de forma inmediata. Dispose no se incluye en el mbito de este curso. Si desea ms informacin sobre Dispose, puede consultar Duracin de los objetos: cmo se crean y destruyen en la documentacin de Visual Studio .NET. Nota Ejemplo de Sub Finalize El siguiente ejemplo muestra cmo utilizar el destructor Finalize: Protected Overrides Sub Finalize( ) ' Can close connections or other resources conn.Close End Sub Protected es un modificador de acceso que establece el nivel de accesibilidad.

6.9.-Cmo utilizar miembros de datos compartidos


Introduccin En Visual Basic .NET, los miembros de datos compartidos pueden utilizarse para permitir que mltiples instancias de una clase hagan referencia a una nica variable a nivel de clase. Sintaxis Utilizaremos la siguiente sintaxis para declarar miembros de datos compartidos: NiveldeAcceso Shared MiembrodeDatos As TipodeDatos Niveles de acceso Los miembros de datos compartidos estn directamente enlazados a la clase, y podemos declararlos como pblicos o privados. Si declaramos los miembros de datos como pblicos, estarn accesibles para cualquier cdigo que pueda acceder a la clase. Si declaramos los miembros de datos como privados, proporcionaremos propiedades compartidas pblicas para acceder a la propiedad compartida privada. Ejemplo El siguiente ejemplo muestra cmo crear una clase de cuenta de ahorro (SavingsAccount) que utilice un miembro de datos compartido pblico para mantener los tipos de inters para una cuenta de ahorro:

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

141

Class SavingsAccount Public Shared InterestRate As Double Public Function CalculateInterest( ) As Double ... End Function End Class El valor del miembro de datos InterestRate de la clase SavingsAccount puede establecerse globalmente con independencia del nmero de instancias de la clase que estn en uso. El valor se utiliza para calcular el inters del saldo actual. Invocar miembros de datos compartidos desde un cliente Despus de crear una clase que utilice miembros de datos compartidos pblicos, podemos invocar los miembros de datos de esa clase desde una aplicacin cliente. El siguiente cdigo muestra cmo invocar la clase SavingsAccount y sus miembros de datos desde una aplicacin cliente: Sub Test( ) SavingsAccount.InterestRate = 0.03 Dim myAccount As New SavingsAccount( ) Dim yourAccount As New SavingsAccount( ) MessageBox.Show(myAccount.CalculateInterest( )) MessageBox.Show(yourAccount.CalculateInterest( )) End Sub En el examen de este cdigo, se observa lo siguiente: InterestRate puede establecerse antes y despus de la creacin de cualquier instancia de la clase SavingsAccount. Cualquier modificacin a InterestRate se aplicar a todas las instancias de la clase SavingsAccount.

Propiedades compartidas Tambin pueden crearse propiedades compartidas en las clases. El siguiente ejemplo muestra cmo declarar una propiedad compartida denominada Rate en la clase SavingsAccount: Class SavingsAccount Private Shared interestRate As Double Shared Property Rate( ) As Double Get Return interestRate End Get Set(ByVal Value As Double) interestRate = Value End Set End Property End Class

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

142

Invocar propiedades compartidas desde un cliente Una vez declarada la propiedad compartida Rate, puede utilizarse en una aplicacin cliente en lugar de acceder directamente al miembro de datos compartido interestRate. Podemos invocar una propiedad compartida cualificndola con el nombre de clase o con el nombre de variable de una instancia especfica de la clase. El siguiente cdigo muestra cmo invocar una propiedad compartida cualificndola con el nombre de la clase: SavingsAccount.Rate = 0.03 El siguiente cdigo muestra cmo invocar una propiedad compartida utilizando el nombre de variable de una instancia especfica de la clase:

6.10.-Cmo utilizar los mtodos compartidos


Introduccin Podemos utilizar los miembros de procedimiento compartidos para disear funciones que pueden ser invocadas sin crear una instancia de la clase. Los procedimientos compartidos son mtodos de una clase que no estn asociados a una instancia especfica de una clase. Los miembros de procedimiento compartidos nicamente pueden acceder a datos marcados con la palabra clave Shared. Por ejemplo, un mtodo compartido no puede hacer referencia a un miembro de la instancia de una clase. Ejemplo del uso de un miembro de procedimiento compartido El siguiente ejemplo muestra cmo una funcin utilizada habitualmente, como GetComputerName, puede crearse como un miembro de procedimiento compartido de forma que una aplicacin cliente puede utilizarla fcilmente. El cliente nicamente necesita hacer referencia al mtodo prefijado por el nombre de la clase, ya que no se requiere ninguna instancia de la clase. ' TestClass code Public Shared Function GetComputerName( ) As String ... End Function ' Client code MessageBox.Show(TestClass.GetComputerName( )) Observaremos tambin que, en el cdigo anterior, Show es un mtodo compartido de la clase MessageBox.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

143

6.11.-Qu es el polimorfismo?
Introduccin La mayora de sistemas de programacin orientada a objetos proporcionan polimorfismo mediante herencia. El polimorfismo basado en herencia implica la definicin de mtodos en una clase base y sobrecargarlos con nuevas implementaciones en clases derivadas. Definicin Polimorfismo hace referencia a la capacidad de definir mltiples clases con diferentes funcionalidades pero con mtodos o propiedades de nombres idnticos que pueden utilizarse de forma intercambiable por el cdigo cliente en tiempo de ejecucin. El nombre del mtodo reside en la clase base. Las implementaciones de mtodos residen en las clases derivadas. Para gestionar esto, nicamente puede declararse en la clase base el nombre del mtodo (no el cdigo que proporciona la funcionalidad del mtodo). Ejemplo de polimorfismo Supongamos que definimos una clase denominada BaseTax que proporciona funcionalidad bsica para calcular el impuesto sobre las ventas de un estado. Las clases derivadas de BaseTax, como CountyTax o CityTax, podran implementar mtodos como CalculateTax. Polimorfismo hace referencia al hecho de que la implementacin del mtodo CalculateTax podra ser distinta en cada una de las clases derivadas. Por ejemplo, el tipo impositivo de un condado (county tax rate) podra ser distinto del tipo impositivo de una ciudad (city tax rate). Las clases que hereden de BaseTax tendrn un mtodo CalculateTax, pero el modo como se calcule realmente el impuesto podra variar en cada una de las clases derivadas.

Sobrecarga de mtodos o polimorfismo, en una misma clase


La sobrecarga de mtodos, es una tcnica que consiste en crear varios mtodos con idntico nombre dentro de la misma clase, distinguindose entre s por su lista de parmetros. Analicemos el siguiente ejemplo: Interfase grafica cliente Public class form1.. Private Sub Botton_Click Dim loEmpleado As New Empleado() Dim ldbResultadoIncent As Double loEmpleado.Salario = 1020.82 'llamada al primer mtodo sobrecargado loEmpleado.Sueldo()

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

144

'llamada al segundo mtodo sobrecargado MsgBox("El sueldo se transferir el da " & loEmpleado.Sueldo(29)) 'llamada al tercer mtodo sobrecargado ldbResultadoIncent = loEmpleado.Sueldo(50.75, "Extras") MsgBox(El incentivo a pagar ser " & ldbResultadoIncent) End Sub End Class Public Class Empleado Private mdbSalario As Double Public Property Salario() As Double Get Return mdbSalario End Get Set(ByVal Value As Double) mdbSalario = Value End Set End Property ' Mtodos sobrecargados Public Overloads Sub Sueldo() ' aqu mostramos en consola el importe del sueldo formateado MsgBox("El sueldo es " & Format(Me.Salario, "#,#.##")) End Sub Public Overloads Function Sueldo(ByVal liDia As Integer) As String ' Aqu mostramos la fecha del mes actual en la que se ' realizar la transferencia del sueldo al banco del empleado Dim ldtFechaActual As Date Dim lsFechaCobro As String ldtFechaActual = Now() lsFechaCobro = CStr(liDia) & "/" & _ CStr(Month(ldtFechaActual)) & "/" & _ CStr(Year(ldtFechaActual)) Return lsFechaCobro End Function Public Overloads Function Sueldo(ByVal ldbImporteIncentivo As Double,ByVal lsTipoIncentivo As String) As Double ' aqu calculamos la cantidad de incentivo que se aadir al ' sueldo del empleado,en funcin del tipo de incentivo Dim ldbIncentivo As Double
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

145

' segn el tipo de incentivo, se descuenta un importe de la cantidad del incentivo Select Case lsTipoIncentivo Case "Viajes" ldbIncentivo = ldbImporteIncentivo - 30 Case "Extras" ldbIncentivo = ldbImporteIncentivo - 15 End Select Return ldbIncentivo End Function End Class

Mtodos sobrecargados
Para crear un mtodo sobrecargado, agregamos dos o ms procedimientos Sub o Function a la clase, cada uno con el mismo nombre. En las declaraciones de procedimiento, el conjunto de argumentos para cada procedimiento debe ser distinto o se producir un error. El siguiente ejemplo muestra un mtodo con dos sobrecargas, una que acepta una String y la otra que acepta un Integer como argumentos. Public Sub TestFunction(ByVal input As String) MsgBox(input) End Sub Public Sub TestFunction(ByVal input As Integer) MsgBox(CStr(input)) End Sub Si se debe llamar a este mtodo desde el cdigo y pesarle una cadena, se ejecutara la primera sobrecarga y un cuadro de mensaje mostrara la cadena; si se le pas un nmero, se ejecutara la segunda sobrecarga y el nmero se convertira en una cadena y aparecera en el cuadro de mensaje. Podemos crear tantas sobrecargas como sean necesarias y cada una de ellas puede contener un nmero diferente de argumentos. En la clase Persons, agregaremos un mtodo con dos sobrecargas para devolver la inicial del segundo nombre de una persona; una slo con la inicial y la otra con la inicial seguida por un punto.

Probar los mtodos sobrecargados en la clase Persons


Abrimos el proyecto Persons que creamos en la secciones anteriores. En el Explorador de soluciones, seleccionamos Persons.vb y, en el men Ver, elegimos Cdigo.
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

146

Agregamos el siguiente cdigo debajo de los mtodos existentes. Public Function MiddleInitial() As String MiddleInitial = Left$(middleNameValue, 1) End Function Public Function MiddleInitial(ByVal period As Boolean) As String MiddleInitial = Left$(middleNameValue, 1) & "." End Function En el Explorador de soluciones, seleccionamos Form1 y, en el men Ver, hacemos clic en Diseador. En el Cuadro de herramientas, arrastramos dos controles ms de Button al formulario. Seleccionamos el tercer control Button y en la ventana Propiedades establecemos su propiedad Text en With. Seleccionamos el cuarto control Button y en la ventana Propiedades establecemos su propiedad Text en Without. Hacemos doble clic en el primer botn (With) para abrir el Editor de cdigo y escribimos el siguiente cdigo en el controlador de eventos Button3_Click. En el controlador de eventos Button4_Click, agregamos el siguiente cdigo. MsgBox(person1.FirstName & " " & person1.MiddleInitial & _ " " & person1.LastName) Presionamos F5 para ejecutar el proyecto y mostrar el formulario.

-En el primer cuadro de texto, escribimos nuestro nombre. -En el segundo cuadro de texto, escribimos nuestro segundo apellido. -En el tercer cuadro de texto, escribimos nuestro tercer apellido. -En el cuarto cuadro de texto, escribimos el ao de nuestro nacimiento con cuatro dgitos (por ejemplo, 1983). -Activamos la casilla si est casado/a.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

147

Hacemos clic en el botn Actualizar para establecer las propiedades de la clase y hacemos clic en el botn With. Se abrir un cuadro de mensaje. Muestra nuestro nombre con un punto tras la inicial del primer apellido.

Hacemos clic en el botn Without. Se abrir un cuadro de mensaje. Muestra nuestro nombre sin el punto tras la inicial del primer apellido.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

148

En el men Archivo, hacemos clic en Guardar todo.

6.12.-Probar controladores de eventos


Si deseamos escribir cdigo que responda a un evento (o que controle un evento), debemos asociar ese evento a un controlador de eventos. Podemos hacerlo mediante la instruccin Handles o Add Handler. La instruccin Add Handler permite asociar los eventos a los controladores en tiempo de ejecucin, mientras que la instruccin Handles slo asocia los eventos a los controladores en tiempo de compilacin. La instruccin Handles se puede agregar al final de cualquier subrutina que tenga la misma firma que el evento. Por ejemplo, antes, agregamos un evento denominado "AgeCalculated" que toma un parmetro de tipo "Integer". La subrutina que crea para controlar el evento tambin debe tomar un parmetro Integer, como se observa en el cdigo siguiente. Private Sub person1_AgeCalculated(ByVal Age As Integer) _ Handles person1.AgeCalculated El objeto person1 se debe crear con la instruccin WithEvents para que se pueda tener acceso al evento AgeCalculated. Al usar la instruccin Add Handler, puede asociar dinmicamente los eventos a controladores en tiempo de ejecucin. Probamos el controlador de eventos en la clase Person En el Explorador de soluciones, seleccionamos Form1 y, en el men Ver, hacemos clic en Cdigo. Agregamos la instruccin WithEvents antes de la declaracin person1, como se muestra en el cdigo siguiente: WithEvents person1 As New Persons.Persons

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

149

Agregamos el procedimiento siguiente a Form1. Este cdigo comprueba la edad calculada y muestra un mensaje basado en el resultado. Private Sub person1_AgeCalculated(ByVal Age As Integer) _ Handles person1.AgeCalculated If Age > 18 Then MsgBox("You have been over 18 for " & Age - 18 _ & " years.") Else MsgBox("You will be 18 in " & 18 - Age & " years") End If End Sub Presionamos F5 para ejecutar el proyecto y mostrar el formulario. -En el primer cuadro de texto, escribimos nuestro nombre. -En el segundo cuadro de texto, escribimos nuestro segundo apellido. -En el tercer cuadro de texto, escribimos nuestro tercer apellido. -En el cuarto cuadro de texto, escribimos el ao de nuestro nacimiento con cuatro dgitos (por ejemplo, 1983). -Activamos la casilla si est casado/a. Hacemos clic en el botn Actualizar para establecer las propiedades de la clase y haga clic en el botn Full Name. Un cuadro de mensaje muestra su nombre completo. Si tiene ms de 18 aos, otro cuadro de mensaje muestra informacin sobre cunto tiempo hace que cumpli los 18 aos. Si tiene menos de 18 aos, aparece un cuadro de mensaje que muestra informacin sobre cunto tiempo queda hasta que cumpla los 18 aos. A continuacin, otro cuadro de mensaje muestra su edad.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

150

En el men Archivo, hacemos clic en Guardar todo.

6.13.- Herencia en Visual Basic NET


La Herencia especifica una relacin es un tipo de Mltiples clases comparten los mismos atributos y operaciones, permitiendo una eficaz reutilizacin del cdigo

Persona

Clase base

Cliente

Empleado

Clase Derivada

Introduccin En la programacin orientada a objetos, podemos compartir las caractersticas de una clase base en otras clases derivadas de la clase base. Esto se denomina herencia. Definicin Herencia es el concepto de reutilizar atributos y operaciones comunes de una clase base en una clase derivada.

Cmo heredar de una clase


Una clase derivada hereda de una clase base Pueden heredarse propiedades, mtodos, miembros de datos, eventos y controladores de eventos (dependiendo del mbito) Palabras clave Inherits: hereda de una clase base NotInheritable: no es heredable MustInherit: no pueden crearse instancias de la clase; deben heredarse como una clase base Introduccin

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

151

En Visual Basic .NET, la herencia puede utilizarse para derivar una clase de una clase existente. La clase derivada puede heredar todas las propiedades, mtodos, miembros de datos, eventos y controladores de eventos de la clase base, facilitando la reutilizacin de la clase base por toda la aplicacin. La palabra clave Inherits La palabra clave Inherits se utiliza para definir una clase derivada que heredar de una clase base existente. Ejemplo: El siguiente ejemplo muestra cmo utilizar la palabra clave Inherits: Public Class CheckingAccount Inherits BankAccount Private Sub ProcessCheck( ) ' Add code to process a check drawn on this account End Sub End Class Observacion Podemos utilizar la palabra clave MyBase para invocar mtodos en una clase base cuando invalidan mtodos en una clase derivada. Tambin podemos utilizar la palabra clave MyBase para invocar el constructor y el destructor de la clase base en nuestra clase derivada. Observemos el siguiente ejemplo: 'Crear clase derivada en dos lneas Public Class Administrativo Inherits Empleado ' Crear clase derivada en la misma lnea Public Class Administrativo : Inherits Empleado La palabra clave NotInheritable La palabra clave NotInheritable se utiliza para definir una clase que no puede utilizarse como clase base para herencia. Si otra clase intenta heredar de esta clase, se generar un error de compilacin. Ejemplo: El siguiente ejemplo muestra cmo utilizar la palabra clave NotInheritable: Public NotInheritable Class TestClass ... End Class Public Class DerivedClass ' The following line generates a compiler error Inherits TestClass
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

152

... End Class La palabra clave MustInherit La palabra clave MustInherit se utiliza para definir clases que no estn pensados para ser utilizados directamente como objetos instanciados. La clase resultante debe ser heredada como una clase base para utilizarla en el objeto de una clase derivada instanciada. Ejemplo: El siguiente ejemplo muestra cmo utilizar la palabra clave MustInherit: Public MustInherit Class BaseClass ... End Class ... Si el cdigo cliente intenta crear una instancia de este tipo de clase, se generar un error de compilacin, como se muestra en el siguiente ejemplo: ' Client code ' The following line generates a compiler error Dim x As New BaseClass( ) La palabra clave Protected Utilizamos el acceso Protected para limitar el mbito de una propiedad, mtodo, miembro de datos, evento o controlador de eventos a la clase que los define y cualquier clase derivada basada en esa clase base. Ejemplo El siguiente ejemplo muestra cmo utilizar la palabra clave Protected: Public Class BaseClass ' Accessible anywhere Public counter As Integer ' Accessible only in this class or a derived class Protected name As String ... End Class

Generar una clase a partir de una clase existente: Herencia de clases


Ahora veremos cmo utilizar la herencia de clases para crear una clase basada en una clase existente. Muchos objetos de la vida real tienen atributos y comportamientos en comn, por ejemplo, todos los coches tienen ruedas y motores, y pueden avanzar y detenerse. Sin embargo, algunos automviles tienen atributos que no son comunes, por ejemplo, un

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

153

descapotable tiene una parte superior que se puede subir/bajar electrnica o manualmente. Si se cre un objeto para representar un automvil, se pueden incluir propiedades y mtodos para todos los atributos y comportamientos comunes, pero no se podran agregar atributos como la cubierta de un descapotable, puesto que dicho atributo no es generalizable a todos los automviles. Mediante el uso de la herencia, se puede crear una clase "descapotable" que deriva de la clase "automvil". sta hereda todos los atributos de la clase automvil y puede agregar los atributos y comportamientos que son nicos de un auto descapotable.

Heredar a partir de una clase existente


La instruccin Inherits se utiliza para declarar una nueva clase, denominada clase derivada, basada en una clase existente conocida como clase base. Las clases derivadas heredan todas las propiedades, los mtodos, los eventos, los campos y las constantes definidos en la clase base. El siguiente cdigo muestra la declaracin de una clase derivada.
Class DerivedClass Inherits BaseClass End Class

Se pueden crear instancias de la nueva clase DerivedClass, se puede tener acceso a sus propiedades y mtodos como BaseClass y se pueden agregar nuevas propiedades y mtodos que son especficos de la nueva clase. Para ver un ejemplo, nos fijaremos en la clase Persons que tenemos creada. Supongamos que deseamos tener una clase que represente jugadores de bisbol: los jugadores del bisbol tienen todos los atributos definidos en la clase Persons, pero tambin tienen atributos nicos, como su nmero y posicin. En lugar de agregar esas propiedades a la clase Persons, se crear una nueva clase derivada que se hereda de Persons, a la que se agregaran las nuevas propiedades. Para crear una clase derivada de la clase Persons: Abrimos el proyecto Persons que llevamos todo el tutorial usando. En el Explorador de soluciones, seleccionamos el nodo del proyecto Persons. En el men Proyecto, elegimos Agregar clase.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

154

En el cuadro de dilogo Agregar nuevo elemento, escribimos Players en el cuadro Nombre, a continuacin, hacemos clic en Agregar.

Se agregar un nuevo mdulo de clase al proyecto.

En el Editor de cdigo, agregamos lo siguiente justo debajo de la lnea Public Class Players. Inherits Persons Agregamos tambin el siguiente cdigo para definir las dos nuevas propiedades. Private numberValue As Integer Private positionValue As String Public Property Number() As Integer Get Number = numberValue End Get Set(ByVal value As Integer)

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

155

numberValue = value End Set End Property Public Property Position() As String Get Position = positionValue End Get Set(ByVal value As String) positionValue = value End Set End Property En el men Archivo, hacemos clic en Guardar todo.

Probar la clase Players


Hemos creado una clase Players, derivada de la clase Persons.Ahora haremos una nueva aplicacin para probar la clase Players. Para crear un proyecto de prueba para la clase: 1. En el men Archivo, elegimos Agregar y, a continuacin, hacemos clic en Nuevo proyecto. 2. En el cuadro de dilogo Agregar nuevo proyecto, en el panel Plantillas, seleccionamos una Aplicacin de Windows Forms. 3. En el cuadro Nombre, escribimos PlayerTest y hacemos clic en Aceptar.

4. Se agregar un nuevo proyecto de Windows Forms al Explorador de soluciones y aparecer un nuevo formulario.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

156

5. En el Explorador de soluciones, seleccionamos el proyecto PlayerTest y, en el men Proyecto, hacemos clic en Establecer como proyecto de inicio. 6. En el Explorador de soluciones, seleccionamos el proyecto PlayerTest y, en el men Proyecto, haga clic en Agregar referencia. 7. Se abrir el cuadro de dilogo Agregar referencia. 8. Hacemos clic en la ficha Proyectos, elegimos Persons y hacemos clic en Aceptar.

9. Hacemos doble clic en el formulario para abrir el Editor de cdigo y escribimos la siguiente declaracin justo debajo de la lnea Public Class Form1. Dim player1 As New Persons.Players Dim player2 As New Persons.Players Esto declara dos nuevas instancias de la clase Players. 10. En el men Archivo, hacemos clic en Guardar todo. Para probar la clase derivada: 1. En el Explorador de soluciones, seleccionamos Form1 en el proyecto PlayerTest y, a continuacin, en el men Ver, hacemos clic en Cdigo.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

157

2. En el Editor de cdigo, agregamos el siguiente cdigo al procedimiento de evento Form1_Load. With player1 .FirstName = "Wyrm" .LastName = "Garcia" .Number = 13 .Position = "Shortstop" End With With player2 .FirstName = "Joe" .LastName = "Black" .Number = 51 .Position = "Catcher" End With 3. En el Explorador de soluciones, seleccionamos Form1 en el proyecto PlayerTest y, a continuacin, en el men Ver, hacemos clic en Diseador.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

158

4. En el Cuadro de herramientas, arrastramos dos controles Button al formulario. 5. Seleccionamos el primer control Button y en la ventana Propiedades establecemos su propiedad Text en At Bat. 6. Seleccionamos el segundo control Button y en la ventana Propiedades establecemos su propiedad Text en On Deck. 7. Hacemos doble clic en el primer botn (At Bat) para abrir el Editor de cdigo y escribimos el siguiente cdigo en el controlador de eventos Button1_Click. MsgBox(player1.Position & " " & player1.FullName & ", #" & CStr(player1.Number) & " is now at bat.") Observamos que estamos utilizando el mtodo FullName que se hered de la clase base Persons. 8. En el controlador de eventos Button2_Click, agregamos el siguiente cdigo.
MsgBox(player2.Position & " " & player2.FullName & ", #" & CStr(player2.Number) & " is on deck.")

9. Presionamos F5 para ejecutar el programa. Hacemos clic en cada botn para ver los resultados. Clic al Boton1(At Bat):

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

159

Clic al Boton2 (on Deck):

10. En el men Archivo, elegimos Guardar todo. Hemos visto, qu son y cmo crear clases, agregarle propiedades, mtodos y eventos, las hemos heredado, etc. la mejor forma de aprender y de que las cosas se entiendan, es hacindolo uno mismo...

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

160

7.- Impresin en Visual Basic .NET


Introduccin
Muchos de los usuarios de Visual Basic 6 que han migrado a .NET han sufrido (incluso estn sufriendo) la carencia de este "nuevo" entorno de programacin de un objeto que les permita imprimir de forma tan fcil como lo era el objeto Printer o de una coleccin que les permita saber las impresoras disponibles en el sistema. En este artculo explicaremos cmo imprimir en .NET y comprobaremos que aunque parezca complicado, a la larga, imprimir en .NET es igual o ms fcil que con VB6, aunque tratndose de un lenguaje orientado a objetos, debemos cambiar un poco el chip.

Los precedentes
Lo primero que debemos tener en cuenta es que todo lo que queramos hacer en .NET debemos hacerlo usando las clases que este entorno nos ofrece y el tema de imprimir no es una excepcin. En Visual Basic 6 solamente disponamos del objeto Printer, que era el que realmente nos permita imprimir, de la coleccin Printers, la cual podamos usar para saber las impresoras que tenamos disponibles, adems del control para dilogos comunes, el cual nos permita seleccionar y configurar la impresora que queramos usar, adems de permitirnos indicar el nmero de pginas a imprimir, etc., aunque no siempre funcionara como a nosotros nos hubiera gustado y en ocasiones tuvisemos que acudir a las funciones del API de Windows si realmente queramos hacer algo verdaderamente prctico. En .NET ha cambiado un poco la forma de hacer todo lo que hacamos en VB6, ya no existen "objetos" que nos permitan imprimir ni colecciones que nos permitan saber las impresoras disponibles, bueno, un poco s, pero como veremos de una forma ms ordenada y algo diferente. Esa diferencia es la que a muchos les ha causado desesperacin e incluso les ha llevado a un consumo excesivo de Aspirinas. En los siguientes puntos veremos que nuestra vida puede ser ms soportable e incluso ms fcil si aprendemos a manejar las clases de .NET que nos permiten imprimir y configurar las opciones de impresin.

7.1.-La solucin: Cmo imprimir en .NET


Bsicamente para imprimir en .NET solamente necesitamos una clase: PrintDocument la cual est definida en el espacio de nombres System.Drawing.Printing. Con esta clase tenemos todo lo necesario para imprimir (en la impresora predeterminada) cualquier tipo de documento. Simplemente necesitamos llamar al mtodo Print y asunto arreglado. Seguramente el lector se preguntar que si esto es as, dnde est el problema? Problema, lo que se dice problema, realmente no hay ninguno, lo que ocurre es que esta clase, particularmente el mtodo Print, se utiliza sin tener que indicar qu es lo que
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

161

queremos imprimir, y aqu es donde podra estar ese problema. El mtodo Print de la clase PrintDocument lo que realmente hace es "despertar a la bestia", es decir, dar las instrucciones pertinentes al motor de .NET para que se inicie el proceso de impresin, dicho proceso se lleva a cabo bsicamente utilizando el evento PrintPage de la clase PrintDocument, en este evento es donde tendremos que hacer todo lo necesario para que se imprima lo que queramos imprimir. Por tanto, para poder controlar lo que se va a imprimir, debemos escribir todo nuestro cdigo en ese evento, el cual se produce para cada pgina que deba imprimirse; posiblemente este sea el punto problemtico, al menos desde el punto de vista del programador de VB6, ya que antes para controlar lo que deba imprimirse simplemente usbamos el mtodo Print del objeto Printer, (o de cualquier objeto del tipo Printer que hubisemos obtenido de la coleccin Printers), al que le indicbamos qu es lo que deba imprimirse, aunque en VB6 ramos nosotros los que debamos comprobar cuando cambiar de pgina, cuando imprimir la cabecera, etc. En .NET todo esto se hace en un solo sitio: el evento PrintPage, por tanto podemos decir que en .NET es ms fcil imprimir y sobre todo controlar cmo y dnde se imprime cada cosa, ya que, si lo simplificamos al mximo, todo se hace en un solo sitio: el evento PrintPage de la clase PrintDocument.

Para muestra, un botn


En el listado podemos ver un ejemplo de la forma ms simple de imprimir en .NET, en este ejemplo mostramos la cadena "Hola, Mundo" en la parte superior de la pgina usando una fuente Arial de 24 puntos en negrita. Private Sub btnImprimirSimple_Click(ByVal sender As Object, _ ByVal e As EventArgs)Handles btnImprimirSimple.Click ' ejemplo simple para imprimir en .NET ' Usamos una clase del tipo PrintDocument Dim printDoc As New PrintDocument ' asignamos el mtodo de evento para cada pgina a imprimir AddHandler printDoc.PrintPage, AddressOf print_PrintPage ' indicamos que queremos imprimir printDoc.Print() End Sub Private Sub print_PrintPage(ByVal sender As Object, _ ByVal e As PrintPageEventArgs) 'Este evento se producir cada vez que se imprima una nueva pgina ' imprimir HOLA MUNDO en Arial tamao 24 y negrita ' imprimimos la cadena en el margen izquierdo Dim xPos As Single = e.MarginBounds.Left ' La fuente a usar Dim prFont As New Font("Arial", 24, FontStyle.Bold)

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

162

' la posicin superior Dim yPos As Single = prFont.GetHeight(e.Graphics) ' imprimimos la cadena e.Graphics.DrawString("Hola, Mundo", prFont, Brushes.Black, xPos, yPos) ' indicamos que ya no hay nada ms que imprimir ' (el valor predeterminado de esta propiedad es False) e.HasMorePages = False End Sub

Ejemplo simple de impresin


Como podemos comprobar el proceso es bien simple: Primero tenemos el cdigo usado para dar la orden de imprimir, (este cdigo puede estar en el evento Click de un botn), en el que creamos un nuevo objeto del tipo PrintDocument al que asignamos el procedimiento de evento a usar cuando se vaya a imprimir cada pgina, cosa que ocurrir despus de llamar al mtodo Print de esta clase. En el evento PrintPage le indicamos a .NET que es lo que queremos imprimir, en nuestro caso slo la cadena "Hola, Mundo", para imprimir dicho texto utilizamos el mtodo DrawString del objeto Graphics, (una propiedad del segundo parmetro pasado al evento). Esta simpleza es en parte porque tampoco hacemos demasiadas cosas en el cdigo del evento PrintPage, aunque aqu mostramos algunas de las cosas necesarias, como por ejemplo indicar el tipo de fuente a usar para la impresin, la cual se puede cambiar en cada una de las lneas a imprimir (e incluso en distintas partes de esa lnea), ya que cada lnea se "dibuja" por medio del mtodo DrawString del objeto Graphics obtenido del segundo parmetro pasado a este mtodo. Como vemos en DrawString debemos indicarle que es lo que queremos imprimir, con qu tipo de fuente y en qu posicin. Por ltimo indicaremos si quedan ms pginas a imprimir, esto lo haremos asignado un valor verdadero o falso a la propiedad HasMorePages del objeto recibido como segundo parmetro del evento, si el valor asignado es True estaremos indicando que queremos seguir imprimiendo, por el contrario, asignando un valor False terminaremos la impresin, cosa que tambin ocurrir si no le asignamos expresamente nada a esa propiedad.

7.2.-Configurar la impresin
Pero para ser claros esta no ser la forma "habitual" de usar este evento, ya que en la mayora de los casos imprimiremos ms de una pgina y seguramente querremos asignar otros valores a la impresora, como los mrgenes, el nmero de copias, el tamao del papel, la orientacin de la impresin (vertical o apaisada) e incluso, lo ms importante, qu impresora usar.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

163

Todos estos valores los podremos indicar usando un objeto del tipo PrinterSettings, el cual, entre otras cosas, nos permite saber cules son las impresoras que tenemos disponibles en el equipo actual. Por tanto, lo habitual ser que usemos un objeto de esta clase en conjunto con el de la clase principal para imprimir: PrintDocument.

Seleccionar la impresora a usar


Otra de las tareas que seguramente nos veremos en la necesidad de ofrecer a los usuarios de nuestras aplicaciones es que puedan seleccionar de una manera fcil qu impresora usar y darles la posibilidad de que ajusten sus preferencias de impresin. Todo esto lo podramos hacer manualmente creando un formulario que utilice un objeto del tipo PrinterSettings y que le ofrezca a los usuarios las opciones que creamos conveniente, pero para que todo sea, digamos, ms homogneo y no tengamos que reinventar la rueda, podemos hacer que toda esta configuracin y seleccin de la impresora a usar la ofrezcamos mediante los mismos cuadros de dilogo que utiliza el resto de aplicaciones, los cuales se basan en los cuadros de dilogos comunes del sistema operativo, si esta es nuestra eleccin, nos resultar fcil, ya que podemos usar la clase PrintDialog. Con un objeto de esta clase, tal como hemos comentado, podemos mostrar el mismo cuadro de dilogo que utilizan el resto de aplicaciones de Windows, con la ventaja aadida de que podemos configurar las opciones que se mostrarn, de forma que lo configuremos para que se adapte, en la medida de lo posible, a las preferencias de nuestra aplicacin. En breve veremos cules son las opciones que podemos usar para ajustar este cuadro de dilogo a nuestras preferencias o a la de nuestra aplicacin.

7.3.-Las clases para imprimir en .NET


Como hemos comentado en los prrafos anteriores, existen varias clases que nos permitirn tanto imprimir como configurar la impresin. Todo esto es posible gracias a las clases que .NET Framework pone a nuestra disposicin para poder realizar esta tarea. Echando mano del comodn que los que nos dedicamos a escribir artculos o libros, tenemos que decir que en este artculo no disponemos del espacio suficiente para enumerar en detalle todas las clases, delegados y enumeraciones que tanto el espacio de nombres System.Drawing.Printing como System.Windows.Forms pone a nuestra disposicin para realizar tareas relacionadas con la impresin, por tanto haremos una pequea criba para mostrar solamente los tipos que desde nuestro punto de vista pueden resultarnos ms tiles, particularmente porque sern los que utilicemos en la mayora de los casos.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

164

La clase PrintDocument
Esta es la clase elemental o principal si queremos imprimir en .NET, como hemos comentado anteriormente, de los miembros que esta clase ofrece principalmente usaremos tres: El mtodo Print es el que iniciar el proceso de impresin, haciendo que se produzcan los eventos necesarios para controlar lo que queremos imprimir. El evento PrintPage, el cual se producir cada vez que tengamos que imprimir una pgina. Dentro de este evento es donde haremos todo lo que tengamos que hacer para imprimir cada una de las pginas, desde aqu podemos controlar si quedan ms pginas por imprimir, etc. La propiedad PrinterSettings a la que podemos asignarle un objeto del mismo nombre en el que indicamos la impresora a usar y otros valores como el rango de pgina, el nmero de copias, el tamao del papel, la orientacin, etc. Del resto de miembros de esta clase podemos destacar la propiedad DocumentName a la que podemos asignar el nombre del documento que estamos imprimiendo y que ser el que se muestre en el estado de la impresin. Tambin tenemos el evento QueryPageSettings el cual se produce justo antes del evento PrintPage y que nos permite asignar valores "particulares" a cada una de las pginas a imprimir antes de que se produzca el evento PrintPage.

La clase PrinterSettings
Tal y como hemos estado indicando en los prrafos anteriores, esta clase nos permite especificar caractersticas de impresin como la impresora a usar, el nmero de copias a imprimir, el rango de pginas, etc. Realmente no necesitamos indicar nada, al menos de forma explcita para usar un objeto de esta clase, ya que al crear una nueva instancia los valores predeterminados sern los que tengamos asignado en la impresora, valga la redundancia, predeterminada de nuestro sistema. Pero si queremos modificar esos valores, tendremos que asignarlos a las propiedades de esta clase, entre las que podemos destacar las siguientes: Copies indica el nmero de copias a imprimir. FromPage indica la pgina a partir de la que queremos imprimir. MaximunPage indica el nmero mximo de copias que se pueden indicar. MinimunPage es el nmero mnimo de copias que podemos indicar. ToPage indica la pgina hasta la que queremos imprimir. Tanto MaximunPage como MinimunPage se utilizarn para indicar los valores mximo y mnimo de las pginas disponibles y se usarn con una clase del tipo PrintDialog. Del resto de propiedades tambin podemos destacar las colecciones: InstalledPrinters es una propiedad compartida y por tanto podemos usarla sin necesidad de crear una instancia de la clase PrinterSettings, esta coleccin

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

165

devuelve un array de tipo String con el nombre de cada una de las impresoras instaladas en el sistema. PaperSizes es una coleccin con elementos del tipo PaperSize que nos permite saber los tamaos de papel que la impresora soporta. Cada elemento del tipo PaperSize nos proporciona informacin sobre el tamao (ancho y alto), el nombre y la "clase" de papel, que no es ni ms que una enumeracin del tipo PaperKind. PrinterResolutions es una coleccin con elementos del tipo PrinterResolution, de forma que podamos averiguar las resoluciones (y calidades) permitidas por la impresora. Cada uno de estos elementos nos indicar tanto la resolucin horizontal como la vertical, adems de la calidad de impresin, especificada con uno de los valores de la enumeracin PrinterResolutionKind, cuyos valores pueden ser: Custom, Draft, High, Low y Medium. De los mtodos, posiblemente el que ms nos puede interesar es: CreateMeasurementGraphics el cual nos permite conseguir un objeto del tipo Graphics con el cual podemos averiguar ciertas caractersticas de la impresora sin necesidad de tener que imprimir, ya que el objeto devuelto por este mtodo es igual al que se incluye en la clase PrintPageEventArgs, usada como segundo parmetro en los eventos producidos por la clase PrintDocument. Como regla general deberamos tener una variable del tipo PrinterSettings para usarla como almacenamiento de las preferencias de impresin de nuestros usuarios, ya que esta clase se utiliza tanto con PrintDocument como con PrintDialog.

La clase PrintDialog
Esta clase nos servir para que nuestros usuarios seleccionen la impresora a usar as como para que indiquen ciertas caractersticas relacionadas con la impresin, como la calidad del papel, el nmero de copias, etc., con la ventaja de que todo esto lo haremos usando el mismo cuadro de dilogo comn incluido en Windows y que es el que la prctica totalidad de aplicaciones de este sistema operativo utilizarn, tal como podemos comprobar en la figura 1.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

166

Figura 1. El cuadro de dilogo para seleccionar la impresora En la figura 1 podemos comprobar que hay ciertos elementos que puede que no nos interese mostrar o dejar habilitados, por ejemplo, si nuestra aplicacin no permite imprimir el cdigo seleccionado no tiene mucho significado ofrecerle la opcin "Seleccin", (la figura est capturada de un Windows XP en ingls, por eso se muestran las opciones en ingls), lo mismo ocurre con el botn de ayuda o con las cajas de texto que permiten indicar el rango de pginas a imprimir. Todas estas caractersticas las podemos habilitar o deshabilitar mediante algunas de las propiedades de la clase PrintDialog, tales como: AllowPrintToFile, AllowSelection, AllowSomePages, PrintToFile, ShowHelp y ShowNetwork.

La ayuda del cuadro de dilogo de imprimir


Como curiosidad, decir que la propiedad ShowHelp nos permite indicar si se debe mostrar o no el botn de ayuda, (no la interrogacin de la barra de ttulos que siempre estar funcional), pero entre las propiedades de esta clase no tenemos ninguna a la que indicarle que ayuda se debe mostrar si pulsamos en ese botn, en lugar de eso, de lo que disponemos es de un evento: HelpRequest el cual se producir cuando el usuario pulse en dicho botn, por tanto si queremos mostrar algn tipo de ayuda, tendremos que usar ese evento para mostrar la informacin que creamos conveniente para nuestro cuadro de dilogo. Al igual que en el resto de cuadros de dilogos de .NET, tenemos el mtodo ShowDialog que ser el que nos permita mostrar el cuadro de dilogo y saber si el usuario ha pulsado en el botn OK (Aceptar) o Cancelar, para que de esta forma sepamos si debemos seguir con el proceso de impresin o no. La propiedad PrinterSettings ser la que nos permita saber lo que el usuario ha seleccionado, adems de ser la que usemos para asignar los valores predeterminados o bien los que tengamos almacenado de ocasiones anteriores; tal como indicamos anteriormente, lo habitual ser que tengamos una variable del tipo de esta propiedad

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

167

con las preferencias del usuario, por tanto antes de llamar al mtodo ShowDialog deberamos asignar a esta propiedad la variable que tengamos con las preferencias del usuario y si no se ha cancelado, debemos asignar nuevamente el resultado de dichas preferencias, tal como mostramos en el listado 2. Private Function seleccionarImpresora() As Boolean Dim prtDialog As New PrintDialog If prtSettings Is Nothing Then prtSettings = New PrinterSettings End If With prtDialog .AllowPrintToFile = False .AllowSelection = False .AllowSomePages = False .PrintToFile = False .ShowHelp = False .ShowNetwork = True .PrinterSettings = prtSettings If .ShowDialog() = DialogResult.OK Then prtSettings = .PrinterSettings Else Return False End If End With Return True End Function

La clase PrintPreviewDialog
Esta clase nos permitir mostrar una ventana con la vista preliminar del documento que queremos imprimir, de forma que los usuarios de nuestra aplicacin pueden ver lo que se imprimir. Debido a que esta clase al estar derivada de Form tiene todas las propiedades, mtodos y eventos de cualquier formulario adems de los relacionados con la previsualizacin del documento a imprimir, veamos solamente los dos miembros que nos interesarn ms: El mtodo ShowDialog ser el que se encargue de mostrar el formulario con la vista preliminar. A la propiedad Document le asignaremos un objeto del tipo PrintDocument que ser el que utilicemos para saber qu es lo que queremos imprimir.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

168

NOTA: Por regla general deberamos asignar a la propiedad Document de la clase PrintPreviewDialog el mismo objeto PrintDocument usado para imprimir, ya que la clase PrintPreviewDialog se encargar de que se produzcan los mismos eventos que si hubisemos llamado al mtodo Print del objeto PrintDocument asignado, de forma que lo que se muestre mediante este dilogo sea lo mismo que se imprima, que es al fin y al cabo lo que queremos conseguir. Tal como hemos resaltado en la nota, tanto el mtodo Print de la clase PrintDocument como la clase PrintPreviewDialog utilizan los mismos eventos del objeto PrintDocument, por tanto podramos usar un mtodo genrico que sea el encargado de mostrar una vista preliminar de lo que queremos imprimir o de mandarlo a la impresora, de esta forma podemos usar de forma comn las opciones ofrecidas al usuario, como por ejemplo permitir la seleccin de la impresora antes de imprimir, etc. En el listado podemos ver cmo podra ser ese mtodo genrico para elegir entre imprimir o previsualizar lo que deseamos imprimir. Private Sub imprimir(ByVal esPreview As Boolean) ' imprimir o mostrar el PrintPreview If prtSettings Is Nothing Then prtSettings = New PrinterSettings End If If chkSelAntes.Checked Then If seleccionarImpresora() = False Then Return End If If prtDoc Is Nothing Then prtDoc = New System.Drawing.Printing.PrintDocument AddHandler prtDoc.PrintPage, AddressOf prt_PrintPage End If ' la lnea actual lineaActual = 0 ' la configuracin a usar en la impresin prtDoc.PrinterSettings = prtSettings If esPreview Then Dim prtPrev As New PrintPreviewDialog prtPrev.Document = prtDoc prtPrev.Text = "Previsualizar documento" prtPrev.ShowDialog()
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

169

Else prtDoc.Print() End If End Sub Tal como podemos ver en la figura, el formulario (o cuadro de dilogo) de previsualizacin nos permite seleccionar el nmero de pgina a mostrar, si queremos ver una o ms pginas a un mismo tiempo, el porcentaje de ampliacin e incluso imprimir lo que estamos viendo, todos estas caractersticas ya estn incluidas en ese formulario.

El formulario de previsualizacin

La clase PrintPreviewControl
Si nuestra intencin es crear nuestro propio formulario de previsualizacin, tambin podemos hacerlo si usamos el control PrintPreviewControl que es el que la clase PrintPreviewDialog utiliza, si bien todos los botones y opciones tendremos que crearlos nosotros, para ello podemos usar los miembros especficos de este control, tales como: AutoZoom lo usaremos para que al cambiar el tamao del control se cambie tambin la pgina mostrada. Columns indica el nmero de pginas a mostrar cuando se elija la orientacin horizontal (apaisada). Document es donde asignaremos el objeto PrintDocument a imprimir. Rows indica el nmero de pginas a mostrar cuando elijamos la orientacin vertical. Zoom para indicar la ampliacin con la que queremos mostrar los documentos. StartPageChanged en un evento que se producir cada vez que cambiemos la pgina de inicio (este evento nos servir para crear un equivalente al NumericDropDown usado en la clase PrintPreviewDialog).

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

170

Si tambin quisiramos implementar un botn para imprimir, tendremos que manejar nosotros mismos la impresin, pero realmente resultara fcil, ya que lo nico que tendramos que hacer es llamar al mtodo Print del objeto PrintDocument asignado a la propiedad Document. Como siempre la ltima palabra la tendremos nosotros y dependiendo de lo que queramos hacer usaremos una clase u otra.

7.4.- Conclusin: Imprimir en .NET es fcil


Tal como hemos podido comprobar, imprimir en .NET no es tan complicado como en un principio pudiera parecer, adems de que tenemos valores aadidos que nos permiten un mayor control sobre la impresin y, especialmente, sobre las opciones que podemos ofrecer a los usuarios de nuestras aplicaciones, ya que como hemos visto, hacer algo como la presentacin preliminar, que en otros lenguajes nos obligara a escribir bastante cdigo, es tan sencillo como crear un nuevo objeto en la memoria y asignar un par de propiedades. Por supuesto, lo que no es totalmente sencillo ni automtico es la presentacin o impresin de los datos que necesitamos mostrar, al menos si queremos darle un toque, digamos, profesional a nuestra impresin, ya que seremos nosotros los que debamos "afinar" en la forma de mostrar esos resultados; pero de todas formas eso es algo que siempre nos tocar hacer, utilicemos el entorno de programacin que utilicemos, la ventaja de usar lo que .NET nos ofrece es que tenemos ciertas posibilidades de hacerlo de una forma ms o menos fcil y que de alguna forma nos facilita bastante la tarea, aunque para la mayora de situaciones ser ms que suficiente e incluso podemos automatizar, principalmente porque podemos aprovechar las posibilidades que nos da la programacin orientada a objetos de crear nuestras propias clases e implementar mtodos de impresin que se adapten a los datos que tengamos que mostrar, ya que una de las claves de la POO es la abstraccin y que mejor forma de abstraccin que crear un mtodo que se encargue de manejar los datos que la propia clase mantiene y que "sepa" cmo mostrar esos datos e incluso qu formato deben aplicarse a la hora de presentar esos datos por la impresora. Posiblemente tengamos que quemar unas cuantas neuronas ms a la hora de "concebir" esa clase, pero a la larga ese esfuerzo habr valido la pena ya que puede suponernos una forma de "olvidarnos" de esos pequeos detalles de ajustar cada una de las lneas que vamos a imprimir. De seguro que el lector puede pensar que tampoco es necesario ese "esfuerzo" extra para imprimir una lnea, y seguramente tenga razn, pero precisamente si cuando diseamos nuestras clases para manejar datos tenemos en cuenta estos detalles, seguramente nos resultar ms fcil realizar cambios en ocasiones futuras. Por ejemplo, si tenemos una clase en la que hay datos de cadena y de tipo numrico y queremos mostrar esos datos, la forma de tratar cada uno de esos datos ser diferente, ya que con toda seguridad los datos numricos querremos ajustarlos a la derecha y los de cadena a la izquierda, adems de que si debemos recortar la

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

171

informacin que tenemos que mostrar, con total seguridad preferiremos "truncar" los datos de cadena antes que los numricos. En este tipo de situaciones si dejamos que el cdigo de la clase sea el que decida estos truncamientos, (realmente el cdigo de la clase no va a decidir nada, ya que tendremos que ser nosotros los que hagamos esa decisin), siempre ser preferible que tener que hacerlo en el propio evento de impresin, sobre todo si ese mismo evento es el que usaremos para imprimir datos de diferentes tipos, que pueden proceder de diferentes clases, pero si las clases usadas para contener los datos estn "preparadas" para imprimir el contenido de cada lnea, entonces resultar tan sencillo como llamar a un mtodo de cada una de esas clases... En el listado podemos ver cmo quedara el evento PrintPage si hiciramos algo de lo que acabamos de comentar. ' El evento usado mientras se imprime el documento Private Sub prt_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) ' Este evento se produce cada vez que se va a imprimir una pgina Dim lineHeight As Single Dim yPos As Single = e.MarginBounds.Top Dim leftMargin As Single = e.MarginBounds.Left Dim printFont As System.Drawing.Font ' Asignar el tipo de letra printFont = prtFont lineHeight = printFont.GetHeight(e.Graphics) Dim fontTitulo As New Font("Arial", 20, FontStyle.Bold) e.Graphics.DrawString("Listado de " & Ttulo, fontTitulo, _ Brushes.Black, leftMargin, yPos) yPos += fontTitulo.GetHeight(e.Graphics) ' imprimir la cabecera de la pgina yPos = Datos(0).CabeceraImpresin(e, printFont, yPos) ' imprimir cada una de las lneas de esta pgina Do yPos += lineHeight e.Graphics.DrawString(Datos(lineaActual).LineaImpresin, _ printFont, Brushes.Black, leftMargin, yPos) lineaActual += 1 Loop Until yPos >= e.MarginBounds.Bottom _ OrElse lineaActual >= Datos.Count If lineaActual < Datos.Count Then e.HasMorePages = True Else e.HasMorePages = False End If End Sub

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

172

7.5.-Hacer Crystal Report con DataSet en Visual Basic.NET


La mayora de las veces que trabajamos con Visual Basic .Net y Crystal Report, solemos conectarnos a SQL Server u Oracle como fuente de datos, debido a que tienen integracin con el IDE de Visual Studio, para facilitar la creacin de los mismos. Cuando hablamos de motores como PostgreSQL, MySQL, Firebird, Teradata y otros, no tenemos la integracin del IDE con el servidor de base de datos, esto hace que no podamos crear tan sencillamente los reportes como los hacemos como con los otros motores, pero no lo hace imposible, slo se debe seguir unos pasos distintos, que tambin sirve para los 2 primeros motores mencionados anteriormente. Lo siguiente sirve en muchos casos para proyectos pequeos de la universidad, a pesar de que utlizar Visual Studio 2008 esto sirve muy bien para Visual Studio 2005 tambin, asi que comencemos: 1.- Proceder a crear un proyecto en Visual Basic 2008, con el Framework 2.0, y le pondr de nombre EjemploReporteCrystal, obviamente si ya tienen el proyecto creado no deben de hacerlo.

2.- Despus lo que hacemos es insertar un DataSet de nuestra base de datos, si no sabes como hacerlo da clic aqu.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

173

3.- Luego de eso agregamos un nuevo elemento, para esto damos clic derecho en nuestro proyecto > Agregar > Nuevo

Elemento. 4.- Tendremos un formulario como el siguiente en donde escogeremos la opcin de la izquierda, seleccionamos Reporting > Seleccionamos ahora Crystal Report > Le ponemos un nombre > y damos clic en Adjuntar.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

174

5.- Ahora lo que veremos ser un wizard o ayudante que nos permitir crear un reporte de manera sencilla, debern entonces de ver una imagen como la siguiente y darle clic en ok. Dejen las opciones tal como las tengo en mi imagen.

6.- Lo siguiente es escoger de donde sacaremos los datos que mostraremos, para esto en la siguiente pantalla que se les mostrar que deber ser como la imagen que coloco abajo, ustedes debern escoger Datos del Proyecto > ADO.NET DataSets > EjemploReporteCrystal.BD_EjemploProcedimientosDataSet (Este es mi dataset que puse enante, entonces aqu colocan el de ustedes) > y escogen las tablas que utilizarn en su reporte, en mi caso escog 2, ya que utilizar datos de las 2 tablas > Presionamos el boton > para cada tabla que queramos utilizar en el reporte y una vez hecho esto damos en siguiente.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

175

7.- En la siguiente pantalla veremos como estn relacionadas las tablas, no hay practicamente nada que explicar asi que damos clic en siguiente.

8.- Ahora en esta pantalla siguiente si hay que poner asunto, porque es aqu en donde diremos que campos de que tablas y en qu lugar los queremos en nuestro reporte, entonces vemos como tengo mis 2 tablas y escojo los datos que necesito de las 2, sin preocuparme de como estn relacionadas ni nada por el estilo, como ven en esta parte lo que hago es darle sentido a la forma de presentar mis datos.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

176

9.- Luego de esto vendrn ciertas opciones como la que utilizar a continuacin que es de agrupar los datos en un cierto orden, y la forma que escogi de agruparlos es por gneros iguales, esto lo hago especificando en la parte de agrupamiento qu campo es el que quiero agrupar.

10.- Lo que sigue son ms opciones como les dije, pero en este momento yo ya le di en finalizar, ya que no necesito hacerle ms cosas a mi reporte, por ahora. Luego de dar clic en finalizar tendr una imagen como la que est abajo, la parte que tengo tachada es una parte que no quiero mostrar en ejecucin por tanto para ocultarlas les damos clic derecho en la parte gris y al desplegarse un men de opciones seleccionamos ocultar.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

177

11.- Bien ahora regresamos y abrimos nuestro form, y buscamos nuestro origen de datos, si no lo vemos por ahi, damos clic en el men de Visual Studio en la opcin de Datos > Seleccionamos ver Origenes de Datos y listo, tendrn que poder ver su dataset con las tablas al lado como en la imagen. Pero bueno lo que debemos hacer con esto es arrastrar esas 2 tablas a mi formulario, y esto para qu es? pues es para colocar esos controles que ven abajo junto con el dataset que estn encerrados en el rectngulo verde, son controles que ya vienen cargados con datos necesarios y que no tendremos que ponerlos nosotros, por ejemplo ruta de la base de datos o metodos de conexin y desconexin, etc.

12.- Despus de poner esas tablas las sacamos junto con la barra que se pone en la parte superior, y deber quedarnos tener algo como lo que sigue.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

178

13.- Luego de lo que hicimos vamos a la caja de herramientas y buscamos un control llamado CrystalReportViewer, lo arrastramos y colocamos en el formulario, este control ser el que nos permita vizualizar nuestro reporte hecho anteriormente.

14.- Entonces una vez hecho esto damos doble clic en el borde del form para entrar al metodo load del mismo y poner el codigo que sigue a continuacin. Aclarando un poco sobre ese cdigo, lo que hacen las 2 primeras lneas es filtrar los datos de las tablas indistintamente si estn relacionadas, las otras 3 lneas sirven para cargar nuestro reporte en el reportviewer que pusimos en el form, para esto cree un objeto llamado rpt del reporte(), que fue mi reporte que creamos hace rato, y en su propiedad SetDataSource le envie el dataset del proyecto que obviamente ya tiene los datos filtrado gracias a las 2 lneas primeras, por ltimo mande a cargar este reporte al control del form con su propiedad ReportSource.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

179

15.- Luego de esto si lo ejecutan debern ver algo como esto.

16.- Ahora abramos el DataSet para crear algo extra, a continuacin lo que haremos es crear un mtodo que nos filtree solo los datos de las personas de gnero masculino. Para esto demos doble clic sobre el dataset o clic derecho y Open.

17.- Damos clic derecho sobre la tabla en la que crearemos el filtro > Adjuntar > Query.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

180

18.- Lo que haremos a las siguientes 2 pantallas es simplemente darles clic en siguiente.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

181

19.- Luego tendremos esto y lo que haremos es agregar otra tabla para relacionarla con la actual, para esto damos clic derecho en la parte blanca al lado de la tabla y en las opciones que se despliegan seleccionamos Adjuntar Tabla.

20.- Ya que nuestra Base de Datos solo posee 2 tablas solo podremos escoger 1, que es la tabla TGenero que es la que no tenemos puesta, la seleccionamos y damos clic en Adjuntar y luego en Cerrar.

21.- Como vemos a continuacin ya nos aparece la tabla que agregamos relacionada con la primera que teniamos, esto es debido a que ya desde que las creamos hicimos esta relacin; lo que sigue el como se ve en la imagen poner en la parte del medio o directamente en el query que necesitamos de la tabla TGenero el campo nombre_genero y que este nos servir como filtro, por eso colocamos en la parte de filtro la palabra =@nombre_genero adems debemos de sacar este campo de rea Select, ya que si lo dejamos ah no nos mostrar datos en nuestro reporte, o por lo menos eso es lo que me ha sucedido en la prctica, porque si lo ejecutamos en ese instante con el botn Execue Query si funciona normalmente pero con el Crystal Report encontre esa falla.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

182

22.- Ya al haberle dado clic en OK debe de presentarnos la siguiente imagen en la cual veremos ya hecha nuestra sentencia query de consulta, damos clic en siguiente para continuar.

23.- Ahora le pondremos un nombre tanto en la parte donde dice Fill a DataTable como en Return a DataTable, damos clic en siguiente.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

183

24.- Lo que viene es que ejecutar lo que hicimos en el DataSet y guardar los cambios, solo le damos clic en Finalizar.

25.- Ahora en el cdigo modificaremos la lnea que hacia el filtro en la tabla TPersona, en mi caso la puse como comentario, y coloqu la que cree recin, pueden ver que despus del DataSet le pongo una coma y le envio un parmetro, esto es debido a que en mi query le puse el @nombre_genero, entonces por cada parmetro as que pongamos en el query que hicimos debemos enviarlo aqu es esa lnea despus del DataSet en el orden que nos lo pide la instruccin; en ese cdigo yo puse la opcin masculino directamente, si nosotros la colocaramos o escogieramos desde un textbox o un combobox este sera el que pondramos ah con su propiedad text.

26.- Ya lo que queda es ejecutar la aplicacin y podremos ver que solo nos filtrar los datos de las personas de gnero masculino.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

184

8.- Acceso a datos con ADO.NET en Visual Basic


8.1. Acercndonos a ADO.NET
En este mdulo, aprenderemos a trabajar con datos y fuentes de datos en Visual Basic ADO.NET es la tecnologa principal para conectarse a una base de datos, nos ofrece un alto nivel de abstraccin, ocultando los detalles de bajo nivel de la implementacin de la base de datos de un fabricante. En este tutorial, encontrar las cosas ms importantes que debe saber, para trabajar con fuentes de datos con Visual Basic. De esta manera, aprender en poco tiempo, a encontrarse cmodo en el entorno de clases de ADO.NET y podr as, sacar el mximo provecho a sus desarrollos. Las partes que forman parte de este mdulo son las siguientes: ADO.NET ha sufrido a lo largo de los ltimos aos diferentes mejoras y actualizaciones, desde que .NET apareci.El resumen de las diferentes versiones de ADO.NET podra quedar de la siguiente forma. ADO.NET 1.0 apareci con Microsoft .NET Framework 1.0. Posteriormente, ADO.NET 1.1 sufri una pequeas y casi inapreciables actualizaciones con la aparicin de Microsoft .NET Framework 1.1. En el caso del entorno Visual Studio, ste trabaja con Microsoft .NET Framework 2.0 y por lo tanto, utiliza ADO.NET 2.0, el cul aade algunas caractersticas nuevas adicionales. En nuestro caso, nos centraremos nica y exclusivamente en ADO.NET como modelo de objetos de acceso a datos para la plataforma .NET de Microsoft, ya que es el mismo para cualquier tipo de versin de ADO.NET.

Qu es ADO.NET?
ADO.NET es la tecnologa principal para conectarse aun gestor de bases de datos, con un alto nivel de abstraccin, lo que nos permite olvidarnos de los detalles de bajo nivel de las bases de datos. Adems ADO.NET es una tecnologa inter operativa. Aparte del almacenamiento y recuperacin de datos, ADO.NET introduce la posibilidad de integrarse con el estndar XML, los datos pueden 'Serializarse' directamente a y desde XML lo que favorece el intercambio de informacin. ADO.NET proporciona diferentes clases del nombre de espacio System.Data dentro de las cules, destacaremos por encima de todas, la clase DataView, la clase DataSet y la clase DataTable. Este conjunto de clases de carcter armnico, funcionan de igual forma con la capa inferior que es la que corresponde a los proveedores de acceso a datos con los que podemos trabajar. Esto facilita el trabajo en n-capas y la posible migracin de aplicaciones que utilicen una determinada fuente de datos y deseemos en un momento dado, hacer uso de otra fuente de datos.

Qu capas o qu partes hay dentro de ADO.NET?

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

185

Dentro de ADO.NET tenemos dos partes importantes. La primera de ellas es la que corresponde con el nombre de espacio System.Data y que constituye los objetos y clases globales de ADO.NET. La otra parte es la que corresponde con los objetos que permiten el acceso a datos a una determinada fuente de datos desde ADO.NET y que utilizan as mismo, las clases del nombre de espacio System.Data. Esta ltima parte, queda constituida por las clases y objetos de los diferentes proveedores de acceso a datos como se muestra en la figura 1.

Visin general de las clases de ADO.NET


Para resumir de alguna forma lo que estamos comentando, diremos que el trabajo de conexin con la base de datos, la ejecucin de una instruccin SQL determinada, una vista, etc., la realiza el proveedor de acceso a datos. Recuperar esos datos para tratarlos, manipularlos o volcarlos a un determinado control o dispositivo, es accin de la capa superior que corresponde con el nombre de espacio System.Data. A continuacin veremos todo esto con ms detalle y comprenderemos de una forma ms clara cada una de las partes que componen el modelo de trabajo con ADO.NET.

Qu nos permite realmente ADO.NET cuando trabajamos con XML?


El entorno de Microsoft .NET Framework nos proporciona el trabajo con estndares y con ello, la posibilidad de trabajar con diferentes tipos de aplicaciones, entornos, sistemas operativos y lenguajes sin necesidad de conocer lo que hay al otro lado de nuestra aplicacin. XML es sin lugar a dudas, el lenguaje de etiquetas por excelencia, vlido para llevar a cabo esta tarea sin tener un impacto relevante cuando trabajamos con diferentes soluciones en entornos dispares. Tanto la posibilidad de trabajar con Servicios Web XML como con documentos e informacin en XML, sobre todo al trabajar con fuentes de datos en ADO.NET, nos proporciona a los desarrolladores las posibilidades necesarias que nos permite hacer que la informacin con la que trabajamos, pueda ser tratada entre diferentes sistemas o entornos, sin que por ello nos

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

186 preocupemos de lo que hay al otro lado.

8.2. System.Data
Las clases del nombre de espacio System.Data son bastantes extensas y variadas. Quizs las clases ms importantes son la clase DataView, la clase DataSet y la clase DataTable.

La clase DataSet
El DataSet es una representacin de datos residente en memoria que proporciona una modelo de programacin relacional coherente independientemente del origen de datos que contiene. El DataSet contiene en s, un conjunto de datos que han sido volcados desde el proveedor de datos. Debemos tener en cuenta que cuando trabajamos con DataSets, el origen de datos no es lo ms importante, ya que ste, puede ser cualquier tipo de origen de datos. No tiene porqu ser una base de datos. Un DataSet contiene colecciones de DataTables y DataRelations. El DataTable contiene una tabla o tablas, mientras que la DataRelation contiene las relaciones entre las DataTables. Sin embargo, no es necesario especificar todo esto hasta el ltimo detalle como veremos ms adelante.

La clase DataView
Este objeto nos permite crear mltiples vistas de nuestros datos, adems de permitirnos presentar los datos. Es la clase que nos permite representar los datos de la clase DataTable, permitindonos editar, ordenar y filtrar, buscar y navegar por un conjunto de datos determinado.

La clase DataTable
Este objeto nos permite representar una determinada tabla en memoria, de modo que podamos interactuar con ella. A la hora de trabajar con este objeto, debemos tener en cuenta el nombre con el cul definamos una determinada tabla, ya que los objetos declarados en el DataTable es sensitivo a maysculas y minsculas.

Un pequeo ejemplo prctico


El siguiente ejemplo prctico, nos ensea a utilizar un DataSet y nos muestra cmo podemos acceder a los objetos que dependen de un DataSet para recuperar por ejemplo, los campos y propiedades de una determinada tabla o tablas.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

187

Imports System.Data Imports System.Data.SqlClient Imports System.Xml Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim Conexion As String = "server=.;uid=sa;password=VisualBasic;database=MSDNVideo" Dim MiTabla As DataTable Dim MiColumna As DataColumn Dim MiDataSet As New DataSet() Dim Comando As New SqlDataAdapter("SELECT * FROM ALQUILERES", Conexion) Comando.Fill(MiDataSet, "ALQUILERES") ' Recorremos las tablas For Each MiTabla In MiDataSet.Tables TextBox1.Text += "Tabla: " & MiTabla.TableName & vbCrLf ' Recorremos las Columnas de cada Tabla For Each MiColumna In MiTabla.Columns TextBox1.Text += MiColumna.ColumnName & vbTab & "(" & MiColumna.DataType.Name & ")" & & vbCrLf Next Next Comando = Nothing End Sub End Class
Nuestro ejemplo en ejecucin es el que se muestra en la figura 1.

Ejemplo en ejecucin del uso de DataSet, DataTable y DataColumn

8.3. Los proveedores de acceso a datos


Los proveedores de acceso a datos es la capa inferior de la parte correspondiente al

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

188 acceso de datos y es la responsable de establecer la comunicacin con las fuentes de datos. En este conjunto de nombres de espacio, encontraremos casi siempre las clases Connection, Command, DataAdapter y DataReader como las clases ms generales, las cuales nos permiten establecer la conexin con la fuente de datos.

Proveedores de acceso a datos de .NET Framework


Dentro del entorno .NET Framework, encontramos un nutrido conjunto de proveedores de acceso a datos. Estos son los siguientes: ODBC .NET Data Provider OLE DB .NET Data Provider Oracle Client .NET Data Provider SQL Server .NET Data Provider Estos proveedores de acceso a datos incluidos en Microsoft .NET Framework, los podemos encontrar en los nombres de espacio: System.Data.Odbc System.Data.OleDb System.Data.OracleClient System.Data.SqlClient El proveedor ODBC .NET permite conectar nuestras aplicaciones a fuentes de datos a travs de ODBC. El proveedor OLE DB .NET permite conectar nuestras aplicaciones a fuentes de datos a travs de OLE DB. El proveedor Oracle Client .NET es un proveedor de acceso a datos especialmente diseado para bases de datos Oracle. Por ltimo, el proveedor SQL Server .NET es un proveedor de acceso a datos nativo, que nos permite conectar nuestras aplicaciones a fuentes de datos Microsoft SQL Server 7 o posterior. Se trata de un proveedor especfico para bases de datos Microsoft SQL Server 7.0, Microsoft SQL Server 2000 y Microsoft SQL Server 2005; 2008

Nota: Siempre que pueda, utilice para acceder a fuentes de datos, un proveedor de acceso a datos nativo. Esto le permitir aumentar considerablemente el rendimiento a la hora de establecer la conexin con una determinada fuente de datos

Los proveedores de acceso a datos que distribuye Microsoft en ADO.NET y algunos desarrollados por otras empresas o terceros, contienen los mismos objetos, aunque los

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

189 nombres de stos, sus propiedades y mtodos, pueden ser diferentes. Ms adelante veremos algn ejemplo, y observar en la prctica cules son estas diferencias ms destacables.

Otros proveedores de acceso a datos


Si bien el proveedor de acceso a datos es el mecanismo a travs del cul podemos establecer una comunicacin nativa con una determinada fuente de datos, y dado que Microsoft proporciona los proveedores de acceso a datos ms corrientes, es cierto que no los proporciona todos, si bien, con OLE DB y ODBC, podemos acceder a la inmensa totalidad de ellos. Sin embargo, hay muchos motores de bases de datos de igual importancia como Oracle, MySql, AS/400, etc. En estos casos, si queremos utilizar un proveedor de acceso a datos nativo, deberemos acudir al fabricante o a empresas o iniciativas particulares para que nos proporcionen el conjunto de clases necesarias que nos permitan abordar esta accin.

El objeto Connection
Este objeto es el encargado de establecer una conexin fsica con una base de datos determinada. Para establecer la conexin con una determinada fuente de datos, no slo debemos establecer la cadena de conexin correctamente, sino que adems deberemos usar los parmetros de conexin y el proveedor de acceso a datos adecuado. Con este objeto, podremos adems abrir y cerrar una conexin.

El objeto Command
Este objeto es el que representa una determinada sentencia SQL o un Stored Procedure. Aunque no es obligatorio su uso, en caso de necesitarlo, lo utilizaremos conjuntamente con el objeto DataAdapter que es el encargado de ejecutar la instruccin indicada.

El objeto DataAdapter
Este objeto es quizs el objeto ms complejo y a la vez complicado de todos los que forman parte de un proveedor de acceso a datos en .NET. Cuando deseamos establecer una comunicacin entre una fuente de datos y un DataSet, utilizamos como intermediario a un objeto DataAdapter. A su vez, un DataAdapter contiene 4 objetos que debemos conocer: SelectCommand es el objeto encargado de realizar los trabajos de seleccin de datos con una fuente de datos dada. En s, es el que se encarga de devolver y rellenar los datos de una fuente deb datos a un DataSet. DeleteCommand es el objeto encargado de realizar las acciones de borrado de datos. InsertCommand es el objeto encargado de realizar las acciones de insercin de datos. UpdateCommand es el objeto encargado de realizar las acciones de actualizacin de datos. Los objetos DeleteCommand, InsertCommand y UpdateCommand son los objetos que se

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

190 utilizan para manipular y transmitir datos de una fuente de datos determinada, al contrario del objeto SelectCommand que tan slo interacta con la fuente de datos para recuperar una porcin o todos los datos indicados en el objeto Command anteriormente comentado.

El objeto DataReader
Este objeto es el utilizado en una sola direccin de datos. Se trata de un objeto de acceso a datos muy rpido. Este objeto puede usar a su vez el objeto Command o el mtodo ExecuteReader.

8.4.- El concepto DataBinding


DataBinding es una expresin de enlace a datos. Como veremos a continuacin es una forma rpida y sencilla de manejar la fuentes de datos mediante su enlace con controles o clases..

El uso de DataBind
El mtodo DataBind se utiliza para rellenar de datos un determinado control o clase. Muchos controles y clases, posee este mtodo al que le asignaremos un conjunto de datos para que se rellene con ellos, pudiendo despus interactuar con los datos de forma directa. En s, un DataBinding es un enlace a datos que se encarga de rellenar de datos a un determinado control o clase. Como ejemplo de esto, veremos como rellenar un control TextBox con un dato utilizando este mtodo. Iniciaremos una nueva aplicacin Windows y escribiremos el siguiente cdigo fuente:

Imports System.Data Imports System.Data.SqlClient Imports System.Xml Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim Conexion As String = "server=.;uid=sa;password=VisualBasic;database=MSDNVideo" Dim MiDataSet As New DataSet() Dim Comando As New SqlDataAdapter("SELECT TITULO FROM ALQUILERES, PELICULAS WHERE PELICULACODBARRAS = CODBARRAS AND SOCIONIF = '111111'", Conexion) ' Rellenamos el DataSet con el contenido de la sentencia SELECT Comando.Fill(MiDataSet, "PELIS") ' Rellenamos el control TextBox1 con el dato correspondiente a la primera fila ' de la sentencia SELECT ejecutada TextBox1.DataBindings.Add("Text", MiDataSet,"PELIS.TITULO") Comando = Nothing End Sub End Class
Nuestro ejemplo en ejecucin es el que se muestra en la figura.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

191

Ejemplo en ejecucin del uso de DataBinding

8.5.- Otras consideraciones


Dentro de las conexiones a fuentes de datos, hay algunas partes de stas que permanecen a veces en el olvido y su importancia sin embargo, es bastante grande. La accin ms pesada cuando realizamos un acceso a una fuente de datos, se encuentra en la conexin con la fuente de datos. Esa tarea, simple tarea, es la que ms recursos del sistema consume cuando Accedemos a fuentes de datos. Esto lo debemos tener en cuenta, y por lo tanto, variante de esto que comentamos son las siguientes premisas: La conexin debe realizarse siempre que se pueda, con los proveedores de acceso a datos nativos, que por lo general salvo raras excepciones, sern ms rpidos que los accesos a fuentes de datos a travs de proveedores del tipo OLE DB y ODBC. La conexin con la fuente de datos (apertura de la conexin), debe realizarse lo ms tarde posible. Es recomendable definir todas las variables que podamos, antes de realizar la conexin. La conexin debe cerrarse lo antes posible, siempre y cuando no tengamos la necesidad de utilizar la conexin previamente abierta. Hay ms particularidades a tener en cuenta cuando trabajamos con fuentes de datos. El hecho de que con un DataSet podamos trabajar con datos desconectados, no significa que dentro de l, podamos abrir una tabla con una cantidad de registros enormes, y trabajemos sobre ella creyendo que esto nos beneficiar. Todo lo contrario.

8.6.- El paradigma de la conexin


Cuando abordamos un proyecto de acceso a fuentes de datos, siempre nos encontramos con una duda existencial. Debemos crear una conexin con la base de datos al principio de nuestra aplicacin y cerrarla cuando la aplicacin se cierre?, o debemos crear una conexin con la base de datos slo cuando vayamos a trabajar con la fuente de datos?. Y si estamos trabajando continuamente con una fuente de datos?, cmo penalizaran todas estas acciones?. Es difcil de asumir que accin tomar en cada caso, y es que dependiendo de lo que vayamos a realizar, a veces es ms efectiva una accin que otra, y en otras ocasiones, no est del todo claro, ya que no existe en s una regla clara que especifique qu accin tomar en un momento MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

192 dado. Lo que s est claro es que el modelo de datos de ADO.NET que hemos visto, quedara resumido en cuanto a la conectividad de la manera en la que se representa en la figura

Visin general de ADO.NET respecto a la conectividad con bases de datos


El objeto DataSet nos ofrece la posibilidad de almacenar datos, tablas y bases de datos de una determinada fuente de datos. De esta manera, podemos trabajar con las aplicaciones estando desconectados de la fuente de datos. Sin embargo, a veces necesitamos trabajar con la fuente de datos estando conectados a ella. El objeto DataReader nos ofrece precisamente la posibilidad de trabajar con fuentes de datos conectadas. Por otro lado, el objeto DataReader tiene algunas particularidades que conviene conocer y que veremos a continuacin.

8.7.- Conociendo el objeto DataReader


El objeto DataReader nos permite como hemos indicado anteriormente, establecer una conexin con una fuente de datos y trabajar con esta fuente de datos sin desconectarnos de ella, sin embargo, hay diferentes cualidades y particularidades que conviene conocer.

DataReader es de solo lectura


Lo que hemos dicho anteriormente, requiere sin embargo, que esta conexin se establezca en un modo de slo lectura, al contrario de lo que se puede hacer con el objeto DataSet, con el que podemos interactuar con la fuente de datos en modo lectura y modo escritura.

DataReader se maneja en una sola direccin


El objeto DataReader slo permite que nos desplacemos por los datos en una sola direccin, sin vuelta atrs. Por el contrario, el objeto DataSet nos permite movernos por los registros para adelante y para atrs. Adems, slo podemos utilizar el objeto DataReader con conexiones establecidas en una sentencia SQL por ejemplo, pero no podemos variar esta. Para hacerlo, debemos entonces

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

193 modificar la conexin con el comando establecido.

DataReader es rpido
Debido a su naturaleza y caractersticas, este objeto es bastante rpido a la hora de trabajar con datos. Como es lgico, consume adems menos memoria y recursos que un objeto DataSet por ejemplo. Sin embargo, dependiendo de las necesidades con las que nos encontremos, puede que este mtodo de acceso y trabajo no sea el ms idneo.

Analizando el flujo de trabajo de DataReader


Cuando trabajamos con fuentes de datos conectadas, trabajaremos con el objeto DataReader. Para trabajar con este objeto, utilizaremos los objetos siguientes del proveedor de acceso a datos: Connection Command DataReader Un resumen grfico de esto es lo que podemos ver en la figura 1.

El flujo de conectividad de DataReader

8.8.- Un primer contacto con el objeto DataReader


A continuacin veremos un ejemplo sencillo sobre la forma de trabajar con DataReader

Un ejemplo simple para entenderlo mejor


Tenga en cuenta que en el siguiente ejemplo nos conectaremos a Microsoft SQL Server y recorreremos los registros uno a uno en un ambiente conectado y volcaremos estos registros en un control TextBox.

Imports System.Data

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

194

Imports System.Data.SqlClient Imports System.Xml Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim Conexion As String = "server=.;uid=sa;password=VisualBasic;database=MSDNVideo" Dim MiConexion As New SqlConnection(Conexion) Dim MiDataReader As SqlDataReader Dim Comando As New SqlCommand("SELECT TITULO FROM ALQUILERES, PELICULAS WHERE PELICULACODBARRAS = CODBARRAS AND SOCIONIF = '111111'", MiConexion) MiConexion.Open() MiDataReader = Comando.ExecuteReader() While MiDataReader.Read() TextBox1.Text += MiDataReader("TITULO") & vbCrLf End While Comando = Nothing MiConexion.Close() End Sub End Class
El cdigo de ejemplo en ejecucin es el que se muestra en la figura 1.

Ejemplo en ejecucin del uso simple de DataReader


Este es un ejemplo simple del uso de DataReader.

Sin embargo, el objeto DataReader contiene un conjunto de propiedades y mtodos que nos proporcionan acciones determinadas. Por ejemplo, en el ejemplo anterior, hemos dado por hecho que la ejecucin de la instruccin Select nos devolver uno o ms valores, pero podramos tambin saber antes de manipular y trabajar con los posibles datos, si hay o no informacin. Esto lo conseguimos con el mtodo HasRows.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

195

8.9.- Trabaja DataReader en un ambiente conectado realmente?


Pese a todo esto, que ocurre si trabajando en un ambiente conectado se desconecta el servidor de acceso a datos?. Imaginemos por un instante, que la conexin con SQL Server se establece correctamente y que en un momento dado se detiene el servicio del servidor de base de datos. Esto es lo que veremos en el siguiente ejemplo.

Desenchufando la fuente de datos usando DataReader


Inicie un nuevo proyecto, inserte en el formulario de la aplicacin un control TextBox y un control Button, y escriba el cdigo que se detalla a continuacin:

Imports System.Data Imports System.Data.SqlClient Imports System.Xml Public Class Form1 Private Conexion As String = "server=.;uid=sa;password=VisualBasic;database=MSDNVideo" Private strSQL As String = "SELECT TITULO FROM ALQUILERES, PELICULAS WHERE PELICULACODBARRAS = CODBARRAS AND SOCIONIF = '111111'" Private MiConexion As New SqlConnection(Conexion) Private MiDataReader As SqlDataReader Private Contador As Long = 0 Private Posicion As Long = 0 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Establecemos la Conexin con la base de datos Establecer_Conexion(True) ' Si hay datos los mostramos, sino deshabilitamos la opcin (botn) para recorrerlos If Not MiDataReader.HasRows Then Button1.Enabled = False Else Button1_Click(sender, e) End If End Sub Private Sub Establecer_Conexion(ByVal bolAccion As Boolean) Dim Comando As SqlCommand If bolAccion Then ' True => Establecemos la conexin Comando = New SqlCommand(strSQL, MiConexion) ' Abrimos la Conexin MiConexion.Open() ' Ejecutamos la sentencia SQL MiDataReader = Comando.ExecuteReader() ' Obtenemos la cantidad de registros obtenidos Contador = MiDataReader.VisibleFieldCount() + 1
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

196

Else ' False => Finalizamos la conexin Button1.Enabled = False ' Cerramos la Conexin Comando = Nothing MiConexion.Close() End If End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' Recorremos los registros y los mostramos Posicion += 1 MiDataReader.Read() TextBox1.Text = MiDataReader("TITULO") ' Si hemos recorrido el objeto por completo, finalizamos la Conexin y ' deshabilitamos el control Button que nos permite recuperar los registros If Posicion = Contador Then Establecer_Conexion(False) End If End Sub End Class
Suponiendo que tenemos en nuestra base de datos varios registros, ejecute la aplicacin. Si todo ha ido como se esperaba, observaremos que nuestra aplicacin tiene un aspecto como el que se muestra en la figura

. Ejemplo en ejecucin del uso de DataReader en un ambiente conectado, forzando la desconexin de la fuente de datos
En este punto, detenga el servicio de SQL Server y pulse el botn Siguiente >>. Observar que la aplicacin sigue funcionando. En este punto se har la pregunta que todos nos hemos hecho, no es el objeto DataReader un objeto conectado?, cmo es posible que funcione si hemos detenido el servicio de SQL Server?. La respuesta es sencilla. El objeto DataReader recupera un nutrido conjunto de valores llenando un pequeo buffer de datos e informacin.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

197 Si el nmero de registros que hay en el buffer se acaban, el objeto DataReader regresar a la fuente de datos para recuperar ms registros. Si el servicio de SQL Server est detenido en ese momento o en su caso, la fuente de datos est parada, la aplicacin generar un error a la hora de leer el siguiente registro. En s, DataReader es un objeto conectado, pero trabaja en background con un conjunto de datos, por lo que a veces nos puede resultar chocante su comportamiento como el ejemplo que comento.

8.10.- Usando DataSource con DataReader


Podemos usar el mtodo DataSource con el objeto DataReader?.

Demostracin del uso de DataSource con DataReader


La respuesta es s, en ADO.NET 2.0, se ha incorporado un nuevo mtodo al objeto DataTable que le permite tener mayor independencia respecto al modo en el que nos conectemos y recuperemos datos de una fuente de datos. Recuerde que podemos recuperar datos en modo conectado DataReader o en modo desconectado DataSet. Este mtodo que se ha incorporado a ADO.NET y que tiene por nombre Load, nos permite cargar un DataReader para volcarlo a continuacin dentro de un control como por ejemplo el control DataGridView. Lo mejor es que veamos como funciona esto con un ejemplo que nos ayude a comprender mejor la teora. Inserte en un formulario un control DataGridView y escriba el siguiente cdigo:

Imports System.Data Imports System.Data.SqlClient Imports System.Xml Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Declaramos las variables a utilizar Dim Conexion As String = "server=.;uid=sa;password=VisualBasic;database=MSDNVideo" Dim strSQL As String = "SELECT TITULO FROM ALQUILERES, PELICULAS WHERE PELICULACODBARRAS = CODBARRAS AND SOCIONIF = '111111'" Dim MiConexion As New SqlConnection(Conexion) Dim MiDataReader As SqlDataReader Dim MiDataTable As New DataTable Dim Comando As SqlCommand ' Establecemos la Conexin con la base de datos Comando = New SqlCommand(strSQL, MiConexion) ' Abrimos la Conexin MiConexion.Open() ' Ejecutamos la sentencia SQL MiDataReader = Comando.ExecuteReader()

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

198

' Cargamos los resultados en el objeto DataTable MiDataTable.Load(MiDataReader, LoadOption.OverwriteChanges) ' Volcamos los datos en el control DataGridView DataGridView1.DataSource = MiDataTable ' Cerramos la Conexin Comando = Nothing MiConexion.Close() End Sub End Class
Nuestro ejemplo en ejecucin es el que podemos ver en la figura

Ejemplo en ejecucin del uso de DataReader y DataSource en un control DataGridView


Con todo y con esto, lo que realmente es curioso, es que hemos olvidado por un instante que el objeto DataReader es un objeto de slo lectura que funciona en una nica direccin, hacia delante. Qu significa esto o como puede influir o como podemos aprovechar esta circunstancia en nuestros desarrollos?.

Carga segmentada de datos con DataSource y DataReader


Si recuperamos los datos de una fuente de datos con DataReader y leemos algunos de sus datos y posteriormente, ejecutamos el mtodo DataSource, el resto de datos, aquellos datos que quedan en el DataReader, sern los que se vuelquen en el control que definamos como destino de los datos. Imaginemos el ejemplo anterior, y el siguiente cdigo fuente.

Imports System.Data Imports System.Data.SqlClient Imports System.Xml Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Declaramos las variables a utilizar Dim Conexion As String =

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

199

"server=.;uid=sa;password=VisualBasic;database=MSDNVideo" Dim strSQL As String = "SELECT TITULO FROM ALQUILERES, PELICULAS WHERE PELICULACODBARRAS = CODBARRAS AND SOCIONIF = '111111'" Dim MiConexion As New SqlConnection(Conexion) Dim MiDataReader As SqlDataReader Dim MiDataTable As New DataTable Dim Comando As SqlCommand ' Establecemos la Conexin con la base de datos Comando = New SqlCommand(strSQL, MiConexion) ' Abrimos la Conexin MiConexion.Open() ' Ejecutamos la sentencia SQL MiDataReader = Comando.ExecuteReader() ' Leemos el primer registro y as nos posicionamos a partir del segundo de ellos MiDataReader.Read() ' Cargamos los resultados en el objeto DataTable MiDataTable.Load(MiDataReader, LoadOption.OverwriteChanges) ' Volcamos los datos en el control DataGridView DataGridView1.DataSource = MiDataTable ' Cerramos la Conexin Comando = Nothing MiConexion.Close() End Sub End Class
En este caso, lo que ocurre como ya hemos comentado, es que los datos que se cargan son los que an no han sido ledos en el objeto DataReader, por lo que se mostrarn todos los datos desde el ltimo ledo hasta llegar al final del objeto.

8.11.- Usando los componentes de acceso a datos de .NET


Los componentes del entorno .NET nos proporcionan las caractersticas necesarias para poder acceder a fuentes de datos de forma rpida y sencilla. El mejor ejemplo de esto que comento es el que veremos a continuacin.

Demostracin del uso de BindingSource y BindingNavigator


Para ello, crearemos un proyecto nuevo e insertaremos un control BindingSource y un control BindingNavigator dentro del formulario. Tambin insertaremos un control TextBox al formulario, dnde presentaremos la informacin sobre la que navegaremos. Nuestro formulario con los controles insertados en l, tendr un aspecto similar al que se presenta en la figura 1.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

200

Controles de navegacin y acceso a datos dispuestos en el formulario Figura 1


Una vez llegado a este punto, lo que tendremos que hacer a continuacin ser escribir el cdigo fuente necesario para poder representar los datos de la sentencia SQL en el control BingindNavigator, para que a su vez los presente en el control TextBox. A continuacin se indica el cdigo fuente de esta parte de demostracin de la aplicacin.

Imports System.Data Imports System.Data.SqlClient Imports System.Xml Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal eAs System.EventArgs) Handles MyBase.Load ' Declaramos las variables a utilizar Dim Conexion As String = "server=.;uid=sa;password=VisualBasic;database=MSDNVideo" Dim strSQL As String = "SELECT TITULO FROM ALQUILERES, PELICULAS WHERE PELICULACODBARRAS = CODBARRAS AND SOCIONIF = '111111'" Dim MiConexion As New SqlConnection(Conexion) Dim MiDataReader As SqlDataReader Dim MiDataTable As New DataTable Dim Comando As SqlCommand ' Establecemos la Conexin con la base de datos Comando = New SqlCommand(strSQL, MiConexion) ' Abrimos la Conexin MiConexion.Open() ' Ejecutamos la sentencia SQL MiDataReader = Comando.ExecuteReader() ' Cargamos los resultados en el objeto DataTable MiDataTable.Load(MiDataReader, LoadOption.OverwriteChanges) ' Volcamos los datos en el control TextBox BindingSource1.DataSource = MiDataTable BindingNavigator1.BindingSource = BindingSource1
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

201

TextBox1.DataBindings.Add(New Binding("Text", BindingSource1, "TITULO", True)) ' Cerramos la Conexin Comando = Nothing MiConexion.Close() End Sub End Class

8.12.- Esquema general de la estructura desconectada de acceso a datos


En los captulos anteriores de este mdulo, hemos visto ya el uso de la clase DataSet. Incluso lo hemos visto con algn ejemplo. La clase DataSet est pensada y diseada para trabajar con fuentes de datos desconectadas. Indudablemente, en este punto, debemos tener clara la estructura general de cmo funciona el acceso desconectado con fuentes de datos. En la figura, podemos observar el diagrama general de esta parte

Estructura general del uso de DataSet en el acceso desconectado a datos

Connection, DataAdapter y DataSet


Como podemos observar en la figura 1, para comunicarnos con una fuente de datos, siempre deberemos establecer una conexin, independientemente de si la conexin con la fuente de datos va a permanecer a lo largo del tiempo o no. El objeto Connection nos permite por lo tanto, establecer la conexin con la fuente de datos. El objeto DataSet nos permite por otro lado, recoger los datos de la fuente de datos y mandrselos a la aplicacin. Entre medias de estos dos objetos, encontramos el objeto DataAdapter que hace las funciones de puente o nexo de unin entre la conexin y el objeto DataSet. Esto es lo que veremos a continuacin, como funciona el objeto DataAdapter, y como encaja todo esto en el acceso a fuentes de datos desconectadas.

8.13.- Conociendo el objeto DataAdapter

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

202 El objeto DataAdapter forma parte del proveedor de acceso a datos, tal y como se muestra en la figura

Visin general de las clases de ADO.NET


Cada proveedor de acceso a datos posee su propio objeto DataAdapter. Cuando realizamos alguna modificacin o accin sobre la fuente de datos, utilizaremos siempre el objeto DataAdapter a caballo entre el objeto DataSet y la fuente de datos establecida a travs de la conexin con el objeto Connection.Con el objeto DataAdapter, podremos adems realizar diferentes acciones sobre nuestras bases de datos, acciones como la ejecucin general de sentencias de SQL no slo para seleccionar un conjunto de datos, sino para alterar el contenido de una base de datos o de sus tablas.

Connection, DataAdapter y DataSet


Antes de entrar en materia ms profundamente, diremos que en lo que respecta a los proveedores de acceso a datos que vienen integrados con .NET, encontramos dos formas de usar un DataAdapter. La primera de ellas es utilizando los componentes del proveedor de acceso a datos. La segunda de ellas es utilizando las clases del nombre de espacio del proveedor de acceso a datos. La mejor forma de entender todo esto que comentamos, es trabajando con un ejemplo prctico que nos ensee a usar el objeto DataAdapter en Visual Studio

Utilizando las clases de .NET


En este primer ejemplo de demostracin del uso de DataAdapter a travs de cdigo usando para ello las clases de .NET, estableceremos una conexin con SQL Server y mostraremos los datos recogidos en un control TextBox. niciaremos Visual Studio 2005 y seleccionaremos un proyecto de formulario de Windows. Dentro del formulario, insertaremos un control TextBox y aadiremos dos referencias al proyecto. Las referencias aadidas sern a las libreras System.Data y System.XML, como se muestra en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

203

Referencias a las clases de acceso a datos de .NET


Una vez que hemos aadido las referencias necesarias para utilizar las clases que queremos en nuestro proyecto, iremos al cdigo y escribiremos las siguientes instrucciones:

Imports System.Data Imports System.Data.SqlClient Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Establecemos la cadena de conexin con la BBDD Dim Conexion As String = "server=.;uid=sa;password=VisualBasic;database=MSDNVideo" ' Declaramos el DataSet dnde volcaremos los datos Dim MiDataSet As New DataSet() ' Declaramos el DataAdapter estableciendo ' la conexin con la fuente de datos SQL Dim Comando As New SqlDataAdapter("SELECT SocioNIF, FechaAlquiler FROM ALQUILERES", Conexion) ' Rellenamos el DataSet con el contenido de la instruccin Comando.Fill(MiDataSet) ' Cerramos la conexin con la BBDD Comando = Nothing ' Declaramos la propiedad Row para recorrer ' las filas contenidas en el DataSet Dim Row ' Recorremos todas las filas y las tratamos For Each Row In MiDataSet.Tables(0).Rows TextBox1.Text += Row("SocioNIF").ToString & vbTab &

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

204

Row("FechaAlquiler") & vbCrLf Next ' Vaciamos el DataSet para liberar memoria MiDataSet = Nothing End Sub End Class
El ejemplo en ejecucin del uso de DataAdapter junto con las clases de .NET es el que se muestra en la figura

Ejemplo del acceso a datos con DataAdapter a travs de las clases de .NET

Utilizando los componentes de .NET


Sin embargo y como ya hemos comentado, existe otro mtodo de acceso a fuentes de datos diferente a las clases de .NET, el acceso a travs de componentes que nos faciliten esa tarea. Sin embargo, los componentes de acceso a datos, utilizan por detrs las clases de .NET que hemos visto, lo que ocurre, es que simplifica enormemente el trabajo y ahorra tiempo a la hora de desarrollar aplicaciones. De todos los modos, todo depende de la utilidad o necesidades con las que nos encontremos en un momento dado. Iniciaremos un proyecto Windows nuevamente, e insertaremos en l un control TextBox como hicimos en el caso anterior. A continuacin, aadiremos los componentes de acceso a fuentes de datos SQL Server que es la fuente de datos origen. Como hemos visto, para conectar a fuentes de datos SQL Server, hemos utilizado el nombre de espacio System.Data y hemos importado en el proyecto los nombres de espacio System.Data y System.Data.SqlClient. Los componentes .NET de acceso a fuentes de datos de SQL Server, se identifican por el nombre Sqlxxx, siendo xxx el tipo de componente a utilizar. Para poder utilizarlos, deberemos aadirlo a la barra de herramientas. Para aadir los componentes a nuestro proyecto, haremos soble clic sobre el formulario y posteriormente haremos clic con el botn secundario del mouse sobre la barra de herramientas y seleccionaremos la opcin Elegir elementos... como se muestra en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

205

Opcin de la barra de herramientas para aadir componentes al entorno


Una vez que hemos hecho esto, seleccionaremos los componentes SqlCommand, SqlCommandBuilder, SqlConnection, SqlDataAdapter y SqlDataSource, tal y como se muestra en la figura

Componentes a aadir al entorno


Una vez que hemos aadido los componentes al entorno, estos quedarn dispuestos dentro de la barra de herramientas como se indica en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

206

Componentes aadidos en la barra de herramientas


Lo primero que haremos ser insertar un componente SqlConnection dentro del formulario. Acudiremos a la ventana de propiedades del componente y modificaremos la propiedad ConnectionString dentro de la cul escribiremos la instruccin:

server=.;uid=sa;password=VisualBasic;database=MSDNVideo
Entendiendo que sta, es la cadena de conexin vlida con nuestra base de datos. A continuacin aadiremos el componente SqlDataAdapter a nuestro formulario. Si se abre alguna ventana, cirrela. Vamos a configurar el control con la ventana Propiedades. Podramos haberlo hecho desde el asistente que se nos ha abierto, pero lo vamos a hacer de otra forma menos sencilla. Sitese sobre la propiedad SelectCommand, y dentro de sta, en la propiedad Connection. Lo que vamos a hacer, es asignar al componente SqlDataAdapter el componente de conexin que vamos a usar para establecer la comunicacin entre la fuente de datos y nuestra aplicacin. Despliegue la propiedad Connection indicada, y seleccione el componente de conexin SqlConnection1 anteriormente configurado, tal y como se muestra en la figura.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

207

Componente SqlDataAdapter con la conexin establecida para ser usada en la ejecucin de nuestra aplicacin
Por ltimo, inserte un componente DataSet al formulario. Todos los componentes quedarn por lo tanto insertados, tal y como se indica en la figura

Componentes aadidos en el formulario de nuestra aplicacin


Una vez que tenemos todo preparado, tan slo nos queda escribir la parte de cdigo fuente necesario para poder realizar todas las operaciones y acciones que necesitamos. A continuacin, se expone el cdigo fuente de nuestra aplicacin de demostracin: Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Establecemos la cadena SQL a utilizar SqlDataAdapter1.SelectCommand.CommandText = "SELECT
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

208

SocioNIF, FechaAlquiler FROM ALQUILERES" ' Abrimos la Conexin SqlConnection1.Open() ' Rellenamos el DataSet con el contenido de la instruccin SQL SqlDataAdapter1.Fill(DataSet1) ' Cerramos la Conexin SqlConnection1.Close() ' Declaramos la propiedad Row para recorrer las filas contenidas en el DataSet Dim Row ' Recorremos todas las filas y las tratamos For Each Row In DataSet1.Tables(0).Rows TextBox1.Text += Row("SocioNIF").ToString & vbTab & Row("FechaAlquiler") & vbCrLf Next End Sub End Class
Ahora nos queda nicamente ejecutar nuestra aplicacin para estudiar el resultado final. Este es el que se puede ver en la figura

Ejemplo en ejecucin del uso de componentes


Pese a todo lo que hemos visto, quizs se pregunte como es que en el caso del primer ejemplo que hemos visto y en el que hemos declarado el uso de un DataAdapter sin usar componentes, hemos tenido la obligatoriedad de aadir las referencias a los nombres de espacio System.Data y System.Xml, mientras que en este segundo ejemplo, no hemos hecho referencia a ellos. En realidad nosotros no hemos hecho referencia a ellos, pero al insertar los componentes dentro del formulario, el entorno Visual Studio 2005 se ha encargado por nosotros de aadir esas referencias al proyecto, tal y como puede verse en la figura.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

209

Referencias aadidas automticamente al trabajar con componentes de acceso a datos

8.14.- Insertando datos a travs del objeto DataAdapter


Hasta ahora, todos los ejemplos que hemos visto del objeto DataAdapter, han sido ejemplos del uso de seleccin de datos, pero an no hemos visto como debemos trabajar cuando realicemos otras acciones sobre la fuente de datos. A continuacin, veremos como realizar acciones de actualizacin de datos, utilizando para ello el objeto DataAdapter.

Nota: El DataSet permanece desconectado de la fuente de datos y si realizamos una modificacin o alteracin de los datos de un DataSet, estos no son propagados a la fuente de datos. Para ello, el DataAdapter debe recibir la orden que queramos ejecutar.

Cmo se insertan datos con el objeto DataAdapter


Suponiendo que hemos recogido un conjunto de datos y que trabajando con el objeto DataSet hemos realizado una insercin de datos y que a continuacin, queremos propagar dicha insercin a la base de datos, deberemos hacer uso del mtodo Insert del objeto DataAdapter.

El objeto DataAdapter se encargar de llamar al comando apropiado para cada una de las filas

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

210 que han sido modificadas en un determinado DataSet. Esto lo realizar siempre a travs del mtodo Update.

Trabajando con un ejemplo


La mejor manera de ver esto es con un ejemplo que nos ayude a entender mejor como funciona la insercin de datos a travs del objeto DataAdapter. Tenga en cuenta adems, que la actualizacin y el borrado de datos funciona de la misma manera. Iniciaremos un nuevo proyecto de formulario Windows y en l insertamos los componentes SqlConnection, SqlDataAdapter, DataSet y SqlCommand. Para el componente SqlConnection, estableceremos la propiedad ConnectionString con el valor:

server=.;uid=sa;password=VisualBasic;database=MSDNVideo
A continuacin seleccionaremos el componente SqlDataAdapter y modificaremos la propiedad SelectCommand > Connection como vimos en el captulo anterior. De la lista de posibles conexiones que le aparezca, seleccione la conexin SqlConnection1. Finalmente, inserte un control Button y un control DataGridView en el formulario. ste quedar como se indica en la figura.

Formulario con los componentes y controles insertados en l Figura 1


Finalmente, escribiremos el cdigo necesario para ejecutar nuestra aplicacin tal y como queremos. Este es el que se detalla a continuacin:

Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Establecemos la cadena SQL a utilizar SqlDataAdapter1.SelectCommand.CommandText = "SELECT NIF, Nombre, Apellido1,

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

211

Apellido2, Telefono, Email, Direccion, Ciudad, Provincia, CP FROM SOCIOS" ' Abrimos la Conexin SqlConnection1.Open() ' Rellenamos el DataSet con el contenido de la instruccin sql SqlDataAdapter1.Fill(DataSet1, "Ejemplo") ' Cerramos la Conexin SqlConnection1.Close() ' Asociamos el control DataGridView al DataSet DataGridView1.DataSource = DataSet1.Tables("Ejemplo") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' Declaramos un objeto DataRow para insertar en l los nuevos datos Dim MiDataRow As Data.DataRow ' Creamos una nueva fila en el DataSet MiDataRow = DataSet1.Tables("Ejemplo").NewRow() ' Insertamos los datos en el DataSet MiDataRow("NIF") = "222222" MiDataRow("Nombre") = "Mara" MiDataRow("Apellido1") = "Jurez" MiDataRow("Apellido2") = "Fernndez" MiDataRow("Telefono") = "1112233" MiDataRow("Email") = "mara@cuentademail.com" MiDataRow("Direccion") = "C\ Fernndez de los Ros, 77" MiDataRow("Ciudad") = "Valladolid" MiDataRow("Provincia") = "Valladolid" MiDataRow("CP") = "11111" DataSet1.Tables("Ejemplo").Rows.Add(MiDataRow) ' Si el DataSet tiene cambios ? If DataSet1.HasChanges Then ' Indicamos la instruccin SQL correspondiente SqlCommand1.CommandText = "INSERT INTO SOCIOS(NIF, Nombre, Apellido1, Apellido2, Telefono, Email, Direccion, Ciudad, Provincia, CP) VALUES(@NIF, @Nombre, @Apellido1, @Apellido2, @Telefono, @Email, @Direccion, @Ciudad, @Provincia, @CP)" ' Establecemos para el comando, la (conexin) que utilizaremos SqlCommand1.Connection = SqlConnection1 ' Le indicamos al DataAdapter, cul es el comando de insercin que usaremos SqlDataAdapter1.InsertCommand = SqlCommand1 ' Aadimos los parmetros y comandos correspondientes ' para cada campo a aadir en la base de datos

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

212

SqlCommand1.Parameters.Add("@NIF", Data.SqlDbType.NChar, 10, "NIF") SqlCommand1.Parameters.Add("@Nombre", Data.SqlDbType.NVarChar, 50, "Nombre") SqlCommand1.Parameters.Add("@Apellido1", Data.SqlDbType.NVarChar, 50, "Apellido1") SqlCommand1.Parameters.Add("@Apellido2", Data.SqlDbType.NVarChar, 50, "Apellido2") SqlCommand1.Parameters.Add("@Telefono", Data.SqlDbType.NVarChar, 13, "Telefono") SqlCommand1.Parameters.Add("@Email", Data.SqlDbType.NVarChar, 50, "Email") sqlCommand1.Parameters.Add("@Direccion", Data.SqlDbType.NVarChar, 100, "Direccion") SqlCommand1.Parameters.Add("@Ciudad", Data.SqlDbType.NVarChar, 50, "Ciudad") SqlCommand1.Parameters.Add("@Provincia", Data.SqlDbType.NVarChar, 50, "Provincia") SqlCommand1.Parameters.Add("@CP", Data.SqlDbType.NChar, 5,"CP") ' Abrimos la conexin SqlConnection1.Open() ' Realizamos la insercin de datos desde el DataSet a travs del DataAdapter SqlDataAdapter1.Update(DataSet1, "Ejemplo") ' Cerramos la conexin SqlConnection1.Close() ' Indicamos con un mensaje que la insercin de datos se ha realizado con xito MessageBox.Show("Datos insertados correctamente") End If End Sub End Class
Por ltimo, ejecute la aplicacin. Si todo ha ido correctamente, los datos habrn quedado correctamente insertados en la base de datos. Un ejemplo de nuestra aplicacin en ejecucin es la que puede verse en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

213

Aplicacin de ejemplo de insercin de datos con DataAdapter y DataSet en ejecucin


Como vemos, el uso de DataAdapter en el caso de manipular datos, vara ligeramente. Sin embargo, no es mucho ms complicado con la actualizacin y borrado de datos. De hecho, la forma de actuar es la misma como veremos a continuacin.

8.15.- Actualizando datos a travs del objeto DataAdapter


De la misma manera que hemos insertado datos en nuestra base de datos, debemos hacer a la hora de actualizar los mismos. Sobre la base del ejemplo anterior (componentes y controles), escriba o modifique el siguiente cdigo:

Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Establecemos la cadena SQL a utilizar SqlDataAdapter1.SelectCommand.CommandText = "SELECT NIF, Nombre, Apellido1, Apellido2, Telefono, Email, Direccion, Ciudad, Provincia, CP FROM SOCIOS" ' Abrimos la Conexin SQL SqlConnection1.Open() SqlDataAdapter1.Fill(DataSet1, "Ejemplo") ' Cerramos la Conexin SqlConnection1.Close() ' Asociamos el control DataGridView al DataSet DataGridView1.DataSource = DataSet1.Tables("Ejemplo") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' En nuestro ejemplo, sabemos que queremos modificar ' la fila 2, columna 4 (todos los elementos empiezan por 0) DataSet1.Tables("Ejemplo").Rows(1)(4) = "1112234" ' Si el DataSet tiene cambios ?
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

214

If DataSet1.HasChanges Then ' Indicamos la instruccin SQL correspondiente SqlCommand1.CommandText = "UPDATE SOCIOS SET Telefono=@Telefono WHERE NIF=@NIF" ' Establecemos para el comando, la (conexin) que utilizaremos SqlCommand1.Connection = SqlConnection1 ' Le indicamos al DataAdapter, cul es el comando de actualizacin que usaremos SqlDataAdapter1.UpdateCommand = SqlCommand1 ' Aadimos los parmetros y comandos orrespondientes ' para cada campo a actualizar en la base de datos SqlCommand1.Parameters.Add("@NIF", Data.SqlDbType.NChar,10, "NIF") SqlCommand1.Parameters.Add("@Nombre", Data.SqlDbType.NVarChar, 50, "Nombre") SqlCommand1.Parameters.Add("@Apellido1", Data.SqlDbType.NVarChar, 50, "Apellido1") SqlCommand1.Parameters.Add("@Apellido2", Data.SqlDbType.NVarChar, 50, "Apellido2") SqlCommand1.Parameters.Add("@Telefono", Data.SqlDbType.NVarChar, 13, "Telefono") SqlCommand1.Parameters.Add("@Email", Data.SqlDbType.NVarChar, 50, "Email") SqlCommand1.Parameters.Add("@Direccion", Data.SqlDbType.NVarChar, 100, "Direccion") SqlCommand1.Parameters.Add("@Ciudad", Data.SqlDbType.NVarChar, 50, "Ciudad") SqlCommand1.Parameters.Add("@Provincia", Data.SqlDbType.NVarChar, 50, "Provincia") SqlCommand1.Parameters.Add("@CP", Data.SqlDbType.NChar, 5, "CP") ' Abrimos la conexin SqlConnection1.Open() ' Realizamos la actualizacin de datos desde el DataSet a travs del DataAdapter SqlDataAdapter1.Update(DataSet1, "Ejemplo") ' Cerramos la conexin SqlConnection1.Close() ' Indicamos con un mensaje que la actualizacin de datos se ha realizado con xito MessageBox.Show("Datos actualizados correctamente") End If End Sub End Class
Nuestro ejemplo en ejecucin es el que se puede ver en la figura 1.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

215

Aplicacin de ejemplo de actualizacin de datos con DataAdapter y DataSet

8.16.- Eliminando datos a travs del objeto DataAdapter

De igual forma sucede con la eliminacin de datos utilizando para ello el objeto DataAdapter junto al objeto DataSet. Utilizaremos nuevamente en este caso, la base del ejemplo anterior (componentes y controles), y escribiremos el siguiente cdigo:

Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Establecemos la cadena SQL a utilizar SqlDataAdapter1.SelectCommand.CommandText = "SELECT NIF,Nombre, Apellido1, Apellido2, Telefono, Email, Direccion, Ciudad,Provincia, CP FROM SOCIOS" ' Abrimos la Conexin SqlConnection1.Open() ' Rellenamos el DataSet con el contenido de la instruccin SQL SqlDataAdapter1.Fill(DataSet1, "Ejemplo") ' Cerramos la Conexin SqlConnection1.Close() ' Asociamos el control DataGridView al DataSet DataGridView1.DataSource = DataSet1.Tables("Ejemplo") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' En nuestro ejemplo, sabemos que queremos eliminar ' la fila 2 (todos los elementos empiezan por 0) por lo que la fila 2 es aqu la 1 DataSet1.Tables("Ejemplo").Rows(1).Delete()

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

216

' Si el DataSet tiene cambios ? If DataSet1.HasChanges Then ' Indicamos la instruccin SQL correspondiente SqlCommand1.CommandText = "DELETE SOCIOS WHERE NIF=@NIF" ' Establecemos para el comando, la (conexin) que utilizaremos SqlCommand1.Connection = SqlConnection1 ' Le indicamos al DataAdapter, cul es el comando de eliminacin que usaremos SqlDataAdapter1.DeleteCommand = SqlCommand1 ' Aadimos los parmetros y comandos correspondientes ' para cada campo a actualizar en la base de datos SqlCommand1.Parameters.Add("@NIF", Data.SqlDbType.NChar,10, "NIF") SqlCommand1.Parameters.Add("@Nombre", Data.SqlDbType.NVarChar, 50, "Nombre") SqlCommand1.Parameters.Add("@Apellido1", Data.SqlDbType.NVarChar, 50, "Apellido1") SqlCommand1.Parameters.Add("@Apellido2", Data.SqlDbType.NVarChar, 50, "Apellido2") SqlCommand1.Parameters.Add("@Telefono", Data.SqlDbType.NVarChar, 13, "Telefono") SqlCommand1.Parameters.Add("@Email", Data.SqlDbType.NVarChar, 50, "Email") SqlCommand1.Parameters.Add("@Direccion", Data.SqlDbType.NVarChar, 100, "Direccion") SqlCommand1.Parameters.Add("@Ciudad", Data.SqlDbType.NVarChar, 50, "Ciudad") SqlCommand1.Parameters.Add("@Provincia", Data.SqlDbType.NVarChar, 50, "Provincia") SqlCommand1.Parameters.Add("@CP", Data.SqlDbType.NChar, 5,"CP") ' Abrimos la conexin SqlConnection1.Open() ' Realizamos la eliminacin de datos desde el DataSet a travs del DataAdapter SqlDataAdapter1.Update(DataSet1, "Ejemplo") ' Cerramos la conexin SqlConnection1.Close() ' Indicamos con un mensaje que la eliminacin de datos se ha realizado con xito MessageBox.Show("Datos eliminados correctamente") End If End Sub End Class
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

217

Nuestro ejemplo en ejecucin es el que se puede ver en la figura .

Aplicacin de ejemplo de eliminacin de datos con DataAdapter y DataSet

8.17.- Qu son los datos Maestro Detalle?


El desarrollador de aplicaciones que debe trabajar con datos y fuentes de datos relacionadas entre s, encuentra con frecuencia problemas de desarrollo en aplicaciones con datos interrelacionados. Adems, este tipo de aplicaciones, consumen gran parte del tiempo de desarrollo y son por lo general, acciones repetitivas. Supongamos como ejemplo general, la tabla Socios de un videoclub. Adems, relacionemos los socios del videoclub, con una tabla Alquileres, para saber si un socio determinado tiene pelculas alquiladas, y en ese caso, saber cules. Este sencillo ejemplo, es un claro exponente de una aplicacin que relaciona datos maestro detalle. Ambas tablas deben estar relacionadas para recopilar la informacin que se necesite en un momento dado. Los datos maestros seran expuestos por los socios del videoclub, mientras que los datos detalle estaran relacionados con los datos de los alquileres de los socios. En nuestro caso, vamos a cambiar las palabras maestro y detalle por padre e hijo, y a partir de ahora, nos referiremos a padre como la tabla Socios, e hijo como la tabla Alquileres. De esta forma, ubicaremos sin problemas ambos conceptos dentro del entorno de Visual Studio 2008, ya que ste tiene alguna ligera connotacin que podra infundirnos a error como observar ms adelante. Por suerte, Visual Studio nos proporciona un conjunto de herramientas, que hace que realizar una aplicacin Windows con todas las caractersticas de una aplicacin maestro detalle, sea un autntico juego de nios, que nos llevar aproximadamente un minuto de nuestro tiempo como mucho. No me cree?. Contine el captulo, y se sorprender de lo que Visual Studio 2008 puede hacer por usted.

8.18.- Configurando la fuente de datos


Trabajar con fuentes de datos requiere como tarea inicial, que tengamos listo y preparado un

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

218 origen de fuentes de datos vlido. Para esta tarea, deberemos configurar la fuente de datos que vamos a utilizar, algo que vamos a aprender a hacer a continuacin.

Configurando el origen de la fuente de datos


Iniciaremos una nueva aplicacin Windows con Visual Studio y seleccionaremos el men Datos > Mostrar orgenes de datos como se indica en la figura

Men para mostrar los orgenes de datos


En este punto, aparecer una ventana como la que se muestra en la figura.

Ventana de orgenes de datos


Como podemos apreciar, la ventana no tiene por defecto ningn origen de datos asignado, adems, esta ventana inicialmente, no est anclada a ningn sitio del entorno. Para situarla en un lugar especfico del entorno, haga clic sobre la ventana y arrstrela sobre la parte en la que desee situarla, como se indica por ejemplo, en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

219

La ventana orgenes de datos podemos situarla dnde deseemos dentro de Visual Studio
En este punto, la ventana de orgenes de datos, quedar anclada en el entorno de desarrollo, como se muestra en la figura

La ventana orgenes de datos anclada en Visual Studio


Cada uno, puede situar esta ventana dnde considere oportuno. En mi caso la he situado entre las ventanas del Explorador de soluciones y de Propiedades, pero podemos situarla dnde consideremos oportuno. Sobre la configuracin del origen de datos, haga clic sobre la opcin Agregar nuevo origen de datos... como se indica en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

220

Opcin para agregar un nuevo origen de datos


Aparecer una ventana como la que se muestra en la figura 6 en la cul indicaremos el lugar de dnde la aplicacin obtendr los datos, y que en nuestro caso ser de una Base de datos.

Como tipo de origen de datos elegiremos una Base de datos


Una vez seleccionado la opcin de Base de datos como tipo de origen de datos, presionaremos el botn Siguiente. En la siguiente ventana, elegiremos la conexin de la base de datos que vamos a utilizar, o presionaremos sobre el botn Nueva conexin... sino tenemos seleccionada la conexin que queremos utilizar. En la figura podemos ver como hemos establecido la conexin con nuestra fuente de datos, que utilizaremos en nuestro ejemplo de creacin de la aplicacin de acceso a datos maestro detalle.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

221

Ventana dnde elegimos la conexin de datos


A continuacin, haremos clic en el botn Siguiente. En la nueva ventana que aparece ahora dentro del asistente para la creacin del origen de datos, indicaremos el nombre de la cadena de conexin que crearemos. En nuestro caso, no modificaremos el nombre de la cadena de conexin, dejndola por defecto como se muestra en la figura

Asignamos un nombre para el nombre de la cadena de conexin


A continuacin, haremos clic sobre el botn Siguiente. En este punto, el asistente se conecta a la base de datos para recuperar la informacin de la base de datos y mostrarla en la ventana del asistente como se muestra en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

222

Ventana con los objetos de la base de datos seleccionada


A continuacin, despliegue el objeto Tablas y seleccione las tablas Alquileres y Socios como se indica en la figura

Seleccin de los objetos de la base de datos seleccionada


Una vez que hemos seleccionado los objetos de la base de datos, haremos clic sobre el botn Finalizar para que el asistente concluya las opciones aadidas al asistente. La ventana del origen de datos, quedar ahora configurado de una forma similar a la que se presenta en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

223

Ventana de origen de datos con la configuracin aadida


A partir de aqu, deberemos preparar las tablas del origen de datos para que se comporten como autnticos datos e informaciones maestro detalle. Esto es lo que veremos en el siguiente mdulo.

8.19.- Preparando el origen de datos


Ya hemos aprendido a aadir nuestro origen de datos, y ahora aprenderemos a prepararlo para poder utilizarlo posteriormente en la aplicacin Windows. La preparacin del origen de datos, nos permitir seleccionar que tabla o datos queremos que acten como maestro y cuales como detalle, o dicho de otra forma, que datos queremos que sean padre y cuales hijo. Nuestro objetivo principal es mostrar la tabla Alquileres como tabla hijo y la tabla Socios como padre de la tabla anterior. Prepararemos e incrustaremos primero la tabla Socios dentro del formulario Windows como Detalle de la informacin, y posteriormente insertaremos la tabla Alquileres dentro del formulario. Por ltimo, asignaremos alguna relacin que permita trabajar con las dos tablas en nuestro formulario Windows sin perder la conexin entre ambas tablas y permitindonos acceder a la informacin que nos proporciona dicha relacin.

Preparando la tabla padre


Lo primero que haremos ser preparar la tabla padre para poderla aadir al formulario Windows. Por esa razn, haremos clic sobre la tabla Socios de la ventana de Orgenes de datos como se indica en la figura

Tabla Socios de la ventana de orgenes de datos

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

224 En la ventana de Orgenes de datos y en concreto con la tabla Socios desplegada, centraremos nuestra atencin en el campo NIF como se indica en la figura

Campo NIF de la tabla Socios


Pulse sobre la lista desplegable que aparece a la derecha del campo NIF y seleccione la opcin Label como se indica en la figura

Lista desplegable con la opcin Label seleccionada como campo de la tabla desplegada
En este caso, la ventana de Orgenes de datos quedar informada tal y como se indica en la figura

Campo NIF modificado en la ventana de Orgenes de datos


A continuacin, haremos clic sobre la tabla Socios como se indica en la figura, y posteriormente presionaremos sobre la lista desplegable que aparece a la derecha de la tabla.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

225

Tabla Socios seleccionada en la ventana de Orgenes de datos Si hacemos clic sobre la lista desplegable, aparecer una lista de opciones o posibilidades, para indicar cmo queremos que sean los campos de la tabla seleccionada con respecto a que tipo de controles queremos que sean. Esto es lo que se indica en la figura

Lista desplegable de la tabla Socios de la ventana de Orgenes de datos


Por defecto, una tabla queda determinada con un icono que representa el control DataGridView, aunque se puede modificar la representacin que deseamos tengan los datos dentro de un formulario seleccionando cualquiera de las opciones que tenemos de la lista desplegable. Estas opciones pueden ser cualquiera de las siguientes:

Representa los datos volcados dentro de un control DataGridView Representa los datos volcados dentro de controles estndar como TextBox u otros controles para reflejarla como Detalle de la informacin
No representa ningn control como tipo de control de volcado de datos En el caso de la tabla Socios que usaremos como tabla padre, cambiaremos la representacin por defecto de DataGridView para indicarle que nos represente la informacin en controles, tal y como se indica en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

226

Tabla Socios seleccionada en la ventana de Orgenes de datos como Detalle Ahora que tenemos la tabla maestra ya preparada, pasaremos a preparar la tabla hija.

Preparando la tabla hija


Ahora que ya tenemos preparada la tabla tabla padre, prepararemos la tabla hija de los alquileres de las pelculas de video, para poder usar su informacin dentro del formulario Windows. Por esa razn, haga clic sobre la tabla Alquileres de la ventana de Orgenes de datos como se indica en la figura

Tabla Alquileres de la ventana de orgenes de datos


Dentro de la ventana de Orgenes de datos y en concreto de la tabla Alquileres desplegada, centraremos nuestra atencin en el campo AlquilerID y SocioNIF como se indica en la figura

Campos AlquilerID y SocioNIF de la tabla Alquileres Sobre el campo AlquilerID y SocioNIF, haremos una pequea modificacin. Pulse sobre la lista desplegable que aparece a la derecha del campo AlquilerID y SocioNIF y seleccione la opcin Label como se indica en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

227

Lista desplegable de opciones de un campo de la tabla desplegada De esta manera, el campo AlquilerID y SocioNIF quedarn modificados en la ventana Orgenes de datos como se indica en la figura

Campo AlquilerID y SocioNIF modificados en la ventana de Orgenes de datos A continuacin, haremos clic sobre la tabla Alquileres como se indica en la figura, y posteriormente presionaremos sobre la lista desplegable que aparece a la derecha de la tabla.

Tabla Alquileres seleccionada en la ventana de Orgenes de datos


Nos aseguraremos que est seleccionada la opcin DataGridView que es la que aparece por defecto. Esto es lo que se indica en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

228

En la tabla Alquileres, nos aseguraremos de seleccionar la opcin DataGridView


Una vez que tenemos las tabla maestra y detalle preparadas para utilizarlas, las aadiremos al formulario Windows para que tengan el funcionamiento esperado.

8.20.- Incrustando los datos maestro detalle


Ya sabemos como crear un origen de datos, tambin sabemos como preparar los datos maestro y detalle, y por ltimo, lo que nos queda es insertar esos datos en el formulario, y relacionar todos sus datos para que funcionen de la forma esperada. A continuacin, veremos como llevar a cabo esta tarea y aprenderemos a hacerlo posible de forma muy rpida y sencilla.

Incrustando la tabla padre en el formulario


Nuestra primera accin, ser incrustar en el formulario los datos o tabla padre, que en nuestro caso es la formada por la tabla Socios. Para situar los datos de la tabla Socios dentro de un formulario y en concreto como una informacin de detalle, bastar con arrastrar y soltar la tabla Socios sobre el formulario como se indica en la figura

Para presentar la informacin como detalle, arrastraremos la tabla Socios de la ventana Orgenes de datos sobre el formulario Windows
Observaremos que Visual Studio, generar por nosotros un conjunto de componentes y controles, que por defecto tendr una apariencia similar a la que se presenta en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

229

Controles y Componentes de la tabla maestra aadidos al formulario Windows


Observe por un momento, que el campo NIF que declaramos como Label en la ventana de Orgenes de datos, aparece como tal en el formulario, tal y como se indica en la figura

Campo NIF de la tabla, representado como un control Label en el formulario Windows


Si ejecutamos nuestra aplicacin, observaremos que esta acta como una tpica aplicacin de acceso a datos que nos permite navegar a travs de los campos de la tabla Socios, tal y como se indica en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

230

Aplicacin en ejecucin de la tabla de detalle incrustada en el formulario Windows


A continuacin, insertaremos en el formulario la tabla Alquileres y relacionaremos ambas tablas para que se muestren los datos relacionados, dentro del formulario Windows.

Incrustando la tabla hija en el formulario


Ya tenemos la tabla padre insertada en nuestro formulario Windows. Nuestra segunda accin, ser la de incrustar en el formulario los datos o tabla hoja, que en nuestro caso es la formada por la tabla Alquileres, la cul adems, posee una relacin entre campos con la tabla Socios insertada anteriormente. Para llevar a cabo esta accin arrastraremos y soltaremos la tabla Alquileres sobre el formulario como se indica en la figura

Para presentar la informacin de la tabla Alquileres, arrastraremos la tabla de la ventana Orgenes de datos sobre el formulario Windows

Como podemos observar, el entorno de trabajo ha hecho por nosotros el trabajo ms complejo para representar los datos de forma rpida y sencilla. El esquema de datos tipados, apareca ya en nuestro proyecto cuando asignamos el correspondiente origen de datos. Ahora lo que ha ocurrido, es que al arrastrar y soltar la tabla padre Socios de la ventana de Orgenes de datos, en el entorno se ha aadido un componente de nombre MSDNVideoDataSet que es el que permitir relacionar el DataSet tipado con nuestros datos. Este componente ser usado por la relacin maestro detalle de las dos tablas aadidas al formulario. En la figura, podemos ver el esquema aadido a nuestro proyecto, y el componente del que estamos hablando.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

231

Esquema del DataSet tipado aadido al proyecto y su componente de relacin


Ejecute la aplicacin y observe el comportamiento de la misma.

Observar por lo tanto, que los datos entre detalle y maestra, no estn relacionados. Si navegamos a travs de los datos de detalle a travs del objeto SociosBindingNavigator, el control DataGridView no representa la relacin de los datos seleccionados. Esto es lo que se muestra en la figura.

Ejecucin de la aplicacin confirmando que los datos mostrados no estn relacionados


A continuacin, la tarea que nos queda para completar el correcto funcionamiento de nuestra aplicacin, es la de relacionar la tabla detalle y la tabla maestra entre s, para que los datos que se muestran en la aplicacin, estn relacionados entre s.

Relacionando la tabla padre con la tabla hija


La tarea ms sencilla es la de relacionar la tabla detalle con la tabla maestra. Es una tarea sencilla, porque Visual Studio nos proporciona las herramientas necesarias para simplificar al mximo esta tarea. Para llevar a cabo esta tarea, haga clic sobre el control DataGridView que corresponde a

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

232 los datos de la tabla maestra, y acceda a la ventana de Propiedades. Dentro de la ventana de Propiedades, acceda a la propiedad DataSource como se indica en la figura.

Propiedad DataSource del control DataGridView de la informacin maestra


Despliegue esta propiedad, y de la lista desplegable que aparece, seleccione la opcin FK_Alquileres_Socios como se indica en la figura

Asignacin de la clave de relacin entre las tablas


Cuando se asigna el campo de relacin de las tablas, dentro de la aplicacin se aade esta relacin para que cuando naveguemos entre los datos de la tabla Socios aparezca toda la informacin de la tabla Alquileres relacionada con la tabla Socios. Esto de lo que hablamos, est supeditado por FK_Alquileres_SociosBindingSource que es lo que se indica en la figura el componente

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

233

Controles y componentes incluido el de relacin entre tablas, aadidos al formulario Windows


Para finalizar, ejecutaremos nuestra aplicacin y comprobaremos que el funcionamiento de esta, incluida la relacin entre tablas, funciona como esperbamos. En la figura, podemos observar el comportamiento de nuestra aplicacin en ejecucin.

Aplicacin en ejecucin, mostrando la correcta relacin entre las tablas

8.21.- Manipulando los datos maestro detalle


Obviamente, los datos maestro detalle no nos sirve nicamente para insertar las tablas de datos en un formulario, mostrarlos y navegar por ellos. Adems de esto, podemos tambin manipular los datos maestro detalle, modificarlos, actualizarlos, borrarlos, sin hacer ninguna accin adicional. El control BindingNavigator ya proporciona todas las caractersticas necesarias para realizar estas acciones. Podemos personalizar el control para permitir o denegar estas acciones. Adems, dentro de la

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

234 ventana de Orgenes de datos, podemos seleccionar diferentes campos de las tablas y cambiar el tipo de control en el que queremos representar sus datos. A continuacin veremos un breve ejemplo de como manipular datos para que nos sirva de aprendizaje de cmo hacer esto posible.

Modificando datos
Ejecute la aplicacin de ejemplo que hemos diseado hasta ahora y sitese en alguno de sus campos. Centrndonos en la informacin de la tabla Socios, cambiaremos un campo determinado, como el que se muestra en la figura

Modificaremos el valor de un campo para que nos sirva de ejemplo


Acto seguido, cuando hayamos realizado la modificacin, haremos clic sobre la opcin de Guardar datos, tal y como se muestra en la figura.

Opcin del control BindingNavigator para guardar los datos modificados


Como vemos, la manipulacin de datos es realmente sencilla y en la relacin de datos mostrada, no tiene porqu presentarnos ninguna dificultad.

Insertando y eliminando datos


Si queremos agregar datos, deberemos hacer clic sobre la opcin Agregar nuevo del control BindingNavigator como se muestra en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

235

Aadir un registro nuevo es realmente sencillo


De la misma manera funciona el mecanismo para eliminar un registro, tal y como se muestra en la figura

Eliminar un registro de forma Rpida

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

236

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

237

Vistas y ordenacin de datos con la clase DataView


La clase DataView nos permite la aplicacin de vistas personalizadas a partir de una tabla contenida en un DataSet, as como la ordenacin y bsqueda de filas. Partiendo de un objeto DataTable situado en un DataSet, vamos a definir varias vistas simultneamente, ordenar y buscar registros, con la ventaja de que el consumo de recursos es menor, puesto que los objetos DataView se alimentan del mismo DataTable. Para realizar algunas pruebas, se acompaa el proyecto Vistas El DataSet del formulario de pruebas va a estar compuesto por dos tablas. El Cdigo fuente muestra el evento de carga del formulario. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load ' crear conexin Dim oConexion As New SqlConnection() oConexion.ConnectionString = "Server=(local);" & _ "Database=Northwind;uid=sa;pwd=;" 'crear dataset oDataSet = New DataSet() Dim oDataAdapter As SqlDataAdapter ' crear un adaptador de datos para la tabla Customers oDataAdapter = New SqlDataAdapter("SELECT * FROM Customers", oConexion) ' aadir tabla al dataset con el adaptador oDataAdapter.Fill(oDataSet, "Customers") oDataAdapter = Nothing ' crear un adaptador de datos para la tabla Products oDataAdapter = New SqlDataAdapter("SELECT * FROM Products", oConexion) ' aadir tabla al dataset con el adaptador oDataAdapter.Fill(oDataSet, "Products") oDataAdapter = Nothing End Sub

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

238

Vistas por cdigo y DefaultView


Podemos crear una vista instanciando un objeto de la clase DataView, o tambin obteniendo la denominada vista por defecto de una tabla de un DataSet, a travs de la propiedad DefaultView del objeto DataTable. La opcin de men Vistas + Normal del formulario, crea dos vistas de esta manera. Ver Cdigo fuente . Private Sub mnuNormal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuNormal.Click ' crear una vista por cdigo y asignarla a un datagrid Dim dvNormal As DataView dvNormal = New DataView(oDataSet.Tables("Customers")) Me.grdDatos.CaptionText = "Customers" Me.grdDatos.DataSource = dvNormal ' tomar la vista por defecto de una tabla ' del dataset y asignarla a un datagrid Me.grdDatosBIS.CaptionText = "Products" Me.grdDatosBIS.DataSource = oDataSet.Tables("Products").DefaultView End Sub La Figura muestra estas vistas en sendos DataGrid del formulario.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

239

Objetos DataView creados por cdigo y obtenido de DataTable.DefaultView.

Filtros con objetos DataView


La propiedad RowFilter de la clase DataView nos permite asignar a este objeto, una cadena con la expresin de filtro, que en una consulta en lenguaje SQL sera la parte correspondiente a la partcula Where. El Cdigo fuente muestra el cdigo de la opcin de men Vistas + Pas, del formulario de ejemplo, en la que se crea un filtro que se muestra posteriormente en un DataGrid. Private Sub mnuPais_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuPais.Click ' crear dataview Dim oDataView As New DataView() oDataView.Table = oDataSet.Tables("Customers") ' establecer un filtro oDataView.RowFilter = "Country='Spain'" Me.grdDatos.CaptionText = "Filtrar Customers por pas Spain" Me.grdDatos.DataSource = oDataView End Sub La Figura muestra las filas de la tabla con el filtro aplicado.

DataView con filtro. Como hemos comentado anteriormente, a partir de un DataTable podemos obtener varios filtros mediante distintos objetos DataView, sin que ello
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua

240

suponga una penalizacin en el consumo de recursos. Para demostrar este punto, la opcin Vistas + Combinada, crea una vista basada en un filtro combinado, y una vista normal, ambas empleando la misma tabla base. Veamos el Cdigo fuente Private Sub mnuCombinada_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuCombinada.Click ' tomar la tabla Customers del dataset y aplicar... ' ...filtro combinado por dos campos y depositar en un datagrid Dim oDataView As New DataView() oDataView.Table = oDataSet.Tables("Customers") oDataView.RowFilter = "ContactTitle LIKE '%Manager%' AND Country IN ('Spain','USA')" Me.grdDatos.CaptionText = "Filtro combinado por campos ContactTitle y Country" Me.grdDatos.DataSource = oDataView ' ...filtro por un campo y depositar en otro datagrid Dim oDV As New DataView() oDV.Table = oDataSet.Tables("Customers") oDV.RowFilter = "ContactName LIKE '%an%'" Me.grdDatosBIS.CaptionText = "Filtro por campo ContactName" Me.grdDatosBIS.DataSource = oDV End Sub La Figura muestra el formulario con los diversos filtros establecidos

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

241

Filtros combinados con objetos DataView.

Bsquedas con DataView


Estableciendo el adecuado filtro a un objeto DataView, podemos realizar bsquedas de registros en tablas, como muestra el Cdigo fuente, correspondiente a la opcin de men Vistas + Buscar fila, del formulario de ejemplo. Deberemos previamente, haber escrito en el TextBox del formulario, el identificador de la tabla Customers a buscar. Private Sub mnuBuscarFila_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuBuscarFila.Click ' crear un dataview y buscar una fila en la vista ' estableciendo un filtro Dim oDataView As New DataView() oDataView.Table = oDataSet.Tables("Customers") oDataView.RowFilter = "CustomerID = '" & Me.txtCustomerID.Text & "'" Me.grdDatosBIS.CaptionText = "Buscar ID cliente: " & Me.txtCustomerID.Text Me.grdDatosBIS.DataSource = oDataView End Sub En la Figura vemos el resultado de una bsqueda, mostrado en uno de los DataGrid del formulario.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

242

Bsqueda de una fila en una tabla de un DataSet, empleando un DataView.

Ordenacin de filas mediante DataView


Para ordenar las filas en un DataView emplearemos su propiedad Sort, asignndole una cadena con el nombre de columna/s a ordenar, tal y como muestra el Cdigo fuente , de la opcin de men Ordenacin + Normal, en el formulario del ejemplo. Private Sub mnuOrdNormal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuOrdNormal.Click ' crear dataview y ordenar las filas con la propiedad Sort Dim oDataView As New DataView() oDataView.Table = oDataSet.Tables("Customers") oDataView.Sort = "Country" Me.grdDatos.CaptionText = "Ordenar por campo Country" Me.grdDatos.DataSource = oDataView End Sub Veamos el resultado al ejecutar en la Figura Si necesitamos ordenar por mltiples columnas de la tabla, slo tenemos que asignar a Sort una cadena con la lista de columnas requeridas. Ver Cdigo fuente .

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

243

DataView ordenando las filas por la columna Country. oDataView.Sort = "Country, PostalCode" Tambin es factible asignar a un DataView una combinacin de filtro y ordenacin, utilizando en la misma operacin las propiedades RowFilter y Sort. El men del formulario Ordenacin + Con filtro realiza este trabajo, que vemos en el Cdigo fuente . Private Sub mnuOrdenFiltro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuOrdenFiltro.Click Dim oDataView As New DataView() oDataView.Table = oDataSet.Tables("Customers") ' establecer un filtro al dataview oDataView.RowFilter = "Country='USA'" ' ordenar las filas del filtro oDataView.Sort = "City" Me.grdDatos.CaptionText = "Filtrar por USA. Ordenar por campo City" Me.grdDatos.DataSource = oDataView End Sub Los datos con el filtro y orden podemos verlos en el DataGrid del formulario, que muestra la Figura .

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

244

Resultado de DataView con filtro y orden.

Obtener el esquema de un DataSet


El esquema de un DataSet consiste en toda la informacin contenida por este objeto, acerca de los nombres de tablas, columnas, relaciones, etc.; es decir, se trata de metainformacin sobre los datos que contiene el DataSet. Podemos obtener estos metadatos del DataSet recorriendo la coleccin que nos interese en cada caso: Tables, Columns, etc. El Cdigo fuente muestra como tras crear un DataSet, recorremos sus tablas, y dentro de estas, sus columnas, mostrando la informacin obtenida en un ListBox. Private Sub btnEsquema_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEsquema.Click ' crear conexin Dim oConexion As New SqlConnection() oConexion.ConnectionString = "Server=(local);" & _ "Database=Northwind;uid=sa;pwd=;" ' crear dataset Dim oDataSet As New DataSet() ' crear adaptadores de datos para las tablas ' y aadir cada tabla al dataset con el adaptador Dim oDataAdapter As SqlDataAdapter oDataAdapter = New SqlDataAdapter("SELECT * FROM Customers", oConexion) oDataAdapter.Fill(oDataSet, "Customers") oDataAdapter = Nothing

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

245

oDataAdapter = New SqlDataAdapter("SELECT * FROM Orders", oConexion) oDataAdapter.Fill(oDataSet, "Orders") oDataAdapter = Nothing oDataAdapter = New SqlDataAdapter("SELECT * FROM Products", oConexion) oDataAdapter.Fill(oDataSet, "Products") oDataAdapter = Nothing oDataAdapter = New SqlDataAdapter("SELECT * FROM Territories", oConexion) oDataAdapter.Fill(oDataSet, "Territories") oDataAdapter = Nothing ' crear un objeto tabla y columna para mostrar ' la informacin del esquema que el dataset contiene Dim oDataTable As DataTable Dim oDataColumn As DataColumn Me.lstEsquema.Items.Add("Estructura del DataSet") ' recorrer la coleccin de tablas del DataSet For Each oDataTable In oDataSet.Tables Me.lstEsquema.Items.Add("Tabla: " & oDataTable.TableName) Next ' recorrer la coleccin de columnas de la tabla For Each oDataColumn In oDataTable.Columns Me.lstEsquema.Items.Add("Campo: " & _ oDataColumn.ColumnName & " --- " & _ "Tipo: " & oDataColumn.DataType.Name) Next End Sub La Figura muestra el ListBox relleno con el esquema del DataSet tras haber pulsado el botn del formulario.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

246

Obtencin del esquema de un DataSet.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

247

Ejemplos de programa de uso de clase en Visual Basic NET


Ejemplo Calcular el salario de un empleado, informacin a sacar por pantalla Nombre del empleado y Salario semanal, datos conocidos: nombre, nmero de horas trabajadas y pago por hora del empleado El salario se calcula de la manera siguiente: Si el nmero de horas trabajadas es mayor que 40, el excedente de 40 se paga al doble de la cuota por hora, en caso de no ser mayor que 40 se paga a la cuota por hora normal. Realicemos la solucin de acuerdo al modelo-vista-controlador Algoritmo Calcular Salario de un empleado

Algoritmo Calcular Salario de un empleado Clase Empleado 1.- Declaraciones :Datos NombreEmpleado: Cadena HorasTrabajadas: Entero PagoHora: Real Salario: Real 2.- Metodo EstablecerNombre( nom: cadena) NombreEmpleado = nom Fin Metodo EstablecerNombre 3.- Metodo Establecerhoras(horas: Entero) HorasTrabajadas = horas Fin Metodo EstablecerHoras 4.- Metodo EstablecerPago( pago: Real) PagoHora = pago Fin Metodo EstablecerPago 5.-Metodo CalcularSalario( ) If HorasTrabajadas<= 40 Then Salario = HorasTrabajadas * PagoHora Else Salario= (40*PagoHora)+ (( HorasTrabajadas -40) *( PagoHora * 2)) Endif Fin Metodo EstablecerNombre 6.- Metodo ObtenerNombre() : Cadena Return NombreEmpleado Fin Metodo ObtenerNombre 7.- Metodo ObtenerSalario( ) : Real Return Salario Fin Metodo ObtenerSalario

Public Class Empleado 'Declaraciones de Datos Private NombreEmpleado As String Private HorasTrabajadas As Integer Private PagoHora As Double Private Salario As Double Public ReadOnly Property obtenerNombre() As String ' bloque Get obtener para devolver el valor de la propiedad Get Return NombreEmpleado End Get End Property Public WriteOnly Property establecerNombre() As String ' bloque Set (Establecer) para asignar valor a la propiedad Set(ByVal Value As String) NombreEmpleado = Value End Set End Property Public ReadOnly Property obtenerHoras() As Integer ' bloque Get para devolver el valor de la propiedad Get Return HorasTrabajadas End Get End Property

Fin de clase empleado

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

248

Public WriteOnly Property EstablecerHoras() As Integer ' bloque Set para establecer valor a la propiedad Set(ByVal hora As Integer) HorasTrabajadas = hora End Set End Property Public WriteOnly Property EstablecerPago() As Double ' bloque Get para devolver el valor de la propiedad Set(ByVal value As Double) PagoHora = value End Set End Property

Diseo en Visual Basic

Public ReadOnly Property ObtenerPagoHora() As Double ' bloque Set para estsblecer el valor a la propiedad Get Return PagoHora End Get End Property Public Sub CalcularSalario() ' en este mtodo calculamos el salario del empleado If HorasTrabajadas <= 40 Then Salario = HorasTrabajadas * PagoHora Else Salario = (40 * PagoHora) + ((HorasTrabajadas - 40) * (PagoHora * 2)) End If End Sub Public ReadOnly Property ObtenerSalario() As Double Get Return Salario End Get End Property End Class

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

249

Clase EjecutaEmpleado

Rem Clase Ejecuta Empleado (Esta se encuentra en el Form) Public Class Form1 Public NEmple As String Dim HT As Double Dim PagoH As Double Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'Declarar e iniciar objeto Dim objEmpleado As Empleado objEmpleado = New Empleado() 'Trasladar datos a las variables NEmple = TextBox1.Text HT = Val(TextBox2.Text) PagoH = Val(TextBox3.Text) 'Metodos establecer objEmpleado.establecerNombre = NEmple objEmpleado.EstablecerPago = PagoH objEmpleado.EstablecerHoras = HT 'Metodo Calcular objEmpleado.CalcularSalario() 'Metodos obtener datos Label4.Text = "Empleado " & UCase(objEmpleado.obtenerNombre) Label5.Text = "Pago por hora " & objEmpleado.ObtenerPagoHora Label6.Text = "Salario " & objEmpleado.ObtenerSalario End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click End End Sub End Class

Metodo Principal Declaraciones Variables NEmple : Cadena HT: Entero

PagoH: Real Declarar, crear e iniciar objeto Empleado Empleado() Solicitar nombre, nmero de horas, pago por hora Leer NEmple, HT, PagoH Establecer objempleado.EstablecerNombre(NEmple) objEmpleado.EstablecerHoras(HT) objEmpleado = new

objEmpleado.EstablecerPago(PagoH)

Calcular ObjEmpleado.CalcularSalario() Imprimir objEmpleado.ObtenerNombre() objEmpleado.ObtenerSalario() Fin Metodo principal Fin clase EjecutaEmpleado

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

250

Algoritmo y programa OO usando seleccin mltiple en Visual Basic NET


Ejercicio: Elaborar un algoritmo que dado un numero del 1 al 7, el programa imprima por pantalla Domingo ,si es 1, Lunes, si es 2 Sbado, si es 7. Solucin:

Algoritmo PresentaDia de la semana Clase PresentaDia Declaraciones Datos NumDia : Entero NombreDia : Cadena Metodo EstablecerNDia( num: Entero) NumDia = Num Fin de mtodo EstablecerDia Metodo CalcularNombredia() Swith NumDia 1: Nombredia = Domingo 2: Nombredia = Lunes 3: Nombredia = Martes 4: Nombredia = Mircoles 5: Nombredia = Jueves 6: Nombredia = Viernes 7: Nombredia = Sbado DEFAULT NombreDia = No est en el rango de 1 a 7 ENDSWITCH Fin Metodo CalcularNombreDia Metodo ObtenerNombreDia() : Cadena Return NombreDia Fin Metodo ObtenerDia Fin clase PresentaDia

Public Class PresentaDia REM Declaraciones de Datos Private INumDia As Integer Public SNombreDia As String ' Metodo obtener nombreDia de solo escritura ReadOnly Property Nombre() As String Get Nombre = SNombreDia End Get End Property 'Metodo establecer Numero del Dia solo lectura WriteOnly Property Dia() As Integer Set(ByVal value As Integer) INumDia = value End Set End Property ' Metodo CalcularNombredia() Public Sub CalcularDia() Select Case (INumDia) Case 1 SNombreDia = "Domingo" Case 2 SNombreDia = "Lunes" Case 3 SNombreDia = "Martes" Case 4 SNombreDia = "Miercoles" Case 5 SNombreDia = "Jueves" Case 6 SNombreDia = "Viernes" Case 7 SNombreDia = "Sabado" Case Else SNombreDia = "No existe ese dia" End Select End Sub End Class

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

251

Clase EjecutaPresentaDia Metodo Principal Declaraciones Variables Ndia : Entero Declarar, crear e iniciar objeto PresentaDia Objdia = new PresentaDia Solicitar numero de dia Leer Ndia Establecer Objdia.EstablecerNDia(Ndia) Calcular ObjDia.CalcularNombreDia() Obtener ObjDia.ObtenerNombreDia() Fin Metodo Principal Fin Clase EjecutaPresentaDia

Public Class Form1 REM programa con clases utilizando seleccion multiple REM Elaborar un algoritmo que dado un numero del 1 al 7, el programa imprima por pantalla Domingo ,si es 1, Lunes, si es 2 Sbado, si es 7. Dim INdia As Integer ' Declara la instancia de la clase Dim objDia As PresentaDia Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click End End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click objDia = New PresentaDia objDia.Dia = Val(TextBox1.Text) objDia.CalcularDia() ' presentar el nombre del dia Label2.Text = "El dia de la semana es " & objDia.Nombre End Sub End Class

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

252

Algoritmo y programa OO usando Estructura de repeticin DOWHILE en Visual Basic NET


Ejemplo: Elaborar un algoritmo para calcular e imprimir el sueldo de varios empleado de una empresa. Datos disponibles: Nombre, Horas Trabajadas, Cuota por Hora Proceso: Sueldo = Horas Trabajadas * cuota por Hora Imprimir: Nombre, Sueldo. Solucin:
Public Class Empleado Private NombreE As String Public Property Nombre() As String Get Nombre = NombreE End Get Set(ByVal valor As String) NombreE = valor End Set End Property Private HorasT As Double Public Property Horas() As String Get Horas = HorasT End Get Set(ByVal valor As String) HorasT = valor End Set End Property Private PagoH As Double Public Property Pago() As String Get Pago = PagoH End Get Set(ByVal valor As String) PagoH = valor End Set End Property Private Sueldo As Double ReadOnly Property Salario() As Double Metodo ObtenerSueldo() : Real Return Sueldo Fin mtodo ObtenerSueldo Fin Clase Empleado Get Salario = Sueldo End Get End Property Public Sub CalcularSueldo() Sueldo = HorasT * PagoH End Sub End Class

Clase Empleado Declaraciones Datos NombreE : Cadena HorasT : Entero PagoH : Real Sueldo : Real Metodo EstablecerNombreE(nom Cadena) NombreE = nom Fin mtodo EstablecerNombreE :

Metodo EstablecerHorasT (Horas : Enterol) HorasT = Horas Fin de mtodo EstablecerHorasT. Metodo EstablecerPagoH( Pago : Real) PagoH = Pago Fin Metodo EstablecerPagoH Metodo CacularSueldo() Sueldo = HorasT * PagoH Fin mtodo CalcularSueldo Metodo ObtenerNombreE(): Cadena Return NombreE Fin Metoddo ObtenerNombreE

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

253

Public Class Form1 Dim ObjEmpleado As Empleado Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click ObjEmpleado = New Empleado ' Recibir datos ObjEmpleado.Nombre = TextBox1.Text ObjEmpleado.Horas = Val(TextBox2.Text) ObjEmpleado.Pago = Val(TextBox3.Text) ' Procesar salario ObjEmpleado.CalcularSueldo() Label4.Text = "El empleado " & Clase EjecutaEmpleado Metodo Principal Declaraciones Variables NomEmple : Cadena HTraba : Entero PagoHora : Real Desea : Carcter Do Declarar, crear e iniciar objeto Empleado objEmpleado = new Empleado() Solicitar Nombre, horas trabajadas, cuota por hora Leer nomEmple, HTraba,PagoHora Establecer ObjEmpleado.EstablecerNombreE(NomEmple) ObjEmpleado.EstablecerHorasT(HTraba) ObjEmpleado.EstablecerPagoH(PagoHora) Calcular ObjEmpleado.CalcularSueldo() Imprimir ObjEmpleado.ObtenerNombreE() ObjEmpleado.Obtenersueldo() Preguntar Desea procesar otro empleado (S/N) ? Leer Desea WHILE Desea = S Fin Metodo principal Fin clase EjecutaEmpleado ObjEmpleado.Nombre & " tiene un salario de " & ObjEmpleado.Salario Dim otros As String otros = InputBox("Otro proceso S/N") If UCase(otros) = "S" Then TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" Label4.Text = "" TextBox1.Focus() End If End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click End End Sub End Class

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

254

Algoritmo y programa OO usando arreglos unidimensionales en Visual Basic NET, Ejemplo:


Se conoce el nmero de unidades producidas por un obrero en cada uno de los 30 das del mes. Elaborar un algoritmo y programa que permita leer la produccin de cada uno de los 30 das y luego los visualice.

Clase Obrero 1.- Declaraciones Datos Produccin: Arreglo[30] : Entero 2.- Mtodo establecerProduccion(pro[]: Entero) Produccin = pro Fin mtodo establecerProduccion 3.- Metodo obtenerProduccion(): Arreglo[] Entero Return produccin Fin mtodo obtenerProduccion Fin Clase Obrero

Clase Ejecutaobrero 1.- Metodo principal Declaraciones Variables Prod, prod2:arreglo[30] Entero I : Entero Declarar, crear e iniciar objeto Obrero objObrero = new Obrero() For i = 0; i<=29; i++ Solicitar produccin del dia i +1 Leer prod[i ] EndFor Establecer objObrero.establecerProduccion(prod) Obtener Prod2 = objObrero.obtenerProduccion() For i = 0 ; i <= 29: i++ Imprimir prod[i] EndFor Fin Metodo principal Fin Clase EjecutaObrero

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

255

Algoritmo y programa OO usando herencia en Visual Basic NET


Ejemplo: En cierta empresa se tienen empleados; los empleados se dividen en dos tipos, empleados por hora, a los que se les paga de acuerdo con el nmero de horas trabajadas y a una cuota por hora. El otro tipo son los empleados asalariados, a quienes se les paga de acuerdo a un sueldo fijo mensual. Se desea procesar a los empleados para realizar los pagos por medio de un programa de computo.

Clase empleado Declaraciones: Datos # nombreEmpleado : cadena # deptoEmple : cadena # puestoTrabajo: cadena Mtodo establecerNombre(nom : cadena) nombreEmpleado = nom Fin mtodo establecerNombre Mtodo establecerDepto(dep: cadena) depatoEmple = dep Fin de mtodo establecerDepto Mtodo establecerPuesto(pues : cadena) puestoTrabajo = pue fin mtodo establecerPuesto Metodo obtenerNombre() : cadena Return nombreEmpleado Fin mtodo obtenerNombre Mtodo obtenerPuesto() : cadena Return puestoTrabajo Fin mtodo obtenerPuesto Mtodo obtenerDpto() : cadena Return deptoEmple Fin mtodo obtenerDpto Fin clase empleado

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

256

Clase EmpleadoPor Hora Declaraciones Datos horasTrabajadas : Entero cuotaHora : Real SueldoQnal : Real Metodo establecerHoras(horasT : Entero) horasTrabajadas = horasT Fin mtodo establecerHoras Metodo establecerCuota(cuotaH : Real) cuotaHora = cuotaH Fin mtodo establecerCuota Metodo calcularSueldoQnal() SueldoQnal = horasTrabajadas * cuotaHora Fin mtodo CalcularSueldoQnal Metodo obtenerSueldoQnal() : Real Return sueldoQnal Fin mtodo obtenerSueldoQnal Fin Clase EmpleadoPorHoras

Clase EmpleadoAsalariado Declaraciones Datos SueldoQnalAsal : Real SueldoMensual : Real Mtodo calcularrSueldoQnalAsal() SueldoQnalAsal = SueldoMensual/2 Fin mtodo calcularSueldoQnalAsal Mtodo establecerSueldoMensual(sdo : Real) SueldoMensual = sdo Fin mtodo establecersueldoMensual Metodo obtenerSueldoQnalAsal() : Real Return SueldoQnalAsal Fin mtodo obtenerSueldoQnalAsal Fin clase EmpleadoAsalariado

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

257

Clase EjecutaEmpleado Metodo principal Declaraciones Variables nomEmple, depto, puesto : cadena hrsTra,TipoEmp : Entero cuoH, SdoMen : Real desea : carcter Do Imprimir men y solicitar tipo de empleado Tipos de empleados 1.- Empleado por Horas 2.- Empleado asalariado Teclee tipo Leer tipoEmp Solicitar Nombre, departamento y puesto Leer nomEmple, depto, puesto If tipoEmple = 1 then Crear objeto EmpleadoPorHora objEmpleado = new EmpleadoPorHora() Solicitar nmero de horas trabajadas y cuota por hora Leer hrsTra, cuoH Establecer objEmpleado. establecerNombre(nomEmple) objEmpleado.establecerDepto(depto) objEmpleado.establecerPuesto(puesto) objEmpleado. establecerHoras(hrsTra) objEmpleado.establecerCuota(cuoH ) objEmpleado. establecerHoras(hrsTra) objEmpleado.establecerCuota(cuoH) Calcular objEmpleado. calcularSueldoQnal() Visualizar objEmpleado. obtenerNombre() objempleado.obtenerPuesto() objEmpleado.obtenerDpto() objEmpleado. obtenerSueldoQnal() Else Crear objeto EmpleadoAsalariado objEmpleado = new empleadoAsalariado() Solicitar sueldo mensual Leer SdoMen

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

258

Establecer objEmpleado. establecerNombre(nomEmple) objEmpleado.establecerDepto(depto) objEmpleado.establecerPuesto(puesto) objEmpleado. establecerSueldoMensual(SdoMen) Calcular objEmpleado. calcularSueldoQnalAsal() Visualizar objEmpleado. obtenerNombre() objempleado.obtenerPuesto() objEmpleado.obtenerDpto() objEmpleado. obtenerSueldoQnalAsal() Endif Preguntar Desea procesar otro empleado S/N)? Leer Desea WHILE Desea = S Fin metodo principal Fin clase EjecutaEmpleado

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

259

Algoritmo y programa OO usando polimorfismo en Visual Basic NET.


Ejemplo: El mismo ejercicio anterior, pero utilizando el concepto de polimorfismo

Clase abstracta Empleado2 Declaraciones Datos # nombreEmpleado: Cadena # deptoEmple : Cadena # puestoTrabajo : Cadena # SueldoQna: Real Metodo establecerNombre(nom: Cadena) nombreEmpleado = nom Fin mtodo establecerNombre Mtodo establecerDepto(dep: cadena) deptoEmple = dep Fin de mtodo establecerDepto Mtodo establecerPuesto(pues : cadena) puestoTrabajo = pue fin mtodo establecerPuesto Metodo abstracto calcularSueldoQna() Metodo obtenerNombre() : cadena Return nombreEmpleado Fin mtodo obtenerNombre Mtodo obtenerPuesto() : cadena Return puestoTrabajo Fin mtodo obtenerPuesto Mtodo obtenerDpto() : cadena Return deptoEmple Fin mtodo obtenerDpto Mtodo obtenerSueldoQna() : Real Return SueldoQna Fin mtodo obtenerDpto Fin clase Empleado2

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

260

Clase EmpleadoPor Hora2 Empleado2 Declaraciones Datos horasTra : Entero cuotaHora : Real

hereda

de

Metodo establecerHoras(horasT : Entero) horasTrab = horasT Fin mtodo establecerHoras Metodo establecerCuota(cuotaH : Real) cuotaHora = cuotaH Fin mtodo establecerCuota Metodo calcularSueldoQna() SueldoQnal = horasTrabajadas * cuotaHora Fin mtodo CalcularSueldoQna Fin Clase EmpleadoPorHora2

Clase EmpleadoAsalariado2 Declaraciones Datos SueldoMensual : Real Mtodo calcularrSueldoQnalAsal() SueldoQnalAsal = SueldoMensual/2 Fin mtodo calcularSueldoQnalAsal Metodo obtenerSueldoQnalAsal() : Real Return SueldoQnalAsal Fin mtodo obtenerSueldoQnalAsal Fin clase EmpleadoAsalariado2

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

261

Clase EjecutaEmpleado2 Metodo principal Declaraciones Variables nomEmple, depto, puesto : cadena hrsTra,TipoEmp : Entero cuoH, SdoMen : Real desea : carcter Do Imprimir men y solicitar tipo de empleado Tipos de empleados 1.- Empleado por Horas 2.- Empleado asalariado Teclee tipo Leer tipoEmp Solicitar Nombre, departamento y puesto Leer nomEmple, depto, puesto If tipoEmple = 1 then Crear objeto EmpleadoPorHora2 objEmpleado = new empleadoPorHora2() Solicitar nmero de horas trabajadas y cuota por hora Leer hrsTra, cuoH Establecer objEmpleado. establecerNombre(nomEmple) objEmpleado.establecerDepto(depto) objEmpleado.establecerPuesto(puesto) objEmpleado.establecerSueldoMensual(SdoMen) Calcular objEmpleado.calcularSueldoQnalAsal() Visualizar objEmpleado.obtenerNombre() objempleado.obtenerPuesto() objEmpleado.obtenerDpto() objEmpleado.obtenerSueldoQnalAsal Endif Preguntar Desea procesar otro empleado (S/N)? Leer Desea WHILE Desea = S Fin mtodo principal Fin clase EjecutaEmpleado2

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

También podría gustarte