Introducción al Entorno de Desarrollo .

Net 
   
¿Qué es la plataforma Microsoft .NET? ¿Qué es el .NET Framework? Conceptos básicos de .NET Explorar el entorno de desarrollo Crear un proyecto Visual Basic .NET

Programación Windows

Introducción
Vi l B i .NET es l últi versió del sistema de desarrollo Visual Basi . Antes de empezar a crear aplicaciones en Visual Basic .NET, le será útil conocer y entender algunos conceptos básicos de .NET.

Conceptos Básicos
¿Qué es la Plataforma Net?
La plataforma .NET proporciona la base de la siguiente generación de soft are que permite conectar sistemas, información, dispositivos y usuarios distintos de un modo más unificado y personalizado. Incorpora servicios Web XML como el medio para permitir la interoperabilidad entre tecnologías diferentes.

¿Que es Visual Studio Net?
Visual Studio .NET es un entorno de desarrollo integrado que nos ayuda a diseñar, desarrollar, depurar e implantar con rapidez soluciones basadas en el .NET Framework. Podemos acceder a un conjunto común de herramientas, diseñadores y editores desde cualquiera de los lenguajes de programación de Visual Studio .NET. Podemos crear aplicaciones Windows Forms y Web Forms que integren datos y lógica de negocio.

¿Qué es el .NET Framework?
"El .NET Framework es un entorno multi-lenguaje para la construcción, distribución y ejecución de Servicios Webs y aplicaciones." El .NET Framework es el corazón de .NET, cualquier cosa que queramos hacer en cualquier lenguaje .NET debe pasar por el filtro cualquiera de las partes integrantes del .NET Framework.
Página 2

Programaci
biblioteca de clases.

i

ows

El .NET Framework tiene dos componentes principales: el Common Lan ua e Runtime y la

CLR o Common Language Runtime
Una de las partes fundamentales de Microsoft .NET Framework, es el CLR o Common Lan ua e Runtime, que no es otra cosa que el entorno o motor de ejecuci n de len uaje común. El CLR es el centro neurál ico del .NET Framework encar ado de estionar la ejecuci n de nuestras aplicaciones, aplicar parámetros de se uridad y ejecutar el denominado recolector de basura entre otras cosas.

Garbage Collector o GC
En su traducci n más o menos exacta, lo definiremos como Recolector de Basura, y que tiene la funci n di na o indi na, de hacer la tarea más sucia de .NET, es decir, de hacer las funciones de estor de limpieza de .NET eliminando de la memoria, todos aquellos objetos que no sean útiles en un momento dado, liberando al sistema de recursos no utilizables. La ejecuci n del GC es una ejecuci n desatendida y trasparente por el pro ramador y por el usuario,

MSIL
MSIL o IL es conocido como Microsoft Intermediate Lan ua e o simplemente Intermediate Lan ua e, o lo que es lo mismo, len uaje intermedio. Todos los len uajes administrados de la plataforma .NET, deben cumplir un conjunto de re las y normas, y parte de este ajuste, es que una aplicaci n escrita en un len uaje de pro ramaci n determinado, debe ser compilada en un len uaje intermedio, de manera tal, que una aplicaci n escrita por ejemplo en C# y otra i ual en Visual Basic, se compilan al prácticamente el mismo len uaje intermedio.

JIT
El entorno de ejecuci n incluye una característica denominada compilaci n Just In Time (JIT), que traduce c di o MSIL al len uaje máquina del sistema en el que la aplicaci n se ejecutará.

Biblioteca de Clases
La biblioteca de clases es una colecci n completa orientada a objetos de clases reutilizables y or anizadas en espacios de nombres jerárquicos en base a su funcionalidad. Podemos utilizar la biblioteca de clases para desarrollar aplicaciones que abarcan desde las aplicaciones clientes

P i

3

Programación Windows
tradicionales hasta las aplicaciones basadas en las últimas innovaciones proporcionadas por ASP.NET y los servicios Web XML.

Formas de Ingreso al Entorno
Hay dos formas de ingresar la Visual .Net: 1.- Inicio/Todos Los Programas/Microsoft Visual Studio 2005/ Microsoft Visual Studio 2005

2.- Inicio/Ejecutar:

Página 4

Programación Windows
Crear un nuevo Proyecto 1.-Menú Archivo/Nuevo Proyecto o las combinaciones de las Teclas Ctrl + N aparecerá la siguiente pantalla

2.- En nombre ingrese Introducción y clic en aceptar.

Explorando el Entorno de Desarrollo
Esta lección introduce las entorno que crear de y principales del desarrollo para modificar Windows de características utilizamos

aplicaciones, como el Diseñador del Forms y los controles Cuadro herramientas.

Ventanas Clásicas
Explorador se Soluciones (Ctrl + Alt + L) El Explorador de soluciones nos permite visualizar archivos y realizar tareas de administración de archivos en una solución o en un proyecto. Una única solución basada en Visual Basic .NET y sus proyectos aparecen en una lista jerárquica que proporciona información actualizada sobre el estado de nuestra solución, proyectos y archivos.

Página 5

Programación Windows
Cuadro de Herraminetas (Ctrl + Alt + X)
Para crear los objetos del interfaz de usuario de nuestra aplicación, añadimos controles desde el Cuadro de herramientas a un formulario. Inicialmente, el Cuadro de herramientas se encuentra ubicado en el lado izquierdo del entorno de desarrollo. Hay varias pestañas para diferentes categorías de controles, como Windows Forms y Datos.

Ventana de Propiedades (F4)
La ventana de propiedades (ventana Propiedades) muestra una lista de las propiedades que pueden configurarse para el formulario o control seleccionado y que podemos modificar mientras creamos o editamos la aplicación. Una propiedad describe una característica de un objeto, como el tamaño, título o color.

Barra de Herramientas
Cuando iniciamos un proyecto Visual Basic .NET y seleccionamos una plantilla de aplicaciones, aparece el entorno de desarrollo visual. El menú principal y la barra de herramientas estándar proporcionan acceso a la mayoría de comandos que controlan el entorno de programación de Visual Studio .NET.

Página 6

Programación Windows
Editor de Código (Shift + F7)
Visual Studio .NET proporciona un Editor de código en el que escribir y mantener el código de nuestro proyecto. Podemos asociar código directamente a un formulario de nuestro proyecto o ubicarlo en otro módulo de código distinto. Se muestra un Editor de có digo distinto para cada formulario o módulo de nuestro proyecto, facilitando la organización, visualización y desplazamiento por el código.

Como Ejecutar
Para poder probar lo que estamos haciendo debemos ejecutar, tambi n se dice iniciar depuración. Para Iniciar Depuración simplemente F5 o desde la Barra de Herramientas clic el icono de iniciar depuración Nota: Cuando la aplicación esta en ejecución no podrá modificar nada en el proyecto, entonces si desea hacer algo (Codificar, Cambiar de propiedades, etc.) entonces tiene que detener la ejecución Para detener la ejecución desde la Barra de Herramientas clic en el icono de detener Depuración

Página 7

Programación Windows
Como Agregar un Nuevo Formulario
1.-Desde el Explorador de Soluciones sobre Clic el derecho Proyecto (Introducción) Agregar /Nuevo elemento; nos mostrara la siguiente pantalla.

2.- Ingresar el nombre ³FrmIngreso´ Aceptar y clic

Como Establecer Formulario de Inicio
1.-Desde el Explorador se Soluciones Clic Derecho sobre el proyecto (en este caso introducción)/ clic en Propiedades; Aparecerá la siguiente pantalla:

2.- En el Combo seleccione el Formulario de Inicio en este caso FrmIngreso

Página 8

Programación Windows
Como Agregar Controles a un formulario
Antes de todo, al formulario que deseamos agregar un control debe esta en modo Diseño (Shift + F7) y el Cuadro de Controles tiene que estar activo (Ctrl + Alt + X). Para agregar controles hay varias formas: 1.-Arrastre el control al formulario (Recomendado) 2.- Clic en el control/Enter 3.- Doble Clic en el control

Como Eliminar un formulario
Desde el Explorador de Soluciones Clic derecho sobre el formulario que desea eliminar (en este caso Form1) / Clic en Eliminar Nota: Cuando se crea un Proyecto debemos guardar y debemos saber donde guarda el proyecto para esto haga clic en el icono de Guardar Todo ( Ejercicio Practico Nº1. 1. Diseñar el siguiente Formulario:
LblNombre TxtNombre

)

BtnMensaje

2. En el evento click del boton BtnMensaje codificamos lo siguiente: Private Sub btnMensaje_Click MsgBox("Bienvenido a Visual Basic .Net " & Me.txtnombre.Text) End Sub Ejercicio Practico Nº2. 1. Diseñar el siguiente Formulario:
TxtTexto

btnColorTexto

btnColorFondo

Página 9

Programaci

i

ows

2. Lue o codificamos lo si uiente en el evento click de los botones: Private Sub BtnColorTexto_Click Me.TxtTexto.ForeColor = Color.Blue End Sub Private Sub BtnColorFondo_Click Me.BackColor = Color.Red End Sub E rcicio Practico º3 1. Diseñar el si uiente Formulario:
Txt1 Txt2 BtnSuma BtnResta BtnDividir TxtRes BtnMultiplicar BtnPotencia

BtnNuev

2. Lue o codificamos lo si uiente en el evento click de los botones:
Private Sub btnsuma_Click Me.txtres.Text = Val(Me.txt1.Text) + Val(Me.txt2.Text) End Sub Private Sub btnresta_Click Me.txtres.Text = Val(Me.txt1.Text) Val(Me.txt2.Text) End Sub Private Sub btnmulti_Click Me.txtres.Text = Val(Me.txt1.Text) * Val(Me.txt2.Text) End Sub Private Sub btndividir_Click Me.txtres.Text = Val(Me.txt1.Text) / Val(Me.txt2.Text) End Sub Private Sub btnpotencia_Click Me.txtres.Text = Val(Me.txt1.Text) ^ Val(Me.txt2.Text) End Sub Private Sub btnnuevo_Click Me.txt1.Clear() Me.txt2.Clear() Me.txtres.Clear() Me.txt1.Focus() End Sub
 

P i

¡

10

Programación Windows
Ejercicio Práctico Nº4 1.- Diseñar el siguiente formulario

TxtUsu TxtPas

Btningresar

BtnSalir

Escriba el Código a utilizar para este ejercicio. «««««««««««««««««««««««««««««««««««««««« «««««««««««««««««««««««««««««««««««««««« «««««««««««««««««««««««««««««««««««««««« «««««««««««««««««««««««««««««««««««««««« «««««««««««««««««««««««««««««««««««««««« «««««««««««««««««««««««««««««««««««««««« ««««««««««««««««««««««««««««««««««««««««.

Resolver:
1.- Crear una aplicación en la cual me permita realizar la siguiente ecuacion: y= 5x2+2x+2 10

2.- Crear una aplicación en la cual me permita realizar la siguiente ecuacion:
y=4x2+¥x+5 2¥x 3.- Crear la siguiente aplicación, en la cual me permita ingresar 2 numeros y el resultado me lo muestre en un label de la siguiente manera como se muestra en la figura.

Página 11

Programación Windows
4.- Desarrollar una aplicación que me permita calcular el promedio de notas obtenidos por los alumnos. Cuando el usuario ingrese la Nota 3 el botón de comando btncalcular se debe habilitar.

5.- Desarrollar la siguiente aplicación

Fu ci 
   

d L

gu j

Tipos de Datos Operadores Variables Sentencias Condicionales Bucles

Página 12

Programación Windows

Tipo de Datos
El tipo de datos de un elemento de programación hace referencia a la clase de datos que puede contener y a cómo se almacenan los datos.

La ilustración anterior lista algunos de los tipos más utilizados en Visual Basic .NET. El t rmino con signo significa que los números pueden ser positivos o negativos, como en +48 o-48.

¿Como Escoger un Tipo de Dato?

Visual Basic no requiere que seleccione explícitamente un tipo de datos cuando declara una variable. Sin embargo, es una buena idea hacerlo, ya que de esta forma sus aplicaciones serán más fiables y requerirán menos memoria. El tipo de datos determina los valores permitidos para una variable, que, a su vez, determinan las operaciones que pueden realizarse sobre esa variable. Puede seguir las directrices generales que se muestran en la ilustración anterior para seleccionar el tipo de datos adecuado para una variable.

Página 13

Programaci

i

ows

Si usted declara variables sin tipo de datos, se les otor a de forma predeterminada el tipo de datos Object. Esto facilita la escritura rápida de pro ramas, pero puede hacer que éstos se ejecuten más lentamente. Pero con todo y con esto, la declaraci n de variables en .NET puede hacerse más extensiva, ya que podemos declarar las variables también, utilizando unos símbolos o caracteres detrás de las variables, que indiquen el tipo de variable utilizada. La si uiente tabla aclarará en al o esto que comento, y el posterior ejemplo, terminará por explicarlo de forma práctica.
Tipo de datos Short Integer Long Single Double Decimal UShort UInteger ULong Símbolo N.A. % & ! # @ N.A. N.A. N.A. Carácter S I L F R D US UI UL

Variabl s
son las Variabl s?
Utilizamos variables para almacenar valores que pueden cambiar cuando una aplicaci n se está ejecutando. Una variable tiene los si uientes elementos: Ámbito: El conjunto de todo el c di o que puede acceder y utilizar la variable. Nombre: La palabra que utilizamos para hacer referencia a la variable en c di o. Ti o e atos: El tipo y tamaño inicial de datos que la variable puede almacenar. Antes de poder utilizar variables en su aplicaci n, debe asi narles un valor. Puede asi nar un valor a una variable después de declararla o mientras la declara.

Sintaxis ara eclarar na Variable
Para declarar una variable, utilice la si uiente sintaxis:

Dim nombreVariable As Type
Utilizamos la instrucci n Dim para declarar y asi nar espacio de almacenamiento para variables en bloques, procedimientos, m dulos, estructuras y clases. Utilizamos la cláusula As en la instrucci n Dim para especificar el tipo de datos de la variable. Nota: La palabra clave Dim es una abreviatura de la palabra dimensi n.

P i

14

Programaci n
Cómo

indows

eclarar Variables
im al nombre de la variable, se uida de la palabra reservada s y el tipo de

Hemos visto que la declaraci n de una variable dentro de un procedimiento, se realiza anteponiendo la palabra reservada dato declarado. Un ejemplo sencillo sería:

Dim strMiVar As Strin
Pero hay un aspecto en la declaraci n de variables que conviene conocer, ya que este aspecto, es el diferenciador más importante entre el Visual Basic de la plataforma .NET y el Visual Basic anterior a .NET. Si declaramos un conjunto de variables de un mismo tipo y las declaramos de la forma:

Dim strMiVar1, strMiVar2, strMiVar3 As Strin
Estaremos declarando las tres variables strMiVar1, strMiVar2 y strMiVar3 como variables de tipo String. En versiones anteriores a .NET de Visual Basic, esta misma declarativa, hacía que las dos primeras variables se declararan de tipo Variant y la última de tipo String. Nota: El tipo de declaraci n Variant de versiones de Visual Basic anteriores a .NET, ya no existe. El tipo Object, es el tipo más adecuado para sustituir a este tipo de declaraci n. De todas las maneras, en Visual Basic 2005, podemos declarar una variable y asi narla un valor inicial a la hora de declarar esta variable. El si uiente ejemplo, ayudará a comprender mejor esto:

Dim strMiVar As Strin = "Ejemplo en Visual Basic 2005"
Inclusive podemos declarar variables de forma anidada y asi narle valores directamente, como por ejemplo:

Dim Val1 As Inte er = 2, Val2 As Inte er = 3, Val3 As Inte er = Val1 + Val2
Messa eBox.Show(Val3) Otra si nificaci n con la asi naci n directa o indirecta de valores es el apartado referente al trabajo con fechas. Si queremos, podemos incluir una fecha entre los caracteres #, teniendo en cuenta que la fecha debe ir en formato MES/DIA/AÑO. Sirva el si uiente ejemplo como demostraci n de esto que estamos comentando:

Dim dateVar As Date dateVar = #12/17/2005# Ms Box(dateVar)
P i

15

Programación Windows

Ámbito de una Variable
Cuando utilizamos variables, debemos asegurarnos de que son accesibles desde todas las áreas de código que hacen referencia a ellas. Por otra parte, es posible que necesite restringir el acceso a determinadas variables. Todo el conjunto de código que puede hacer referencia a una variable por su nombre se denomina ámbito (scope) de la variable.

Ejercicio Práctico Nº1:
1.- Diseñar el siguiente formulario

BtnImagen1 PictureBox1 BtnImagen2 BtnImagen3 BtnImagen4

Página 16

Programación

indows

2. Lue o codificamos lo si uiente Imports System.Drawin .Ima e Public Class Form1 Dim ruta As Strin = "Aqui pondremos la ruta donde se encuentran las imá enes unido con un \" Private Sub btnima en1_Click Me.PictureBox1.Ima e = FromFile(ruta & "nombre de la ima en con su extension") End Sub End Class 3. El codi o del evento click del boton BtnIma en1; es el mismo para los otros botones pero con imá enes diferentes.

Uso de Estructuras de ecisión
En nuestro pro rama, podemos desear que al unas secciones de su c di o se ejecuten únicamente cuando se cumpla una determinada condici n. Esto se consi ue utilizando una estructura de decisi n. Esta lecci n explica c mo utilizar las estructuras de decisi n If«Then y Select Case. Estudiaremos c mo incorporar expresiones condicionales en estas estructuras.

Cómo Utili ar Instrucciones I «T en...Else
Las instrucciones If«Then«Else son una extensi n del concepto If«Then. Utilizando un bloque If«Then«Else, podemos definir dos bloques de c di o y que nuestro pro rama ejecute uno u otro dependiendo del resultado de una condici n. Si es verdadera más de una de las condiciones de una estructura condicional, únicamente se ejecutarán las instrucciones de c di o incluidas en la primera condici n verdadera. Una instrucci n If«Then«Else incluye los si uientes componentes:  Una condici n que evalúa si es True o False  Una o más instrucciones que se ejecutan dependiendo del resultado de la prueba de la condici n  Una instrucci n End If en el caso de un bloque Para utilizar una instrucci n If«Then«Else, utilizar la si uiente sintaxis:

I condition T en statements Else statements End I

P i

17

Programación Windows
Ejercicio Práctico Nº2
1.- Diseñar el siguiente formulario

TxtUsuario TxtPassword

BtnIngresar

ProgressBar1

2.- Luego agregamos un control 3.- Codificaremos lo siguiente en los siguientes eventos: Private Sub btnIngresar_Click If Me.txtusuario.Text = "Carlos" And Me.txtpassword.Text = "123" Then Me.ProgressBar1.Visible = True Me.Timer1.Enabled = True ElseIf Me.txtusuario.Text = "David" And Me.txtpassword.Text = "456" Then Me.ProgressBar1.Visible = True Me.Timer1.Enabled = True ElseIf Me.txtusuario.Text = "Yahir" And Me.txtpassword.Text = "789" Then Me.ProgressBar1.Visible = True Me.Timer1.Enabled = True Else MsgBox("Acceso Denegado", MsgBoxStyle.Critical, "Sistema") End If End Sub Private Sub Timer1_Tick Me.ProgressBar1.Value = Me.ProgressBar1.Value + 1 If Me.ProgressBar1.Value = 100 Then Me.Timer1.Stop() MsgBox("Bienvenido al Sistema " & Me.txtusuario.Text, MsgBoxStyle.Information, "Sistema") End If End Sub

Página 18

Programación Windows

Cómo Utilizar Instrucciones Select Case
La instrucción Select Case permite a nuestra aplicación ejecutar uno o varios bloques de código dependiendo del valor de una expresión de prueba. La instrucción Select Case funciona como una compleja estructura If«Then«Else anidada, pero su mantenimiento es más sencillo. La sintaxis para la instrucción Select Case es como sigue:

Select Case testexpression [Case expressionlist-n] [statements-n1] . . . [Case Else] [elsestatement] End Select Ejercicio Práctico Nº
TxtAlu

1.- Diseñar el siguiente formulario
LstCursos

TxtNP TxtEP

LblCon TxtProm

TxtEF

2.- Codificaremos lo siguiente en los siguientes eventos: Private Sub btncalcular_Click If Me.txtalu.Text = "" Then MsgBox("Ingrese un Nombre de Alumno", MsgBoxStyle.Information, "Alumno") Exit Sub End If 'Si no se selecciono ningun elemento del ListBox If Me.lstcursos.SelectedIndex = -1 Then MsgBox("Por Favor Seleccione un Curso", MsgBoxStyle.Information, "Cursos") Exit Sub End If
Página 19

Programación

indows

Dim a As Short If Me.txtnp.Text = "" Then a=1 ElseIf Me.txtep.Text = "" Then a=2 ElseIf Me.txtef.Text = "" Then a=3 End If Select Case a Case 1 : Ms Box("In rese Nota de Prácticas", Ms BoxStyle.Information, "Nota1") Exit Sub Case 2 : Ms Box("In rese Exámen Parcial", Ms BoxStyle.Information, "Nota2") Exit Sub Case 3 : Ms Box("In rese Exámen Final", Ms BoxStyle.Information, "Nota3") Exit Sub End Select Dim n1, n2, n3, prom As Short n1 = CInt(Me.txtnp.Text) n2 = CInt(Me.txtep.Text) n3 = CInt(Me.txtef.Text) prom = (n1 + n2 + n3) / 3 Me.txtprom.Text = CStr(prom) If CInt(Me.txtprom.Text) >= 11 Then Me.lblcon.Text = "Aprobado" Me.lblcon.ForeColor = Color.Blue Else Me.lblcon.Text = "Desaprobado" Me.lblcon.ForeColor = Color.Red End If End Sub Private Sub txtnp_KeyPress 'Si la tecla que se presiona; no es un numero o no es un control If Not (Char.IsNumber(e.KeyChar) Or Char.IsControl(e.KeyChar)) Then Ms Box("Por In rese solo Numeros") 'Interrumpir el evento e.Handled = True End If End Sub Private Sub txtep_KeyPress 'Si la tecla que se presiona no es un numero; no es un numero o no es un control If Not (Char.IsNumber(e.KeyChar) Or Char.IsControl(e.KeyChar)) Then Ms Box("Por In rese solo Numeros") 'Interrumpir el evento e.Handled = True End If End Sub
P i 20

Programación

indows

Private Sub txtef_KeyPress 'Si la tecla que se presiona no es un numero; no es un numero o no es un control If Not (Char.IsNumber(e.KeyChar) Or Char.IsControl(e.KeyChar)) Then Ms Box("Por In rese solo Numeros") 'Interrumpir el evento e.Handled = True End If End Sub Private Sub txtnp_Validatin If Me.txtnp.Text < 5 Or Me.txtnp.Text > 20 Then Ms Box("Nota no Valida") Me.ErrorProvider1.SetError(Me.txtnp, "Fuera de Ran o") e.Cancel = True Else Me.ErrorProvider1.Clear() End If End Sub Private Sub txtep_Validatin If Me.txtep.Text < 5 Or Me.txtep.Text > 20 Then Ms Box("Nota no Valida") Me.ErrorProvider1.SetError(Me.txtep, "Fuera de Ran o") e.Cancel = True Else Me.ErrorProvider1.Clear() End If End Sub Private Sub txtef_Validatin If Me.txtef.Text < 5 Or Me.txtef.Text > 20 Then Ms Box("Nota no Valida") Me.ErrorProvider1.SetError(Me.txtef, "Fuera de Ran o") e.Cancel = True Else Me.ErrorProvider1.Clear() End If End Sub

Bucles
Es probable que necesite frecuentemente repetir la ejecuci n de un bloque de c di o hasta que se cumpla una determinada condici n en los pro ramas que desarrolle. Para repetir la ejecuci n de un bloque de c di o en Visual Basic .NET, es conveniente utilizar estructuras de bucle condicionales. Esta lecci n describe c mo utilizar bucles condicionales para decidir si ejecutar o no c di o y cuándo hacerlo. Esta lecci n también describe c mo decidir el uso de una instrucci n Exit para salir de un bucle.

P i

21

Programación

indows

Cómo Utili ar Instrucciones or«Next
Podemos utilizar un bucle For«Next cuando conocemos el número de veces que es necesario que se ejecute un bucle. Una instrucci n For«Next repite un conjunto de instrucciones un número específico de veces. Un bucle For«Next se ejecuta un determinado número de veces fijado por un contador de bucles. El valor del contador de un bucle For«Next puede incrementarse o disminuir dependiendo de si step es positivo o ne ativo. La sintaxis de una instrucci n For«Next es la si uiente:

or counter = start To end [Step step [statements [Exit For Next [counter

Cómo Utili ar Instrucciones or Each«Next
Una instrucci n For Each«Next ejecuta un bloque de instrucciones para cada elemento de una colecci n o una matriz. Una colecci n es un conjunto de objetos a rupados conjuntamente y a los que se hace referencia como una unidad. La sintaxis para la instrucci n For Each«Next es la si uiente:

or Each elementvariable In collection

' Statement block to be executed for each value ' of elementvariable
Next [elementvariable Ejercicio Practico Nº
1. Diseñar el si uiente formulario
ListBox3 ListBox2

TxtNum

ListBox1

BtnCalcular BtnLimpiar

P i

22

Programación

indows

2. Codificaremos lo si uiente en los si uientes eventos: Private Sub btncalcular_Click Dim n, s, r As Inte er n = Val(Me.txtnum.Text) For s = 1 To 12 Me.ListBox2.Items.Add(s & " =") Next For r = 1 To 12 Me.ListBox3.Items.Add(n * r) Next End Sub Private Sub btnlimpiar_Click Me.ListBox2.Items.Clear() Me.ListBox3.Items.Clear() Me.txtnum.Clear() Me.txtnum.Focus() End Sub Ejercicio Practico Nº 1. Diseñar el si uiente formulario

btnLimpi

2. Codificaremos lo si uiente en los si uientes eventos: Private Sub BtnLimpiar_Click Dim con As Control For Each con In Me.Controls If TypeOf con Is TextBox Then con.Text = "" If TypeOf con Is GroupBox Then Dim con2 As Control For Each con2 In con.Controls If TypeOf con2 Is TextBox Then con2.Text = "" Next End If Next End Sub

P i

23

Programación

indows

Como Utili ar Instrucción

o «Loop

Puede utilizar instrucciones Do«Loop para ejecutar un bloque de instrucciones un número de veces indefinido dependiendo del valor de tipo bolean de una condici n. Las instrucciones pueden repetirse mientras el valor de la condici n sea True o hasta que sea True. Generalmente, la condici n es el resultado de comparar dos valores, pero también puede ser cualquier expresi n que da como resultado un valor de tipo Bolean (True o False). El bucle DO...LOOP es muy versatil. Con el se pueden crear ran variedad de bucles distintos, bucles que comprueben una condici n antes de ejecutar el bucle una vez, después de la primera ejecuci n y con conbinaciones con mientras (WHILE) que se cumple una condici n o hasta (UNTIL) que esa condicion se cumpla. la sintaxis de esta estructura es la si uiente: DO [WHILE | UNTIL (condicion)] Sentencias ..... LOOP [WHILE | UNTIL (condici n)] Vamos a tratar de explicar esta sentencia de manera pausada para que sea más fácil de entender. Lo que siempre tendremos en estos bucles es el DO y el LOOP, entre estos dos colocaremos las sentencias que queremos ejecutar en cada iteraci n del bucle. Los bucles tienen que evaluar entre cada iteraci n si se si uen ejecutando o no, para ello evalúa una condici n. Lo versátil de este bucle es que la condici n se puede expresar de muchas maneras distintas. Condición expresada al lado del ejecutarse el bucle. O: en este caso la condici n se evalúa antes de empezar a

Condición expresada al lado del LOOP: en este caso la condici n se evalúa después de ejecutarse el bucle. Tiene como diferencia principal frente al otro método que en este caso el bucle se ejecutará por lo menos una vez. Además de poder expresar la condici n en estos dos sitios también se puede construir la condici n con un enunciado mientras (WHILE o un enunciado hasta (UNTIL . Las diferencias semánticas de estas dos posibilidades se trasladan también a su manera de funcionar. Vamos a ver un par de ejemplos de este bucle para comprender su funcionamiento. El ejemplo pide constantemente el nombre del autor de la pá ina y no para hasta que el nombre sea "Castilla". También tiene el usuario la posibilidad de escribir "out", en ese caso, comprobado con un enunciado IF, se sale del bucle rompiéndolo con la sentencia EXIT DO, utilizada para romper bucles. Ejercicio Practico Nº3 1. - Diseñar el si uiente formulario En el método clic del BtnWhile
entrada = "" DO WHILE (entrada <> "Castilla") entrada = inputbox ("Dime el nombre del autor","se uridad","Castilla",2,3) if (entrada = "out") then ms box ("sal o por la puerta de atras") exit do end if
¢ ¢ ¢ ¢

BtnWhile BtnUntil

Dim entrada as Strin

P i

24

Programación Windows
LOOP El si uiente ejemplo realiza una cuenta y entre cuenta y cuenta se muestra el valor de la cuenta actual en una ventanita donde sale un bot n de Reintentar y otro de Cancelar. Si se pulsa reintentar se si ue ejecutando el bucle y si se pulsa Cancelar se sale por la puerta de atrás, de manera similar a como se salía en el ejemplo anterior, con EXIT DO. En el método clic del BtnUntil Dim cont Dim respuesta cont = 0 Do cont = cont + 1 respuesta = Ms Box(cont, 69, "Variable del bucle, con valor 6 se sale") If (respuesta = 2) Then Ms Box("Cuenta Cancelada", 16, "Cancelaste!") Exit Do End If Loop Until (cont = 6)

Funciones del Sistema y Funciones Definidas por el Usuario

P i

25

Programación Windows

Funciones Tipo Cadena
Una cadena es un dato de tipo String (Carácter); es decir se refiere a letras o letras y números, ahora veremos las funciones de cadenas mas utilizadas y posteriormente realizaremos una aplicación para que les quede mas claro, sobre las fun ciones de cadena. y Right: Obtiene de una cadena, una cantidad de caracteres empezando por la derecha: Sintaxis; Microsoft.VisulBasic.Right(Cadena,N) y Left: Obtiene de una cadena, una cantidad de caracteres empezando por la izquierda: Sintaxis; Microsoft.VisulBasic.Left(Cadena,N) y Mid: Obtiene de una cadena, una cantidad de caracteres a partir de una posición determinada: Sintaxis; Microsoft.VisulBasic.Mid(Cadena,N) y Len: Obtiene la longitud de una cadena, es decir la cantidad de caracteres que contiene incluyendo los espacios en blanco: Sintaxis; Len(Cadena) y Trim: Quita los espacios en blanco al final de una cadena: Sintaxis; Trim(Cadena) y RTrim: Quita los espacios en blanco al final de una cadena: Sintaxis; RTrim(Cadena) y LTrim: Quita los espacios en blanco al inicio de una cadena: Sintaxis; LTrim(Cadena) y UCase: Convierte una cadena en mayúsculas: Sintaxis; UCase(Cadena) y LCase: Convierte una cadena en minúsculas: Sintaxis; LCase(Cadena) y StrConv: Convierte una cadena en 3 formas diferentes, en mayúsculas = 1, minúsculas = 2, la primera letra de cada palabra en mayúsculas = 3 : Sintaxis; StrConv(Cadena,Valor) y InStr: Obtiene un número que indica la posición de una subcadena dentro de una cadena: Sintaxis; InStr(Cadena,SubCadena) Ejercicio Práctico Nº1 1.- Diseñar el siguiente formulario

2.- Luego codificaremos lo siguiente.
Página 26

Programación Windows
btnMuestra (Evento Click) Me.lblLon itud.Text = Len(Trim(Me.txtFrase.Text)) Me.lblPrimero.Text = Microsoft.VisulBasic.Left(Trim(Me.txtFrase.Text), 1) Me.lblUltimo.Text = Microsoft.VisulBasic.Ri ht(Trim(Me.txtFrase.Text), 1) Me.lblSe Sex.Text = Microsoft.VisulBasic.Mid(Trim(Me.txtFrase.Text), 2, 5) Me.lblPosA.Text = InStr(Me.txtFrase.Text, "a") Me.lblMinusculas.Text = LCase(Me.txtFrase.Text) Me.lblMayusculas.Text = UCase(Me.txtFrase.Text) Me.lblSoloPrim.Text = StrConv(Me.txtFrase.Text, 3) BtnNuevo_Click Me.txtFrase.Text = "" Me.lblLon itud.Text = "" Me.lblMayusculas.Text = "" Me.lblMinusculas.Text = "" Me.lblPosA.Text = "" Me.lblPrimero.Text = "" Me.lblSe Sex.Text = "" Me.lblSoloPrim.Text = "" Me.lblUltimo.Text = "" Me.txtFrase.Focus() btnSalir (Evento Click) Me.Close()

P i

27

Programación Windows

Funciones Cronológicas

TxtFec aSi TxtHoraSis
£

Ejercicio Práctico Nº2 1.- Diseñar el siguiente formulario
TxtN

BtnDif BtnNumM

TxtDI TxtFec aIn TxtFec aConv
£ £

Página 28

£

DtpFec

Programación Windows
2.- Lue o codificaremos lo si uiente
Private Sub btnverfecha_Click 'Fecha del Sistema Me.txtfechasis.Text = FormatDateTime(Today, DateFormat.Lon Date) End Sub Private Sub btnverhora_Click 'Hora del Sistema Me.txthorasis.Text = TimeOfDay End Sub Private Sub btnFechaNueva_Click 'Incrementar una Fecha Me.txtNF.Text = FormatDateTime(DateAdd(DateInterval.Day, CInt(Me.txtDI.Text), Today), DateFormat.Lon Date) End Sub Private Sub btndife_Click 'Diferencia entre Fechas Ms Box("Han pasado " & DateDiff(DateInterval.Month, Me.dtpFecha.Value, Today) & " meses " & vbCrLf & _ "desde la fecha " & FormatDateTime(Me.dtpFecha.Value, DateFormat.ShortDate) & " hasta hoy") End Sub Private Sub btnNumMes_Click 'Extraer parte de una Fecha Ms Box("El Numero de Mes de la Fecha Ele ida es " & DatePart(DateInterval.Month, Me.dtpFecha.Value)) End Sub Private Sub btnconvertir_Click 'Convertir un Caracter en Fecha Me.txtfechaconver.Text = DateValue(Me.txtfechain .Text) End Sub
¤ ¤ ¤ ¤ ¤ ¤

Procedimientos Sub
Un procedimiento Sub ejecuta acciones, pero no devuelve nin ún valor. Puede tomar ar umentos, como constantes, variables o expresiones, que le pasa el c di o de llamda. La sintaxis para declarar un procedimiento Sub es la si uiente: eclarción: [ Public | Private | Friend ] Sub <Nombre Subrutina> ([Lista de Parámetros]) <Sentencias> [Exit Sub] End Sub

P i

29

Programación Windows Procedmientos unction
Un procedimiento Function consiste en una serie de instrucciones de Visual Basic delimitadas por las instrucciones Function y End Function. Cada vez que se llama a un procedimiento de este tipo, se ejecutan las instrucciones de éste, desde la primera instrucci n ejecutable. La sintaxis para declarar un procedimiento Function es la si uiente: [ Public | Private | Friend ] Function <Nombre Funci n> ([Lista de Parámetros]) As <Tipo de Dato> <Sentencias> [Exit Function] End Function Ejercicio Practico Nº 1.- A re ar una clase la cual se llamara CLSOPERACIONES
Public Class clsoperaciones Public Function promedio(ByVal nota1 As Short, ByVal nota2 As Short, ByVal nota3 As Short) As Short promedio = (nota1 + nota2 + nota3) / 3 End Function
¥ ¥ ¥ ¦

Public Function parimpar(ByVal numero As Inte er) As Strin If numero Mod 2 = 0 Then parimpar = "Es par" Else parimpar = "Impar" End If End Function
¥ ¥

Public Function hipotenusa(ByVal ladoA As Sin le, ByVal ladoB As Sin le) As Sin le hipotenusa = Math.Sqrt(Math.Pow(ladoA, 2) + Math.Pow(ladoB, 2)) End Function Public Sub limpiar(ByVal frm As Form) Dim con As Control For Each con In frm.Controls If TypeOf con Is TextBox Then con.Text = "" If TypeOf con Is GroupBox Or TypeOf con Is Panel Then Dim con2 As Control For Each con2 In con.Controls If TypeOf con2 Is TextBox Then con2.Text = "" If TypeOf con2 Is GroupBox Or TypeOf con2 Is Panel Then Dim con3 As Control For Each con3 In con2.Controls If TypeOf con3 Is TextBox Then con3.Text = "" Next End If Next End If Next End Sub End Class

2.- Lue o A re aremos un Modulo y codificaremos lo si uiente.
¦ ¦ ¦

Public obj As New clsoperaciones

P i

30

Programación Windows
3. - Diseñaremos los siguientes formularios.

Private Sub BtnCalcular_Click Me.Label1.Text = obj.promedio(Me.txtN1.Text, Me.txtN2.Text, Me.txtN3.Text) End Sub

Private Sub BtnConsultar_Click Me.Label1.Text = obj.parimpar(Me.TextBox1.Text) End Sub Private Sub BtnCalcular_Click Dim num1, num2, hipo As Single num1 = InputBox("Ingrese lado A del Triangulo: ") num2 = InputBox("Ingrese lado B del Triangulo: ") hipo = obj.hipotenusa(num1, num2) MessageBox.Show("La Hipotenusa del Triangulo rectángulo es " & hipo) End Sub Private Sub BtnLimpiar_Click obj.limpiar(Me) End Sub

Sub habilitar(ByVal sw As Boolean) Me.Button1.Enabled = sw Me.Button2.Enabled = Not sw Me.Button3.Enabled = sw Me.Button4.Enabled = Not sw Me.Button5.Enabled = sw Me.Button6.Enabled = Not sw Me.Button7.Enabled = sw End Sub Button1 Private Sub Button6_Click habilitar(True) End Sub Private Sub Button7_Click habilitar(False) End Sub

Button2 Button3

Button4

Button5

Button6

Button7

Página 31

Programación Windows

Mane o de Colecciones Arre los, Array ist, HashTable y Sorted ist 
Recorrido de un ArrayList con el IEnumerator  Recorrido de un HashTable con el IDictionaryEnumerator

rreglos
rrays
Una de las formas en las que podemos a rupar varios datos es mediante los arrays (o matrices). Usando un array, podemos acceder a cualquiera de los valores que tenemos almacenado mediante un índice numérico. Por ejemplo, si tenemos la variable discografía y queremos acceder al tercer disco, podríamos hacerlo de la si uiente forma: discografía(3 . Sabiendo esto, podemos comprobar que sería fácil recorrer el contenido de los arrays mediante un bucle For. ué tipos de datos se pueden usar para crear arrays? Los tipos de datos de las variables usadas como array, pueden ser de cualquier tipo, dependiendo de lo que queramos uardar. Por ejemplo, si queremos uardar los nombres de los discos que tenemos, podemos usar un array del tipo Strin

eclarar Variables Como rrays Para poder indicarle al VB que nuestra intenci n es crear un array podemos hacerlo de dos formas distintas, para este ejemplo crearemos un array de tipo Inte er: 1- La clásica (la usada en versiones anteriores) Dim a() As Inte er 2- La nueva forma introducida en .NET: Dim a As Inte er()

P i

32

Programación Windows
Reservar Memoria Para Un rray Para poder hacerlo tenemos que usar la instrucci n ReDim:

ReDim a(5)
Al ejecutarse este c di o, tendremos un array con capacidad para 6 elementos. Y son seis y no cinco, (como por l ica habría que esperar), porque en .NET Framework el índice menor de un array siempre es cero y en Visual Basic, el índice superior es el indicado entre paréntesis. Por tanto el array a tendrá reservada memoria para 6 valores de tipo Inte er, los índices serían desde 0 hasta 5 ambos inclusive. Además de usar ReDim, que realmente sirve para "redimensionar" el contenido de un array, es decir, para volver a dimensionarlo o cambiarlo por un nuevo valor. Si sabemos con antelaci n el tamaño que contendrá el array, podemos hacerlo de esta forma:

Dim a(5) s Integer
Con este c di o estaríamos declarando la variable a como un array de 6 elementos (de 0 a 5) del tipo Inte er. Cuando indicamos la cantidad de elementos que contendrá el array no podemos usar la se unda to forma de declaraci n que te mostré anteriormente: Dim a As Inte er(5) ya que es produciría un error sintáctico. signar Valores Un rray Para asi nar un valor a un elemento de un array, se hace de la misma forma que con las variables normales, pero indicando el índice (o posici n) en el que uardará el valor. Por ejemplo, para almacenar el valor 15 en la posici n 3 del array a, haríamos lo si uiente:

a(3) = 5
Acceder A Un Elemento De Un Array De i ual forma, si queremos utilizar ese elemento que está en la posici n 3 para una operaci n, podemos hacerlo como con el resto de las variables, pero siempre usando el paréntesis y el número de elemento al que queremos acceder:

i = b * a(3)
Los Límites De Los Índices De Un Array Como ya he comentado antes, el índice inferior de un array, siempre es cero, esto es invariable, todos los arrays de .NET Framework empiezan a contar por cero. Pero el índice superior puede ser el que nosotros queramos, aunque sin pasarnos, que la memoria disponible se puede a otar si pretendemos usar un valor exa eradamente alto. Realmente el índice superior de un array es 2^64 -1 (el valor máximo de un tipo Lon )

P i

33

Programación Windows
Iniciali ar Un Array Al Declararla Al i ual que las variables normales se pueden declarar y al mismo tiempo asi narle un valor inicial, con los arrays también podemos hacerlo, pero de una forma diferente, ya que no es lo mismo asi nar un valor que varios. Aunque hay que tener presente que si inicializamos un array al declararla, no podemos indicar el número de elementos que tendrá, ya que el número de elementos estará supeditado a los valores asi nados. Para inicializar un array debemos declarar ese array sin indicar el número de elementos que contendrá, se uida de un si no i ual y a continuaci n los valores encerrados en llaves. Veamos un ejemplo:
Dim a() As Integer = {1, 42, 15, 90, 2}

También podemos hacerlo de esta otra forma:
Dim a As Integer() = {1, 42, 15, 90, 2}

Usando cualquiera de estas dos formas mostradas, el número de elementos será 5, por tanto los índices irán desde 0 hasta 4. Los Arrays Pueden Ser De Cualquier Tipo En todos estos ejemplos estamos usando valores de tipo Inte er, pero podríamos hacer lo mismo si fuesen de tipo Strin o cualquier otro. En el caso de que sean datos de tipo Strin , los valores a asi nar deberán estar entre comillas dobles o ser variables de tipo Strin . Por ejemplo:

Dim s As String() = {"Hola", "Mundo, ", "te", "saludo"}
Cambiar El Tamaño De Un Array Y Mantener Los Elementos tenemos la si uiente declaraci n: ue Tuviera.

Para poder conse uirlo, debemos usar ReDim se uida de la palabra clave Preserve, por tanto si

Dim a() As Integer = { , , 3, , 5}
Y queremos que en lu ar de 5 elementos (de 0 a 4) ten a, por ejemplo 10 y no perder los otros valores, usaremos la si uiente instrucci n:

ReDim Preserve a(10)

P i

34

Programación Windows
A partir de ese momento, el array tendrá 11 elementos (de 0 a 10), los 5 primeros con los valores que antes tenía y los nuevos elementos tendrán un valor cero, que es el valor por defecto de los valores numéricos. Si s lo usamos ReDim a(10), también tendremos once elementos en el array, pero todos tendrán un valor cero, es decir, si no se usa Preserve, se pierden los valores contenidos en el array. Eliminar Un Array De La Memoria. Si en al ún momento del pro rama queremos eliminar el contenido de un array, por ejemplo para que no si a ocupando memoria, ya que es posible que no si a ocupando memoria, podemos usar Erase se uida del array que queremos "limpiar", por ejemplo:

Erase a
Esto eliminará el contenido del array a. Si después de eliminar el contenido de un array queremos volver a usarlo, tendremos que ReDimensionarlo con el mismo número de dimensiones que tenía, ya que Erase s lo borra el contenido, no la definici n del array.

Ejercicio Practico Nº1
1.- Diseñar el si uiente formulario

TxtNombres BtnAgregar BtnMostrar BtnLimpiar

LstNombres

P i

35

Programación Windows
Public Class Form1 Dim nombres(0) As Strin Private Sub btna re ar_Click If Me.txtnombre.Text.Trim <> "" Then nombres(UBound(nombres)) = Me.txtnombre.Text ReDim Preserve nombres(UBound(nombres) + 1) Ms Box("Guardado ...!", Ms BoxStyle.Information, "Arre los") Me.txtnombre.Clear() Me.txtnombre.Focus() Else Ms Box("Por Favor In rese un Nombre", Ms BoxStyle.Information, "Arre los") Me.txtnombre.Clear() Me.txtnombre.Focus() End If End Sub Private Sub btnmostrar_Click Dim x As Inte er For x = 0 To UBound(nombres) - 1 Me.lstnombres.Items.Add(nombres(x)) Next ReDim nombres(0) End Sub Private Sub btnlimpiar_Click Me.lstnombres.Items.Clear() End Sub End Class

Estructuras
Podemos combinar elementos de datos de distintos tipos para crear una combinaci n de tipos de datos única denominada estructura. Las estructuras resultan útiles cuando deseamos que una única variable uarde varias piezas de informaci n relacionadas. Después de declarar una estructura, podemos declarar variables de ese tipo. Definición.-Una estructura es una combinaci n de tipos de datos que se crea combinando otros tipos de datos. Las estructuras son de tipo valor (es decir, una variable de tipo estructura contiene los datos de la estructura, en lu ar de una referencia a los datos como hace el tipo referencia). Las estructuras pueden tener datos, propiedades, métodos y procedimientos y pueden invocar y manipular eventos.

Ejemplo
P i 36

Programación Windows
El uso más simple y habitual de las estructuras es encapsular variables relacionadas, creando un tipo de datos definido por el usuario. Por ejemplo, es posible que deseemos guardar juntos el nombre, fecha de contratación, cargo y salario de un empleado. Podríamos utilizar varias variables para esta información, o podemos definir una estructura y utilizarla como la variable deun único empleado. La ventaja de la estructura se hace patente cuando tiene muchos empleados y, por tanto, muchas instancias de la variable. El siguiente ejemplo muestra una estructura Employee simple: Public Structure Employee Public FirstName As String Public LastName As String Public HireDate As Date Public JobTitle As String Private Salary As Decimal End Structure

Cómo Declarar Estructuras

Cómo Utilizar Las Estructuras

Página 37

Programación Windows
Ejercicio Practico Nº 1.- A re ar un Modulo a la aplicaci n y escribir el si uiente c di o. Module Module1 'Declaramos la estructura Public Structure DatosAlumnos Public codi o As Inte er Public nombre As Strin Public curso As Strin Public promedio As Inte er End Structure 'Declaramos un arrays que me almacenen los valores Public alumnos(0) As DatosAlumnos End Module 2.- Lue o diseñar el si uiente formulario
txtnombr txtcurso txtpromedi

3.- En el evento click del bot n btna re ar codificaremos lo si uiente
btnagrega btnconsultar Private Sub btna re ar_Click 'Declarar una variable para manipular la estructura Dim mialumno As DatosAlumnos 'Asi nar valores a la estructura With mialumno .codi o = UBound(alumnos) + 1 .nombre = txtnombre.Text .curso = txtcurso.Text .promedio = txtpromedio.Text End With 'A re ar valores al arrays de la estructura alumnos(UBound(alumnos)) = mialumno 'Redimensionar la matriz manteniendo la los valores ReDim Preserve alumnos(UBound(alumnos) + 1) 'Mostrar mensaje de Datos A re ados Ms Box("Datos A re ados...", Ms BoxStyle.Information, "Alumnos") 'Limpiamos las cajas de textos txtnombre.Text = "" txtcurso.Text = "" txtpromedio.Text = "" txtnombre.Focus() End Sub

Private Sub btnconsultar_Click Frmconsulta.Show() End Sub
P i 38

Programación Windows
4.- Luego diseñaremos el siguiente formualrio. 5.- Luego en el evento load del formulario frmconsulta. Private Sub Frmconsulta_Load Frminscribir.Hide() End Sub
txtpromed Private Sub btnconsultar_Click Dim mialumno As DatosAlumnos Dim x As String = txtconsulta.Text btnconsult mialumno = alumnos(x - 1) txtcodigo.Text = mialumno.codigo txtnombre.Text = mialumno.nombre txtcurso.Text = mialumno.curso txtpromedio.Text = mialumno.promedio txtconsulta.Text = "" txtconsulta.Focus() End Sub Private Sub btninscribir_click Frminscribir.Show() Me.Close() End Sub txtconsul txtcodi txtnomb txtcurs btninscrib

Manejo de ArrayList
Esta es una colección donde podemos guardar cualquier tipo de objeto. Su método ArrayList.Add() acepta el tipo object, por lo cual podemos coleccionar enteros, cadenas, listboxes, botones, y casi cualquier cosa que se nos ocurra« El acceso a sus elementos se logra por medio de la posición o índice. Podemos utilizar su propiedad ArrayList.Count para preguntarle a la colección cuantos elementos tiene Esta clase permite la creación y manipulación de arrays cuyo tamaño puede ser modificado dinámicamente.

Página 39

Programación Windows
Este mejora comportamiento el rendimiento del y

objeto tiene la ventaja de que optimiza recursos, puesto que cada vez que añadimos o eliminamos valores, el array items no siempre tiene que ser redimensionado. ¿Qué sucede, sin embargo, cuando se han añadido valores y el array está completo?, pues que el objeto ArrayList detecta esta situación y en la siguiente ocasión en que se añade un nuevo valor, se automáticamente

redimensiona duplicando el número de elementos inicial que nuevo contenía. un Veamos esquema de de

funcionamiento.

Borrado de Elementos en una Colección Arraylist
Para realizar un borrado de valores, la clase ArrayList proporciona los métodos descritos a continuación. ‡ Remove(Valor). Elimina el elemento del array que corresponde a Valor. ‡ RemoveAt(Posicion). Elimina el elemento del array situado en el índice Posición. ‡ RemoveRange (Posición Elementos). Elimina el conjunto de elementos indicados en el parámetro Elementos, comenzando por el índice Posición. ‡ Clear ( ). Elimina todos los elementos del objeto.

Página 40

Programación Windows

IEnumerator
Un objeto enumerador pertenece al interfaz IEnumerator, diseñado para realizar un recorrido o iteraci n a través de uno de los diferentes tipos de colecci n (arrays incluidos) existentes en .NET Framework. Mediante el método GetEnumerator( ) de un objeto array, obtenemos un objeto que implementa el interfaz Ienumerator, que s lo puede realizar labores de lectura sobre el array, en nin ún caso de modificaci n. La estructura de control utilizada para recorrer el array, puede ser indistintamente un bucle For...Next, For Each...Next, o la novedosa técnica de los objetos enumeradores proporcionados por el objeto array.

Ejercicio Práctico Nº3
1.- Diseñar el si uiente formulario. 2.- Codificaremos lo si uiente: Public Class Form1 'Declaramos nuestro ArrayList Dim lista As New ArrayList() Private Sub Form1_Load 'A re amos elementos a nuestro ArrayList lista.Add("Lima") lista.Add("Lambayeque") lista.Add("Trujillo") lista.Add("Tacna") lista.Add("Arequipa") lista.Add("Puno") End Sub
TxtTot TxtCiud CboCiuda

Private Sub btnordenar_Click If Me.cbociudad.Items.Count <> 0 Then Me.cbociudad.Items.Clear() 'Sirve para ordenar los elementos de un ArrayList lista.Sort() 'Declaramos nuestro IEnumerator Dim recorrer As IEnumerator recorrer = lista.GetEnumerator While recorrer.MoveNext 'A re a el elemento actual del Array Me.cbociudad.Items.Add(recorrer.Current) End While Else Ms Box("Primero debe de Car ar las Ciudades", Ms BoxStyle.Information, "ArrayList") End If End Sub

P i

41

Programación Windows
Private Sub btnVer_Click 'Muestra el Total de Elementos del ArrayList Me.txtTotal.Text = lista.Count End Sub Private Sub btncar ar_Click Me.cbociudad.Items.Clear() 'Car amos el combo con un For For x As Inte er = 0 To lista.Count - 1 Me.cbociudad.Items.Add(lista(x)) Next End Sub Private Sub btnenumerador_Click Me.cbociudad.Items.Clear() 'Car amos el Combo con un IEnumerator Dim recorrer As IEnumerator 'Asi na el numero de elementos de mi ArrayList recorrer = lista.GetEnumerator While recorrer.MoveNext Me.cbociudad.Items.Add(recorrer.Current) End While End Sub Private Sub btnlimpiar_Click 'Elimina los elementos del Combo Me.cbociudad.Items.Clear() End Sub Private Sub btncapacidad_Click 'Muestra la capacidad de almacenamiento del ArrayList Ms Box(lista.Capacity) End Sub Private Sub btna re ar_Click 'A re ar un elemento al ArrayList lista.Add(Me.txtciudad.Text) End Sub End Class

P i

42

Programación Windows

La Clase HashTable
Esta clase tiene la particularidad de que el acceso a los valores del array que estiona internamente se realiza a través de una clave asociada a cada elemento, al estilo de los objetos Dictionary de versiones anteriores de VB. Como dato si nificativo, esta clase implementa el interfaz IDictionary, por lo que si hemos utilizado anteriormente objetos Dictionary, ya conocemos ran parte de su filosofía de trabajo. En este tipo de colecci n no es necesario preocuparse por la posici n o índice de los elementos, ya que accedemos a ellos a través de literales, lo cual en al unas circunstancias es mucho más c modo de manejar. Respecto a la asi naci n de valores a la colecci n, esta clase utiliza el método Add( ), cuyo primer parámetro corresponde a la clave del elemento y el se undo corresponde al valor que vamos a asi nar a la posici n de su array. Las propiedades Keys y Values de la clase Hashtable, devuelven un array con los nombres de las claves y los valores de un objeto Hashtable respectivamente.

Manejo del IDictonaryEnumerator
Si queremos recorrer el array al completo contenido en el objeto, podemos utilizar el método GetEnumerator( ), que nos devuelve un enumerador para poder obtener todos los valores del objeto en un bucle. La diferencia con los otros al oritmos de recorrido que hemos visto anteriormente, es que al estar la colecci n Hashtable basada en una combinaci n de clave/valor, necesitamos un enumerador basado en el interfaz IDictionaryEnumerator, especialmente adaptad para manipular o arrays de este tipo. Como habrá comprobado el lector, un enumerador IDictionaryEnumerator proporciona la informaci n de la colecci n mediante las propiedades Key y Value, a diferencia de un enumerador simple, basado en IEnumerator, en el que usamos la propiedad Current, para extraer los datos. La clase Hashtable no sitúa los valores que se añaden al array en posiciones consecutivas, por lo que al obtener los valores mediante un enumerador posiblemente no aparecerán en el mismo orden en el que los añadimos inicialmente. Dada la filosofía de funcionamiento de este tipo de objetos, el orden en el que se raban los valores dentro del array no debería ser un problema, ya que nosotros accedemos al array utilizando claves y no índices, como sucede en un array estándar.

P i

43

Programación Windows
Ejercicio Práctico Nº
1.- Diseñar el Si uiente Formulario:
TxtCod

TxtNom LstCod LstNom

2.- Codificaremos lo si uiente: Public Class Form2 'Declaramos un objeto HashTable Dim clientes As New Hashtable Private Sub btn uardar_Click 'A re amos elementos a nuestro HashTable 'Le asi namos un codi o y un valor para cada elemento in resado clientes.Add(Me.txtcod.Text, Me.txtnom.Text) Ms Box("Datos Guardados!...", Ms BoxStyle.Information, "HashTable") Me.txtcod.Clear() Me.txtnom.Clear() Me.txtcod.Focus() End Sub Private Sub btnmostrar_Click 'Recorremos el HashTable con el IDictonaryEnumerator 'Y cada elemento recorrido lo a re amos en los 'dos ListBoxs Dim RECO As IDictionaryEnumerator RECO = clientes.GetEnumerator While RECO.MoveNext Me.lstcod.Items.Add(RECO.Key) Me.lstnom.Items.Add(RECO.Value) End While End Sub End Class

La Clase SortedList
Esta clase es una variaci n de Hashtable, ya que nos permite crear colecciones basadas en pares de claves y valor, pero con la diferencia de que en una colecci n SortedList, los elementos se ordenan por la clave se ún van siendo a re ados. El funcionamiento eneral, es básicamente i ual que para los objetos Hashtable.

P i

44

Programación Windows
Ejercicio Práctico Nº5
1.- Diseñar el si uiente formulario
§

2.- Codificaremos lo si uiente: Public Class Form3 'Declaramos nuestro SortedList Dim letras As New SortedList Private Sub Form3_Load 'A re amos valores letras.Add("H", 111) letras.Add("A", 222) letras.Add("J", 333) letras.Add("Z", 444) letras.Add("M", 555) End Sub

ListVie 1

Private Sub BtnMostrar_Click 'Recorremos los elementos del SortedList y lo a re aremos al ListView Dim reco As IDictionaryEnumerator reco = letras.GetEnumerator While reco.MoveNext Dim lst As New ListViewItem(reco.Key.ToStrin ) lst.SubItems.Add(reco.Value.ToStrin ) Me.ListView1.Items.Add(lst) End While

Mane o de Hilos (Threads) y Componente BackGroundWorker 
Definici n de un Threadin  Componente Back roundWorker  Práctica de Laboratorio de Hilos

P i

45

Programación Windows

Manejo de THREADS (Hilos)
Todas las aplicaciones se ejecutan en un Thread (o hilo de ejecuci n). Pero cada aplicaci n puede tener más de un Thread al mismo tiempo, es decir se pueden estar haciendo varias cosas a un mismo tiempo. En Visual Basic.Net, a diferencia de las versiones anteriores, se pueden crear Threads para que podamos realizar diferentes tareas a un mismo tiempo, el uso o no de Threads lo decidirás tú, ya no es al o que no podamos hacer aunque quisiéramos. Cuando se define un nuevo Thread, lo que hay que hacer es indicarle al compilador cual será el procedimiento que queremos usar de forma paralela al resto de la aplicaci n. Este procedimiento debe ser obli atoriamente del tipo SUB. La ventaja principal de los Threads es tener varias actividades ocurriendo en forma simultánea, lo cual es una ran posibilidad para que los desarrolladores puedan trabajar con varios procesos sin perjudicar otras tareas. Por ejemplo, el usuario puede interactuar con la aplicaci n mientras se va ejecutando una consulta de miles de re istro. Se recomienda el uso de Threads en las si uientes situaciones: Para comunicaciones sobre una red, servidor Web o Servidor de Base de Datos. Al ejecutar operaciones que demoren bastante tiempo. Para mantener siempre disponible la comunicaci n entre el usuario y la interface mientras se van ejecutando tareas en se undo plano, etc.

Implementación de Threads
Para implementar Threads se usa el namespace: ³System.Threading.Thread´ y lue o se hace uso de los métodos que se definen a continuaci n:
y

Start : Inicia un Thread, el cual es un proceso de llamada asíncrona. Para saber el estado del Thread hay que usar las propiedades ThreadState y IsAlive. Abort: Cancela un Thread iniciado, si deseamos saber el estado nuevamente podemos usar las propiedades ThreadState y IsAlive. Sleep: Ocasiona una pausa en milise undos del bloque de instrucciones. Suspend: También ocasiona una pausa en el bloque de instrucci n. Resume: Reinicia una pausa ori inada con el método Suspend. Interrupt: Interrumpe una pausa ori inando una exepci n. Join: Espera por un Thread.

y

y y y y y

P i

46

Programación Windows
Ejercicio Práctico Nº1
1.- Diseñar el siguiente formulario. 2.- Codificaremos lo siguiente. 'Importamos el namespace para Trheading Imports System.Threading Public Class Form1 'Creamos 2 procedimientos Public Sub Calculo_1() Dim res As Long For I As Integer = 0 To 100000 res = res + I Next MessageBox.Show("Calculo_1 " & res) End Sub Public Sub Calculo_2() Dim res As Long For I As Integer = 0 To 500 res = res + I Next MessageBox.Show("Calculo_2 " & res) End Sub Private Sub BtnComenzar_Click 'Creamos 2 variables de tipo Threading Dim hilo1 As New Thread(AddressOf Calculo_1) Dim hilo2 As New Thread(AddressOf Calculo_2) 'Ejecutamos los 2 procesos hilo1.Start() hilo2.Start() End Sub End Class

BackgroundWorker
Para solucionar el problema anterior el Framework 2.0 trae una clase muy util que encapsula bastante código que hasta ahora teníamos que escribir nosotros. Se trata de BackgroundWorker. Su uso es sencillo, y se basa en eventos. Los eventos que expone son los si uientes: g

Página 47

Programación Windows
Evento curre Cuando... ...se solicita la ejecución de una tarea. Dentro del event handler asociado a este evento debe encontrarse el código a ejecutar en otro hilo. Solo ocurre DoWork cuando se ejecuta el método RunWorkerAsync() (de hecho ese método lo unico que hace es lanzar el evento y arreglar las cosas para que se ejecute en otro hilo). ProgressChanged RunWorkerCompleted ...se reporta un progreso en el trabajo. ...se terminó la ejecución de la tarea. La terminación puede deberse a que la ejecución se completó o a que esta fue cancelada.

A traves del método RunWorkerAsync() le indicamos al BackgroundWorker que se debe iniciar la ejecución de una tarea. Imediatamente luego de su ejecución, se produce el evento DoWork, y es ahi donde debemos indicarle que hacer. Durante la ejecución podemos utilizar el método ReportProgress() para lanzar el evento ProgressChanged, el cual podemos utilizar para actualizar un contador, una barra de progreso o simplemente para hacer alguna otra tarea. Si lo deseamos podemos utlizar el método CancelAsync() para cancelar la ejecución de la tarea, pero cabe aclarar que la simple ejecución del método no cancela la tarea sino que setea en true la propiedad CancellationPending del BackgroundWorker. Nosotros vam a ser los encargados de os monitorear a esta bandera y cancelar el trabajo nosotros mismos. Una vez terminada la ejecución de la tarea se lanza el evento RunWorkerCompleted. El delegado de evento posee un argumento del tipo RunWorkerCompletedEventArgs quenos ayudará a determinar si la tarea fue cancelada o no y cual fue su resultado. El código que acompaña a este artículo tiene una pequeña aplicacion que simula realizar una tarea pesada y reporta su estado cada tanto. Obviamente su funcionamiento se basa n el e BackgroundWorker.

Ejercicio Práctico Nº2
1.- Diseñar el siguiente formulario

Página 48

Programación Windows
2.- Codificaremos lo si uiente. Imports System.ComponentModel Public Class Form2 Public Sub Calculo_1(ByVal hilotr1 As Back roundWorker, ByVal e As DoWorkEventAr s) Dim res As Lon For I As Inte er = 0 To 100000 res = res + I Next Messa eBox.Show("Calculo_1 " & res) End Sub Public Sub Calculo_2(ByVal hilotr2 As Back roundWorker, ByVal e As DoWorkEventAr s) Dim res As Lon For I As Inte er = 0 To 500 res = res + I Next Messa eBox.Show("Calculo_2 " & res) End Sub Private Sub BtnComenzar_Click Me.Back roundWorker1.RunWorkerAsync() Me.Back roundWorker2.RunWorkerAsync() Dim x As Inte er = 0 End Sub Private Sub Back roundWorker1_DoWork Dim hilotr1 As Back roundWorker = sender Calculo_1(hilotr1, e) End Sub Private Sub Back roundWorker2_DoWork Dim hilotr2 As Back roundWorker = sender Calculo_2(hilotr2, e) End Sub End Class

Practica de Laboratorio
Implementando MultiThread y Control de Excepciones 1.- Se va a crear una aplicaci n en la que se implemente múltiples Threads para iniciar la lectura de un archivo de texto extenso y poder cancelar este proceso si es necesario. Además para evitar los errores en tiempo de ejecuci n haremos uso del control estructurado de excepciones. 2.- Diseñar el si uiente formulario.
P i

TxtNomb

TxtArchiv

49

Programación Windows
3.- Codificaremos lo si uiente: Public Class frmarchivo 'Creamos un Thread llamado Hilo Dim hilo As System.Threadin .Thread 'Crearemos el procedimiento LeerArchivo 'El cual abrira un documento de Texto Sub leerarchivo() Dim flujo As System.IO.StreamReader Dim linea As Strin = "" Try flujo = System.IO.File.OpenText(Me.txtnombre.Text) Do Until IsNothin (linea) linea = flujo.ReadLine Me.txtarchivo.Text = Me.txtarchivo.Text & linea & Chr(13) & Chr(10) Loop Catch X As IO.IOException Ms Box(X.Messa e, Ms BoxStyle.Information, "No se Pudo") Exit Sub Me.txtnombre.Clear() End Try flujo.Close() Me.btnsuspender.Enabled = False Me.btncontinuar.Enabled = False Me.btncancelar.Enabled = False End Sub Private Sub btnleer_Click 'Instanciamos un nuevo thread 'El cual llamara al procedimiento LeerArchivo hilo = New System.Threadin .Thread(AddressOf leerarchivo) 'Ejecuta el Thread hilo.Start() Me.btnsuspender.Enabled = True Me.btncancelar.Enabled = True End Sub Private Sub txtnombre_TextChan ed Me.btnleer.Enabled = Me.txtnombre.Text <> "" End Sub Private Sub btncancelar_Click 'Cancela la ejecucion del Thread hilo.Abort() Me.btnleer.Enabled = False Me.btnsuspender.Enabled = False Me.btncancelar.Enabled = False End Sub

P i

50

Programación Windows
Private Sub btnnuevo_Click Me.txtnombre.Clear() Me.txtarchivo.Clear() Me.txtnombre.Focus() End Sub Private Sub btnsuspender_Click 'Detiene la ejecucion del Thread hilo.Suspend() Me.btnleer.Enabled = False Me.btncontinuar.Enabled = True Me.btncancelar.Enabled = False End Sub Private Sub btncontinuar_Click 'Reinicia la ejecucion del Thread hilo.Resume() End Sub Private Sub BtnVerificar_Click 'Verifica el estado de ejecucion del Thread If hilo.IsAlive() Then Ms Box("En Ejecuci n", Ms BoxStyle.Information, "Vida del Threads") Else Ms Box("Termino su Ejecuci n", Ms BoxStyle.Information, "Vida del Threads") End If End Sub Private Sub btnsalir_Click Me.Close() End Sub End Class

Serialización y Deserializacion de Ob etos Administración de Archivos 
Serializaci n XML  Clase System.IO : Acceso a archivos y carpetas  StreamWriter y StreamReader

P i

51

Programación Windows

Introducción
El prop sito de este Tema es mostrar un mecanismo sencillo que permita contenidos en los controles de una forma de Windows; en una archivo xml. Para lo rar este prop sito utilizaremos la clase XmlSerializer que permite crear una representaci n XML de un objeto para efectos de almacenamiento y transporte. Esta clase permite serializaci n XML y Desearializaci n XML. La serializaci n permite crear a partir de las variables y propiedades públicas de una clase un objeto XML serializado. El método Serialize de la clase XmlSerializer permite crear un archivo XML de tipo (System.IO.StreamWriter) a partir de una clase por medio de una objeto serializado. El método Deserialize de la clase XmlSerializer permite crear objeto con la informaci n deseralizada proveniente de un archivo XML. uardar los valores

Descripción de la Seriali ación ML
La serializaci n es el proceso mediante el cual almacena el estado de un objeto en una secuencia de datos. La serializaci n permite conservar el estado de un objeto, de forma que se puede recuperar el estado posteriormente. La serializaci n permite también clonar un objeto existente para crear un nuevo objeto. El espacio de nombres System.Xml.Serialization contiene clases que se pueden utilizar para serializar objetos en XML.

Ejercicio Práctico Nº1
1.Crearemos un proyecto llamado Serializaci n de Objetos. 2.- Lue o a nuestro proyecto a re aremos una clase llamada CLSPRODUCTOS.

3.- Dentro de nuestra clase clsproductos codificaremos lo si uiente. Public Class clsproductos 'Declaracion de Variables Private vname As Strin Private vdescription As Strin Private vqty As Inte er

P i

52

Programación Windows
'Declaracion de las Propiedades Public Property nombre() As Strin Get nombre = vname End Get Set(ByVal value As Strin ) vname = value End Set End Property Public Property descripcion() As Strin Get descripcion = vdescription End Get Set(ByVal value As Strin ) vdescription = value End Set End Property Public Property cantidad() As Inte er Get cantidad = vqty End Get Set(ByVal value As Inte er) vqty = value End Set End Property End Class 4.- Lue o diseñaremos el si uiente formulario.
TxtnomPro TxtDescripcio TxtCantida BtnSerializar BtnDeSerializar

Imports System.IO 'Importamos el NameSpace que me permitira la Serializacion Imports System.Xml.Serialization Public Class Form1 'Declaramos una Variable del Tipo de La Clase ClsProductos Dim p As New clsproductos Private Sub BtnSerializar_Click 'Asi nacion de Valores Para la Clase Productos p.nombre = Me.txtnompro.Text p.descripcion = Me.txtdescripcion.Text p.cantidad = CInt(Me.txtcantidad.Text)

P i

53

Programación Windows
'Declaracion de la Variable "X" que contendra la clase Dim x As New XmlSerializer(p.GetType) 'Lugar donde se creara el archivo XML Dim archivo As New StreamWriter("C:\Producto.xml") 'Crea el archivo XML en el lugar donde se le indica 'Y la clase a Serializar x.Serialize(archivo, p) archivo.Close() MsgBox("Objeto XML creado", MsgBoxStyle.Information, "Serializacion") End Sub Private Sub BtnDeSerializar_Click Try Dim x As New XmlSerializer(p.GetType) 'Archivo XML que se Desearilizar Dim archivodes As New StreamReader("C:\Producto.xml") 'Variable que contendra la clase deserializada Dim p2 As New clsproductos 'Direccion del archivo a Deserealizar p2 = x.Deserialize(archivodes) archivodes.Close() MsgBox("Nombre:" & p2.nombre & vbCrLf & "Descripcion:" & p2.descripcion & vbCrLf & "Cantidad:" & CStr(p2.cantidad)) Catch ex As Exception MsgBox("El Archivo no Existe", MsgBoxStyle.Information, "Deserializacion") End Try End Sub End Class 5.- Al ejecutar nuestra aplicación introduciremos un nombre, descripción, y cantidad de un producto .

Página 54

Programación Windows
6.- Daremos clic en el botón Serializar objeto y nos saldrá un mensaje como el que muestra la figura.

7.- Abriremos el archivo XML creado en la unidad ³C:\´, y aparecerá el código como muestra la figura; el cual es código XML.

8.- Luego al dar clic sobre el botón Deserializar nos mostrará la información del archivo serializado anteriormente.

Página 55

Programación Windows

El NameSpace System.IO
Este NameSpace contiene todos los tipos que permiten leer y escribir en los archivos y secuencia de datos, así como tipos que proporcionan compatibilidad básica con los archivos y directorios. Al unas Clases de System.IO

Clase
Directory DirectoryInfo

Descripción
Expone métodos estáticos para crear, mover y enumerar archivos en directorios y subdirectorios Expone métodos de instancia para crear, mover y enumerar archivos en directorios y subdirectorios.

ile

Proporciona métodos estáticos para crear, copiar, eliminar, mover y abrir archivos y contribuye a la creaci n de objetos FileStream. Utilice la clase ileStream para leer, escribir, abrir y cerrar archivos en un sistema de archivos, así como para manipular otros identificadores del sistema operativo relacionados con archivos, como canalizaciones, entrada estándar y salida estándar amd. Puede especificar que las operaciones de lectura y escritura sean sincr nicas o asincr nicas. FileStream almacena en el búfer la entrada y la salida para obtener un mejor rendimiento.

FileInfo

Proporciona métodos de instancia para crear, copiar, eliminar, mover y abrir archivos y contribuye a la creaci n de objetos FileStream. Expone un objeto Stream alrededor de un archivo; se admiten operaciones de lectura y escritura sincr nica y asincr nica. Un objeto Stream proporciona una vista enérica de una secuencia de bytes. Ejecuta operaciones en instancias de Strin que contienen informaci n de rutas de archivos o directorios. Estas operaciones se ejecutan de forma adecuada para múltiples plataformas.

FileStream

Path

P i

56

Programación Windows
Ejercicio Práctico Nº 1.- Diseñar el si uiente formulario.
TxtCarpet a

2.- Lue o codificaremos lo si uiente:
'Importamos el namesapce que nos permitira 'manejar archivos, carpetas y unidades Imports System.IO Public Class Form2 'Declaro una variable para manejar Carpetas Dim carpeta As DirectoryInfo 'Declaro una variable para manejar Archivos Dim archivo As FileStream Private Sub Btncrearcarpeta_Click Try 'Codi o para crear la carpeta carpeta = Directory.CreateDirectory("C:\" & Me.txtcarpeta.Text) Ms Box("Carpeta Creada", Ms BoxStyle.Information, "Manejo de Archivos") Catch ex As Exception Ms Box("La Carpeta ya Existe", Ms BoxStyle.Critical, "Manejo de Archivos") End Try End Sub Private Sub Btncreararchivo_Click Try 'Codi o para crear el archivo archivo = File.Create("C:\" & Me.txtarchivo.Text) Ms Box("Archivo Creada", Ms BoxStyle.Information, "Manejo de Archivos") Catch ex As Exception End Try End Sub Private Sub BtnExisArchivo_Click 'Codi o de existencia de un archivo If File.Exists("C:\" & Me.txtarchivo.Text) Then Ms Box("El Archivo ya existe", Ms BoxStyle.Information) Else Ms Box("El Archivo no existe", Ms BoxStyle.Information) End If End Sub Private Sub BtnExisCarpeta_Click 'Codi o de existencia de una carpeta If Directory.Exists("C:\" & Me.txtcarpeta.Text) Then Ms Box("La Carpeta ya existe", Ms BoxStyle.Information) Else Ms Box("La Carpeta no existe", Ms BoxStyle.Information) End If End Sub End Class
¨ ¨ ¨ ¨ ¨ ¨ ¨ ¨ ¨ ¨ ¨ ¨ ¨ ¨ ¨ ¨ ¨ ¨

TxtArchivo

P i

57

Programación Windows
Ejercicio Práctico Nº 1.- Diseñar el siguiente formulario. 2.- Luego codificaremos lo siguiente: 

'Importamos el namesapce que nos permitira 'manejar archivos carpetas y unidades Imports System.IO Public Class Form Private Sub btncrear_Click 'Variable de tipo StreamWriter que me permite crear y escribir en un archivo de texto Dim archi As New StreamWriter( C:\ & Me.txtarchi.Text & ".txt") Dim texto As String texto = Me.txtTexto.Text archi.WriteLine(texto) archi.Flush() End Sub End Class 
© ©

TxtArc i

TxtTexto

Ejercicio Práctico Nº4 1.- Diseñar el siguiente formulario.
'Importamos el namesapce que nos permitira 'manejar archivos carpetas y unidades Imports System.IO Public Class Form4 Private Sub btnAbrir_Click 'Variable que capturara la direccion del archivo a abrir Dim ruta As String 'variable que contendra el texto del archivo a cargar Dim texto As String = "" 'Extension que solo podra abrir el openfiledialog Me.OpenFileDialog1.Filter = "Archivos de Texto ( .txt)| .txt" If Me.OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then 'Direccion del archivo capturado por el openfiledialog 'el cual lo contendra la variable ruta = Me.OpenFileDialog1.FileName 'Declaro mi variable que leera el archivo Dim lectura As StreamReader 'Indicamos que archivo va a leer lectura = File.OpenText(ruta) 'Que se ejecute siempre y cuando la variable texto 'contenga algo Do Until IsNothing(texto) 'Cada linea de mi archivo lo pasará a 'la variable texto texto = lectura.ReadLine 'Muestra cada línea de texto de mi archivo 'en la caja de texto Me.txtTexto.Text = Me.txtTexto.Text & texto & Chr(1 ) & Chr(10) Loop End If End Sub End Class 
   

BtnCrea

Página 58

Programación Windows

Mane o de Archivos y Envió de Mensa e por Correo Electrónico 
Creaci n de un Explorador con System.IO  Clases a utilizar para enviar un mensaje vía Mail  Cuadros de Diálo os (OpenFileDialo , ColorDialo , FontDialo )
Ejercicio Práctico Nº1 (Explorador) BtnMostrar

1.- Diseñar el si uiente formulario.

2.- Lue o codificaremos lo si uiente. 'Importaci n de la Clase Imports System.IO Public Class Form1 Private Sub BtnMostrar_Click 'Array de tipo Drive va a car ar las unidades de disco Dim unidades() As DriveInfo = DriveInfo.GetDrives 'Variable que recorrera las unidades de disco Dim unidad As DriveInfo Me.lstunidades.Items.Clear() 'Recorre cada una de las unidades y lo a re a al ListBox For Each unidad In unidades Me.lstunidades.Items.Add(unidad.Name) Next End Sub

P i

59

Programación Windows
Private Sub lstunidades_MouseClick Me.lstcarpetas.Items.Clear() 'Variable que captura el nombre de la unidad 'Seleccionada en el ListBox Dim unidad As Strin = Me.lstunidades.SelectedItem.ToStrin 'Variable a la cual se le dira de que unidad 'se va a buscar las carpetas existentes Dim directorioraiz As New DirectoryInfo(unidad) 'Variable de tipo carpeta que recorrera todas las carpetas 'de la unidad indicada Dim directorio As DirectoryInfo Try For Each directorio In directorioraiz.GetDirectories 'Recorre todas las carpetas y lo va a re ando al ListBox Me.lstcarpetas.Items.Add(directorio) Next Catch ex As Exception Ms Box("No Hay Carpetas", Ms BoxStyle.Information) End Try End Sub Private Sub lstcarpetas_MouseClick Me.lstarchivos.Items.Clear() 'Variables que capturaran los nombres de la unidad 'y carpeta de la unidad seleccionada Dim unidad, carpeta As Strin unidad = Me.lstunidades.SelectedItem.ToStrin carpeta = Me.lstcarpetas.SelectedItem.ToStrin 'Variable a la cual se le dira de que unidad y carpeta 'se va a buscar los archivos existentes Dim ruta As New DirectoryInfo(Path.Combine(unidad, carpeta)) 'Variable de tipo archivo que recorrera los archivos existentes Dim archivo As FileInfo For Each archivo In ruta.GetFiles 'Recorre los archivos existentes y los a rea al ListBox Me.lstarchivos.Items.Add(archivo.Name) Next End Sub

P i

60

Programación Windows
Private Sub lstarchivos_MouseClick Me.lstinformacion.Items.Clear() 'Varibles que almacenaran los nombres de la unidad 'carpeta y archivo seleccionados en los ListBoxs Dim unidad, carpeta, archivo As String unidad = Me.lstunidades.SelectedItem.ToString carpeta = Me.lstcarpetas.SelectedItem.ToString archivo = Me.lstarchivos.SelectedItem.ToString 'Variable a la cual se le dira de que unidad y carpeta 'se va a buscar el archivo existente. Dim informacion As New FileInfo(Path.Combine(Path.Combine(unidad, carpeta), archivo)) 'Se agregara al ListBox la informacion del archivo correspondiente Me.lstinformacion.Items.Add("Nombre:" & informacion.Name) Me.lstinformacion.Items.Add("Tamaño(Bytes): " & informacion.Length) Me.lstinformacion.Items.Add("Fecha de Creación: " & informacion.CreationTime.ToShortDateString) End Sub End Class 3.- Ejecutaremos y deberá aparecer como se muestra en la figura.

Página 61

Programación Windows
Ejercicio Práctico Nº (Envió de Mensaje por Correo)

1.- Diseñar el si uiente formulario.

TxtDe

LstAdjuntar

TxtPara TxtAsunto BtnQuitar

RbFuente BtnAdjuntar RbColor BtnEnviar TxtMensaje

2.- Lue o codificaremos lo si uiente. Imports System.Net.Mail Public Class Form2 'Variable la cual contendra los datos adjuntos 'de nuestro mensaje Dim datosadjuntos As System.Net.Mail.Attachment Private Sub Form2_Load 'Texto que se car ara al car ar el formulario Me.txtDe.Text = "ejemplocorreosise@ mail.com" Me.txtDe.ReadOnly = True End Sub Private Sub BtnEnviar_Click 'creamos un nuevo mensaje de correo Dim correo As New MailMessa e 'De correo.From = New MailAddress(Me.txtDe.Text) 'Para
P i 62

Programación Windows
correo.To.Add(Me.txtPara.Text) 'Asunto correo.Subject = txtAsunto.Text 'Archivo Adjunto Dim counter As Inte er 'Para poder car ar varios For counter = 0 To lstadjuntar.Items.Count - 1 'Cada archivo ya esta car ado o adjuntado al mensaje datosadjuntos = New Net.Mail.Attachment(lstadjuntar.Items(counter)) correo.Attachments.Add(datosadjuntos) Next 'Cuerpo del correo correo.Body = txtMensaje.Text 'Mostrar como HTML correo.IsBodyHtml = True 'Prioridad de el correo correo.Priority = MailPriority.Normal 'acto se uido le indicamos cual servidor utilizaremos 'aquì usaremos por default a mail y su puerto SMTP Dim smtp As New SmtpClient() smtp.Host = "smtp. mail.com" smtp.Port = 587 smtp.Credentials = New System.Net.NetworkCredential("ejemplocorreosise@ mail.com", "ejemplocorreo") smtp.EnableSsl = True Try 'listo tenemos la estructura de nuestro mensaje armada ahora enviemosla a nuestro destinatario y listo smtp.Send(correo) Ms Box("Mensaje enviado satisfactoriamente") Catch ex As Exception Ms Box("No se pudo Enviar su Mensaje " & ex.Messa e) End Try End Sub Private Sub BtnAdjuntar_Click Dim Counter As Inte er 'Muestra un mensaje si el archivo no existe OfdAbrir.CheckFileExists = True OfdAbrir.Title = "Seleccione Archivo(s) que quesee adjuntar" 'Se abre el OpenFileDialo
P i 63

Programación Windows
OfdAbrir.ShowDialo () For Counter = 0 To UBound(OfdAbrir.FileNames) If Me.lstadjuntar.Items.Contains(Me.OfdAbrir.FileName) = False Then 'Si el archivo no se encuentra en el ListBox lo a re a lstadjuntar.Items.Add(OfdAbrir.FileNames(Counter)) Else 'De lo contrario muestra un mensaje 'si el archivo ya esta adjuntado Ms Box("El Archivo ya se car o", Ms BoxStyle.Information, "Envio de Correo") End If Next End Sub Private Sub BtnQuitar_Click_1 'Elimina el archivo adjuntado del ListBox If lstadjuntar.SelectedIndex > -1 Then lstadjuntar.Items.RemoveAt(lstadjuntar.SelectedIndex) End If End Sub Private Sub RbColor_CheckedChan ed 'Abre el Cuadro de Color If RbColor.Checked = True Then If Me.ColorDialo 1.ShowDialo = Windows.Forms.Dialo Result.OK Then Me.txtMensaje.ForeColor = Me.ColorDialo 1.Color End If End If End Sub Private Sub RbFuente_CheckedChan ed 'Abre el cuadro de Fuente If RbFuente.Checked = True Then If FontDialo 1.ShowDialo () = Windows.Forms.Dialo Result.OK Then Me.txtMensaje.Font = FontDialo 1.Font End If End If End Sub End Class

P i

64

Programación Windows

Componentes COM, Controles Active X y Interacción con Office 
Interacci n con Word  Manejo de A entes  Manejo de Controles Active X

Interacción con Office
Microsoft Office a rupa un conjunto de pro ramas (Word, Excel, Outlook, Power Point y Access, entre otros) con la finalidad de ayudarle a solucionar sus necesidades ofimáticas. Cada uno de estos pro ramas expone su propia biblioteca de objetos, denominada también modelo de objetos, que los desarrolladores pueden utilizar como plataforma para la creaci n de soluciones personalizadas. Office permite que los desarrolladores aprovechen las ventajas de un amplio conjunto de funcionalidades ya creadas. ¿Qué se entiende por modelo de objetos? Es un conjunto de clases que representan objetos que exponen toda la funcionalidad de la aplicaci n de la que forman parte. Evidentemente, los modelos de objetos de Microsoft Office no son parte de Visual Studio. Esto es, s lo estarán disponibles para pro ramar contra ellos si ha instalado una versi n de Office en su sistema. Los modelos de objetos de las distintas versiones de Office son muy parecidos. Por eso, independientemente de la versi n de office utilizada para esta clase debería de ser capaz de ajustar el c di o para adaptarlo a su versi n.

P i

65

Programación Windows

Utili ación de Word en una Aplicación
Este apartado proporciona una descripci n breve de los objetos utilizados normalmente en el modelo de objetos de Microsoft Office Word 2003 y 2007, tal como Aplication, Document, Selection, etc.

Crear una Instancia de Word
Una aplicaci n de Visual Basic que quiere acceder a un documento Word, lo primero que debe hacer es crear una instancia de la aplicaci n Microsoft Office Word. Esta operaci n requiere crear un nuevo proyecto y a re ar al mismo una referencia de la Biblioteca Microsoft Word 12.0 Object Library, que se encuentra en la pestaña COM.

Una vez realizada este paso ya se puede crear una instancia de la aplicaci n Word. Imports Microsoft.Office.Interop ««« Dim ApWord as New Word.Application

P i

66

Programación Windows Crear Nuevos Documentos
Para crear un documento nuevo basado en la plantilla Normal.dot hay que invocar al método Add de la colecci n Documents. Dim doc as Word.Document=ApWord.Documents.Add() Cuando se crea un document Nuevo, se a re a a la colecci n Documents de documentos abiertos de la aplicaci n Word. Ejecutar Add equivale a hacer clic el bot n Nuevo Documento en blanco de la barra de herramientas deWord.

Visuali ar un Documento
Se puede presentar el documento Word asi nando a la propiedad Visible del objeto aplicaci n el valor=True. ApWord.Visible=True

Abrir Documentos Existentes
Para abrir un documento existente hay que invocar al método Open de la colecci n Documents pasando el nombre del fichero como ar umento: Dim doc as Word.Document=ApWord.Documents.Open(³C:\ Este método devuelve una referencia al documento abierto. \midocumento.doc´)

Hacer Referencia al Documento Activo
Para hacer referencia al documento activo se puede utilizar la propiedad ActiveDocument del objeto aplicaci n. Dim doc as Word.Document=ApWord.ActiveDocument

Insertar texto en un Documento Word
Existen distintas formas de insertar texto en un documento Word. Quizás, la mas sencilla sea utilizando el método InsertAfter o InsertBefore para insertar texto después o antes de una selecci n (objeto Selection) o un ran o (objeto Ran e). Por ejemplo, las si uientes líneas de c di o insertan texto al final del contenido del documento activo: Dim doc as Word.Document=ApWord.ActiveDocument Doc.Content.InsertAfter(³Texto a insertar´) Este otro ejemplo inserta texto al final del ran o del documento doc. En este ejemplo, el objeto Ran e (devuelto por la funci n Ran e) se refiere a todo el texto del documento doc. doc.Range.InsertAfter(³Texto a insertar´)

P i

67

Programación Windows Definir y Seleccionar Rangos
Un ran o representa un área de texto conti ua en un documento. Esta definido por la posici n del carácter inicial y final del mismo. Se puede utilizar la propiedad Ran e de muchos objetos (Para raph, Bookmark, etc.) para devolver el objeto Ran e definido por los mismos. Por ejemplo, el si uiente c di o inserta texto al final del primer párrafo de doc, definido en este caso por el objeto ran o: Dim ran o as Word.Ran e=doc.Para raphs(1).Ran e Ran o.InsertAfter(³Texto a Insertar´) El si uiente ejemplo define un ran o desde el inicio del Se undo párrafo hasta el final del tercer párrafo; después, selecciona el texto definido por el mismo y lo corta: Ran o=doc.Ran e(doc.Para raphs(2).Ran e.Start, doc.Para raphs(3).Ran e.End) Ran o.Select() doc.ActiveWindow.Selection.Cut() Este otro ejemplo borra el texto del document doc. En este caso, el objeto Ran e se refiere a todo el texto del documento doc. Doc.Ran e.Delete()

Dar Formato al Texto en Documentos de Word
Para dar formato al texto de un documento, hay que definir un ran o que incluya el texto al cual se refiere aplicar el formato. El si uiente ejemplo define un ran o compuesto por los párrafos se undo y tercero del documento y asi na a ese texto el estilo cursiva. Ran o=doc.Ran e(doc.Para raphs(2).Ran e.Start, doc.Para raphs(3).Ran e.End) Ran o.Font.Italic=1 Este otro ejemplo pone en ne rita el texto que se añade a continuaci n del párrafo especificado. Dim siguienteparrafo as Integer=doc.Paragraphs.Count doc.Paragraphs(siguienteparrafo).Range.Font.Bold=1

P i

68

Programación Windows Guardar y Cerrar Documentos
Para guardar un documento se puede utilizar alguno de los métodos siguientes: Save, SaveAs o Close. Los métodos Save y Close sólo afectan al documento para el que son invocados. En cambio, cuando se aplican a la colección Documents, se veránafectados todos los documentos que estén abiertos. El método Close cierra el documento para el que es invocado o los documentos que estén abiertos de la colección Documents. Por ejemplo, la siguiente sentencia cierra el documento doc. doc.Close El método Save guarda los cambios efectuados en el objeto Document especificado. Por Ejemplo. doc.Save() El método SaveAs permite guardar un documento con otro nombre. Es preciso especificar el nuevo nombre, pero hay otros argumentos opcionales. doc.SaveAs(³C:\docs\miDocu.doc´) Ejercicio Práctico Nº1 1.- Diseñar el siguiente formulario.
CboFuente

btnCrear btnAbrir CboTamaño ChkNegrita ChkCursiva TxtDocumento BtnGuardar

TxtContenido

Página 69

Programación Windows
2.- Los combos contendrán lo siguiente:

3.- Codificaremos lo siguiente: 'Importamos el namespace para trabajar con office Imports Microsoft.Office.Interop Public Class Form1 Private Sub btncrear_Click Dim apword As New Word.Application Dim doc As Word.Document = apword.Documents.Add apword.Visible = True End Sub Private Sub btnabrir_Click Dim apword As New Word.Application Dim ruta As String Me.OpenFileDialog1.Filter = "Documentos de Word (*.doc)|*.doc" If Me.OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then ruta = Me.OpenFileDialog1.FileName End If Dim doc As Word.Document = apword.Documents.Open(ruta) End Sub Private Sub btnguardar_Click Dim apword As New Word.Application Dim docword As Word.Document = apword.Documents.Add apword.Visible = False 'Indica que se trabajará con el Documento Activo Dim doc As Word.Document = apword.ActiveDocument 'Inserta el Texto del TextBox en el Documento doc.Content.InsertAfter(Me.txtcontenido.Text) 'Pone en Negrita el Texto a Guardar en el Documento Dim rango As Word.Range = doc.Range(doc.Range.Paragraphs(1).Range.Start, doc.Range.Paragraphs(doc.Paragraphs.Count).Range.End) If Me.chkNegrita.Checked = True Then rango.Font.Bold = 1 End If

Página 70

Programación Windows
'Pone en Cursiva el Texto a Guardar en el Documento If Me.chkcursiva.Checked = True Then rango.Font.Italic = 1 End If 'Indica el Tamaño de Letra If Me.cbotamaño.SelectedIndex <> -1 Then rango.Font.Size = Me.cbotamaño.Text Else rango.Font.Size = 12 End If 'Indica la Fuente o Tipo de Letra If Me.cbofuente.SelectedIndex <> -1 Then rango.Font.Name = Me.cbofuente.Text Else rango.Font.Name = "Times New Roman" End If 'Guarda el Documento doc.SaveAs(Me.txtdocumento.Text & ".doc") 'Cierra el Documento doc.Close() MsgBox("Documento de Word Creado ...!", MsgBoxStyle.Information, "SISE") End Sub End Class

Consumo de Bibliotecas COM
En este laboratorio usaremos la librería COM [Microsoft Agent Object para el uso de los ³Agentes de Microsoft´, los mismos que utiliza el Microsoft Office para mostrar ayuda al usuario. Los agentes son pequeños objetos que pueden interactuar con el usuario a base de movimientos, gestos, leyendas e incluso por voz. Diseñe el siguiente formulario:
BtnMostrar ListBox1

BtnOcultar TxtMensaje BtnMovimiento BtnMensaje

Página 71

Programación Windows
Agregue la librería COM Microsoft Agent Control 2.0, para ello ir al Menú Proyecto / Agregar Referencia así como se muestra en la figura:

Luego en la etiqueta COM de la ventana emergente escogeremos Microsoft Agent Control 2.0, así como se muestra en la figura.

Luego escribiremos el siguiente código. y A nivel Formulario: Public Class Form1 'Declarar los Objetos Dim Agente As New AgentObjects.Agent Dim Muñeco As AgentObjects.IAgentCtlCharacterEx En el evento Load del Formulario Private Sub Form1_Load 'Cargar un Character; es decir el muñeco que va a aparecer Agente.Connected = True Agente.Characters.Load("Merlin", "merlin.acs") Muñeco = Agente.Characters("Merlin") 'Bucle para Cargar Todos los Movimientos Dim Mov As Object For Each Mov In Muñeco.AnimationNames Me.ListBox1.Items.Add(Mov) Next End Sub y En el evento clic de cada uno de los Botones:
Página 72

y

Programación Windows
Private Sub btnmostrar_Click 'Muestra el Agente Muñeco.Show() 'Desplaza de Posicion al Agente Muñeco.MoveTo(450, 350) End Sub Private Sub btnocultar_Click 'Oculta al Agente Muñeco.Hide() End Sub Private Sub btnmovimiento_Click 'Ejecuta el Movimiento Muñeco.Play(Me.ListBox1.SelectedItem) End Sub Private Sub btnmensaje_Click 'Muestra el Mensaje Muñeco.Speak(Me.txtmensaje.Text) End Sub Al final ejecutamos la aplicación y se debe de mostrar de la siguiente manera:

Para que el agente Merlin pueda tener voz, es necesario instalar 2 archivos los cuales son: y y Microsoft SAPI 4.0 Para que Hablen en español

Un archivo es para el sistema operativo Windows y el otro es para el idioma. Para que puedan trabajar con estos archivos es necesario que su instructor les provea de la carpeta Ayudantes para Microsoft.

Página 73

Programación Windows

Componentes ActiveX
Visual Basic.Net permite usar componentes ya definidos en nuestros formularios, dichos componentes no son mas que clases que trabajan de una forma concreta que han sido creados para realizar funciones especificas, dichos componentes, cuentan con eventos y propiedades, dado que son usados como objetos. Estos componentes forman parte de una lista de controles que Visual Basic.Net nos ofrece, así mismo podremos agregar más componentes según nuestro propiorequerimientos.

Explorador Web
Para poder comprender mejor el uso de componentes COM realizaremos un programa que nos permita crear un explorador de paginas web. 1.- Crear un formulario. 2.- Luego como nuestro componente Web no se encuentra en la lista, procederemos a sacarlo de la lista de elementos.  Pulsamos clic derecho en el menú de Componentes  Elegimos la opción Elegir Elementos

Página 74

Programación Windows
3.- Seleccionaremos el componente Explorador del Web de Microsoft y luego en Aceptar.

4.- Luego nos mostrara el componente en nuestra lista de Elementos. 5.- Después insertamos ese componente usándolo como control a nuestro formulario, también insertaremos un control TextBox y Button.
TxtDir BtnIr

AxWebBrowser

6.- Luego en el evento clic del botón BtnIr codificamos lo siguiente.

Private Sub btnIr_Click Me.AxWebBrowser1.Navigate(Me.txtdir.Text.Trim) End Sub

Página 75

Programación Windows

Reproductor de Música y Video
Crearemos un reproductor de música y Video usando componentes COM, dicho pro rama es muy simple y sencillo el cual te permitirá tener un enfoque claro de los componentes ActiveX. 1.- Utilizaremos el componente AxWindowsMediaPlayer, si no lo encontramos en nuestra lista lo a re aremos de nuestra lista de Ele ir Elementos. 2.- Lue o insertamos el control Windows Media Player en nuestro formulario junto con 2 botones uno para el audio y el otro para el video. El formulario deberá quedar de la si uiente manera.

AxWindowsMediaPlayer

BtnAudio

BtnVideo

3.- Lue o en el evento clic de cada bot n codificaremos lo si uiente. Private Sub btnaudio_Click Me.AxWindowsMediaPlayer1.URL = "D:\Rocky.mp3" End Sub Private Sub btnvideo_Click Me.AxWindowsMediaPlayer1.URL = "D:\madonna.mp " End Sub

P i

76

Programación Windows

Globalización y POO (Pro ramación Orientada a Ob etos) 
    
Clase System.Globalization Clase CultureInfo Definici n de una Clase Atributos de una Clase Propiedades de un a Clase Métodos de una Clase

System.Globali ation
La lobalizaci n es el proceso de diseño y desarrollo de una aplicaci n que permite el uso de interfaces de usuario localizadas y datos re ionales para usuarios de varias referencias culturales. El espacio de nombres System.Globali ation contiene clases que definen informaci n relativa a la referencia cultural, incluido el idioma, el país o re i n, los calendarios utilizados, los modelos de formato para las fechas, la moneda y los números y el criterio de ordenaci n de las cadenas. Estas clases son útiles para escribir aplicaciones lobalizadas (internacionalizadas). Las clases como lobalizaci n, por ejemplo, Strin Info y TextInfo proporcionan funciones avanzadas de compatibilidad para suplentes y procesamiento de elementos de texto. En .NET Framework, la clase CultureInfo representa informaci n acerca de una referencia cultural específica. Esa informaci n incluye el sistema de escritura, los calendarios utilizados, las convenciones de formato de fecha y hora, las convenciones de números y de moneda, y las re las de ordenaci n. Antes de empezar la fase de diseño, debe determinar qué referencias culturales admitirá la aplicaci n. De este modo, permitirá diseñar características que admitan todas las referencias culturales identificadas. Además, le posibilitará centrarse en la escritura de c di o que funcione i ual de bien en todas las referencias culturales admitidas. El espacio de nombres System.Globalization contiene clases que definen informaci n relativa a la referencia cultural, incluido el idioma, el país o re i n, los calendarios utilizados, los modelos de formato de fecha, moneda y números, y el criterio de ordenaci n de las cadenas. Utilice esas clases para simplificar el proceso de desarrollo de una aplicaci n de uso internacional. Al pasar un objeto CultureInfo para la referencia cultural actual a los métodos de este espacio de nombres, puede iniciar el conjunto de re las y datos correctos para la referencia cultural del usuario actual.
P i 77

Programación Windows
La clase CultureInfo contiene informaci n específica de la referencia cultural, como el idioma, el país o re i n, el calendario y las convenciones culturales asociadas a una referencia cultural específica. Esta clase también proporciona la informaci n necesaria para realizar operaciones específicas de la referencia cultural, como la distinci n de mayúsculas y minúsculas, el formato de fechas y números, y la comparaci n de cadenas. En el c di o usado para averi uar el separador decimal (y el de miles) usamos la propiedad NumberFormat de la propiedad compartida CurrentCulture de la clase CultureInfo, y ese método devuelve un objeto del tipo NumberFormatInfo que tiene las si uientes propiedades:
Propiedad CurrencyDecimalDigits Descripción Indica el número de posiciones decimales que se van a utilizar en valores de moneda.

CurrencyDecimalSeparator Obtiene o establece la cadena que se va a utilizar como separador decimal en valores de moneda. CurrencyGroupSeparator Obtiene o establece la cadena que separa grupos de dígitos a la izquierda de la coma decimal en valores de moneda. Obtiene o establece el número de dígitos en cada grupo a la izquierda de la coma decimal en valores de moneda. Obtiene o establece el modelo de formato para los valores de moneda negativos. Obtiene o establece el modelo de formato para los valores de moneda positivos. Obtiene o establece la cadena que se va a utilizar como símbolo de moneda. Obtiene un NumberFormatInfo de sólo lectura que aplica formato a los valores basándose en la referencia cultural actual. Obtiene o establece un valor que especifica cómo la interfaz gráfica de usuario muestra la forma de un dígito. Obtiene la NumberFormatInfo predeterminada de sólo lectura que es independiente de la referencia cultural (invariable). Obtiene un valor que indica si NumberFormatInfo es de sólo

CurrencyGroupSizes

CurrencyNegativePattern

CurrencyPositivePattern

CurrencySymbol

CurrentInfo

DigitSubstitution

InvariantInfo

IsReadOnly

P i

78

Programación Windows
lectura. NaNSymbol Obtiene o establece la cadena que representa el valor NaN (no un número) de IEEE. Obtiene o establece una matriz de cadenas de dígitos nativos equivalentes a los dígitos occidentales del 0 al 9. Obtiene o establece la cadena que representa un infinito negativo. Obtiene o establece la cadena que denota que el número asociado es negativo. Obtiene o establece el número de posiciones decimales que se van a utilizar en valores numéricos. Obtiene o establece la cadena que se va a utilizar como separador decimal en valores numéricos. Obtiene o establece la cadena que separa grupos de dígitos a la izquierda de la coma decimal en valores numéricos. Obtiene o establece el número de dígitos en cada grupo a la izquierda de la coma decimal en valores numéricos. Obtiene o establece el modelo de formato para los valores numéricos negativos. Obtiene o establece el número de posiciones decimales que se van a utilizar en valores de porcentaje. Obtiene o establece la cadena que se van a utilizar como separador decimal en valores de porcentaje. Obtiene o establece la cadena que separa grupos de dígitos a la izquierda de la coma decimal en valores de porcentaje. Obtiene o establece el número de dígitos en cada grupo a la izquierda de la coma decimal en valores de porcentaje. Obtiene o establece el modelo de formato para los valores de porcentaje negativos. Obtiene o establece el modelo de formato para los valores de porcentaje positivos.

NativeDigits

NegativeInfinitySymbol

NegativeSign

NumberDecimalDigits

NumberDecimalSeparator

NumberGroupSeparator

NumberGroupSizes

NumberNegativePattern

PercentDecimalDigits

PercentDecimalSeparator

PercentGroupSeparator

PercentGroupSizes

PercentNegativePattern

PercentPositivePattern

P i

79

Programación Windows
PercentSymbol Obtiene o establece la cadena que se va a utilizar como símbolo de porcentaje. Obtiene o establece la cadena que se va a utilizar como símbolo de por mil. Obtiene o establece la cadena que representa un infinito positivo. Obtiene o establece la cadena que denota que el número asociado es positivo.

PerMilleSymbol

PositiveInfinitySymbol PositiveSign

Nota: Esta es la tabla usada en la informaci n de Visual Studio 2005, pero todas las propiedades están disponibles también en las versiones anteriores. Ejercicio Práctico Nº1 1.- Diseñar el si uiente formulario.
TxtSD BtnVer

TxtSM

2.- Lue o Codificaremos lo si uiente. Private Sub btnver_Click 'Variable que a arrara el separador decimal y separador rupal Dim s As Strin 'A arra el separador decimal de la confi uracion re ional del sistema s =System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator Me.TxtSD.Text = s 'A arra el separador de rupo de la confi uracion re ional del sistema s = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyGroupSeparator Me.TxtSM.Text = s End Sub

P i

80

Programación Windows
Ejercicio Práctico Nº
1.- Diseñar el si uiente formulario.
Txtnum BtnVer

Txtfn Txtff Txtfh

2.- Lue o Codificaremos lo si uiente. Private Sub btnver_Click 'Variable que captura el numero a dar formato re ional Dim x As Decimal = Val(Me.txtnum.Text) 'Variable que define el formato re ional de la Moneda Dim objculture As Globalization.NumberFormatInfo = New Globalization.CultureInfo("ESPE").NumberFormat objculture.CurrencyDecimalDi its = 1 objculture.CurrencyDecimalSeparator = "," objculture.CurrencyGroupSeparator = "." objculture.CurrencySymbol = "S/." 'Mostrar el numero convertido a un formato de Moneda 'El cual contiene la variable de tipo Globalization Me.txtfn.Text = x.ToStrin ("c", objculture) 'Variable que define el formato re ional de la Fecha y Hora Dim formatofecha As Globalization.DateTimeFormatInfo = New Globalization.CultureInfo("ES-ES", True).DateTimeFormat Dim dt As New DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day) Me.txtff.Text = dt.ToStrin (formatofecha.ShortDatePattern) Me.txtfh.Text = dt.ToStrin (formatofecha.ShortTimePattern) End Sub

P i

81

Programación Windows

La Clase CultureInfo
La clase CultureInfo especifica un nombre único para cada referencia cultural basándose en el estándar RFC 1766. El nombre es una combinaci n de un c di o de referencia cultural de dos letras en minúscula asociado con un idioma, y un c di o de referencia cultural secundaria de dos letras en mayúscula asociado con un país o re i n. El c di o de referencia cultural secundaria si ue al c di o de referencia cultural, separados por un ui n (-). Los ejemplos incluyen "ja-JP" para el japonés de Jap n, "en-US" para el in lés de EE.UU. y "de-DE" para el alemán de Alemania (a diferencia de "deAT" para el alemán de Austria). En los casos en los que no haya un c di o de idioma de dos letras disponible, se usa el c di o de tres letras que se deriva de ISO 639-2; por ejemplo, se usa el c di o de tres letras"div" para referencias culturales que utilizan el idioma dhivehi. Al unos nombres de referencias culturales tienen sufijos que especifican la escritura; por ejemplo, "-Cyrl" especifica las letras del cirílico, "-Latn" especifica las letras del latín. En este tema se utilizan las expresiones "referencia cultural neutra" y "referencia cultural específica". Una referencia cultural neutra se especifica únicamente mediante el c di o de dos dí itos de la referencia cultural en minúscula. Por ejemplo, "fr" especifica la referencia cultural neutra para el francés y "de" especifica la referencia cultural neutra para el alemán. Una referencia cultural específica se identifica por el c di o de referencia cultural se uido por el c di o de referencia cultural secundaria de dos dí itos en mayúscula. Por ejemplo, "fr-FR" especifica francés de Francia y "fr-CA" especifica francés de Canadá. A continuaci n, se incluyen los nombres e identificadores de CultureInfo predefinidos aceptados y utilizados por esta y otras clases en el espacio de nombres System.Globalization. Nombre de referencia cultural "" (cadena vacía) af af-ZA sq sq-AL ar ar-DZ ar-BH ar-EG ar-IQ ar-JO ar-KW ar-LB ar-LY ar-MA Identificador de referencia cultural 0x007F 0x0036 0x0436 0x001C 0x041C 0x0001 0x1401 0x3C01 0x0C01 0x0801 0x2C01 0x3401 0x3001 0x1001 0x1801 Idioma-País/región referencia cultural invariable Afrikaans Afrikaans-Sudáfrica Albanés Albanés-Albania Árabe Árabe-Ar elia Árabe-Bahrein Árabe-E ipto Árabe-Iraq Árabe-Jordania Árabe-Kuwait Árabe-Líbano Árabe-Libia Árabe-Marruecos
P i 82

Programación Windows
ar-OM ar-QA ar-SA ar-SY ar-TN ar-AE ar-YE hy hy-AM az az-AZ-Cyrl az-AZ-Latn eu eu-ES be be-BY b b -BG ca ca-ES zh-HK zh-MO zh-CN zh-CHS zh-SG zh-TW zh-CHT hr hr-HR cs cs-CZ da da-DK div div-MV nl nl-BE nl-NL en en-AU en-BZ en-CA en-CB en-IE 0x2001 0x4001 0x0401 0x2801 0x1C01 0x3801 0x2401 0x002B 0x042B 0x002C 0x082C 0x042C 0x002D 0x042D 0x0023 0x0423 0x0002 0x0402 0x0003 0x0403 0x0C04 0x1404 0x0804 0x0004 0x1004 0x0404 0x7C04 0x001A 0x041A 0x0005 0x0405 0x0006 0x0406 0x0065 0x0465 0x0013 0x0813 0x0413 0x0009 0x0C09 0x2809 0x1009 0x2409 0x1809 Árabe-Omán Árabe-Qatar Árabe-Arabia Saudí Árabe-Siria Árabe-Túnez Árabe-Emiratos Árabes Unidos Árabe-Yemen Armenio Armenio-Armenia Azerí Azerí (cirílico)-Azerbaiyán Azerí (latino)-Azerbaiyán Vasco Vasco-España Bielorruso Bielorruso-Bielorrusia Búl aro Búl aro-Bul aria Catalán Catalán-España Chino-Zona administrativa especial de Hon Kon Chino-Zona administrativa especial de Macao Chino-China Chino (simplificado) Chino-Sin apur Chino-Taiwán Chino (tradicional) Croata Croata-Croacia Checo Checo-República Checa Danés Danés-Dinamarca Dhivehi Dhivehi-Maldivas Holandés Holandés-Bél ica Holandés-Países Bajos In lés In lés-Australia In lés-Belice In lés-Canadá In lés-Caribe In lés-Irlanda
P i 83

Programación Windows
en-JM en-NZ en-PH en-ZA en-TT en-GB en-US en-ZW et et-EE fo fo-FO fa fa-IR fi fi-FI fr fr-BE fr-CA fr-FR fr-LU fr-MC fr-CH l l-ES ka ka-GE de de-AT de-DE de-LI de-LU de-CH el el-GR u u-IN he he-IL hi hi-IN hu hu-HU es is-IS id 0x2009 0x1409 0x3409 0x1C09 0x2C09 0x0809 0x0409 0x3009 0x0025 0x0425 0x0038 0x0438 0x0029 0x0429 0x000B 0x040B 0x000C 0x080C 0x0C0C 0x040C 0x140C 0x180C 0x100C 0x0056 0x0456 0x0037 0x0437 0x0007 0x0C07 0x0407 0x1407 0x1007 0x0807 0x0008 0x0408 0x0047 0x0447 0x000D 0x040D 0x0039 0x0439 0x000E 0x040E 0x000F 0x040F 0x0021 In lés-Jamaica In lés-Nueva Zelanda In lés-Filipinas In lés-Sudáfrica In lés-Trinidad y Toba o In lés-Reino Unido In lés-Estados Unidos In lés-Zimbabue Estonio Estonio-Estonia Feroés Feroés-Islas Feroe Persa Persa-Irán Finlandés Finlandés-Finlandia Francés Francés-Bél ica Francés-Canadá Francés-Francia Francés-Luxembur o Francés-M naco Francés-Suiza Galle o Galle o-España Geor iano Geor iano-Geor ia Alemán Alemán-Austria Alemán-Alemania Alemán-Liechtenstein Alemán-Luxembur o Alemán-Suiza Grie o Grie o-Grecia Gujarati Gujarati-India Hebreo Hebreo-Israel Hindi Hindi-India Hún aro Hún aro-Hun ría Islandés Islandés-Islandia Indonesio
P i 84

Programación Windows
id-ID it it-IT it-CH ja ja-JP kn kn-IN kk kk-KZ kok kok-IN ko ko-KR ky ky-KZ lv lv-LV lt lt-LT mk mk-MK ms ms-BN ms-MY mr mr-IN mn mn-MN no nb-NO nn-NO pl pl-PL pt pt-BR pt-PT pa pa-IN ro ro-RO ru ru-RU sa sa-IN 0x0421 0x0010 0x0410 0x0810 0x0011 0x0411 0x004B 0x044B 0x003F 0x043F 0x0057 0x0457 0x0012 0x0412 0x0040 0x0440 0x0026 0x0426 0x0027 0x0427 0x002F 0x042F 0x003E 0x083E 0x043E 0x004E 0x044E 0x0050 0x0450 0x0014 0x0414 0x0814 0x0015 0x0415 0x0016 0x0416 0x0816 0x0046 0x0446 0x0018 0x0418 0x0019 0x0419 0x004F 0x044F Indonesio-Indonesia Italiano Italiano-Italia Italiano-Suiza Japonés Japonés-Jap n Kannada Kannada-India Kazajo Kazajo-Kazajistán Konkani Konkani-India Coreano Coreano-Corea Kir uís Kir uís-Kazajistán Let n Let n-Letonia Lituano Lituano-Lituania Macedonio Macedonio-Anti ua República Yu oslava de Macedonia Malayo Malayo-Brunéi Darussalam Malayo-Malasia Marathi Marathi-India Mon ol Mon ol-Mon olia Norue o Norue o (Bokmal)-Norue a Norue o (Nynorsk)-Norue a Polaco Polaco-Polonia Portu ués Portu ués-Brasil Portu ués-Portu al Punjabi Punjabí-India Rumano Rumano-Rumanía Ruso Ruso-Rusia Sánscrito Sánscrito-India
P i 85

Programación Windows
sr-SP-Cyrl sr-SP-Latn sk sk-SK sl sl-SI es es-AR es-BO es-CL es-CO es-CR es-DO es-EC es-SV es-GT es-HN es-MX es-NI es-PA es-PY es-PE es-PR es-ES es-UY es-VE sw sw-KE sv sv-FI sv-SE syr syr-SY ta ta-IN tt tt-RU te te-IN th th-TH tr tr-TR uk uk-UA ur 0x0C1A 0x081A 0x001B 0x041B 0x0024 0x0424 0x000A 0x2C0A 0x400A 0x340A 0x240A 0x140A 0x1C0A 0x300A 0x440A 0x100A 0x480A 0x080A 0x4C0A 0x180A 0x3C0A 0x280A 0x500A 0x0C0A 0x380A 0x200A 0x0041 0x0441 0x001D 0x081D 0x041D 0x005A 0x045A 0x0049 0x0449 0x0044 0x0444 0x004A 0x044A 0x001E 0x041E 0x001F 0x041F 0x0022 0x0422 0x0020 Serbio (cirílico)-Serbia Serbio (latino)-Serbia Eslovaco Eslovaco-Eslovaquia Esloveno Esloveno-Eslovenia Español Español-Ar entina Español-Bolivia Español-Chile Español-Colombia Español-Costa Rica Español-República Dominicana Español-Ecuador Español-El Salvador Español-Guatemala Español-Honduras Español-México Español-Nicara ua Español-Panamá Español-Para uay Español-Perú Español-Puerto Rico Español-España Español-Uru uay Español-Venezuela Suajili Suajili-Kenia Sueco Sueco-Finlandia Sueco-Suecia Sirio Sirio-Siria Tamil Tamil-India Tártaro Tártaro-Rusia Telu u Telu u-India Tailandés Tailandés-Tailandia Turco Turco-Turquía Ucraniano Ucraniano-Ucrania Urdú
P i 86

Programación Windows
ur-PK uz uz-UZ-Cyrl uz-UZ-Latn vi vi-VN 0x0420 0x0043 0x0843 0x0443 0x002A 0x042A Urdú-Pakistán Uzbeko Uzbeko (cirílico)-Uzbekistán Uzbeko (latino)-Uzbekistán Vietnamita Vietnamita-Vietnam

Ejercicio Práctico Nº3 1.- Diseñar el si uiente formulario.

CboCulturas

BtnMostrar

TxtFecha

2.- Lue o codificaremos lo si uiente. Imports System Imports System.Globalization Public Class Form3 Dim colculturas As New Collection Dim nvalor As Double = 1234.56 Sub filtrarcombo() Dim ci As CultureInfo For Each ci In CultureInfo.GetCultures(CultureTypes.AllCultures) If Len(ci.ToStrin ) > 4 Then colculturas.Add(ci) End If Next Me.cboculturas.DataSource = colculturas End Sub Private Sub Form3_Load Me.txtfecha.Text = Now.ToStrin ("d", CultureInfo.InstalledUICulture) Me.txtmoneda.Text = nvalor.ToStrin ("c", CultureInfo.InstalledUICulture) filtrarcombo() End Sub Private Sub BtnMostrar_Click Try Dim newdate As New Date Dim cultura As Strin Dim indice As Inte er indice = Me.cboculturas.SelectedIndex cultura = Me.cboculturas.ValueMember Me.txtfecha.Text = Now.ToStrin ("d", colculturas(indice + 1)) Me.txtmoneda.Text = nvalor.ToStrin ("c", colculturas(indice + 1))
P i 87
TxtMoneda

Programación Windows
Catch ex As Exception Ms Box("No se Reconoce", Ms BoxStyle.Information, "SISE") Me.txtfecha.Clear() Me.txtmoneda.Clear() End Try End Sub End Class

Programación Orientada a Objetos (POO)
En Visual Basic Net un objeto puede definirse como cualquier cosa, ente o entidad física o l ica de informaci n. En este sentido todos los elementos materiales o inmateriales pueden clasificarse como objetos. En particular cualquier objeto considerado presenta los si uientes tres elementos: a) Propiedades: Son las características propias de un objeto estas propiedades o atributos son los que permiten diferenciar o individualizar un objeto de otro objeto ya sea de la misma o diferente clase o cate oría. Las propiedades más generales son forma, color, tamaño, peso, etc., pero ya en particular: Chamarra Marca, material, precio, color, tamaño, etc. Alumno Matricula, nombre, edad, domicilio, etc. Gato Raza, nombre, color, edad, etc. Ventana Windows±>Tamaño, Color, Font, etc. b) Métodos: Son las conductas propias de la naturaleza del objeto. Así como las propiedades son el ser (que es) del objeto, los métodos son el hacer (que hacer) del objeto. Ejemplo de métodos: Gato ²> Maullar (), comer (), correr (), saltar (), etc. Alumno²> Estudiar (), comer (), asistir clase (), pintear () Cuaderno±>Es escrito (), es rayado (), es borrado (), etc. Ventana Windows±> Abrir (), cerrar (), maximizar (), etc. c) Eventos: Es la relaci n (de varias maneras) que se puede dar entre dos objetos ya sean de la misma o diferente clase. Un evento se manifiesta como una interacci n entre dos objetos, en eneral al momento de la relaci n al mismo tiempo se dará una reacci n o respuesta por parte de los dos objetos que se manifiestan como una serie, cadena o conjuntos de métodos propios que se activan o disparan, ejemplo:

P i

88

Programación Windows
Evento ato detecta ata ato detecta perro Rat n clic Windows Relación Métodos que se activan detectar maullar(), correr(), oler() detectar bufar(), saltar(), correr() clic maximizar(), cerrar() minimizar(), etc.

maestro ensena alumno Ensenar pasar lista(), pre untar(), etc. Rat n dblclk Windows dblclk

Un Pro rama o un SCRIPT en visual Basic Net se pueden considerar como un conjunto de una o más pá inas o formas donde cada una de ellas contiene un conjunto de objetos, componentes o controles. Un componente o propiamente dicho un control es un objeto que se especializa en una tarea especifica por ejemplo hay controles especializados en desple ar textos o mensajes, otros controles se especializan en desple ar imá enes o videos, otros en manipular directorios o archivos en disco, etc. Pero en eneral tanto las formas como los controles no dejan de ser objetos en pro ramaci n de visual Basic y por tanto tienen sus propiedades, métodos y están sujetos a eventos. En visual Basic Net recordar además que un conjunto de objetos que comparten o contienen características similares forman la llamada CLASE.

Creación de Propiedades para la Clase
Una propiedad en una clase se define, por normal eneral, mediante dos elementos: una variable de propiedad y un procedimiento de propiedad. La variable de propiedad, tal y como su nombre indica, es una variable con ámbito privado a nivel de la clase, que se encar a de uardar el valor de propiedad. Por su parte el procedimiento de propiedad o Property, es el encar ado de actuar de puente entre el c di o cliente y la variable de propiedad, realizando las operaciones de acceso y asi naci n de valores a dicha variable. Por lo tanto, para crear una propiedad en nuestra clase, declararemos en primer lu ar una variable Private, y en se undo lu ar un procedimiento de tipo Property, que consta de dos bloques: Get, para devolver el valor de la variable de la propiedad (podemos usar la palabre clave Return para devolver el valor); y Set, para asi nárselo (aquí debe usar un parámetro con el nombre Value, que contiene el valor para asi nárselo). La sintaxis a emplear se muestra en el si uiente c di o fuente. Sintaxis: [Tipo de Declaración] Property <Nombre> [as <Tipo Dato>] [[ReadOnly] Get <Instrucciones> End Get]
P i 89

Programación Windows
[[WriteOnly] Set (By Val Value [As <Tipo Dato>]) <Instrucciones> End Set] End Property

Ejercicio Práctico Nº
1.- Crear un Proyecto llamado POO en Visual 2.- A re ar una clase llamada Empleado en el cual crearemos las si uientes propiedades y Métodos. Public Class Empleado 'Variables de Propiedad Private mvarcodi o As Inte er Private mvarnombre As Strin Private mvarsueldo As Sin le 'Propiedades Public Property Codi o() As Inte er Get Codi o = mvarcodi o End Get Set(ByVal value As Inte er) mvarcodi o = value End Set End Property Public Property Nombre() As Strin Get Nombre = mvarnombre End Get Set(ByVal value As Strin ) mvarnombre = value End Set End Property Public Property Sueldo() As Sin le Get Sueldo = mvarsueldo End Get Set(ByVal value As Sin le) mvarsueldo = Sueldo End Set End Property 'Metodos Public Sub crearempleado(ByVal vcodi o As Inte er, ByVal vnombre As Strin , ByVal vsueldo As Sin le)
P i 90

Programación Windows
mvarcodigo = vcodigo mvarnombre = vnombre mvarsueldo = vsueldo End Sub Public Sub actualizarSueldo(ByVal vnuevosueldo As Single) mvarsueldo = vnuevosueldo End Sub End Class 3.- Luego Agregaremos otro proyecto al cual llamaremos Probando Clase; para ello ir al Menú Archivo, luego Agregar y elegir Nuevo Proyecto. 4.-Agregaremos la referencia de nuestro proyecto POO en Visual a nuestro proyecto Probando Clase, para ello clic derecho y elegir Referencia.

5.- Diseñaremos el siguiente formulario.

TxtCod TxtNom TxtSue

6.- Codificaremos lo siguiente. Public Class Form1 'Declaracion de la variable que contendra toda la Clase Empleado
Página 91

Programación Windows
'del Proyecto POO en Visual Dim objempleado As New POO_en_Visual.Empleado() Private Sub BtnCrear_Click 'Se llama al metodo CrearEmpleado objempleado.crearempleado(Me.txtcod.Text, Me.txtnom.Text, Me.txtsue.Text) Ms Box("Datos Guardados...!", Ms BoxStyle.Information, "SISE") End Sub Private Sub btnactualizar_Click Dim sueldo As Sin le Dim res As Strin res = InputBox("In rese Nuevo Sueldo") If res = "" Then Exit Sub Else sueldo = CDbl(res) End If 'Llamamos al método ActualizarSueldo objempleado.actualizarSueldo(sueldo) Ms Box("Sueldo Actualizado...!", Ms BoxStyle.Information, "SISE") End Sub Private Sub btnmostrar_Click With objempleado Ms Box("Codi o: " & .Codi o & vbCrLf & "Nombre: " & .Nombre & vbCrLf & "Sueldo: " & .Sueldo, Ms BoxStyle.Information, "SISE") End With End Sub End Class

Ejercicio Práctico Nº5
1.- Diseñar el si uiente formulario.

TxtNom DateTimePicker

LblMensaje

BtnMostrar

P i

92

Programación Windows
2.- Lue o a re aremos una clase llamado Persona el cual crearemos las si uientes propiedades y métodos. Public Class Persona 'Variables de Propiedad Private _nombre As Strin Private _fechanacimiento As Date 'Propiedades Public Property nombre() As Strin Get Return _nombre End Get Set(ByVal value As Strin ) _nombre = value End Set End Property Public Property fechanacimiento() As Date Get Return _fechanacimiento End Get Set(ByVal value As Date) _fechanacimiento = value End Set End Property 'Metodos Public Function edad() As Inte er Dim tempedad As Strin tempedad = Microsoft.VisualBasic.DateDiff(DateInterval.Year, _fechanacimiento, Now()) Return tempedad End Function End Class 3.- Codificaremos lo si uiente en el evento clic del BtnMostrar Private Sub btnmostrar_Click 'Variable que contiene la clase Persona Dim opersona As New Persona opersona.nombre = Me.txtnom.Text opersona.fechanacimiento = Me.DateTimePicker1.Value Me.lblMensaje.Text = "La Edad de " & opersona.nombre & " es " & opersona.edad() & " años" End Sub
P i 93

Programación Windows
Ejercicio Práctico Nº6
1.- A re ar una clase llamada Empleado2 y a re aremos los si uientes campos, propiedades y métodos. Public Class Empleado2 'Campos de la clase Public codi o As Inte er Public nombre As Strin Public remuneracion As Double Public CostoXhora As Decimal Public HorasTrabajadas As Inte er 'variables por propiedad Private cuentabancaria As Strin Private entidad As Strin Private fechain reso As Date 'Propiedad de Solo Escritura Public WriteOnly Property ctbancaria() As Strin Set(ByVal value As Strin ) Select Case Microsoft.VisualBasic.Left(value, 4) Case "1111" : entidad = "Banco de Credito" Case "2222" : entidad = "Banco Continental" Case "3333" : entidad = "Banco Interbank" Case "4444" : entidad = "Banco de la Nacion" Case "5555" : entidad = "Caja Municipal" Case Else : entidad = "No Existe Entidad" End Select End Set End Property 'Propiedad de Lectura y Escritura Public Property FechaIn () As Date Get Return fechain reso End Get Set(ByVal value As Date) fechain reso = value End Set End Property 'Propiedades de Solo Lectura Public ReadOnly Property banco() As Strin Get Return entidad End Get End Property Public ReadOnly Property mesin reso() As Strin Get
P i 94

Programación Windows
Return Format(fechain reso, "MMMM") End Get End Property 'Funcion que calcula y devuelve el sueldo Public Function sueldo(ByVal horas As Inte er) remuneracion = horas * CostoXhora Return remuneracion End Function End Class 2.- Lue o diseñamos el si uiente formulario.
txtCod txtNom CboCuentaBancaria 

DtpF txtHoras txtCXH

BtnRegistrar

ListView1

3.- Lue o en el evento Clic del Bot n BtnRe istrar codificaremos lo si uiente: Private Sub btnre istrar_Click 'Declaramos nuestra variable que contendra 'todo lo que conten a nuestra clase Empleado2 Dim oempleado As New Empleado2 'Campos de la Clase oempleado.codi o = Me.txtcod.Text oempleado.nombre = Me.txtnom.Text 'Propiedad ctbancaria de la clase Empleado2 oempleado.ctbancaria = Me.cbocuentabancaria.Text 'Propiedad FechaIn de la clase Empleado2 oempleado.FechaIn = Me.dtpfi.Value 'Campos de la Clase oempleado.CostoXhora = Me.txtCXH.Text oempleado.HorasTrabajadas = Me.txthoras.Text 'Campo Remuneracion de la Clase Empleado2 y 'Método Sueldo de la clase Empleado2 oempleado.remuneracion = oempleado.sueldo(oempleado.HorasTrabajadas)
P i 95

Programación Windows
Dim vista As New ListViewItem vista = Me.ListView1.Items.Add(oempleado.codi o) vista.SubItems.Add(oempleado.nombre) vista.SubItems.Add(oempleado.banco) vista.SubItems.Add(oempleado.mesin reso) vista.SubItems.Add(oempleado.HorasTrabajadas) vista.SubItems.Add(oempleado.CostoXhora) vista.SubItems.Add(oempleado.remuneracion) End Sub

Pro ramación Orientada a Ob etos (POO) - Usando una ibrería de Clases
Práctica de aboratorio
Este laboratorio pretende enseñar como se trabajan con componentes en Visual Basic .Net, primero se verá un laboratorio de c mo crear una Librería de Clases y lue o veremos como trabajar con herencia de clases.

Creando y Usando una Librería de Clases
Se va a construir una librería que permita manejar el inventario de productos en almacén y realizar un mantenimiento de estos. Para esto realizar los si uientes pasos: 1.-Ele ir un nuevo proyecto ³Visual Basic´ el cual se llamara POO_en_Visual y a re ar una Clase llamada Producto.
y

Creando Propiedades para la clase Producto Private mvarCodi o As Strin Private mvarNombre As Strin Private mvarPrecio As Sin le Private mvarStock As Inte er Public Property Codi o() As Strin Get Codi o = Me.mvarCodi o End Get Set(ByVal value As Strin ) Me.mvarCodi o = value End Set End Property

P i

96

Programación Windows
Public Property Nombre() As Strin Get Nombre = Me.mvarNombre End Get Set(ByVal value As Strin ) Me.mvarNombre = value End Set End Property Public Property Precio() As Sin le Get Precio = Me.mvarPrecio End Get Set(ByVal value As Sin le) Me.mvarPrecio = value End Set End Property Public Property Stock() As Inte er Get Stock = Me.mvarStock End Get Set(ByVal value As Inte er) Me.mvarStock = value End Set End Property
y

Creando Métodos para la clase Producto.
Public Sub CrearProducto(ByVal vcodi o As Strin , ByVal vnombre As Strin , ByVal vprecio As Sin le, ByVal vstock As Inte er) Me.mvarCodi o = vcodi o Me.mvarNombre = vnombre Me.mvarPrecio = vprecio Me.mvarStock = vstock End Sub Public Sub ActualizarPrecio(ByVal vOperacionPrecio As Byte, ByVal vTasa As Sin le) If vOperacionPrecio = 1 Then Me.mvarPrecio = (1 + (vTasa / 100)) * Me.mvarPrecio ElseIf vOperacionPrecio = 2 Then Me.mvarPrecio = (1 - (vTasa / 100)) * Me.mvarPrecio End If End Sub Public Sub ActualizarStock(ByVal vOperacionStock As Byte, ByVal vCantidad As Inte er) If vOperacionStock = 1 Then Me.mvarStock = Me.mvarStock + vCantidad ElseIf vOperacionStock = 2 Then Me.mvarStock = Me.mvarStock - vCantidad End If End Sub 
       

P i

97

Programación Windows
2.- Luego, añadimos una aplicación para Windows que me permita realizar el mantenim iento de productos usando la librería creada. 3.- Para eso seguir los siguientes pasos:

4.- El proyecto se llamará Probando Clase 5.- Diseñamos un formulario llamado FrmProducto que tenga un TabControl con 3 fichas, una de ingreso de productos, otra de actualización de precios y stock y otra de consulta, diseñadas tal como se muestran las figuras de abajo: y Ficha ³Ingreso³ del formulario FRMPRODUCTO

y

Ficha ³Actualización³ del formulario FRMPRODUCTO

Página 98

Programación Windows
y Ficha ³Consulta³ del formulario FRMPRODUCTO

Después de realizar el diseño y antes de escribir código, para usar la librería primero debemos hacer una referencia a esta. Clic derecho sobre nuestro proyecto ³Probando Clase´ y elegimos agregar Referencia, nos aparecerá una ventana el cual elegiremos la pestaña proyecto y clic sobre el proyecto que contiene nuestra clase ³POO_en_Visual´.

Declarar e inicializar una variable objeto de tipo de la clase Producto, tal como sigue: Dim objproducto As New POO_en_Visual.Producto y Programando en el botón Crear producto: Private Sub btncrear_Click objproducto.CrearProducto(Me.txtcod_ing.Text, Me.txtnom_ing.Text, Me.txtpre_ing.Text, Me.txtstock_ing.Text) MsgBox("Producto Registrado...!", MsgBoxStyle.Information, "SISE") Me.txtcod_ing.Clear() Me.txtnom_ing.Clear() Me.txtpre_ing.Clear() Me.txtstock_ing.Clear() Me.txtcod_ing.Focus() End Sub

Página 99

Programación Windows
y

Programando los botones de actuali ar precio y stock del producto:
Private Sub btnacpre_Click If Me.rbaupre.Checked = True Then objproducto.ActualizarPrecio(1, Me.txtTasa.Text) ElseIf Me.rbdispre.Checked = True Then objproducto.ActualizarPrecio(2, Me.txtTasa.Text) End If Ms Box("Precio Actualizado...!", Ms BoxStyle.Information, "SISE") Me.txtTasa.Clear() End Sub Private Sub btnacsto_Click If Me.rbausto.Checked = True Then objproducto.ActualizarStock(1, Me.txtcan.Text) ElseIf Me.rbdissto.Checked = True Then objproducto.ActualizarStock(2, Me.txtcan.Text) End If Ms Box("Stock Actualizado...!", Ms BoxStyle.Information, "SISE") Me.txtcan.Clear() End Sub 
 

y

Finalmente, mostrando los datos del producto:
Private Sub btnmostrar_Click With objproducto Me.txtcod_con.Text = .Codi o Me.txtnom_con.Text = .Nombre Me.txtpre_con.Text = .Precio Me.txtstock_con.Text = .Stock End With End Sub 

Constructores, SobreCar a de Métodos o Polimorfismo, Eventos y Herencia 
¿Qué son Constructores?    
Definici n de Sobrecar a de Métodos Concepto de Eventos Herencia de una Clase Herencia y Sobrecar a
P i 100 

Programación Windows

Constructores
El punto de inicio de cualquier clase, cuando se crea una instancia en la memoria, es un método especial al que se le conoce como constructor. Un constructor no devuelve nin ún valor, por tanto en Visual Basic sería un método de tipo Sub llamado New. El primer método que es ejecutado al instanciar un objeto de la clase se denomina constructor. Este tipo de método resulta útil para tareas de confi uraci n iníciales sobre el objeto. No es necesario escribir un método constructor en la clase, ya que en el caso de que no exista, el compilador se encar a de crearlo implícitamente. Todas las clases de Visual Basic .Net tienen un constructor por defecto que es método ³New´, pero se pueden a re ar varios constructores ³New´ diferenciándose por el número de parámetros.

Sintaxis:
Public Sub New () <Instrucciones> End Sub Public Sub New ([<Param1>As <Tipo Dato>]) <Instrucciones> End Sub Public Sub New ([<Param1>As <Tipo Dato>,<Param2>As <Tipo Dato>]) <Instrucciones> End Sub Nota: Es requisito indispensable escribir los métodos constructores al inicio de la clase, de lo contrario no funcionarían.

P i

101

Programación Windows
Ejercicio Práctico Nº1
1.- Crearemos una Clase llamada ClsEmpleado Public Class ClsEmpleado Private fecha As Date Public Property fechacrea() As Date Get Return fecha End Get Set(ByVal value As Date) fecha = value End Set End Property 'Método Constructor Public Sub New() 'Asi namos un valor inicial 'A una variable de propiedad fecha = Now End Sub End Class 2.- Lue o diseñaremos el si uiente formulario.

BtnMostrar1 BtnMostrar2 BtnMostrar3

3.- En el evento clic del bot n BtnMostrar1 codificaremos lo si uiente: Private Sub btnMostrar_Click Dim objempleado As New ClsEmpleado Ms Box("El Empleado se creo " & objempleado.fechacrea) End Sub

P i

102

Programación Windows
4.- Lue o crearemos otra Clase llamada ClsEmpleado2 Public Class ClsEmpleado2 Private mvarfechacrea As Date Public Property fechacrea() As Date Get Return mvarfechacrea End Get Set(ByVal value As Date) mvarfechacrea = value End Set End Property 'Método constructor con parámetro Public Sub New(ByVal vfechacrea As Date) 'Asi namos el valor de parámetro 'A una variable de Propiedad mvarfechacrea = vfechacrea End Sub End Class 5.- En el evento clic del bot n BtnMostrar2 codificaremos lo si uiente: Private Sub btnmostrar2_Click 'Forma de Instanciar un objeto con un constructor parametrizado Dim objempleado2 As New ClsEmpleado2("07/12/2007") Ms Box("El Empleado se creo " & objempleado2.fechacrea) End Sub Nota: Los constructores también se pueden sobrecar ar, es decir, pueden existir varias versiones en las que cada una de ellas reciba distintos parámetros, en número y/o en tipo.

6.- Lue o crearemos otra Clase llamada ClsEmpleado3 Public Class ClsEmpleado3 'Campos de la Clase Public nombre As Strin Public apellido As Strin Public Sueldo As Sin le 'Metodo Constructor Public Sub New(ByVal vnombre As Strin , ByVal vapellido As Strin ) nombre = vnombre apellido = vapellido End Sub
P i 103

Programación Windows
'Método Constructor SobreCar ado Public Sub New(ByVal vnombre As Strin , ByVal vapellido As Strin , ByVal vsueldo As Sin le) nombre = vnombre apellido = vapellido Sueldo = vsueldo End Sub End Class 7.- En el evento clic del bot n BtnMostrar3 codificaremos lo si uiente: Private Sub btnmostrar3_Click Dim objempleado3 As New ClsEmpleado3("Ana", "Castilla", 1200) Ms Box("El Nombre es: " & objempleado3.nombre & vbNewLine & "Su Apellido es: " & objempleado3.apellido & vbNewLine & "Su Sueldo es: " & objempleado3.Sueldo) End Sub

Sobrecarga de Métodos o Polimorfismo
La sobrecarga de métodos, es una técnica que consiste en crear varios métodos con idéntico nombre dentro de la misma clase, distin uiéndose entre sí por su lista de parámetros. Para declarar un método como sobrecar ado, debemos utilizar la palabra clave Overloads después del modificador de ámbito. Podemos sobrecar ar métodos de tipo Sub y Function. Ejercicio Práctico Nº2
y

Una situaci n que podría requerir la sobrecar a de métodos sería la si uiente: la clase Empleado necesita manejar en diferentes formas, la informaci n que referente al sueldo existe sobre el empleado. Por tal motivo, vamos a crear tres métodos con el nombre Sueldo( ), que variarán en su firma, o protocolo de llamada, y realizarán diferentes tareas, pero todas ellas relacionadas con el sueldo del empleado.

y

1.- Crearemos una clase llamado Empleado. Public Class Empleado 'Campo de la Clase Public nombre As Strin 'Variable de Propiedad Private mvarsalario As Double Public Property salario() As Double Get Return mvarsalario
P i 104

Programación Windows
End Get Set(ByVal value As Double) mvarsalario = value End Set End Property 'Métodos SobreCar ados Public Overloads Sub Sueldo() 'Aqui mostramos el importe del sueldo formateado Ms Box("El sueldo es: " & Format(salario, "#,#.##")) End Sub Public Overloads Function Sueldo(ByVal vdia As Inte er) As Strin ' aquí mostramos la fecha del mes actual ' en la que se realizará la transferencia ' del sueldo al banco del empleado Dim FechaActual As Date Dim FechaCobro As Strin FechaActual = Now FechaCobro = CStr(vdia) & "/" & CStr(Month(FechaActual)) & "/" & CStr(Year(FechaActual)) Return FechaCobro End Function Public Overloads Function Sueldo(ByVal ImporteIncentivo As Double, ByVal TipoIncentivo As Strin ) As Double ' aquí calculamos la cantidad de incentivo ' que se añadirá al sueldo del empleado, ' en funci n del tipo de incentivo Dim incentivo As Double ' se ún el tipo de incentivo, ' se descuenta un importe ' de la cantidad del incentivo Select Case TipoIncentivo Case "Viajes" incentivo = ImporteIncentivo - 30 Case "Extras" incentivo = ImporteIncentivo - 15 End Select Return incentivo End Function End Class

P i

105

Programación Windows
2.Lue o diseñaremos el si uiente formulario.

TxtNo TxtSalari NumericUpDow TxtIncentiv CboTipoIn LblMensaj

BtnMostra

3.- Lue o codificaremos lo si uiente: Private Sub btnmostrar_Click 'Variable que maneja la clase Dim objempleado As New Empleado objempleado.nombre = Me.txtnom.Text objempleado.salario = CDbl(Me.txtsalario.Text) 'Variables que capturan el resultado Dim s2, s3 As Strin Dim resincentivo As Double 'llamada al primer método sobrecar ado objempleado.Sueldo() 'llamada al se undo método sobrecar ado s2 = "El Sueldo se Transferira el dia " & objempleado.Sueldo(Me.NumericUpDown1.Value) 'llamada al tercer método sobrecar ado resincentivo = objempleado.Sueldo(Me.txtincentivo.Text, Me.cbotipoinc.Text) s3 = "El Incentivo a pa ar será " & CStr(resincentivo) 'Resultado final que se mostrara en un Label Me.lblmensaje.Text = s2 & vbNewLine & s3 End Sub

P i

106

Programación Windows

Eventos
Un evento es un suceso que le ocurre al objeto y que le indica sobre un cambio en sus atributos o propiedades. Un evento es necesario para controlar el estado de las propiedades e informar a las aplicaciones del nuevo estado, para que estas realizacen la acci n correspondiente. Es fácil entender eventos asociados a objetos visuales como los controles, por ejemplo en el objeto ³button´ se tiene el evento ³Click´ que se desencadena al seleccionar el bot n, el evento ³MouseMove´ que ocurre al pasar el mouse por el bot n, y así hay muchos eventos asociados al objeto bot n; pero cuando trabajamos con clases, los eventos son más abstractos y un poco más difíciles de entender, ya que podía confundirse con lo métodos. Para aclarar el concepto de eventos definamos mentalmente una clase llamada ³Cuenta´ para un componente llamado ³Banco´. Esta clase cuenta tiene propiedades como ³NumeroCta´, ³FechaApertura´, ³TipoCta´, ³NumeroTarjeta´, y ³Saldo´. Además tiene métodos como ³Dep sito´, ³Retiro´ y ³Transferencia´ que modifican el estado del saldo. Cuando hacemos un ³Re tiro´ de nuestra cuenta donde el monto a retirar supera el ³Saldo´ se desencadena un evento llamado ³SaldoInsuficiente´ y también cuando durante el día hemos retirado mas dl monto permitido se desencadena el evento ³limiteRetiroDiario´. Para crear un evento en la clase primero declare evento con la sentencia ³Event´ y lue o llámelo con ³RaiseEvent´, tal como se muestra en la sintaxis. Declaración Sintaxis: [Tipo Declaraci n] Event <Nombre> ([Parámetro(s)]) Declaración Llamada: RaiseEvent <Nombre> ([Parámetro(s)]) Ejercicio Práctico Nº3 1.- Crearemos 2 eventos para una clase llamada Empleado, el cual estos eventos nos informarán cuando el sueldo es bajo o alto; para nuestra realidad un sueldo será bajo cuando es menor a 500 y alto cuando sea mayor a 3000. Public Class Empleado 'Variables de Propiedad Private mvarcodi o As Inte er Private mvarnombre As Strin Private mvarsueldo As Sin le

P i

107

Programación Windows
'Propiedades Public Property Codigo() As Integer Get Codigo = mvarcodigo End Get Set(ByVal value As Integer) mvarcodigo = value End Set End Property Public Property Nombre() As String Get Nombre = mvarnombre End Get Set(ByVal value As String) mvarnombre = value End Set End Property Public Property Sueldo() As Single Get Sueldo = mvarsueldo End Get Set(ByVal value As Single) mvarsueldo = Sueldo End Set End Property 'Metodos Public Sub crearempleado(ByVal vcodigo As Integer, ByVal vnombre As String, ByVal vsueldo As Single) mvarcodigo = vcodigo mvarnombre = vnombre mvarsueldo = vsueldo µEl procedimiento creado el cual maneja los eventos lo llamaremos chequearsueldo() End Sub Public Sub actuali arSueldo(ByVal vnuevosueldo As Single) mvarsueldo = vnuevosueldo µEl procedimiento creado el cual maneja los eventos lo llamaremos chequearsueldo() End Sub 'Creamos eventos Public Event SueldoBajo() Public Event SueldoAlto() 'Crearemos un procedimiento el cual 'desencadenara un evento de acuerdo 'a la condicion establecida Sub chequearsueldo() If mvarsueldo < 500 Then RaiseEvent SueldoBajo() ElseIf mvarsueldo > 3000 Then RaiseEvent SueldoAlto() End If End Sub End Class 

P i

108

Programación Windows
2.- Lue o diseñaremos el si uiente formulario.

TxtCod TxtNom BtnCrear TxtSue BtnMostrar BtnActualizar TxtEventoSueldo

3.- Codificaremos lo si uiente. Public Class FrmProducto 'Declaracion de la variable que contendra toda la Clase Empleado 'del Proyecto POO en Visual 'Pero como nuestra clase maneja 2 eventos 'Se declara de la si uiente manera para poder usar los eventos creados Private WithEvents objempleado As New Empleado() Private Sub BtnCrear_Click 'Se llama al metodo CrearEmpleado objempleado.crearempleado(Me.txtcod.Text, Me.txtnom.Text, Me.txtsue.Text) Ms Box("Datos Guardados...!", Ms BoxStyle.Information, "SISE") End Sub Private Sub btnactualizar_Click Dim sueldo As Sin le Dim res As Strin res = InputBox("In rese Nuevo Sueldo") If res = "" Then Exit Sub Else sueldo = CDbl(res) End If 'Llamamos al método ActualizarSueldo objempleado.actualizarSueldo(sueldo) Ms Box("Sueldo Actualizado...!", Ms BoxStyle.Information, "SISE") End Sub

P i

109

Programación Windows
Private Sub btnmostrar_Click With objempleado MsgBox("Codigo: " & .Codigo & vbCrLf & "Nombre: " & .Nombre & vbCrLf & "Sueldo: " & .Sueldo, MsgBoxStyle.Information, "SISE") End With End Sub 'Crearemos 2 procedimientos el cual cada uno 'indica lo que hara cada evento 'Al evento lo llamaremos con Handles Public Sub Sbajo() Handles objempleado.SueldoBajo Me.txteventosueldo.ForeColor = Color.Green Me.txteventosueldo.Text = objempleado.Nombre " tiene un Sueldo Bajo" End Sub Public Sub SAlto() Handles objempleado.SueldoAlto Me.txteventosueldo.ForeColor = Color.Blue Me.txteventosueldo.Text = objempleado.Nombre " tiene un Sueldo Alto" End Sub End Class 


Herencia de Clases
Introducción a la Herencia de Clases
La parte principal de la Pro ramaci n Orientada a Objetos (POO) es la herencia de clases, es decir, la característica de definir una clase que sirve de base para otras clases derivadas, las clases derivadas tendrán los miembros de la clase base: propiedades, métodos, eventos, etc. Los miembros heredados por la clase derivada pueden sobre escribirse e implementarse de otra forma, además la clase derivada puede tener sus propios miembros y servir de clase base para otras clases, lo rándose la reutilizaci n de objetos a través de la herencia. Otra forma de herencia es a través del polimorfismo, que es una característica POO que consiste en definir una Clase Abstracta con propiedades y métodos que serán implementados de diferentes formas por otras clases, es decir, con un mismo nombre de propiedad o método se obtiene funcionalidad distinta de acuerdo al tipo de objeto. En .Net solo existe herencia simple y no herencia múltiple, es decir, una clase derivada solo puede heredar de una clase Base. Haciendo una analo ía, si a la clase base le llamamos ³Padre´ y a la clase derivada le llamamos ³Hijo´ diríamos que la herencia simple consiste en que un ³Hijo´ solo puede tener un solo ³Padre´, lo que parece al o natural y coherente. Si deseamos simular herencia múltiple en Visual Basic .Net recurrimos a las interfaces, que permiten definir propiedades y métodos en una clase sin c di o, lue o desde una clase se puede implementar varias interfaces, lo rándose una herencia múltiple pero a nivel de definici n y no de c di o, ya que la implementaci n será distinta en cada clase.

P i

110

Programación Windows
En eneral, la herencia de clases permite rehusar c di o y facilitar el mantenimiento de las aplicaciones, ya que cuando se desee modificar características de un objeto solo hay que cambiar la clase adecuada.

Implementando Herencia a una Clase
Para crear una herencia de clases se usa la instrucci n Inherits se uida de la clase base de donde se heredarán los miembros para la clase actual (clase derivada). Tal como se muestra debajo.

Sintaxis:
Inherits <Clase Base> Nota: Dos observaciones importantes que hay que tener en cuenta son: 1. La instrucci n Inherits debe escribirse en la primera línea de la clase derivada 2. Solo puede existir una instrucci n Inherits, ya que solo existe herencia simple. Ejercicio Práctico Nº
1.- Crearemos a continuaci n una clase llamada Vendedor que heredará todas sus propiedades, métodos y eventos de clase creada anteriormente llamada Empleado.

Public Class Vendedor 'Esto quiere decir que se heredará de la clase Empleado Inherits Empleado 'Variables de Propiedad Private mvarventa As Sin le Private mvarcomision As Sin le 'Propiedades Public Property Venta() As Sin le Get Return mvarventa End Get Set(ByVal value As Sin le) mvarventa = value End Set End Property Public Property Comision() As Sin le Get Return mvarcomision End Get Set(ByVal value As Sin le) mvarcomision = value End Set End Property End Class
P i 111

Programación Windows
2.- Lue o diseñaremos el si uiente formulario

TxtCod TxtNom TxtSue TxtVenta BtnCrear TxtComision BtnMostrar BtnActualizar

3.- Codificaremos lo si uiente. Public Class FrmVendedor Dim objvendedor As New Vendedor Private Sub BtnCrear_Click 'Accedemos a los miembros de clase Padre objvendedor.Codi o = Me.txtcod.Text objvendedor.Nombre = Me.txtnom.Text objvendedor.Sueldo = Me.txtsue.Text 'Ahora Accedemos a los miembros de esta clase objvendedor.Venta = Me.txtventa.Text objvendedor.Comision = Me.txtcomi.Text End Sub Private Sub btnactualizar_Click Dim sueldo As Sin le Dim res As Strin res = InputBox("In rese Nuevo Sueldo") If res = "" Then Exit Sub Else sueldo = CDbl(res) End If 'Llamamos al método ActualizarSueldo de la clase Padre objvendedor.actualizarSueldo(sueldo) Ms Box("Sueldo Actualizado...!", Ms BoxStyle.Information, "SISE") End Sub

P i

112

Programación Windows
Private Sub btnmostrar_Click Ms Box("Codi o: " & objvendedor.Codi o & vbNewLine & _ "Nombre: " & objvendedor.Nombre & vbNewLine & _ "Sueldo: " & objvendedor.Sueldo & vbNewLine & _ "Venta: " & objvendedor.Venta & vbNewLine & _ "Comision: " & objvendedor.Comision) End Sub End Class

Herencia y Sobrecarga de Métodos
Podemos sobrecar ar métodos existentes en una clase base dentro de una clase derivada, para ello simplemente escribimos la implementaci n del método sobrecar ado utilizando la palabra clave Overloads, tal y como se ha explicado en anteriores apartados. Tomemos como ejemplo una clase base Empleado y su clase derivada Administrativo. Cuando calculamos los incentivos para un empleado, lo hacemos basándonos en una operaci n sobre el salario; sin embar o, los incentivos para el administrativo se calculan en base a un número de horas, por lo que escribimos dos implementaciones del mismo método en cada clase, sobrecar ando el método en la clase Administrativo.

Ejercicio Práctico Nº5
1.- Crearemos la clase base Empleado. Public Class Empleado 'Campos de la clase Public mvarid As Inte er Public mvarnombre As Strin Public mvarsalario As Sin le Public mvarincentivo As Sin le 'Métodos de la clase base Empleado Public Sub calcularincentivo() ' calcular los incentivos en base ' al salario Me.mvarincentivo = Me.mvarsalario / 10 End Sub Public Sub verincentivos() Ms Box("Los Incentivos de " & Me.mvarnombre & " son " & Me.mvarincentivo) End Sub End Class

P i

113

Programación Windows
2.- Lue o crearemos la clase derivada Administrativo. Public Class Administrativo 'Heredamos de la clase Empleado Inherits Empleado 'Sobrecar amos el método calcularincentivo de la clase Empleado Public Overloads Sub calcularincentivo(ByVal vhoras As Inte er) ' calcular los incentivos en base a horas Me.mvarincentivo = vhoras * 15 End Sub End Class 3.- Lue o diseñaremos el si uiente formulario.

TxtCod TxtNom TxtSalario BtnPadre BtnHijo

4.- Codificaremos lo si uiente. Public Class Form1 'Instanciamos la clase base Dim objempleado As New Empleado 'Instanciamos la clase derivada Dim objadministrativo As New Administrativo Private Sub btnPadre_Click Me.objempleado.mvarid = Me.txtcod.Text Me.objempleado.mvarnombre = Me.txtnom.Text Me.objempleado.mvarsalario = Me.txtsalario.Text Me.objempleado.calcularincentivo() Me.objempleado.verincentivos() End Sub Private Sub btnhijo_Click Me.objadministrativo.mvarid = Me.txtcod.Text Me.objadministrativo.mvarnombre = Me.txtnom.Text Me.objadministrativo.mvarsalario = Me.txtsalario.Text
P i 114

Programación Windows
Dim horas As Inte er Dim res As Strin res = InputBox("In rese Numero de Horas") If res = "" Then Exit Sub Else horas = CInt(res) End If 'Llamamos el método sobrecar ado de la clase Derivada Me.objadministrativo.calcularincentivo(horas) Me.objadministrativo.verincentivos() End Sub End Class
! ! ! !

Ado .Net Conexiones Strin Proveedores de Datos - (Consultas Múltiples) 
¿Qué es Ado.Net?  ¿Qué es un NameSpace?  Ado evoluciona a Ado.Net  Conexiones Strin  ¿Qué es un Proveedor de Datos?  .Data Provider  Connection y DataAdapter  Cómo funciona el DataAdapter  Consultas Simples y Múltiples

¿Qué es Ado.Net?
Ado.Net es un modelo de pro ramación basado en estándares que permite crear aplicaciones distribuidas que accedan a datos compartidos. Por ser una Interfaz de Pro ramación de Aplicaciones (API), está disponible desde muchas aplicaciones, herramientas de desarrollo, len uajes de pro ramación y nave adores de Internet. Entre el software donde podemos usar Ado.Net tenemos: Visual Basic.Net Visual C++.Net Visual C# ASP.Net JScript.Net
P i 115

Programación Windows ¿Qué es un NameSpace de Acceso de Datos?
Hay tres Namespace que puede importar dentro de una aplicación.Net que utiliza ADO.Net. En primer lu ar usará siempre el namespace System.Data, y lue o ele ir entre System.Data.SqlClient o System.Data.Oledb, dependiendo del ori en de los datos. Cuando utiliza Ado.Net debe importar el namespace System.Data, para hacerlo debe usar la palabra clave Imports.

Imports System.Data
Si esta trabajando con una base de datos SQL Server 2000, también importará el namespace System.Data.Sqlclient. Si esta trabajando con datos de otros orí enes de datos, necesitará importar el namespace System.Data.Oledb, para hacerlo debe usar la si uiente sentencia:

Imports System.Data.Sqlclient Imports System.Data.Oledb

NameSpace
System.Data

Descripción
Incluye las clases que hacen posible reali ar el trabajo en modo desconectado en la arquitectura de ADO .NET

System.Data.Common

Provee las clases e interfaces heredadas que permiten la implementación de los .NET Data Providers.

System.Data.SqlClient System.Data.OleDb System.Data.SqlTypes System.Xml

Proveedor para SQL Server. Proveedor para OLE-DB para NET. Las clases y estructuras nativas de SQL Server Clases, interfases de XML.

P i

116

Programación Windows
Para poder emplear el SQLClient en el editor de codigo de su aplicación debe colocar la siguiente instrucción:

ADO ADO .NET
ADO evoluciona hacia ADO .NET

Conexiones String en Visual Basic .Net 2005
Conexión Access 200
Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C: \mydatabase.mdb

Conexión a Access 2007
Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\myFolder\myAccess2007file.accdb

Página 117

Programación Windows

SQL 2005
Vía Autentificación Windows
Server =myServer; DataBase =myDataBase; Integrated Security=True

Vía Usuario de SQL Server 2005
Server =myServer; DataBase =myDataBase; User Id=myUsername; Password=myPassword
1.- Diseñar el Si uiente formulario:

btnAccess2003

PictureBox1

btnAccess2007

btnSql2005

btnUsuario

lblConecta

2.- Para realizar la Conexión con Access, se debe de contar con la Base de Datos Neptuno entre ada por el Profesor, en los 2 tipos de versiones uardadas en Access 2003 y Access 2007.
Versión 2003 Versión 2007

P i

118

Programación Windows
3.- Para Hacer la conexión con Access y SQL se deben de Importar los si uientes NameSpace respectivamente: Imports System.Data.OleDb 'Para la conexion Access Imports System.Data.SqlClient 'Para la conexion con SQL Estos NameSpace los importamos en Declaraciones Generales, por encima del Public Class 4.- Lue o di itar el si uiente códi o para las diferentes conexiones en sus respectivos botones. Private Sub btnaccess2003_Click Dim cn As New OleDbConnection("Provider=Microsoft.Jet.Oledb.4.0; Data Source=C:\Neptuno.mdb") Try cn.Open() Me.lblconecta.Text = "Conexion con Access 2003 Satisfactoria..." Me.lblconecta.Refresh() Catch ex As Exception Me.lblconecta.Text = ex.Messa e cn.Close() Finally cn.Close() End Try End Sub

Private Sub btnaccess2007_Click Me.lblconecta.Text = "" Dim cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Neptuno.accdb") Try cn.Open() Me.lblconecta.Text = "Conexion con Access 2007 Satisfactoria ..." Me.lblconecta.Refresh() Catch ex As Exception Me.lblconecta.Text = ex.Messa e cn.Close()
P i 119

Programación Windows
Finally cn.Close() End Try End Sub

Private Sub btnusuario_Click Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; User Id=Castilla; Password=123") Try cn.Open() Me.lblconecta.Text = "Conexion a SQL 2005 Mediante el Usuario Castilla es Satisfactoria..." Me.lblconecta.Refresh() Catch ex As Exception Me.lblconecta.Text = ex.Messa e cn.Close() Finally cn.Close() End Try End Sub

Private Sub btnsql2005_Click Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True") Try cn.Open() Me.lblconecta.Text = "Conexion a SQL 2005 Satisfactoria..." Me.lblconecta.Refresh() Catch ex As Exception Me.lblconecta.Text = ex.Messa e cn.Close() Finally cn.Close() End Try End Sub
P i 120

Programación Windows

¿Qué son los proveedores de Datos?
Los proveedores de datos proporcionan el enlace entre el origen deDatos y el Objeto DataSet. Los objetos que son proporcionados por los proveedores de datos .Net se listan en la siguiente tabla:

Objetos del proveedor de datos .Net
Connection Command DataAdapter

Propósito
Proporciona la conectividad con el origen de datos Proporciona el acceso para los comandos de Base de Datos Utiliza el objeto Connection para proporcionar un enlace entre el DataSet y el proveedor de datos. El objeto DataAdapter actualiza los cambios que se han hecho a los datos en el DataSet

.Net Data Provider
Estas clases son específicas para un origen de datos. El .Net Data Provider provee la habilidad de conectarse al origen de datos, recuperar y administrar datos.

Hay que resaltar que estos componentes son implementados separadamente por cada .Net Data Provider.

Connection
Esta clase es empleada para representar una conexión hacia un especifico origen de datos.

Página 121

Programación Windows
DataAdapter
Esta clase actúa como un puente entre el origen de datos y el objeto desconectado del DataSet. Provee 2 interfaces, una a través de la cual permite poblar el DataSet y actualizar la información en el origen de datos y la otra provee 4 propiedades cada una de tipo command: SelectCommand, InsertCommand, UpdateCommand y DeleteCommand.

DataAdapter

DataAdapter
SelectCommand InsertCommand UpdateCommand DeleteCommand

Database

DataSet

.DataSet

Página 122

Programación Windows

Como Actúa el DataAdapter con respecto a una Base de Datos
Connection, Command 1
DataAdapter VB DataTable Despachar Datos (Fill) SqlClient

Base atos

2

Consultas
1.- Diseñamos el si uiente formulario.

BtnCargar

DatagridView

2.- Lue o en declaraciones enerales importamos lo si uiente. Imports System.Data Imports System.Data.SqlClient 3.- Lue o a nivel formulario creamos la conexión. Public Class Form1 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True")

P i

123

Programación Windows
4.- codificamos lo siguiente en el botón btnCargar Private Sub Btncargar_Click Dim da As New SqlDataAdapter("Select * from Products", cn) Dim ds As New DataSet da.Fill(ds, "Productos") Me.DataGridView1.DataSource = ds.Tables("Productos") End Sub 5.- Despues cargamos la aplicaión y se debe mostrar de la siguiente manera.

Página 124

Programación Windows

Pro ramación Orientada a Ob etos (POO) - Usando una ibrería de Herencia
Práctica de aboratorio
En este laboratorio vamos a construir una librería de clases para un Instituto Superior Tecnológico que permita matricular a los alumnos en un cierto curso libre dictado por un cierto profesor. Para lo cual realizamos los siguientes pasos.

Trabajando con Herencia de Clases
1.-Elegir un nuevo proyecto ³Visual Basic´ y una plantilla ³Biblioteca de Clases´ el cual se llamara ³Librería de Clases Herencia´ 2.- Crear la clase ³Persona´, luego escribir el código siguiente para crear las propiedades: Nombre, FechaNac, Edad y Dirección y el método CrearPersona: Public Class Persona Private mvarNombre As String Private mvarFechaNac As Date Private mvarEdad As Byte Private mvarDireccion As String Public Property Nombre() As String Get Return Me.mvarNombre End Get Set(ByVal value As String) Me.mvarNombre = value End Set End Property Public Property FechaNac() As Date Get Return Me.mvarFechaNac End Get Set(ByVal value As Date) Me.mvarFechaNac = value End Set End Property

P i

125

Programación Windows
Public ReadOnly Property Edad() As Byte Get Return Me.mvarEdad End Get End Property Public Property Direccion() As String Get Return Me.mvarDireccion End Get Set(ByVal value As String) Me.mvarDireccion = value End Set End Property Public Sub CrearPersona(ByVal vNombre As String, ByVal vFechaNac As Date, ByVal vDireccion As String) Me.mvarNombre = vNombre Me.mvarFechaNac = vFechaNac Me.mvarDireccion = vDireccion Me.mvarEdad = Convert.ToByte(Date.Today.Year - vFechaNac.Year) End Sub End Class 2.- Crear la clase ³Alumno´ que hereda de ³Persona´, para lo cual añadimos una clase al componente, y le pondremos como nombre ³Alumno´. Luego escribimos el siguiente código. Public Class Alumno 'Codigo que identifica que va heredar de la clase Persona Inherits Persona Private mvarCodigo As String Private mvarEspecialidad As String Public Property Codigo() As String Get Return Me.mvarCodigo End Get Set(ByVal value As String) Me.mvarCodigo = value End Set End Property Public Property Especialidad() As String Get Return Me.mvarEspecialidad End Get Set(ByVal value As String) Me.mvarEspecialidad = value End Set End Property
P i 126

Programación Windows
Public Sub CrearAlumno(ByVal vNombre As String, ByVal vFechaNac As Date, ByVal vDireccion As String, ByVal vCodigo As String, ByVal vEspecialidad As String) CrearPersona(vNombre, vFechaNac, vDireccion) Me.mvarCodigo = vCodigo Me.mvarEspecialidad = vEspecialidad End Sub End Class 3.- Crear la clase ³Profesor´ que también hereda de ³Persona´, para lo cual añadimos una clase al componente; y escribimos como nombre ³Profesor´. Luego escribimos el siguiente código: Public Class Profesor 'Codigo que identifica que va heredar de la clase Persona Inherits Persona Private mvarCodigo As String Private mvarTipo As String Public Property Codigo() As String Get Return Me.mvarCodigo End Get Set(ByVal value As String) Me.mvarCodigo = value End Set End Property Public Property Tipo() As String Get Return Me.mvarTipo End Get Set(ByVal value As String) Me.mvarTipo = value End Set End Property Public Sub CrearProfesor(ByVal vNombre As String, ByVal vFechaNac As Date, ByVal vDireccion As String, ByVal vCodigo As String, ByVal vTipo As String) CrearPersona(vNombre, vFechaNac, vDireccion) Me.mvarCodigo = vCodigo Me.mvarTipo = vTipo End Sub End Class

P i

127

Programación Windows
4.- Finalmente crear la clase ³Curso´, para lo cual añadimos una clase al componente, y escribimos como nombre ³Curso´. Luego escribimos el siguiente código: Public Class Curso Private mvarCodigo As String Private mvarNombre As String Private mvarTotalHoras As Byte Private mvarCostoTotal As Single Private mvarCostoHora As Single Public Property Codigo() As String Get Return mvarCodigo End Get Set(ByVal value As String) Me.mvarCodigo = value End Set End Property Public Property Nombre() As String Get Return Me.mvarNombre End Get Set(ByVal value As String) Me.mvarNombre = value End Set End Property Public Property TotalHoras() As Byte Get Return Me.mvarTotalHoras End Get Set(ByVal value As Byte) Me.mvarTotalHoras = value End Set End Property Public Property CostoTotal() As Single Get Return Me.mvarCostoTotal End Get Set(ByVal value As Single) Me.mvarCostoTotal = value End Set End Property Public ReadOnly Property CostoHora() As Single Get Return Me.mvarCostoHora End Get End Property
P i 128

Programación Windows
Public Sub CrearCurso(ByVal vCodigo As String, ByVal vNombre As String, ByVal vTotalHoras As Byte, ByVal vCostoTotal As Single) Me.mvarCodigo = vCodigo Me.mvarNombre = vNombre Me.mvarTotalHoras = vTotalHoras Me.mvarCostoTotal = vCostoTotal Me.mvarCostoHora = Me.mvarCostoTotal / Me.mvarTotalHoras End Sub 2.- Luego, añadimos una aplicación para Windows que me permita realizarla matricula usando la librería de clases creada. 3.- Para eso seguir los siguientes pasos:

4.- El proyecto se llamará Probando Librería Herencia 5.- Diseñamos un formulario llamado FrmMatricula que tenga un TabControl con 3 fichas, una de ingreso de Datos del Alumno, otra el Curso y por ultimo el Profesor, diseñadas tal como se muestran las figuras de abajo: y Ficha ³Alumno³ del formulario FRMMATRICULA

Página 129

Programación Windows
y Ficha ³Curso³ del formulario FRMMATRICULA

y

Ficha ³Profesor³ del formulario FRMMATRICULA

Después de realizar el diseño y antes de escribir código, para usar la librería primero debemos hacer una referencia a esta. Clic derecho sobre nuestro proyecto ³Probando Librería Herencia´ y elegimos agregar Referencia, nos aparecerá una ventana el cual elegiremos la pestaña proyecto y clic sobre el proyecto que contiene nuestra clase ³Librería de Clases Herencia´.

Página 130

Programación Windows
En las declaraciones generales definimos variables objetos para manipular datos del Alumno, Curso y Profesor. Public objAlumno As New Libreria_de_Clases_Herencia.Alumno Public objCurso As New Libreria_de_Clases_Herencia.Curso Public objProfesor As New Libreria_de_Clases_Herencia.Profesor
y

Programando en el botón Matricula: Private Sub btnMatricular_Click Me.objAlumno.CrearAlumno(Me.txtnomalu.Text, Me.dtpFechaNacAlu.Value, Me.txtdiralu.Text, Me.txtcodalu.Text, Me.CboEspecialidad.Text) Me.objCurso.CrearCurso(Me.txtcodcur.Text, Me.cbocurso.Text, Me.txtTotalHoras.Text, Me.txtCostoTotal.Text) Me.objProfesor.CrearProfesor(Me.txtnomprof.Text, Me.dtpfechanacprof.Value, Me.txtdirprof.Text, Me.txtcodprof.Text, Me.cbotipo.Text) MsgBox("Alumno Matriculado...!", MsgBoxStyle.Information, "SISE")

End Sub
y

Programando en el botón Consultar: Private Sub btnConsultar_Click MsgBox("El Alumno(a) " & Me.objAlumno.Nombre & vbNewLine & _ "con " & Me.objAlumno.Edad & " años de edad" & vbNewLine & _ "Con una Especialidad en " & Me.objAlumno.Especialidad & vbNewLine & _ "Esta inscrito en el Curso de " & Me.objCurso.Nombre & vbNewLine & _ "El cual tiene un Costo X Hora de S/." & Me.objCurso.CostoHora & vbNewLine & _ "Sera dictado por el Profesor(a) " & Me.objProfesor.Nombre & vbNewLine & _ "con " & Me.objProfesor.Edad & " años de edad", MsgBoxStyle.Information, "SISE") End Sub Finalmente, programamos el botón Salir de la aplicación: Private Sub btnsalir_Click Me.Close() End Sub

y

P i

131

Programación Windows

Data Sets, DataTable y DataRelation 
  
¿Qué es un DataSet? ¿Qué es un DataTable? DataColumns, DataRows DataRelation Via Código y Usando Asistente

La Clase DataSet
Básicamente, un objeto DataSet va a ser similar a un objeto Recordset de ADO, pero más potente y complejo. Es el almacén de datos por excelencia en ADO .NET, representando una base de datos en memoria y desconectada del proveedor de datos, que contiene tablas y sus relaciones. El objeto DataSet nos proporciona el mejor concepto sobre datos desconectados: una copia en el cliente de la arquitectura de la base de datos, basada en un esquema XML que la independiza del fabricante, proporcionando al desarrollador la libertad de trabajo independiente de la plataforma. Cada tabla contenida dentro de un objeto DataSet se encuentra disponible a través de su propiedad Tables, que es una colección de objetos System.Data.DataTable. Cada objeto DataTable contiene una colección de objetos DataRow que representan las filas de la tabla. Y si seguimos con esta analogía tenemos que decir que cada objeto DataRow, es decir, cada fila, posee una colección de objetos DataColumn, que representan cada una de las columnas de la fila actual. Existen además, colecciones y objetos para representan las relaciones, claves y valores por defecto existentes dentro de un objeto DataSet. Para poder crear e inicializar las tablas del DataSet debemos hacer uso del objeto DataAdapter, que posee las dos versiones, es decir, el objeto SqlDataAdapter para SQL Server y OleDbDataAdapter genérico de OLE DB. Al objeto DataAdapter le pasaremos como parámetro una cadena que representa la consulta que se va a ejecutar, y que va a rellenar de datos el DataSet. Del objeto DataAdapter utilizaremos el método Fill(), que posee dos parámetros; el primero es el DataSet a rellenar de información; y el segundo, una cadena con el nombre que tendrá la tabla creada dentro del DataSet, producto de la ejecución de la consulta.
P i 132

Programación Windows
En lo que respecta a las propiedades de la clase DataSet, podemos remarcar las siguientes.
y

Relations. Esta propiedad devuelve una colección de objetos DataRelation, que representan todas las relaciones existentes entre las tablas del objeto DataSet. Tables. Devuelve una colección de objetos DataTable, que representan a cada una de las tablas existentes dentro del objeto DataSet.

y

DataSet Tables

olum s onstrain

R ow s Relation
Un DataTable, almacena datos de forma similar que una tabla en una base de datos, es decir que la información esta distribuida en un conjunto de registros cada una de ellas esta conteniendo un conjunto e columnas. Un DataTable esta constituido por las siguientes colecciones:
y

Columns, contiene el DataColumn, se define las características como nombre de la columna, tipos de datos y primary key. Rows, contiene el DataRow, que representa la información que se quiere manipular. Constraints, contiene ForeignKeyConstraint y/o UniqueConstraint.

y y

DataColumn
Define el nombre de columna y el tipo de datos que se almacenara. Se puede crear una nueva columna a través de los siguientes formatos:

DataRow
Para poder poblar un DataTable debemos emplear el objeto DataRow, cada objeto DataRow puede referenciar a la colección Columns. Para crear un objeto DataRow debe emplear el metodo NewRow
P i 133

Programación Windows

Reali ando Consultas Múltiples 1ra Forma
1.- Creamos el diseño para el siguiente formulario.
BtnMostrar

DataGridView1

DataGridView2

DataGridView3

2.- Luego hacemos la conexión con SQL, pero antes importamos los namespace. Imports System.Data Imports System.Data.SqlClient Public Class Form2 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True") 3.- En botón BtnMostrar codificamos lo siguiente. Private Sub btnMostrar_Click 'Declaramos los DataAdapter Dim da1 As New SqlDataAdapter("Select Categoryid,Categoryname from Categories", cn) Dim da2 As New SqlDataAdapter("Select Productid,Productname,Unitprice from Products", cn) Dim da3 As New SqlDataAdapter("Select Supplierid,CompanyName, City, Country from Suppliers", cn)

P i

134

Programación Windows
'Declaramos el DataSet Dim ds As New DataSet 'Llenamos el DataSet da1.Fill(ds, "Categoria") da2.Fill(ds, "Productos") da3.Fill(ds, "Proveedor") 'Cargamos los DataGridView Me.DataGridView1.DataSource = ds.Tables("Categoria") Me.DataGridView2.DataSource = ds.Tables("Productos") Me.DataGridView3.DataSource = ds.Tables("Proveedor") End Sub 4.- Luego ejecutamos la aplicación y se debe mostrar de la siguiente manera.

2da Forma.
1.- Agregamos otro formulario con el mismo diseño que el anterior.
BtnMost

DataGridVie

DataGridVie

DataGridVie

Página 135

Programación Windows
2.- Luego hacemos la conexión con SQL, pero antes importamos los namespace. Imports System.Data Imports System.Data.SqlClient Public Class Form3 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True") 3.- En botón BtnMostrar codificamos lo siguiente. Private Sub BtnMostrar_Click 'Declaramos todo en un DataAdapter Dim da As New SqlDataAdapter ("Select Categoryid,Categoryname from Categories;" & _ "Select Productid,Productname,Unitprice from Products;" & _ "Select Supplierid,CompanyName, City, Country from Suppliers", cn) Dim ds As New DataSet da.Fill(ds) ds.Tables(0).TableName = "Categoria" ds.Tables(1).TableName = "Productos" ds.Tables(2).TableName = "Proveedor" Me.DataGridView1.DataSource = ds.Tables("Categoria") Me.DataGridView2.DataSource = ds.Tables("Productos") Me.DataGridView3.DataSource = ds.Tables("Proveedor") End Sub

Ejercicio Práctico Nº1
1.- Diseñar el siguiente formulario.

BtnDataSe

LstClientes

P i

136

Programación Windows
2.- Codificaremos lo siguiente: 'Importacion de los NameSpace Imports System.Data Imports System.Data.SqlClient Public Class Form1 'Declaracion de la cadena de conexion Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=SSPI") Private Sub btnDataset_Click 'Declaracion del DataAdapter Dim da As New SqlDataAdapter("Select * from Customers order by CompanyName", cn) 'Declaracion del DataSet Dim ds As New DataSet 'Filtramos lo que contiene el DataAdapter al DataSet 'En una tabla temporal Customers da.Fill(ds, "Clientes") 'Declaramos una variable de tipo DataRow Dim Fila As DataRow 'La Variable Fila de Tipo DataRow 'Recorrera todas las filas de la tabla de nuestro DataSet 'y las agregara al ListBox For Each Fila In ds.Tables("Clientes").Rows Me.lstclientes.Items.Add(Fila.Item("CompanyName") & " - " & Fila.Item("ContactName") & " - " & Fila.Item("Country")) Next End Sub End Class

Relaciones entre tablas mediante objetos DataRelation
Los objetos DataRelation nos permiten establecer una relación entre dos tablas (objetos DataTable) de un DataSet, a través de una columna o campo común (objetos DataColumn). Ejercicio Practico Nº2 1.- Diseñar el siguiente formulario.
CboClientes

LstOrdenes

P i

137

Programación Windows
2.- Luego Codificaremos lo siguiente: 'Importamos los NameSpace Imports System.Data Imports System.Data.SqlClient Public Class Form2 'Declaramos la cadena de conexion Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=SSPI") 'Declaramos nuestros DataAdapters 'para traer informacion de las 2 tablas 'a relacionar Dim daClientes As New SqlDataAdapter("Select * from Customers", cn) Dim daOrdenes As New SqlDataAdapter("Select * from Orders", cn) Dim ds As New DataSet Private Sub Form2_Load 'Llenamos el DataSet en 2 DataTables daClientes.Fill(ds, "Clientes") daOrdenes.Fill(ds, "Ordenes") 'Indicamos la relacion de los 2 DataTables ds.Relations.Add("ClientesOrdenes", ds.Tables("Clientes").Columns("Customerid"), ds.Tables("Ordenes").Columns("Customerid")) Dim fila As DataRow 'Llenamos el ComboBox For Each fila In ds.Tables("Clientes").Rows Me.cboClientes.Items.Add(fila.Item("CompanyName")) Next End Sub Private Sub cboClientes_SelectedIndexChanged 'Limpiamos el ListBox Me.LstOrdenes.Items.Clear() 'Variable de tipo DataRow que contendra 'Los registros de la Tabla Primaria (Customers) Dim FilaPadre As DataRow FilaPadre = ds.Tables("Clientes").Rows(Me.cboClientes.SelectedIndex) 'Arrays que contendra los registros de la tabla Hija 'Mediante la Relacion (Customers-Orders) Dim FilasHija() As DataRow FilasHija = FilaPadre.GetChildRows("ClientesOrdenes") Dim Filas As DataRow 'Llenar el listbox con valores de las filas hijas For Each Filas In FilasHija Me.LstOrdenes.Items.Add(Filas.Item("OrderId") & " - " & Filas.Item("OrderDate")) Next End Sub End Class
P i 138

Programación Windows
Ejercicio Practico Nº3 1.- Diseñar el siguiente formulario.
CboClient

DataGridView

2.- Luego codificaremos lo siguiente: Imports System.Data Imports System.Data.SqlClient Public Class Form3 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=SSPI") Dim daClientes As New SqlDataAdapter("Select * from Customers", cn) Dim daOrdenes As New SqlDataAdapter("Select * from Orders", cn) Dim ds As New DataSet Private Sub Form3_Load daClientes.Fill(ds, "Clientes") daOrdenes.Fill(ds, "Ordenes") ds.Relations.Add("ClientesOrdenes", ds.Tables("Clientes").Columns("Customerid"), ds.Tables("Ordenes").Columns("Customerid")) Dim fila As DataRow For Each fila In ds.Tables("Clientes").Rows Me.cboClientes.Items.Add(fila.Item("CompanyName")) Next End Sub Private Sub cboClientes_SelectedIndexChanged Dim FilaPadre As DataRow FilaPadre = ds.Tables("Clientes").Rows(Me.cboClientes.SelectedIndex) Dim FilasHija() As DataRow FilasHija = FilaPadre.GetChildRows("ClientesOrdenes") 'Creacion de un DataTable Dim dtRelacion As New DataTable 'Declaracion de un DataColumn Dim columna As DataColumn 'Declaracion de un DataRow Dim fila As DataRow

P i

139

Programación Windows
'Crearemos 2 columnas para nuestro DataTable columna = New DataColumn("Codigo") 'Indicamos el Tipo de Dato para la columna columna.DataType = Type.GetType("System.Int32") 'Agregaremos la columna al DataTable dtRelacion.Columns.Add(columna) columna = New DataColumn("Fecha Orden") columna.DataType = Type.GetType("System.DateTime") dtRelacion.Columns.Add(columna) 'Variable que recorrera las FilasHijas Dim Filas As DataRow For Each Filas In FilasHija 'Se crea una nueva fila en el DataTable fila = dtRelacion.NewRow 'Agregara los registros de los campos de la fila Hija 'En cada columna creada fila("Codigo") = Filas.Item("OrderId") fila("Fecha Orden") = Filas.Item("OrderDate") 'Agregaremos las filas al DataTable dtRelacion.Rows.Add(fila) Next 'Por ultimo mostraremos el contenido del DataTable 'en un DataGridView Me.DataGridView1.DataSource = dtRelacion End Sub End Class

Relación de 2 Tablas Usando la Herramienta Relation del DataSet
1.- Agregaremos otro formulario al proyecto, y en el nuevo formulario agregaremos 2 SqlDataAdapter, uno para la tabla empleados y el otro para la tabla orders. En la Tabla Empleado escogeremos los campos EmployeeId, y FirstName. En la Tabla Orders escogeremos los campos OrderId, OrderDate y EmployeeId. Al final debe mostrarse los 2 SqlDataAdapter.

2.- Luego seleccionamos los 2 SqlDataAdapter, y generaremos un conjunto de Datos. .- Ir al menú Datos / Generar Conjunto de datos. 4.- En la ventana que aparecerá le ponemos un nombre al DataSet que se va generar, luego escogeremos los 2 SqlDataAdapter.
Página 140

Programación Windows

5.- Luego en el DataSet generado, clic sobre la flecha negra y escogeremos Diseñador del DataSet.

6.- Nos mostrará una ventana donde aparecerán las dos Tablas, Employees y Orders.

7.- Ahora usaremos la herramienta Relation del DataSet para relacionar esas 2 Tablas.

Página 141

Programación Windows
8.- Al relacionar arrastraremos desde la Tabla Orders hacia la Tabla Employees (es decir de Padre a Hijo), en este caso la tabla padre va ser Employees y el hijo Orders. 9.- En la ventana que aparecerá se debe mostrar la relación entre ellas por el campo EmplyeeId.

10.- La relación debe quedar de la siguiente manera.

11.- Luego a nuestro formulario le agregaremos un ListBox y un DataGrid.

Página 142

Programación Windows
12.- En su propiedad DataSource del ListBox, escogeremos el DataSet generado, y en su propiedad DisplayMember, escogeremos el campo FirstName de la Tabla Employees, p los nombres de los ues empleados son los que se deben de mostrar al cargar mi formulario.

1 .- Luego en su propiedad DataSource del DataGrid cargaremos el DataSet creado, y en su propiedad DataMember escogeremos la Tabla Orders relacionada con la Tabla Employees.

14.- Luego en el evento Load del Formulario escribiremos el siguiente código para cargar los 2 SqlDataAdapter al DataSet. Private Sub Form2_Load Me.SqlDataAdapter1.Fill(Me.DsEmployeesorders1) Me.SqlDataAdapter2.Fill(Me.DsEmployeesorders1) End Sub

Página 143

Programación Windows
15.- Al final ejecutamos y se debe mostrar de la siguiente manera, escogemos un empleado en el ListBox, y en el Datagrid se debe mostrar las ordenes emitidas por ese empleado.

El Obj 

D

Vi w

¿Qué es el Objeto DataView? 

¿Para que Sirve?  Propiedad Sort y RowFilter  Navegación de Registros (Control BindingSource)  DataBinding y BindingContext

Página 144

Programación Windows

El objeto DataView
El objeto DataView permite manejar dentro de una aplicación la información que recibe un objeto DataSet. La información que recibe un DataSet se almacena en forma predeterminada en un objeto DataTable y esta la podemos enviar al objeto DataView para manejarla y presentarla de muchas formas. El objeto DataView se puede enlazar a controles y mostrarla ordenada o filtrada, es decir, crear un subconjunto de los datos obtenidos. Una de las formas de crear un objeto DataView es la siguiente:

Dim Nombre as New DataView
Una vez creado el objeto DataView se utiliza su propiedad Table para enviarle información que tiene el Objeto DataSet mediante su objeto DataTable. La siguiente instrucción envía el objeto DataView la información que contiene el objeto DataTable llamado Empleados de DataSet Ds.

MiDataView.Table=Ds.Tables(³Empleados´)

Principales Propiedades del Objeto DataView
AllowDelete : Permite que se pueda eliminar o no registros del DataView AllowEdit: Permite que se pueda editar la información del DataView AllowAddNew: Permite que pueda o no agregar nuevos registros al DataView. Count: Devuelve la cantidad de registros que contiene el DataView Item: Permite acceder a la información de una fila del DataView. La primera fila tiene el número 0 (cero). Para acceder a la información de una columna, podemos usar también la propiedad Item de esta propiedad utilizando el número de la columna o su nombre. La primera columna tiene el número 0 (cero). RowFilter: Esta propiedad se utiliza cuando deseamos seleccionar los registros del DataView. Aquí se escribe la condición que deben cumplir los registros. Por Ejemplo: La siguiente instrucción sólo selecciona en el DataView las personas cuyo nombre empieza con Ca:

MiDataView.RowFilter=´Nombre like µCa%¶´
Sort: Esta propiedad se utilize para indicar la columna por la cual se debe de ordenar la información del DataView. Por ejemplo, la siguiente instrucción ordena por la columna Nombre la información del DataView.

MiDataView.Sort=´Nombre´
P i 145

Programación Windows
Ejercicio Práctico Nº1 1.- Diseñar el siguiente Formulario.
BtnMostrar

2.- Luego codificaremos lo siguiente: Imports System.Data Imports System.Data.SqlClient
TxtPrecio LblTotal TxtProducto TxtStock

Public Class Form1 'Declaro mi cadena de conexión Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=SSPI") 'Declaro mi DataAdapter Dim da As New SqlDataAdapter("Select * from Products", cn) 'Declaro mi DataSet Dim ds As New DataSet 'Declaro mi vista Dim midataview As New DataView Private Sub BtnMostrar_Click da.Fill(ds, "Productos") 'Le asigno una tabla midataview.Table = ds.Tables("Productos") 'Ordena los registros por el campo Productname midataview.Sort = "ProductName" Me.DataGridView1.DataSource = midataview Me.lbltotal.Text = "Son " & midataview.Count & " registros" End Sub Private Sub DataGridView1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView1.DoubleClick 'Si la fila que selecciono Si contiene algo entonces... If Not IsDBNull(Me.DataGridView1.SelectedCells(0).Value) Then Me.txtproducto.Text = midataview.Item(Me.DataGridView1.CurrentRow.Index).Item("Productname") Me.txtprecio.Text = midataview.Item(Me.DataGridView1.CurrentRow.Index).Item("Unitprice") Me.txtStock.Text = midataview.Item(Me.DataGridView1.CurrentRow.Index).Item("UnitsInStock") End If End Sub End Class

P i

146

Programación Windows
Ejercicio Práctico Nº2 1.- Diseñar el siguiente Formulario.
BtnCon1 BtnCon2

DataGridView

Imports System.Data Imports System.Data.SqlClient Public Class Form2 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=SSPI") Dim da As New SqlDataAdapter("Select Productid,Productname,Unitprice, UnitsInStock from Products", cn) Dim ds As New DataSet Dim dv As New DataView Private Sub Form2_Load 'Cargamos nuestra Vista da.Fill(ds, "Productos") dv.Table = ds.Tables("Productos") End Sub Private Sub btnCon1_Click 'Condicion de Filtrado dv.RowFilter = "ProductName like 'C%'" Me.DataGridView1.DataSource = dv End Sub Private Sub btnCon2_Click 'Condicion de Filtrado dv.RowFilter = "Unitprice=18 and Productname like 'S%'" Me.DataGridView1.DataSource = dv End Sub End Class

P i

147

Programación Windows
Ejercicio Práctico Nº3 1.- Diseñar el siguiente Formulario.
TxtProducto

DataGridView

Imports System.Data Imports System.Data.SqlClient Public Class Form3 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=SSPI") Dim da As New SqlDataAdapter("Select Productid,Productname,Unitprice, UnitsInStock from Products", cn) Dim ds As New DataSet Dim dv As New DataView Private Sub Form3_Load 'Se llena la vista da.Fill(ds, "Productos") dv.Table = ds.Tables("Productos") End Sub Private Sub txtproducto_TextChanged 'La condicion de filtrado se concaneta o se une 'con lo que se escriba en la caja TxtProducto 'Entonces la condicion de filtrado lo pone la caja de Texto dv.RowFilter = "Productname like '" & Me.txtproducto.Text & "%'" Me.DataGridView1.DataSource = dv End Sub End Class

P i

148

Programación Windows

Usando el Control BindingSource
En general, un Objeto BindingSource hace de puente entre el control y el conjunto de datos, simplificando la conexión control-origen de datos, la actualización del contenido actual, la notificación de cambios y otros servicios.
Control de un Formulario

BindingSource

Origen de Datos

Realizada la conexión control-origen de datos, toda interacción con los datos, incluyendo navegación, ordenación, filtrado y actualizaciones, puede ser llevada a cabo utilizando la funcionalidad del componente BindingSource. 1.- Agregaremos un control BindingSource, que se encuentra en el grupo Datos del cuadro de Herramientas

2.- En su propiedad DataSource del BindingSource escogemos la opción Agregar origen de Datos del Proyecto.

Página 149

Programación Windows
3.- Aparecerá la siguiente ventana y escogeremos Base de Datos y luego clic en el botón siguiente.

4.- Luego escogemos la conexión hecha en el Explorador de Servidores con la Base de Datos Northwind.

5.- Luego la ventana que aparece muestra el nombre que se le va a dar a la cadena de conexión.

Página 150

Programación Windows
6.- Después clic en siguiente y luego escogemos los campos de la tabla que se mostrarán y le pondremos un nombre al DataSet que se generará en este caso le pondremos DsSuppliers y clic en Finalizar.

7.- Luego deben de aparecer el BindingSource y el DataSet debajo del Formulario.

8.- Luego en su propiedad DataMember del BindingSource cargaremos la tabla seleccionada.

Página 151

Programación Windows
9.- Y por defecto se agregará un TableAdapter, que es un adaptador para acceder a la tabla de la Base de Datos.

10.- Luego creamos el siguiente diseño en el formulario.

TxtCodigo TxtNombre TxtDireccion TxtRegistro BtnPrimero BtnUltimo BtnAnterior BtnSiguiente TxtTelefono

11.- Ahora en lazaremos las Cajas de Textos al BindingSource, para ello en su propiedad DataBinding / Text de las Cajas de Textos, elegiremos el BindingSource y el campo de la tabla que queremos que se muestre en la Caja de Texto. Asi lo haremos para las demás Cajas de Textos.

P i

152

Programación Windows
12.- Luego crearemos el siguiente procedimiento a nivel formulario. Private Sub mostrarposicion() Dim itotal As Integer = Me.BindingSource1.Count Dim ipos As Integer If itotal = 0 Then txtregistro.Text = "No Regsitros" Else ipos = Me.BindingSource1.Position + 1 txtregistro.Text = ipos.ToString & " de " & itotal.ToString End If End Sub 13.- Luego escribiremos el siguiente código para los botones de desplazamiento y para el evento Load del Formulario Private Sub Form1_Load 'TODO: esta línea de código carga datos en la tabla 'DsSuppliers.Suppliers' Puede quitarla según sea necesario. Me.SuppliersTableAdapter.Fill(Me.DsSuppliers.Suppliers) mostrarposicion() End Sub Private Sub btnprimero_Click Me.BindingSource1.MoveFirst() mostrarposicion() End Sub Private Sub btnanterior_Click Me.BindingSource1.MovePrevious() mostrarposicion() End Sub Private Sub btnsiguiente_Click Me.BindingSource1.MoveNext() mostrarposicion() End Sub moverla o

P i

153

Programación Windows
Private Sub btnultimo_Click Me.BindingSource1.MoveLast() mostrarposicion() End Sub 14.- Por ultimo ejecutamos la aplicación y se debe mostrar como la figura.

DataBinding y BindingContext
Los controles que con regularidad se utilizan en aplicaciones Windows así como en aplicaciones Web tienen la propiedad DataBinding, es necesario configurar la propiedad de cada control que contendrá en enlace a los datos, luego para administrar esta se de utilizar la propiedad be BindingContext de la clase contenedora. Al usar el BindingContext obtiene el BindingManagerBase que mantiene sincronizados todos los controles enlazados al mismo origen de datos, se puede utilizar la propiedad Position del BindingManagerBase para especificar el elemento actualmente seleccionado de una lista. Por ejemplo, para enlazar una caja de texto con el campo FirsName de la Tabla Empleados (dtEmpleados) contenida en una DataSet previamente definido utilizo la siguiente instrucc ión: txtNombre.DataBindings.Add("Text", dtEmpleados, "FirstName") Luego para administrar por ejemplo la posición actual o lo que es lo mismo el registro activo se utiliza la siguiente instrucción: Me.BindingContext(dtEmpleados).Position = 0 Note en la instrucción anterior que se utiliza ña propiedad BindingContext del formulario, como lo dicho en líneas arriba, la propiedad Position va a mantener sincronizados todos los controles enlazados al DataTable dtEmpleados.
Página 154

Programación Windows
Ejemplo: Realizar el Siguiente Diseño:

txtCodigo txtproducto txtprecio txtstock

btnprimero btnanterior LblTotal btnsiguiente

btnultimo

Imports System.Data Imports System.Data.SqlClient Public Class Form1 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True") Dim ds As New DataSet Sub cuenta() Dim total As Integer = Me.BindingContext(ds.Tables("Productos")).Count Dim pos As Integer If total = 0 Then Me.lbltotal.Text = "No hay registros" Else pos = Me.BindingContext(ds.Tables("Productos")).Position + 1 Me.lbltotal.Text = pos & " de " & total End If End Sub Sub cargar() Me.txtcodigo.DataBindings.Add("text", ds.Tables("Productos"), "ProductId") Me.txtproducto.DataBindings.Add("text", ds.Tables("Productos"), "ProductName") Me.txtprecio.DataBindings.Add("text", ds.Tables("Productos"), "UnitPrice") Me.txtstock.DataBindings.Add("text", ds.Tables("Productos"), "UnitsInStock") End Sub
P i 155

Programación Windows
Private Sub Form1_Load Dim da As New SqlDataAdapter("Select * from Products", cn) da.Fill(ds, "Productos") cargar() cuenta() End Sub Private Sub btnprimero_Click Me.BindingContext(ds.Tables("Productos")).Position = 0 cuenta() End Sub Private Sub btnanterior_Click Me.BindingContext(ds.Tables("Productos")).Position -= 1 cuenta() End Sub Private Sub btnsiguiente_Click Me.BindingContext(ds.Tables("Productos")).Position += 1 cuenta() End Sub Private Sub btnultimo_Click Me.BindingContext(ds.Tables("Productos")).Position = ds.Tables("Productos").Rows.Count ± 1 cuenta() End Sub End Class

Consultas con Procedimientos Almacenados con Parámetros 
  
La Clase Command Búsqueda de Clientes Consultas de Fechas Trabajo de Consultas con parámetros.
P i 156

Programación Windows

Las clases Command
Establecida una conexión con un almacén de datos, la siguiente operación lógica consiste en enviarle sentencias para realizar los distintos tipos de operaciones que habitualmente realizamos con los datos. Las clases Command de ADO .NET serán las usaremos para realizar tales operaciones. SqlCommand y OleDbCommand, son muy similares al objeto Command existente en ADO. El objeto Command nos va a permitir ejecutar una sentencia SQL o un procedimiento almacenado sobre la fuente de datos a la que estamos accediendo. A través de un objeto Command también podremos obtener un conjunto de resultados del almacén de datos. En este caso, los resultados se pasarán a otros objetos de ADO .NET, como DataReader o DataAdapter; estos dos objetos los comentaremos más adelante. Un objeto Command lo vamos a crear a partir de una conexión ya existente, y va a contener una sentencia SQL para ejecutar sobre la conexión establecida con el origen de datos. Entre las propiedades que ofrecen los objetos SqlCommand y OleDbCommand, caben destacar las siguientes.
y

CommandText. Contiene una cadena de texto que va a indicar la sentencia SQL o procedimiento almacenado que se va a ejecutar sobre el origen de los datos. CommandTimeout. Tiempo de espera en segundos que se va a aplicar a la ejecución de un objeto Command. Su valor por defecto es de 30 segundos. CommandType. Indica el tipo de comando que se va a ejecutar contra el almacén de datos, es decir, indica como se debe interpretar el valor de la propiedad CommadText. Puede tener los siguientes valores: StoredProcedure, para indicar que se trata de un procedimiento almacenado; TableDirect se trata de obtener una tabla por su nombre (únicamente aplicable al objeto OleDbCommand); y Text que indica que es una sentencia SQL. EL valor por defecto es Text. Connection. Devuelve el objeto SqlConnection o OleDbConnection utilizado para ejecutar el objeto Command correspondiente. Parameters. Colección de parámetros que se pueden utilizar para ejecutar el objeto Command, esta colección se utiliza cuando deseamos ejecutar sentencias SQL que hacen uso de parámetros, esta propiedad devuelve un objeto de la clase SqlParameterCollection o un objeto de la clase OleDbParameterCollection. Estas colecciones contendrán objetos de la clase SqlParamter y OleDbParameter, respectivamente, para represen a cada uno de los tar parámetros utilizados. Estos parámetros también son utilizados para ejecutar procedimientos almacenados.

y

y

y

y

P i

157

Programación Windows
Una vez vistas algunas de las propiedades de las clases SqlCommand y OleDbCommand, vamos a pasar a comentar brevemente los principales métodos de estas clases. Ejercicio Practico Nº1 En este ejemplo veremos como el Command llama a un procedimiento almacenado creado en la Base de datos Northwind. 1.- Agregamos un formulario con el siguiente diseño.
DataGridView BtnMostra

DataGridView

2.- Luego hacemos la conexión con SQL, pero antes importamos los namespace. Imports System.Data Imports System.Data.SqlClient Public Class Form2 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True") 3.- Después creamos un procedimiento almacenado llamado ListarTablas CREATE PROCEDURE ListarTablas AS Select Categoryid,Categoryname from Categories Select Productid,Productname,Unitprice from Products Select Supplierid,CompanyName, City, Country from Suppliers RETURN
DataGridView

P i

158

Programación Windows
4.- Luego en el Botón BtnMostrar codificamos lo siguiente. Private Sub BtnMostrar_Click Dim comando As New SqlCommand("ListarTablas", cn) comando.CommandType = CommandType.StoredProcedure Dim da As New SqlDataAdapter(comando) Dim ds As New DataSet da.Fill(ds) ds.Tables(0).TableName = "Categoria" ds.Tables(1).TableName = "Producto" ds.Tables(2).TableName = "Proveedor" Me.DataGridView1.DataSource = ds.Tables("Categoria") Me.DataGridView2.DataSource = ds.Tables("Producto") Me.DataGridView3.DataSource = ds.Tables("Proveedor") End Sub Ejercicio Practico Nº2 En este ejemplo trabajaremos con el ComboBox y dos propiedades del mismo: ValueMember: Sirve para guardar un campo especifico cuando se elige un elemento del ComboBox. SelectedValue: Sirve para devolver el valor guardado en la propiedad ValueMember. 1.- Diseñamos el siguiente formulario.

BtnVer ComboBox DataGridView

P i

159

Programación Windows
2.- Luego en declaraciones generales importamos lo siguiente. Imports System.Data Imports System.Data.SqlClient 3.- Luego a nivel formulario creamos la conexión. Public Class Form3 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True") 4.- En el evento load del formulario codificamos lo siguiente. Private Sub Form3_Load Dim cmd As New SqlCommand("Select * from Categories", cn) Dim da As New SqlDataAdapter(cmd) Dim ds As New DataSet da.Fill(ds, "Categorias") Me.ComboBox1.DataSource = ds.Tables("Categorias") Me.ComboBox1.ValueMember = "CategoryId" Me.ComboBox1.DisplayMember = "CategoryName" End Sub Private Sub Btnver_Click Dim cmd As New SqlCommand("Select * from products where categoryid=" & Me.ComboBox1.SelectedValue, cn) Dim da As New SqlDataAdapter(cmd) Dim ds As New DataSet da.Fill(ds, "Productos") Me.DataGridView1.DataSource = ds.Tables("Productos") End Sub 6.- Por último ejecutamos y se debe de mostrar de la siguiente manera.

Página 160

Programación Windows

Consultas con Procedimientos Almacenados
1ra. Consulta
1.- Crear el siguiente procedimiento almacenado. CREATE PROCEDURE BuscarClientes @cliente varchar(20) AS select customerid,companyname,city,country from customers where companyname like @cliente + ' ' return 2.- Luego diseñar el siguiente formulario: 3.- Hacemos la conexión con la Base de Datos. Imports System.Data Imports System.Data.SqlClient Public Class Form1 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True") 4.- En el evento Load del Formulario. Private Sub Form1_Load 'Da el ancho de las Columnas Automáticamente deacuerdo a sus contenidos Me.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells Dim cmd As New SqlCommand("Select customerid,companyname,city,country from Customers", cn) Dim da As New SqlDataAdapter(cmd) Dim dt As New DataTable da.Fill(dt) Me.DataGridView1.DataSource = dt End Sub

Página 161

Programación Windows
5.- En el evento TextChange del TxtCliente Private Sub txtcliente_TextChanged Dim comando As New SqlCommand("BuscarClientes", cn) comando.CommandType = CommandType.StoredProcedure comando.Parameters.Add("@cliente", SqlDbType.NVarChar, 20).Value = Me.txtcliente.Text Dim da As New SqlDataAdapter(comando) Dim dt As New DataTable da.Fill(dt) Me.DataGridView1.DataSource = dt End Sub 6.- Luego ejecutar la aplicación y se debe mostrar de la siguiente manera.

2da. Consulta
1.- Crear el siguiente procedimiento almacenado. CREATE PROCEDURE BuscarPorFechas @fecha datetime AS select o.orderid,p.productname,c.companyname,o.orderdate from orders o inner join customers c on o.customerid=c.customerid inner join [order details] d on o.orderid=d.orderid inner join products p on p.productid=d.productid where o.orderdate=@fecha RETURN 2.- Nos conectamos con la Base de Datos Imports System.Data Imports System.Data.SqlClient

Página 162

Programación Windows
Public Class Form2 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True") 3.- En el evento ValueChanged del DataTimePicker Private Sub dtpfecha_ValueChanged Dim cmd As New SqlCommand("BuscarPorFechas", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@fecha", SqlDbType.DateTime).Value = Me.dtpfecha.Value Dim da As New SqlDataAdapter(cmd) Dim ds As New DataSet da.Fill(ds, "Fecha") Me.DataGrid1.DataSource = ds.Tables("Fecha") End Sub 4.- Luego ejecutamos la aplicación.

Entorno Conectado ExecuteNonQuer y ExecuteScalar anteni iento de una Tabla

Página 163

Programación Windows

El Entorno Conectado
Durante mucho tiempo las aplicaciones que requerian el empleo de datos lo hacian a traves de un entorno conectado de datos, lo cual significa que un usuario y/o aplicacion esta conectado al origen de datos constantemente. Un escenario conectado ofrece como beneficio: y y Un entorno seguro de facil mantenimiento. Se puede controlar facilmente la concurrencia. Requiere de una conexion de Red Permanente. Afecta la escabilidad de la aplicación.

Pero a su vez este modo de trabajo nos puede presentar algunas desventajas: y y

Accediendo a Entornos Conectados
En escenarios conectados los recursos están disponibles hasta cerrar la conexión. a) Abrir Conexión b) Ejecutar el Comando c) Procesar las Filas de un Reader d) Cerrar el Reader e) Cerrar la Conexion

Página 164

Programación Windows

Instrucción Execute NonQuery
Esto es lo que nos dice la ayuda de Visual Studio sobre el método ExecuteNonQuery: y y Ejecuta una instrucción SQL en un objeto de conexión. Se puede utilizar ExecuteNonQuery para realizar operaciones de catálogo (por ejemplo, consultar la estructura de una base de datos o crear objetos de base de datos como tablas) o para cambiar la información de una base de datos ejecutando las instrucciones UPDATE, INSERT o DELETE. y Aunque ExecuteNonQuery no devuelva ninguna fila, los parámetros de salida o los valores devueltos asignados a los parámetros se rellenan con datos. y Para las instrucciones UPDATE, INSERT y DELETE, el valor devuelto corresponde al número de filas afectadas por el comando. Para los demás tipos de instrucciones, el valor devuelto es -1.

Abrir y Cerrar una Conexión Ejecutando el SQLCommand
1.- Crearemos el siguiente procedimiento almacenado: CREATE PROCEDURE CrearTablaContactos AS Create table Contactos ( CodContacto int identity(1,1), CodEmpleado int not null, Fecha Datetime ) RETURN 2.- Luego en nuestro formulario insertaremos un Button y quedará de la siguiente manera. 3.- Luego hacemos la conexión vía script. Imports System.Data.SqlClient Public Class Form1 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True")

Página 165

Programación Windows
4.- Luego en el Button codificamos lo siguiente. Private Sub Button1_Click 'Lo codificamos dentro de un try Catch para que se maneje un error que 'se pueda cometer, asi tal vez si la tabla ya existe, que me mande un mensaje Try Dim comando As New SqlCommand("CrearTablaContactos", cn) comando.CommandType = CommandType.StoredProcedure 'Abre la conexion cn.Open() 'ejecuta el SQLCommand comando.ExecuteNonQuery() 'Muestra mensaje despues de Crear la Tabla MsgBox("Tabla "Mensaje") Catch ex As Exception 'Si la Tabla ya existe que me mande un mensaje MsgBox("La Tabla Contactos ya Existe", MsgBoxStyle.Information, "Mensaje") Finally 'Cierra la conexión cn.Close() End Try End Sub 5.- Luego ejecutamos y al dar clic sobre el button se debe mostrar el siguiente mensaje Contactos Creada Satisfactoriamente", MsgBoxStyle.Information,

6.- Si volvemos a dar clic nos debe mostrar el siguiente mensaje.

Página 166

Programación Windows

Insertar Registros a una Tabla
1.- Crear el Siguiente procedimiento almacenado. CREATE PROCEDURE InsertarProducto @descripcion varchar(40), @categoria int, @proveedor int AS Insert into Products(Productname, Categoryid,SupplierID) values(@descripcion,@categoria,@Proveedor) RETURN @@identity 2.- Hacemos el siguiente diseño en el formulario.

TxtProducto

btnAgregar

btnLimpiar

TxtProveedor

TxtCategoria

3.- Hacemos la Conexión. System.Data.SqlClient Public Class Form2 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True") 4.- Luego en el botón btnAgregar, codificamos lo siguiente: Private Sub btnagregar_Click Try Dim comando As New SqlCommand("InsertarProducto", cn) comando.CommandType = CommandType.StoredProcedure comando.Parameters.Add("@descripcion", SqlDbType.NVarChar, 40).Value = Me.txtproducto.Text comando.Parameters.Add("@categoria", SqlDbType.Int).Value = Val(Me.txtcategoria.Text) comando.Parameters.Add("@proveedor", SqlDbType.Int).Value = Val(Me.txtproveedor.Text)

P i

167

Programación Windows
'Asi definimos un parámetro de retorno Dim prm1 As New SqlParameter("@return_value", SqlDbType.Int) prm1.Direction = ParameterDirection.ReturnValue comando.Parameters.Add(prm1) 'Abrir la Conexión cn.Open() 'Ejecuta el SQLCommand comando.ExecuteNonQuery() 'Mensaje de Producto Insertado MsgBox("Se ha Insertado un Producto con Código " & prm1.Value) Catch ex As Exception MsgBox(ex.Message) Finally cn.Close() End Try End Sub 5.- Luego en botón btnlimpiar, codificamos: Private Sub btnlimpiar_Click Me.txtcategoria.Clear() Me.txtproducto.Clear() Me.txtproveedor.Clear() End Sub

Instrucción ExecuteScalar:
y

Ejecuta la consulta y devuelve la primera columna de la primera fila del conjunto de resultados que devuelve la consulta. Se omiten todas las demás columnas y filas. Utilice el método ExecuteScalar para recuperar un único valor (por ejemplo, un valor agregado) de una base de datos.

y

Por tanto, podemos deducir que ExecuteNonQuery lo usaremos para ejecutar la mayoría de las instrucciones de SQL que ejecutará algo en la base de datos, pero que no devolverá un valor. Bueno, en realidad, en algunos casos si que devolverá un valor, pero será para indicarnos, por ejemplo, si eliminamos varias filas de la tabla, devolverá el número de filas eliminadas. Por otro lado, ExecuteScalar lo usaremos cuando tengamos que ejecutar un código de SQL del que queremos recuperar la primera columna de la primera fila. Este método devuelve un valor de tipo Object que tendremos que convertir según el valor devuelto. Por ejemplo, si queremos saber el número de registros (filas) de una tabla que cumple cierto criterio, podemos usar un comando SQL como este:
SELECT Count(*) FROM Prueba WHERE FechaAlta >= @Param1

P i

168

Programación Windows
En este caso, el valor devuelto será del tipo Int32 y será el número de filas que hay en la tabla Prueba de la base de datos indicada en el objeto Connection que previamente habremos abierto que tenga una fecha igual o superior a la indicada en el parámetro proporcionado a ese comando. Si no hay ninguna fila que cumpla ese criterio, devolverá cero. Nota: Instrucciones de SQL no significa que hay que usarlo con SQL Server, sino que son instrucciones en "lenguaje" SQL, que en SQL Server se conoce como T-SQL o Transact SQL, y que por tanto podemos usar con cualquier tipo de base de datos, (o casi).

Ejercicio Práctico Nº1

Txtpro

BtnProductos

BtnEmpleados Txtemp

Imports System.Data Imports System.Data.SqlClient Dim cn As New SqlConnection("Server=(local); Database=Northwind; Integrated Security=True") Private Sub Btnproductos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim cmd As New SqlCommand("Select count(*) from products", cn) cn.Open() Dim x As Integer x = cmd.ExecuteScalar Me.txtpro.Text = x.ToString cn.Close() End Sub

P i

169

Programación Windows
Private Sub BtnEmpleados_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim cmd As New SqlCommand("Select count(*) from employees", cn) cn.Open() Dim y As Integer y = cmd.ExecuteScalar Me.txtemp.Text = y.ToString cn.Close() End Sub

Mantenimiento de la Tabla Shippers (Empresa)
1.- Diseñar el siguiente Formulario.

BtnNuevo TxtCod BtnGuardar BtnModificar

TxtEmp TxtTel

BtnEliminar

DgvEmpresa

2.- Luego Codificaremos lo siguiente: Imports System.Data Imports System.Data.SqlClient Public Class Form1 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=SSPI") Sub filtrar() Dim da As New SqlDataAdapter("Select * from Shippers", cn) Dim dt As New DataTable da.Fill(dt) Me.DgvEmpresa.DataSource = dt End Sub
P i 170

Programación Windows
Private Sub Form1_Load filtrar() End Sub Private Sub BtnGuardar_Click Try Dim cmd As New SqlCommand("Insert Into Shippers Values(@empresa,@telefono)", cn) cmd.Parameters.Add("@empresa", SqlDbType.VarChar, 40).Value = Me.txtemp.Text cmd.Parameters.Add("@telefono", SqlDbType.VarChar, 9).Value = Me.txtTel.Text cn.Open() cmd.ExecuteNonQuery() MsgBox("Empresa Registrada...!", MsgBoxStyle.Information, "SISE") filtrar() Catch ex As Exception MsgBox(ex.Message) Finally cn.Close() End Try Dim x As Integer Dim cmd1 As New SqlCommand("Select max(shipperid) from Shippers", cn) cn.Open() x = cmd1.ExecuteScalar Me.txtcod.Text = x.ToString cn.Close() End Sub Private Sub BtnActualizar_Click Try Dim cmd As New SqlCommand("Update Shippers Set CompanyName=@empresa,Phone=@telefono where Shipperid=@codigo", cn) cmd.Parameters.Add("@empresa", SqlDbType.VarChar, 40).Value = Me.txtemp.Text cmd.Parameters.Add("@telefono", SqlDbType.VarChar, 9).Value = Me.txtTel.Text cmd.Parameters.Add("@codigo", SqlDbType.Int).Value = CInt(Me.txtcod.Text) cn.Open() cmd.ExecuteNonQuery() MsgBox("Datos Actualizados...!", MsgBoxStyle.Information, "SISE") filtrar() Catch ex As Exception MsgBox(ex.Message) Finally cn.Close() End Try End Sub Private Sub BtnEliminar_Click Try Dim cmd As New SqlCommand("Delete from Shippers where Shipperid=@codigo", cn) cmd.Parameters.Add("@codigo", SqlDbType.Int).Value = Me.txtcod.Text cn.Open() cmd.ExecuteNonQuery()
P i 171

Programación Windows
MsgBox("Empresa Eliminada...!", MsgBoxStyle.Information, "SISE") filtrar() Catch ex As Exception MsgBox(ex.Message) Finally cn.Close() End Try End Sub Private Sub DgvEmpresa_DoubleClick If Not IsDBNull(Me.DgvEmpresa.SelectedCells(0).Value) Then Me.txtcod.Text = Me.DgvEmpresa.SelectedCells(0).Value Me.txtemp.Text = Me.DgvEmpresa.SelectedCells(1).Value Me.txtTel.Text = Me.DgvEmpresa.SelectedCells(2).Value End If End Sub Private Sub BtnNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.txtcod.Clear() Me.txtemp.Clear() Me.txtTel.Clear() End Sub End Class

El Control DataGrid ie 
¿Qué es un DatagridView?  ¿Arquitectura del DataGridView?  Ejemplo Práctico

P i

172

Programación Windows

Arquitectura de un Control DataGridView
Un control DataGridView contiene dos clases fundamentales de objetos:celdas y bandas o grupos de celdas (filas y columnas). La celda es la unidad fundamental de interacción con el control DaraGridView. Podemos acceder a cualquiera de ellas a través de la colección Cells de DataGridViewRow y a las que estén seleccionadas, a través de la colección SelectedCells. El esquema de los datos almacenados en un DataGridView es expresado en columnas (objeto DataGridViewColumn), a las que podemos acceder a través de su colección Columns y a las que estén seleccionadas, a través de su colección SelectedColumns. Las filas (objeto DataGridViewRow) muestran los campos de los registros almacenados en un DataGridView. Podemos acceder a ellas a través de su colección Rows, y a las que estén seleccionadas, a través de su colección SelectedRows. 1.- Diseñar el siguiente formulario.

CboOrden CboProducto TxtPre TxtCan

DgvProductos

Imports System.Data Imports System.Data.SqlClient

P i

173

Programación Windows
Public Class Form3 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True")

Private Sub Form3_Load Dim dr As SqlDataReader Dim cmd As New SqlCommand("Select * from orders", cn) cn.Open() dr = cmd.ExecuteReader Do While dr.Read Me.cboorden.Items.Add(dr("OrderId")) Loop dr.Close() cn.Close() Dim cmd2 As New SqlCommand("Select * from products", cn) Dim da As New SqlDataAdapter(cmd2) Dim dt As New DataTable da.Fill(dt) Me.cboproducto.DataSource = dt Me.cboproducto.DisplayMember = "Productname" Me.cboproducto.ValueMember = "Productid" Me.dgvdetalle.Columns(0).Width = 45 Me.dgvdetalle.Columns(1).Width = 45 Me.dgvdetalle.Columns(2).Width = 90 Me.dgvdetalle.Columns(3).Width = 60 Me.dgvdetalle.Columns(4).Width = 60 Me.dgvdetalle.Columns(5).Width = 60 Me.cboproducto.Text = "" Me.txtpre.Clear() End Sub

Private Sub cboproducto_SelectedIndexChanged Dim x As Double Dim cmd3 As New SqlCommand("Select UnitPrice from Products where productname='" & Me.cboproducto.Text.Trim & "'", cn) cn.Open() x = CDec(cmd3.ExecuteScalar) cn.Close() Me.txtpre.Text = x.ToString("###,##0.00")

P i

174

Programación Windows
End Sub

Private Sub btnagregar_Click Me.dgvdetalle.Rows.Add(Me.cboorden.Text, Me.cboproducto.SelectedValue, Me.cboproducto.Text, Me.txtpre.Text, Me.txtcant.Text, Val(Me.txtcant.Text) * Val(Me.txtpre.Text)) End Sub

Private Sub btneliminar_Click If Me.dgvdetalle.Rows.Count = 1 Then MsgBox("No se puede Eliminar", MsgBoxStyle.Information, "DataGridView") Else Me.dgvdetalle.Rows.Remove(Me.dgvdetalle.CurrentRow) End If End Sub

Private Sub btnguardar_Click Dim x As Integer Try For x = 0 To Me.dgvdetalle.Rows.Count - 2 Dim cmd As New SqlCommand("insert [Order details] values(@orden,@producto,@precio,@cantidad,0)", cn) cmd.Parameters.Add("@orden", SqlDbType.Int).Value = Me.dgvdetalle.Item(0, x).Value cmd.Parameters.Add("@producto", SqlDbType.Int).Value = Me.dgvdetalle.Item(1, x).Value cmd.Parameters.Add("@precio", SqlDbType.Money).Value = Me.dgvdetalle.Item(3, x).Value cmd.Parameters.Add("@cantidad", SqlDbType.Int).Value = Me.dgvdetalle.Item(4, x).Value cn.Open() cmd.ExecuteNonQuery() cn.Close() Next MsgBox("Detalle de Orden Generado", MsgBoxStyle.Information, "Sistema") Me.dgvdetalle.Rows.Clear() Catch ex As Exception MsgBox(ex.Message) Finally cn.Close() End Try End Sub End Class

P i

175

Programación Windows

El Ob eto DataReader 
¿Qué es el Objeto DataReader?  ¿Qué es el Objeto SQLDataReader?  Instrucción ExecuteReader  Ejemplo Práctico

Objeto DataReader
El objeto DataReader se utiliza en Ado.Net para leer la información que envía el origen de datos y manejarla en el cliente. Por Ejemplo: Si ha usado el objeto SQLConnection, tendrás que utilizar el objeto SQLDataReader.

Objeto SQLDataReader
El objeto SQLDataReader permite acceder a la información de una base de Datos de una manera muy rápida, mejorando el rendimiento de nuestra aplicación por la velocidad que utiliza para acceder a ella y también porque requiere poco espacio de memoria ya que sólo perm anece en ella un solo registró a la vez. Las características de acceso a la información de este objeto es que es en forma secuencial y hacia delante, es decir, desde la primera hasta la última fila. Otra característica de este objeto es que la información que almacena es de solo lectura, es decir, que sólo se puede utilizar cuando deseamos leer la información del servidor, por ejemplo, para los programas de listado que se necesitan desarrollar. Para utilizar el objeto SQLDataReader, primero debe de definir una variable de este tipo como se muestra a continuación:

Dim variable as SqlDataReader
Ejemplo:

Dim dr as SqlDataReader
Después de definir la variable, crear el objeto SQLCommand y abrir la conexión, puede llenar el objeto SQLDataReader de la siguiente manera:

P i

176

Programación Windows
Variable=Objeto SQLCommand.ExecuteReader
Ejemplo:

Dr=CmdClientes.ExecuteReader Ejercicio Practico Nº1
BtnVer

LstCliente

Imports System.Data Imports System.Data.SqlClient Public Class Form1 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=SSPI") Private Sub BtnVer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim dr As SqlDataReader Dim cmd As New SqlCommand("Select * from customers", cn) cn.Open() dr = cmd.ExecuteReader Do While dr.Read Me.lstclientes.Items.Add(dr(1)) Loop dr.Close() cn.Close() End Sub End Class El resultado será el siguiente

Página 177

Programación Windows

Acceso al Sistema
1.- Diseñaremos el formulario para que quede de la siguiente manera.

PictureBox1 Y PictureBox2

TxtUsuario

TxtContraseña ProgressBar1 BtnIngresar BtnSalir 2.- Después añadiremos 2 Timer; uno para el ProgressBar1 y el otro para los dos PictureBox

3.- Cargamos una imagen para cada PictureBox

4.- Luego hacemos la conexión con la Base de Datos.

Imports System.Data Imports System.Data.SqlClient Public Class Form1 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True")
5.- En el Evento Load del Formulario codificamos:

Private Sub Form1_Load Me.Timer2.Enabled = True Me.PictureBox1.Visible = False Me.PictureBox2.Visible = False End Sub

Página 178

Programación Windows
"

6.- En el Botón BtnIngresar codificamos

Private Sub btningresar_Click Dim cmd As New SqlCommand("Select Employeeid, LastName, FirstName, Extension from Employees where LastName='" & Me.txtusuario.Text & "'", cn) Dim dr As SqlDataReader cn.open() dr = cmd.ExecuteReader If dr.Read() Then If dr("Extension") = Me.txtcontraseña.Text Then Me.Timer1.Enabled = True Else MsgBox("Contraseña Incorrecta") End If Else MsgBox("Usuario No Existe") End If cn.Close() End Sub
7.- Luego en el Evento Tick del Timer1, codificamos lo siguiente (Este Timer es para el control del ProgressBar)

Private Sub Timer1_Tick Me.ProgressBar1.Visible = True Me.ProgressBar1.Value = Me.ProgressBar1.Value + 1 If Me.ProgressBar1.Value = 100 Then Me.Timer1.Enabled = False MsgBox("Bienvido al Sistema Usuario " & Me.txtusuario.Text, MsgBoxStyle.Information, "Sistema") MDIParent1.Show() End If
8.- En el evento Tick del Timer2, codificamos lo siguiente(Este Timer es para los PictureBox)

Private Sub Timer2_Tick Static a As Integer If a = 0 Then Me.PictureBox1.Visible = True Me.PictureBox2.Visible = False a=1 Else If a = 1 Then Me.PictureBox1.Visible = False Me.PictureBox2.Visible = True a=0 End If End If
9.- En el evento Clic del Botón BtnSalir codificamos:

Private Sub Button1_Click Me.Close() End Sub
10.- En el evento Load del MdiParent1 codificamos:

Private Sub MDIParent1_Load Form1.Hide() End Sub

P i

179

Programación Windows
11.- Finalmente ejecutamos la aplicación. Ingresamos un Usuario y una Contraseña.

1

2

Crear Proyectos de Instalaci n 
Como crear Proyectos de Instalación  Personalizar el Proyecto  Generar el Instalador

Página 180

Programación Windows
Una vez desarrollado un aplicativo, el paso siguiente lógico es generarle su instalador, para ello vamos a agregar a la Solución un proyecto de Instalación e Implementación.

El proyecto de Instalación contiene 6 vistas para configurar según el tipo de instalador que deseemos crear, ahora vamos a detallar 1 a 1 el uso de las vistas:

Vista: Sistema de Archivos

En esta vista se muestran 3 carpetas que representan a las carpeta de la maquina en donde se s instalara el Aplicativo. Carpeta de la Aplicación= Representa a la carpeta en donde el Usuario escogió instalar el Aplicativo, por defecto será Archivos de Programa. Es aquí donde debemos agregar el Ejecutable, sus dependencias y los demás archivos necesarios para que el aplicativo funcione bien. Escritorio del Usuario= Representa al Escritorio de la Maquina Cliente, aquí colocaremos los accesos directos.
Página 181

Programación Windows
Menú Programas del Usuario= Representa al Menú Programas de la Maquina Cliente, Acá también colocaremos un acceso directo. Ahora procederemos a configurar las carpetas: Agregue Carpetas para administrar mejor los archivos a instalar, comience con la carpeta con el Nombre de la Empresa luego con el nombre del Aplicativo y por ult mo por carpetas para administrar i los archivos del aplicativo, de la siguiente manera:

Ahora proceda a agregar el ejecutable y los archivos que el aplicativo necesitará

Página 182

Programación Windows

Ahora crearemos los accesos directos que luego arrastraremos al Escritorio y al Menú programas de usuario.

Una vez agregado el acceso directo tenemos que asignarle el icono antes agregado, de la siguiente manera:

El siguiente paso es arrastrar los accesos directos creados hacia las carpetas correspondientes:

Página 183

Programación Windows Vista Interfaz de Usuario
Esta vista permite configurar las pantallas que se muestran en la instalación Mediante la ventana de propiedades solo cambiaremos algunas propiedades, como el Banner de las pantallas

Página 184

Programación Windows Vista Acciones personalizadas
Esta vista sirve para agregar un Ejecutable (proceso) que corra en paralelo a la inhalación del aplicativo, esta soportada en base a eventos.

Solo debemos agregar en la vista Sistema de Archivos el Ejecutable a insertar en esta vista:

Recuerde que no todos los ejecutables poseen los mismos argumentos de ejecución.

Vista Condiciones de Inicio
Esta vista permite hacer búsquedas en la Maquina del Cliente y en base a estas dejar o no la instalación del Aplicativo:

Agregue una búsqueda de un archivo especificando el nombre y la extensión del mismo, no dejando de lado la carpeta donde se buscara el archivo.
Página 185

Programación Windows

Ahora procederemos a agregar una Condición basada en la búsqueda anterior

Ahora asigne a la condición la búsqueda antes especificada

Compile el proyecto y tendrá los archivos de instalación del mismo.

Y por último se generará el instalador correctamente, el cual se encontrará dentro de la carpeta Debug.

Página 186