Sie sind auf Seite 1von 186

Introduccin al Entorno de Desarrollo .

Net
    
Qu es la plataforma Microsoft .NET? Qu es el .NET Framework? Conceptos bsicos de .NET Explorar el entorno de desarrollo Crear un proyecto Visual Basic .NET

Programacin Windows

Introduccin
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 bsicos de .NET.

Conceptos Bsicos
Qu es la Plataforma Net?
La plataforma .NET proporciona la base de la siguiente generacin de soft are que permite conectar sistemas, informacin, dispositivos y usuarios distintos de un modo ms unificado y personalizado. Incorpora servicios Web XML como el medio para permitir la interoperabilidad entre tecnologas diferentes.

Que es Visual Studio Net?


Visual Studio .NET es un entorno de desarrollo integrado que nos ayuda a disear, desarrollar, depurar e implantar con rapidez soluciones basadas en el .NET Framework. Podemos acceder a un conjunto comn de herramientas, diseadores y editores desde cualquiera de los lenguajes de programacin de Visual Studio .NET. Podemos crear aplicaciones Windows Forms y Web Forms que integren datos y lgica de negocio.

Qu es el .NET Framework?
"El .NET Framework es un entorno multi-lenguaje para la construccin, distribucin y ejecucin de Servicios Webs y aplicaciones." El .NET Framework es el corazn de .NET, cualquier cosa que queramos hacer en cualquier lenguaje .NET debe pasar por el filtro cualquiera de las partes integrantes del .NET Framework.
Pgina 2

Programaci
biblioteca de clases.

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 comn. El CLR es el centro neurl ico del .NET Framework encar ado de estionar la ejecuci n de nuestras aplicaciones, aplicar parmetros de se uridad y ejecutar el denominado recolector de basura entre otras cosas.

Garbage Collector o GC
En su traducci n ms o menos exacta, lo definiremos como Recolector de Basura, y que tiene la funci n di na o indi na, de hacer la tarea ms 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 prcticamente el mismo len uaje intermedio.

JIT
El entorno de ejecuci n incluye una caracterstica denominada compilaci n Just In Time (JIT), que traduce c di o MSIL al len uaje mquina 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 jerrquicos en base a su funcionalidad. Podemos utilizar la biblioteca de clases para desarrollar aplicaciones que abarcan desde las aplicaciones clientes

P i

Programacin 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:

Pgina 4

Programacin 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 Introduccin y clic en aceptar.

Explorando el Entorno de Desarrollo


Esta leccin introduce las entorno que crear de y principales del desarrollo para modificar Windows de caractersticas utilizamos

aplicaciones, como el Diseador del Forms y los controles Cuadro herramientas.

Ventanas Clsicas
Explorador se Soluciones (Ctrl + Alt + L) El Explorador de soluciones nos permite visualizar archivos y realizar tareas de administracin de archivos en una solucin o en un proyecto. Una nica solucin basada en Visual Basic .NET y sus proyectos aparecen en una lista jerrquica que proporciona informacin actualizada sobre el estado de nuestra solucin, proyectos y archivos.

Pgina 5

Programacin Windows
Cuadro de Herraminetas (Ctrl + Alt + X)
Para crear los objetos del interfaz de usuario de nuestra aplicacin, aadimos 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 pestaas para diferentes categoras 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 aplicacin. Una propiedad describe una caracterstica de un objeto, como el tamao, ttulo 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 estndar proporcionan acceso a la mayora de comandos que controlan el entorno de programacin de Visual Studio .NET.

Pgina 6

Programacin Windows
Editor de Cdigo (Shift + F7)
Visual Studio .NET proporciona un Editor de cdigo en el que escribir y mantener el cdigo de nuestro proyecto. Podemos asociar cdigo directamente a un formulario de nuestro proyecto o ubicarlo en otro mdulo de cdigo distinto. Se muestra un Editor de c digo distinto para cada formulario o mdulo de nuestro proyecto, facilitando la organizacin, visualizacin y desplazamiento por el cdigo.

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

Pgina 7

Programacin Windows
Como Agregar un Nuevo Formulario
1.-Desde el Explorador de Soluciones sobre Clic el derecho Proyecto (Introduccin) 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 introduccin)/ clic en Propiedades; Aparecer la siguiente pantalla:

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

Pgina 8

Programacin Windows
Como Agregar Controles a un formulario
Antes de todo, al formulario que deseamos agregar un control debe esta en modo Diseo (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 N1. 1. Disear 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 N2. 1. Disear el siguiente Formulario:
TxtTexto

btnColorTexto

btnColorFondo

Pgina 9

Programaci

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

Programacin Windows
Ejercicio Prctico N4 1.- Disear el siguiente formulario

TxtUsu TxtPas

Btningresar

BtnSalir

Escriba el Cdigo a utilizar para este ejercicio. .

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

2.- Crear una aplicacin en la cual me permita realizar la siguiente ecuacion:


y=4x2+x+5 2x 3.- Crear la siguiente aplicacin, 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.

Pgina 11

Programacin Windows
4.- Desarrollar una aplicacin que me permita calcular el promedio de notas obtenidos por los alumnos. Cuando el usuario ingrese la Nota 3 el botn de comando btncalcular se debe habilitar.

5.- Desarrollar la siguiente aplicacin

Fu ci
    

d L

gu j

Tipos de Datos Operadores Variables Sentencias Condicionales Bucles

Pgina 12

Programacin Windows

Tipo de Datos
El tipo de datos de un elemento de programacin hace referencia a la clase de datos que puede contener y a cmo se almacenan los datos.

La ilustracin anterior lista algunos de los tipos ms utilizados en Visual Basic .NET. El t rmino con signo significa que los nmeros pueden ser positivos o negativos, como en +48 o-48.

Como Escoger un Tipo de Dato?

Visual Basic no requiere que seleccione explcitamente un tipo de datos cuando declara una variable. Sin embargo, es una buena idea hacerlo, ya que de esta forma sus aplicaciones sern ms fiables y requerirn 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 ilustracin anterior para seleccionar el tipo de datos adecuado para una variable.

Pgina 13

Programaci

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 rpida de pro ramas, pero puede hacer que stos se ejecuten ms lentamente. Pero con todo y con esto, la declaraci n de variables en .NET puede hacerse ms extensiva, ya que podemos declarar las variables tambin, utilizando unos smbolos o caracteres detrs 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 prctica.
Tipo de datos Short Integer Long Single Double Decimal UShort UInteger ULong Smbolo N.A. % & ! # @ N.A. N.A. N.A. Carcter 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 tamao 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 despus 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 clusula 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
Cmo

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 sera:

Dim strMiVar As Strin


Pero hay un aspecto en la declaraci n de variables que conviene conocer, ya que este aspecto, es el diferenciador ms 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, haca 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 ms 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/AO. 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

Programacin Windows

mbito de una Variable


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

Ejercicio Prctico N1:


1.- Disear el siguiente formulario

BtnImagen1 PictureBox1 BtnImagen2 BtnImagen3 BtnImagen4

Pgina 16

Programacin

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 ecisin


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 IfThen y Select Case. Estudiaremos c mo incorporar expresiones condicionales en estas estructuras.

Cmo Utili ar Instrucciones I T en...Else


Las instrucciones IfThenElse son una extensi n del concepto IfThen. Utilizando un bloque IfThenElse, 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 ms de una de las condiciones de una estructura condicional, nicamente se ejecutarn las instrucciones de c di o incluidas en la primera condici n verdadera. Una instrucci n IfThenElse incluye los si uientes componentes:  Una condici n que evala si es True o False  Una o ms 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 IfThenElse, utilizar la si uiente sintaxis:

I condition T en statements Else statements End I

P i

17

Programacin Windows
Ejercicio Prctico N2
1.- Disear 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

Pgina 18

Programacin Windows

Cmo Utilizar Instrucciones Select Case


La instruccin Select Case permite a nuestra aplicacin ejecutar uno o varios bloques de cdigo dependiendo del valor de una expresin de prueba. La instruccin Select Case funciona como una compleja estructura IfThenElse anidada, pero su mantenimiento es ms sencillo. La sintaxis para la instruccin Select Case es como sigue:

Select Case testexpression [Case expressionlist-n] [statements-n1] . . . [Case Else] [elsestatement] End Select Ejercicio Prctico N
TxtAlu

1.- Disear 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
Pgina 19

Programacin

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 Prcticas", Ms BoxStyle.Information, "Nota1") Exit Sub Case 2 : Ms Box("In rese Exmen Parcial", Ms BoxStyle.Information, "Nota2") Exit Sub Case 3 : Ms Box("In rese Exmen 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

Programacin

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 cundo hacerlo. Esta lecci n tambin describe c mo decidir el uso de una instrucci n Exit para salir de un bucle.

P i

21

Programacin

indows

Cmo Utili ar Instrucciones orNext


Podemos utilizar un bucle ForNext cuando conocemos el nmero de veces que es necesario que se ejecute un bucle. Una instrucci n ForNext repite un conjunto de instrucciones un nmero especfico de veces. Un bucle ForNext se ejecuta un determinado nmero de veces fijado por un contador de bucles. El valor del contador de un bucle ForNext puede incrementarse o disminuir dependiendo de si step es positivo o ne ativo. La sintaxis de una instrucci n ForNext es la si uiente:

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

Cmo Utili ar Instrucciones or EachNext


Una instrucci n For EachNext 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 EachNext 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. Disear el si uiente formulario
ListBox3 ListBox2

TxtNum

ListBox1

BtnCalcular BtnLimpiar

P i

22

Programacin

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

Programacin

indows

Como Utili ar Instruccin

o Loop

Puede utilizar instrucciones DoLoop para ejecutar un bloque de instrucciones un nmero 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 tambin 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, despus 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 ms fcil 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 evala una condici n. Lo verstil de este bucle es que la condici n se puede expresar de muchas maneras distintas. Condicin expresada al lado del ejecutarse el bucle. O: en este caso la condici n se evala antes de empezar a

Condicin expresada al lado del LOOP: en este caso la condici n se evala despus de ejecutarse el bucle. Tiene como diferencia principal frente al otro mtodo que en este caso el bucle se ejecutar por lo menos una vez. Adems de poder expresar la condici n en estos dos sitios tambin se puede construir la condici n con un enunciado mientras (WHILE o un enunciado hasta (UNTIL . Las diferencias semnticas de estas dos posibilidades se trasladan tambin 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". Tambin tiene el usuario la posibilidad de escribir "out", en ese caso, comprobado con un enunciado IF, se sale del bucle rompindolo con la sentencia EXIT DO, utilizada para romper bucles. Ejercicio Practico N3 1. - Disear el si uiente formulario En el mtodo 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

Programacin 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 atrs, de manera similar a como se sala en el ejemplo anterior, con EXIT DO. En el mtodo 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

Programacin Windows

Funciones Tipo Cadena


Una cadena es un dato de tipo String (Carcter); es decir se refiere a letras o letras y nmeros, ahora veremos las funciones de cadenas mas utilizadas y posteriormente realizaremos una aplicacin 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 posicin 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 maysculas: Sintaxis; UCase(Cadena) y LCase: Convierte una cadena en minsculas: Sintaxis; LCase(Cadena) y StrConv: Convierte una cadena en 3 formas diferentes, en maysculas = 1, minsculas = 2, la primera letra de cada palabra en maysculas = 3 : Sintaxis; StrConv(Cadena,Valor) y InStr: Obtiene un nmero que indica la posicin de una subcadena dentro de una cadena: Sintaxis; InStr(Cadena,SubCadena) Ejercicio Prctico N1 1.- Disear el siguiente formulario

2.- Luego codificaremos lo siguiente.


Pgina 26

Programacin 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

Programacin Windows

Funciones Cronolgicas

TxtFec aSi TxtHoraSis

Ejercicio Prctico N2 1.- Disear el siguiente formulario


TxtN

BtnDif BtnNumM

TxtDI TxtFec aIn TxtFec aConv


Pgina 28

DtpFec

Programacin 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: eclarcin: [ Public | Private | Friend ] Sub <Nombre Subrutina> ([Lista de Parmetros]) <Sentencias> [Exit Sub] End Sub

P i

29

Programacin 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 Parmetros]) 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

Programacin Windows
3. - Disearemos 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 rectngulo 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

Pgina 31

Programacin 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 numrico. Por ejemplo, si tenemos la variable discografa y queremos acceder al tercer disco, podramos hacerlo de la si uiente forma: discografa(3 . Sabiendo esto, podemos comprobar que sera fcil 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 clsica (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

Programacin 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 habra 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 parntesis. Por tanto el array a tendr reservada memoria para 6 valores de tipo Inte er, los ndices seran desde 0 hasta 5 ambos inclusive. Adems 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 tamao que contendr el array, podemos hacerlo de esta forma:

Dim a(5) s Integer


Con este c di o estaramos 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 producira un error sintctico. 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, haramos 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 parntesis y el nmero de elemento al que queremos acceder:

i = b * a(3)
Los Lmites 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 mximo de un tipo Lon )

P i

33

Programacin 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 tambin 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 nmero de elementos que tendr, ya que el nmero de elementos estar supeditado a los valores asi nados. Para inicializar un array debemos declarar ese array sin indicar el nmero 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}

Tambin podemos hacerlo de esta otra forma:


Dim a As Integer() = {1, 42, 15, 90, 2}

Usando cualquiera de estas dos formas mostradas, el nmero de elementos ser 5, por tanto los ndices irn desde 0 hasta 4. Los Arrays Pueden Ser De Cualquier Tipo En todos estos ejemplos estamos usando valores de tipo Inte er, pero podramos 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 debern estar entre comillas dobles o ser variables de tipo Strin . Por ejemplo:

Dim s As String() = {"Hola", "Mundo, ", "te", "saludo"}


Cambiar El Tamao 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

Programacin Windows
A partir de ese momento, el array tendr 11 elementos (de 0 a 10), los 5 primeros con los valores que antes tena y los nuevos elementos tendrn un valor cero, que es el valor por defecto de los valores numricos. Si s lo usamos ReDim a(10), tambin tendremos once elementos en el array, pero todos tendrn 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 despus de eliminar el contenido de un array queremos volver a usarlo, tendremos que ReDimensionarlo con el mismo nmero de dimensiones que tena, ya que Erase s lo borra el contenido, no la definici n del array.

Ejercicio Practico N1
1.- Disear el si uiente formulario

TxtNombres BtnAgregar BtnMostrar BtnLimpiar

LstNombres

P i

35

Programacin 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. Despus de declarar una estructura, podemos declarar variables de ese tipo. Definicin.-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, mtodos y procedimientos y pueden invocar y manipular eventos.

Ejemplo
P i 36

Programacin Windows
El uso ms 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 contratacin, cargo y salario de un empleado. Podramos utilizar varias variables para esta informacin, 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

Cmo Declarar Estructuras

Cmo Utilizar Las Estructuras

Pgina 37

Programacin 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 disear 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

Programacin Windows
4.- Luego disearemos 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 coleccin donde podemos guardar cualquier tipo de objeto. Su mtodo 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 posicin o ndice. Podemos utilizar su propiedad ArrayList.Count para preguntarle a la coleccin cuantos elementos tiene Esta clase permite la creacin y manipulacin de arrays cuyo tamao puede ser modificado dinmicamente.

Pgina 39

Programacin Windows
Este mejora comportamiento el rendimiento del y

objeto tiene la ventaja de que optimiza recursos, puesto que cada vez que aadimos o eliminamos valores, el array items no siempre tiene que ser redimensionado. Qu sucede, sin embargo, cuando se han aadido valores y el array est completo?, pues que el objeto ArrayList detecta esta situacin y en la siguiente ocasin en que se aade un nuevo valor, se automticamente

redimensiona duplicando el nmero de elementos inicial que nuevo contena. un Veamos esquema de de

funcionamiento.

Borrado de Elementos en una Coleccin Arraylist


Para realizar un borrado de valores, la clase ArrayList proporciona los mtodos descritos a continuacin. Remove(Valor). Elimina el elemento del array que corresponde a Valor. RemoveAt(Posicion). Elimina el elemento del array situado en el ndice Posicin. RemoveRange (Posicin Elementos). Elimina el conjunto de elementos indicados en el parmetro Elementos, comenzando por el ndice Posicin. Clear ( ). Elimina todos los elementos del objeto.

Pgina 40

Programacin Windows

IEnumerator
Un objeto enumerador pertenece al interfaz IEnumerator, diseado para realizar un recorrido o iteraci n a travs de uno de los diferentes tipos de colecci n (arrays incluidos) existentes en .NET Framework. Mediante el mtodo 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 tcnica de los objetos enumeradores proporcionados por el objeto array.

Ejercicio Prctico N3
1.- Disear 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

Programacin 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

Programacin Windows

La Clase HashTable
Esta clase tiene la particularidad de que el acceso a los valores del array que estiona internamente se realiza a travs 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 filosofa 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 travs de literales, lo cual en al unas circunstancias es mucho ms c modo de manejar. Respecto a la asi naci n de valores a la colecci n, esta clase utiliza el mtodo Add( ), cuyo primer parmetro 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 mtodo 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 sita los valores que se aaden al array en posiciones consecutivas, por lo que al obtener los valores mediante un enumerador posiblemente no aparecern en el mismo orden en el que los aadimos inicialmente. Dada la filosofa de funcionamiento de este tipo de objetos, el orden en el que se raban los valores dentro del array no debera ser un problema, ya que nosotros accedemos al array utilizando claves y no ndices, como sucede en un array estndar.

P i

43

Programacin Windows
Ejercicio Prctico N
1.- Disear 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 bsicamente i ual que para los objetos Hashtable.

P i

44

Programacin Windows
Ejercicio Prctico N5
1.- Disear 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  Prctica de Laboratorio de Hilos

P i

45

Programacin Windows

Manejo de THREADS (Hilos)


Todas las aplicaciones se ejecutan en un Thread (o hilo de ejecuci n). Pero cada aplicaci n puede tener ms 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 decidirs t, ya no es al o que no podamos hacer aunque quisiramos. 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 simultnea, 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.

Implementacin de Threads
Para implementar Threads se usa el namespace: System.Threading.Thread y lue o se hace uso de los mtodos que se definen a continuaci n:
y

Start : Inicia un Thread, el cual es un proceso de llamada asncrona. 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: Tambin ocasiona una pausa en el bloque de instrucci n. Resume: Reinicia una pausa ori inada con el mtodo Suspend. Interrupt: Interrumpe una pausa ori inando una exepci n. Join: Espera por un Thread.

y y y y y

P i

46

Programacin Windows
Ejercicio Prctico N1
1.- Disear 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 cdigo que hasta ahora tenamos 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

Pgina 47

Programacin Windows
Evento curre Cuando... ...se solicita la ejecucin de una tarea. Dentro del event handler asociado a este evento debe encontrarse el cdigo a ejecutar en otro hilo. Solo ocurre DoWork cuando se ejecuta el mtodo RunWorkerAsync() (de hecho ese mtodo 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 ejecucin de la tarea. La terminacin puede deberse a que la ejecucin se complet o a que esta fue cancelada.

A traves del mtodo RunWorkerAsync() le indicamos al BackgroundWorker que se debe iniciar la ejecucin de una tarea. Imediatamente luego de su ejecucin, se produce el evento DoWork, y es ahi donde debemos indicarle que hacer. Durante la ejecucin podemos utilizar el mtodo 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 mtodo CancelAsync() para cancelar la ejecucin de la tarea, pero cabe aclarar que la simple ejecucin del mtodo 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 ejecucin 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 cdigo que acompaa a este artculo tiene una pequea aplicacion que simula realizar una tarea pesada y reporta su estado cada tanto. Obviamente su funcionamiento se basa n el e BackgroundWorker.

Ejercicio Prctico N2
1.- Disear el siguiente formulario

Pgina 48

Programacin 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 mltiples Threads para iniciar la lectura de un archivo de texto extenso y poder cancelar este proceso si es necesario. Adems para evitar los errores en tiempo de ejecuci n haremos uso del control estructurado de excepciones. 2.- Disear el si uiente formulario.
P i

TxtNomb

TxtArchiv

49

Programacin 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

Programacin 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

Serializacin y Deserializacion de Ob etos Administracin de Archivos


 Serializaci n XML  Clase System.IO : Acceso a archivos y carpetas  StreamWriter y StreamReader

P i

51

Programacin Windows

Introduccin
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 pblicas de una clase un objeto XML serializado. El mtodo 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 mtodo Deserialize de la clase XmlSerializer permite crear objeto con la informaci n deseralizada proveniente de un archivo XML. uardar los valores

Descripcin de la Seriali acin 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 tambin 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 Prctico N1
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

Programacin 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 disearemos 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

Programacin 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 aplicacin introduciremos un nombre, descripcin, y cantidad de un producto .

Pgina 54

Programacin Windows
6.- Daremos clic en el botn 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 cdigo como muestra la figura; el cual es cdigo XML.

8.- Luego al dar clic sobre el botn Deserializar nos mostrar la informacin del archivo serializado anteriormente.

Pgina 55

Programacin 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 bsica con los archivos y directorios. Al unas Clases de System.IO

Clase
Directory DirectoryInfo

Descripcin
Expone mtodos estticos para crear, mover y enumerar archivos en directorios y subdirectorios Expone mtodos de instancia para crear, mover y enumerar archivos en directorios y subdirectorios.

ile

Proporciona mtodos estticos 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 estndar y salida estndar amd. Puede especificar que las operaciones de lectura y escritura sean sincr nicas o asincr nicas. FileStream almacena en el bfer la entrada y la salida para obtener un mejor rendimiento.

FileInfo

Proporciona mtodos 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 enrica 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 mltiples plataformas.

FileStream

Path

P i

56

Programacin Windows
Ejercicio Prctico N 1.- Disear 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

Programacin Windows
Ejercicio Prctico N 1.- Disear 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 Prctico N4 1.- Disear 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 lnea 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

Pgina 58

Programacin Windows

Mane o de Archivos y Envi de Mensa e por Correo Electrnico


 Creaci n de un Explorador con System.IO  Clases a utilizar para enviar un mensaje va Mail  Cuadros de Dilo os (OpenFileDialo , ColorDialo , FontDialo )
Ejercicio Prctico N1 (Explorador) BtnMostrar

1.- Disear 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

Programacin 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

Programacin 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("Tamao(Bytes): " & informacion.Length) Me.lstinformacion.Items.Add("Fecha de Creacin: " & informacion.CreationTime.ToShortDateString) End Sub End Class 3.- Ejecutaremos y deber aparecer como se muestra en la figura.

Pgina 61

Programacin Windows
Ejercicio Prctico N (Envi de Mensaje por Correo)

1.- Disear 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

Programacin 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

Programacin 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

Programacin Windows

Componentes COM, Controles Active X y Interaccin con Office


 Interacci n con Word  Manejo de A entes  Manejo de Controles Active X

Interaccin 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 ofimticas. Cada uno de estos pro ramas expone su propia biblioteca de objetos, denominada tambin 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 estarn 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 debera de ser capaz de ajustar el c di o para adaptarlo a su versi n.

P i

65

Programacin Windows

Utili acin de Word en una Aplicacin


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 pestaa 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

Programacin Windows Crear Nuevos Documentos


Para crear un documento nuevo basado en la plantilla Normal.dot hay que invocar al mtodo 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 mtodo Open de la colecci n Documents pasando el nombre del fichero como ar umento: Dim doc as Word.Document=ApWord.Documents.Open(C:\ Este mtodo 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. Quizs, la mas sencilla sea utilizando el mtodo InsertAfter o InsertBefore para insertar texto despus o antes de una selecci n (objeto Selection) o un ran o (objeto Ran e). Por ejemplo, las si uientes lneas 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

Programacin 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 carcter 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 prrafo 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 prrafo hasta el final del tercer prrafo; despus, 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 prrafos 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 aade a continuaci n del prrafo especificado. Dim siguienteparrafo as Integer=doc.Paragraphs.Count doc.Paragraphs(siguienteparrafo).Range.Font.Bold=1

P i

68

Programacin Windows Guardar y Cerrar Documentos


Para guardar un documento se puede utilizar alguno de los mtodos siguientes: Save, SaveAs o Close. Los mtodos Save y Close slo afectan al documento para el que son invocados. En cambio, cuando se aplican a la coleccin Documents, se vernafectados todos los documentos que estn abiertos. El mtodo Close cierra el documento para el que es invocado o los documentos que estn abiertos de la coleccin Documents. Por ejemplo, la siguiente sentencia cierra el documento doc. doc.Close El mtodo Save guarda los cambios efectuados en el objeto Document especificado. Por Ejemplo. doc.Save() El mtodo 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 Prctico N1 1.- Disear el siguiente formulario.
CboFuente

btnCrear btnAbrir CboTamao ChkNegrita ChkCursiva TxtDocumento BtnGuardar

TxtContenido

Pgina 69

Programacin Windows
2.- Los combos contendrn 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

Pgina 70

Programacin 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 Tamao de Letra If Me.cbotamao.SelectedIndex <> -1 Then rango.Font.Size = Me.cbotamao.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 librera 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 pequeos objetos que pueden interactuar con el usuario a base de movimientos, gestos, leyendas e incluso por voz. Disee el siguiente formulario:
BtnMostrar ListBox1

BtnOcultar TxtMensaje BtnMovimiento BtnMensaje

Pgina 71

Programacin Windows
Agregue la librera 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 cdigo. y A nivel Formulario: Public Class Form1 'Declarar los Objetos Dim Agente As New AgentObjects.Agent Dim Mueco As AgentObjects.IAgentCtlCharacterEx En el evento Load del Formulario Private Sub Form1_Load 'Cargar un Character; es decir el mueco que va a aparecer Agente.Connected = True Agente.Characters.Load("Merlin", "merlin.acs") Mueco = Agente.Characters("Merlin") 'Bucle para Cargar Todos los Movimientos Dim Mov As Object For Each Mov In Mueco.AnimationNames Me.ListBox1.Items.Add(Mov) Next End Sub y En el evento clic de cada uno de los Botones:
Pgina 72

Programacin Windows
Private Sub btnmostrar_Click 'Muestra el Agente Mueco.Show() 'Desplaza de Posicion al Agente Mueco.MoveTo(450, 350) End Sub Private Sub btnocultar_Click 'Oculta al Agente Mueco.Hide() End Sub Private Sub btnmovimiento_Click 'Ejecuta el Movimiento Mueco.Play(Me.ListBox1.SelectedItem) End Sub Private Sub btnmensaje_Click 'Muestra el Mensaje Mueco.Speak(Me.txtmensaje.Text) End Sub Al final ejecutamos la aplicacin 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 espaol

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.

Pgina 73

Programacin 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 ms componentes segn 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 opcin Elegir Elementos

Pgina 74

Programacin 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.- Despus insertamos ese componente usndolo como control a nuestro formulario, tambin insertaremos un control TextBox y Button.
TxtDir BtnIr

AxWebBrowser

6.- Luego en el evento clic del botn BtnIr codificamos lo siguiente.

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

Pgina 75

Programacin Windows

Reproductor de Msica y Video


Crearemos un reproductor de msica 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

Programacin Windows

Globalizacin y POO (Pro ramacin Orientada a Ob etos)


     
Clase System.Globalization Clase CultureInfo Definici n de una Clase Atributos de una Clase Propiedades de un a Clase Mtodos de una Clase

System.Globali ation
La lobalizaci n es el proceso de diseo 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 pas o re i n, los calendarios utilizados, los modelos de formato para las fechas, la moneda y los nmeros 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 especfica. Esa informaci n incluye el sistema de escritura, los calendarios utilizados, las convenciones de formato de fecha y hora, las convenciones de nmeros y de moneda, y las re las de ordenaci n. Antes de empezar la fase de diseo, debe determinar qu referencias culturales admitir la aplicaci n. De este modo, permitir disear caractersticas que admitan todas las referencias culturales identificadas. Adems, 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 pas o re i n, los calendarios utilizados, los modelos de formato de fecha, moneda y nmeros, 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 mtodos 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

Programacin Windows
La clase CultureInfo contiene informaci n especfica de la referencia cultural, como el idioma, el pas o re i n, el calendario y las convenciones culturales asociadas a una referencia cultural especfica. Esta clase tambin proporciona la informaci n necesaria para realizar operaciones especficas de la referencia cultural, como la distinci n de maysculas y minsculas, el formato de fechas y nmeros, 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 mtodo devuelve un objeto del tipo NumberFormatInfo que tiene las si uientes propiedades:
Propiedad CurrencyDecimalDigits Descripcin Indica el nmero 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 dgitos a la izquierda de la coma decimal en valores de moneda. Obtiene o establece el nmero de dgitos 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 smbolo de moneda. Obtiene un NumberFormatInfo de slo lectura que aplica formato a los valores basndose en la referencia cultural actual. Obtiene o establece un valor que especifica cmo la interfaz grfica de usuario muestra la forma de un dgito. Obtiene la NumberFormatInfo predeterminada de slo lectura que es independiente de la referencia cultural (invariable). Obtiene un valor que indica si NumberFormatInfo es de slo

CurrencyGroupSizes

CurrencyNegativePattern

CurrencyPositivePattern

CurrencySymbol

CurrentInfo

DigitSubstitution

InvariantInfo

IsReadOnly

P i

78

Programacin Windows
lectura. NaNSymbol Obtiene o establece la cadena que representa el valor NaN (no un nmero) de IEEE. Obtiene o establece una matriz de cadenas de dgitos nativos equivalentes a los dgitos occidentales del 0 al 9. Obtiene o establece la cadena que representa un infinito negativo. Obtiene o establece la cadena que denota que el nmero asociado es negativo. Obtiene o establece el nmero de posiciones decimales que se van a utilizar en valores numricos. Obtiene o establece la cadena que se va a utilizar como separador decimal en valores numricos. Obtiene o establece la cadena que separa grupos de dgitos a la izquierda de la coma decimal en valores numricos. Obtiene o establece el nmero de dgitos en cada grupo a la izquierda de la coma decimal en valores numricos. Obtiene o establece el modelo de formato para los valores numricos negativos. Obtiene o establece el nmero 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 dgitos a la izquierda de la coma decimal en valores de porcentaje. Obtiene o establece el nmero de dgitos 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

Programacin Windows
PercentSymbol Obtiene o establece la cadena que se va a utilizar como smbolo de porcentaje. Obtiene o establece la cadena que se va a utilizar como smbolo de por mil. Obtiene o establece la cadena que representa un infinito positivo. Obtiene o establece la cadena que denota que el nmero asociado es positivo.

PerMilleSymbol

PositiveInfinitySymbol PositiveSign

Nota: Esta es la tabla usada en la informaci n de Visual Studio 2005, pero todas las propiedades estn disponibles tambin en las versiones anteriores. Ejercicio Prctico N1 1.- Disear 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

Programacin Windows
Ejercicio Prctico N
1.- Disear 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

Programacin Windows

La Clase CultureInfo
La clase CultureInfo especifica un nombre nico para cada referencia cultural basndose en el estndar RFC 1766. El nombre es una combinaci n de un c di o de referencia cultural de dos letras en minscula asociado con un idioma, y un c di o de referencia cultural secundaria de dos letras en mayscula asociado con un pas 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 japons de Jap n, "en-US" para el in ls de EE.UU. y "de-DE" para el alemn de Alemania (a diferencia de "deAT" para el alemn 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 cirlico, "-Latn" especifica las letras del latn. En este tema se utilizan las expresiones "referencia cultural neutra" y "referencia cultural especfica". Una referencia cultural neutra se especifica nicamente mediante el c di o de dos d itos de la referencia cultural en minscula. Por ejemplo, "fr" especifica la referencia cultural neutra para el francs y "de" especifica la referencia cultural neutra para el alemn. Una referencia cultural especfica 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 mayscula. Por ejemplo, "fr-FR" especifica francs de Francia y "fr-CA" especifica francs 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 vaca) 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-Pas/regin referencia cultural invariable Afrikaans Afrikaans-Sudfrica Albans Albans-Albania rabe rabe-Ar elia rabe-Bahrein rabe-E ipto rabe-Iraq rabe-Jordania rabe-Kuwait rabe-Lbano rabe-Libia rabe-Marruecos
P i 82

Programacin 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-Omn rabe-Qatar rabe-Arabia Saud rabe-Siria rabe-Tnez rabe-Emiratos rabes Unidos rabe-Yemen Armenio Armenio-Armenia Azer Azer (cirlico)-Azerbaiyn Azer (latino)-Azerbaiyn Vasco Vasco-Espaa Bielorruso Bielorruso-Bielorrusia Bl aro Bl aro-Bul aria Cataln Cataln-Espaa Chino-Zona administrativa especial de Hon Kon Chino-Zona administrativa especial de Macao Chino-China Chino (simplificado) Chino-Sin apur Chino-Taiwn Chino (tradicional) Croata Croata-Croacia Checo Checo-Repblica Checa Dans Dans-Dinamarca Dhivehi Dhivehi-Maldivas Holands Holands-Bl ica Holands-Pases Bajos In ls In ls-Australia In ls-Belice In ls-Canad In ls-Caribe In ls-Irlanda
P i 83

Programacin 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 ls-Jamaica In ls-Nueva Zelanda In ls-Filipinas In ls-Sudfrica In ls-Trinidad y Toba o In ls-Reino Unido In ls-Estados Unidos In ls-Zimbabue Estonio Estonio-Estonia Feros Feros-Islas Feroe Persa Persa-Irn Finlands Finlands-Finlandia Francs Francs-Bl ica Francs-Canad Francs-Francia Francs-Luxembur o Francs-M naco Francs-Suiza Galle o Galle o-Espaa Geor iano Geor iano-Geor ia Alemn Alemn-Austria Alemn-Alemania Alemn-Liechtenstein Alemn-Luxembur o Alemn-Suiza Grie o Grie o-Grecia Gujarati Gujarati-India Hebreo Hebreo-Israel Hindi Hindi-India Hn aro Hn aro-Hun ra Islands Islands-Islandia Indonesio
P i 84

Programacin 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 Japons Japons-Jap n Kannada Kannada-India Kazajo Kazajo-Kazajistn Konkani Konkani-India Coreano Coreano-Corea Kir us Kir us-Kazajistn Let n Let n-Letonia Lituano Lituano-Lituania Macedonio Macedonio-Anti ua Repblica Yu oslava de Macedonia Malayo Malayo-Bruni 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 us Portu us-Brasil Portu us-Portu al Punjabi Punjab-India Rumano Rumano-Rumana Ruso Ruso-Rusia Snscrito Snscrito-India
P i 85

Programacin 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 (cirlico)-Serbia Serbio (latino)-Serbia Eslovaco Eslovaco-Eslovaquia Esloveno Esloveno-Eslovenia Espaol Espaol-Ar entina Espaol-Bolivia Espaol-Chile Espaol-Colombia Espaol-Costa Rica Espaol-Repblica Dominicana Espaol-Ecuador Espaol-El Salvador Espaol-Guatemala Espaol-Honduras Espaol-Mxico Espaol-Nicara ua Espaol-Panam Espaol-Para uay Espaol-Per Espaol-Puerto Rico Espaol-Espaa Espaol-Uru uay Espaol-Venezuela Suajili Suajili-Kenia Sueco Sueco-Finlandia Sueco-Suecia Sirio Sirio-Siria Tamil Tamil-India Trtaro Trtaro-Rusia Telu u Telu u-India Tailands Tailands-Tailandia Turco Turco-Turqua Ucraniano Ucraniano-Ucrania Urd
P i 86

Programacin Windows
ur-PK uz uz-UZ-Cyrl uz-UZ-Latn vi vi-VN 0x0420 0x0043 0x0843 0x0443 0x002A 0x042A Urd-Pakistn Uzbeko Uzbeko (cirlico)-Uzbekistn Uzbeko (latino)-Uzbekistn Vietnamita Vietnamita-Vietnam

Ejercicio Prctico N3 1.- Disear 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

Programacin 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

Programacin Orientada a Objetos (POO)


En Visual Basic Net un objeto puede definirse como cualquier cosa, ente o entidad fsica 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 caractersticas 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 ora. Las propiedades ms generales son forma, color, tamao, peso, etc., pero ya en particular: Chamarra Marca, material, precio, color, tamao, etc. Alumno Matricula, nombre, edad, domicilio, etc. Gato Raza, nombre, color, edad, etc. Ventana Windows>Tamao, Color, Font, etc. b) Mtodos: Son las conductas propias de la naturaleza del objeto. As como las propiedades son el ser (que es) del objeto, los mtodos son el hacer (que hacer) del objeto. Ejemplo de mtodos: 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 mtodos propios que se activan o disparan, ejemplo:

P i

88

Programacin Windows
Evento ato detecta ata ato detecta perro Rat n clic Windows Relacin Mtodos 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 ms 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, mtodos y estn sujetos a eventos. En visual Basic Net recordar adems que un conjunto de objetos que comparten o contienen caractersticas similares forman la llamada CLASE.

Creacin 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 nrselo (aqu debe usar un parmetro con el nombre Value, que contiene el valor para asi nrselo). La sintaxis a emplear se muestra en el si uiente c di o fuente. Sintaxis: [Tipo de Declaracin] Property <Nombre> [as <Tipo Dato>] [[ReadOnly] Get <Instrucciones> End Get]
P i 89

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

Ejercicio Prctico 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 Mtodos. 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

Programacin 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.- Disearemos el siguiente formulario.

TxtCod TxtNom TxtSue

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

Programacin 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 mtodo 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 Prctico N5
1.- Disear el si uiente formulario.

TxtNom DateTimePicker

LblMensaje

BtnMostrar

P i

92

Programacin Windows
2.- Lue o a re aremos una clase llamado Persona el cual crearemos las si uientes propiedades y mtodos. 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() & " aos" End Sub
P i 93

Programacin Windows
Ejercicio Prctico N6
1.- A re ar una clase llamada Empleado2 y a re aremos los si uientes campos, propiedades y mtodos. 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

Programacin 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 diseamos 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 'Mtodo Sueldo de la clase Empleado2 oempleado.remuneracion = oempleado.sueldo(oempleado.HorasTrabajadas)
P i 95

Programacin 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 ramacin Orientada a Ob etos (POO) - Usando una ibrera de Clases


Prctica de aboratorio
Este laboratorio pretende ensear como se trabajan con componentes en Visual Basic .Net, primero se ver un laboratorio de c mo crear una Librera de Clases y lue o veremos como trabajar con herencia de clases.

Creando y Usando una Librera de Clases


Se va a construir una librera que permita manejar el inventario de productos en almacn 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

Programacin 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 Mtodos 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

Programacin Windows
2.- Luego, aadimos una aplicacin para Windows que me permita realizar el mantenim iento de productos usando la librera creada. 3.- Para eso seguir los siguientes pasos:

4.- El proyecto se llamar Probando Clase 5.- Diseamos un formulario llamado FrmProducto que tenga un TabControl con 3 fichas, una de ingreso de productos, otra de actualizacin de precios y stock y otra de consulta, diseadas tal como se muestran las figuras de abajo: y Ficha Ingreso del formulario FRMPRODUCTO

Ficha Actualizacin del formulario FRMPRODUCTO

Pgina 98

Programacin Windows
y Ficha Consulta del formulario FRMPRODUCTO

Despus de realizar el diseo y antes de escribir cdigo, para usar la librera 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 pestaa 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 botn 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

Pgina 99

Programacin 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
  

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 Mtodos o Polimorfismo, Eventos y Herencia


 Qu son Constructores?    
Definici n de Sobrecar a de Mtodos Concepto de Eventos Herencia de una Clase Herencia y Sobrecar a
P i 100

Programacin Windows

Constructores
El punto de inicio de cualquier clase, cuando se crea una instancia en la memoria, es un mtodo especial al que se le conoce como constructor. Un constructor no devuelve nin n valor, por tanto en Visual Basic sera un mtodo de tipo Sub llamado New. El primer mtodo que es ejecutado al instanciar un objeto de la clase se denomina constructor. Este tipo de mtodo resulta til para tareas de confi uraci n inciales sobre el objeto. No es necesario escribir un mtodo constructor en la clase, ya que en el caso de que no exista, el compilador se encar a de crearlo implcitamente. Todas las clases de Visual Basic .Net tienen un constructor por defecto que es mtodo New, pero se pueden a re ar varios constructores New diferencindose por el nmero de parmetros.

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 mtodos constructores al inicio de la clase, de lo contrario no funcionaran.

P i

101

Programacin Windows
Ejercicio Prctico N1
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 'Mtodo Constructor Public Sub New() 'Asi namos un valor inicial 'A una variable de propiedad fecha = Now End Sub End Class 2.- Lue o disearemos 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

Programacin 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 'Mtodo constructor con parmetro Public Sub New(ByVal vfechacrea As Date) 'Asi namos el valor de parmetro '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 tambin se pueden sobrecar ar, es decir, pueden existir varias versiones en las que cada una de ellas reciba distintos parmetros, en nmero 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

Programacin Windows
'Mtodo 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 Mtodos o Polimorfismo


La sobrecarga de mtodos, es una tcnica que consiste en crear varios mtodos con idntico nombre dentro de la misma clase, distin uindose entre s por su lista de parmetros. Para declarar un mtodo como sobrecar ado, debemos utilizar la palabra clave Overloads despus del modificador de mbito. Podemos sobrecar ar mtodos de tipo Sub y Function. Ejercicio Prctico N2
y

Una situaci n que podra requerir la sobrecar a de mtodos sera 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 mtodos con el nombre Sueldo( ), que variarn en su firma, o protocolo de llamada, y realizarn diferentes tareas, pero todas ellas relacionadas con el sueldo del empleado.

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

Programacin Windows
End Get Set(ByVal value As Double) mvarsalario = value End Set End Property 'Mtodos 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 aadir 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

Programacin Windows
2.Lue o disearemos 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 mtodo sobrecar ado objempleado.Sueldo() 'llamada al se undo mtodo sobrecar ado s2 = "El Sueldo se Transferira el dia " & objempleado.Sueldo(Me.NumericUpDown1.Value) 'llamada al tercer mtodo 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

Programacin 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 fcil 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 ms abstractos y un poco ms difciles de entender, ya que poda confundirse con lo mtodos. 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. Adems tiene mtodos 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 tambin cuando durante el da 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 llmelo con RaiseEvent, tal como se muestra en la sintaxis. Declaracin Sintaxis: [Tipo Declaraci n] Event <Nombre> ([Parmetro(s)]) Declaracin Llamada: RaiseEvent <Nombre> ([Parmetro(s)]) Ejercicio Prctico N3 1.- Crearemos 2 eventos para una clase llamada Empleado, el cual estos eventos nos informarn 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

Programacin 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

Programacin Windows
2.- Lue o disearemos 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 mtodo ActualizarSueldo objempleado.actualizarSueldo(sueldo) Ms Box("Sueldo Actualizado...!", Ms BoxStyle.Information, "SISE") End Sub

P i

109

Programacin 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
Introduccin 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 caracterstica de definir una clase que sirve de base para otras clases derivadas, las clases derivadas tendrn los miembros de la clase base: propiedades, mtodos, eventos, etc. Los miembros heredados por la clase derivada pueden sobre escribirse e implementarse de otra forma, adems la clase derivada puede tener sus propios miembros y servir de clase base para otras clases, lo rndose la reutilizaci n de objetos a travs de la herencia. Otra forma de herencia es a travs del polimorfismo, que es una caracterstica POO que consiste en definir una Clase Abstracta con propiedades y mtodos que sern implementados de diferentes formas por otras clases, es decir, con un mismo nombre de propiedad o mtodo se obtiene funcionalidad distinta de acuerdo al tipo de objeto. En .Net solo existe herencia simple y no herencia mltiple, 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 diramos 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 mltiple en Visual Basic .Net recurrimos a las interfaces, que permiten definir propiedades y mtodos en una clase sin c di o, lue o desde una clase se puede implementar varias interfaces, lo rndose una herencia mltiple 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

Programacin 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 caractersticas 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 heredarn 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 lnea de la clase derivada 2. Solo puede existir una instrucci n Inherits, ya que solo existe herencia simple. Ejercicio Prctico N
1.- Crearemos a continuaci n una clase llamada Vendedor que heredar todas sus propiedades, mtodos 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

Programacin Windows
2.- Lue o disearemos 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 mtodo ActualizarSueldo de la clase Padre objvendedor.actualizarSueldo(sueldo) Ms Box("Sueldo Actualizado...!", Ms BoxStyle.Information, "SISE") End Sub

P i

112

Programacin 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 Mtodos


Podemos sobrecar ar mtodos existentes en una clase base dentro de una clase derivada, para ello simplemente escribimos la implementaci n del mtodo 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 basndonos en una operaci n sobre el salario; sin embar o, los incentivos para el administrativo se calculan en base a un nmero de horas, por lo que escribimos dos implementaciones del mismo mtodo en cada clase, sobrecar ando el mtodo en la clase Administrativo.

Ejercicio Prctico N5
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 'Mtodos 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

Programacin Windows
2.- Lue o crearemos la clase derivada Administrativo. Public Class Administrativo 'Heredamos de la clase Empleado Inherits Empleado 'Sobrecar amos el mtodo 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 disearemos 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

Programacin 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 mtodo 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 Mltiples)


 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  Cmo funciona el DataAdapter  Consultas Simples y Mltiples

Qu es Ado.Net?
Ado.Net es un modelo de pro ramacin basado en estndares que permite crear aplicaciones distribuidas que accedan a datos compartidos. Por ser una Interfaz de Pro ramacin de Aplicaciones (API), est disponible desde muchas aplicaciones, herramientas de desarrollo, len uajes de pro ramacin 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

Programacin Windows Qu es un NameSpace de Acceso de Datos?


Hay tres Namespace que puede importar dentro de una aplicacin.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, tambin 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

Descripcin
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 implementacin 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

Programacin Windows
Para poder emplear el SQLClient en el editor de codigo de su aplicacin debe colocar la siguiente instruccin:

ADO ADO .NET


ADO evoluciona hacia ADO .NET

Conexiones String en Visual Basic .Net 2005


Conexin Access 200
Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C: \mydatabase.mdb

Conexin a Access 2007


Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\myFolder\myAccess2007file.accdb

Pgina 117

Programacin Windows

SQL 2005
Va Autentificacin Windows
Server =myServer; DataBase =myDataBase; Integrated Security=True

Va Usuario de SQL Server 2005


Server =myServer; DataBase =myDataBase; User Id=myUsername; Password=myPassword
1.- Disear el Si uiente formulario:

btnAccess2003

PictureBox1

btnAccess2007

btnSql2005

btnUsuario

lblConecta

2.- Para realizar la Conexin 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.
Versin 2003 Versin 2007

P i

118

Programacin Windows
3.- Para Hacer la conexin 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 cdi 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

Programacin 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

Programacin 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

Propsito
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 especficas 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 conexin hacia un especifico origen de datos.

Pgina 121

Programacin Windows
DataAdapter
Esta clase acta como un puente entre el origen de datos y el objeto desconectado del DataSet. Provee 2 interfaces, una a travs de la cual permite poblar el DataSet y actualizar la informacin 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

Pgina 122

Programacin Windows

Como Acta el DataAdapter con respecto a una Base de Datos


Connection, Command 1
DataAdapter VB DataTable Despachar Datos (Fill) SqlClient

Base atos

Consultas
1.- Diseamos 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 conexin. Public Class Form1 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True")

P i

123

Programacin Windows
4.- codificamos lo siguiente en el botn 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 aplicain y se debe mostrar de la siguiente manera.

Pgina 124

Programacin Windows

Pro ramacin Orientada a Ob etos (POO) - Usando una ibrera de Herencia


Prctica de aboratorio
En este laboratorio vamos a construir una librera de clases para un Instituto Superior Tecnolgico 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 Librera de Clases Herencia 2.- Crear la clase Persona, luego escribir el cdigo siguiente para crear las propiedades: Nombre, FechaNac, Edad y Direccin y el mtodo 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

Programacin 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 aadimos una clase al componente, y le pondremos como nombre Alumno. Luego escribimos el siguiente cdigo. 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

Programacin 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 tambin hereda de Persona, para lo cual aadimos una clase al componente; y escribimos como nombre Profesor. Luego escribimos el siguiente cdigo: 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

Programacin Windows
4.- Finalmente crear la clase Curso, para lo cual aadimos una clase al componente, y escribimos como nombre Curso. Luego escribimos el siguiente cdigo: 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

Programacin 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, aadimos una aplicacin para Windows que me permita realizarla matricula usando la librera de clases creada. 3.- Para eso seguir los siguientes pasos:

4.- El proyecto se llamar Probando Librera Herencia 5.- Diseamos 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, diseadas tal como se muestran las figuras de abajo: y Ficha Alumno del formulario FRMMATRICULA

Pgina 129

Programacin Windows
y Ficha Curso del formulario FRMMATRICULA

Ficha Profesor del formulario FRMMATRICULA

Despus de realizar el diseo y antes de escribir cdigo, para usar la librera primero debemos hacer una referencia a esta. Clic derecho sobre nuestro proyecto Probando Librera Herencia y elegimos agregar Referencia, nos aparecer una ventana el cual elegiremos la pestaa proyecto y clic sobre el proyecto que contiene nuestra clase Librera de Clases Herencia.

Pgina 130

Programacin 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 botn 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 botn Consultar: Private Sub btnConsultar_Click MsgBox("El Alumno(a) " & Me.objAlumno.Nombre & vbNewLine & _ "con " & Me.objAlumno.Edad & " aos 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 & " aos de edad", MsgBoxStyle.Information, "SISE") End Sub Finalmente, programamos el botn Salir de la aplicacin: Private Sub btnsalir_Click Me.Close() End Sub

P i

131

Programacin Windows

Data Sets, DataTable y DataRelation


   
Qu es un DataSet? Qu es un DataTable? DataColumns, DataRows DataRelation Via Cdigo y Usando Asistente

La Clase DataSet
Bsicamente, un objeto DataSet va a ser similar a un objeto Recordset de ADO, pero ms potente y complejo. Es el almacn 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 travs de su propiedad Tables, que es una coleccin de objetos System.Data.DataTable. Cada objeto DataTable contiene una coleccin de objetos DataRow que representan las filas de la tabla. Y si seguimos con esta analoga tenemos que decir que cada objeto DataRow, es decir, cada fila, posee una coleccin de objetos DataColumn, que representan cada una de las columnas de la fila actual. Existen adems, 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 genrico de OLE DB. Al objeto DataAdapter le pasaremos como parmetro 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 mtodo Fill(), que posee dos parmetros; el primero es el DataSet a rellenar de informacin; y el segundo, una cadena con el nombre que tendr la tabla creada dentro del DataSet, producto de la ejecucin de la consulta.
P i 132

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

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

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 informacin 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 caractersticas como nombre de la columna, tipos de datos y primary key. Rows, contiene el DataRow, que representa la informacin 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 travs de los siguientes formatos:

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

Programacin Windows

Reali ando Consultas Mltiples 1ra Forma


1.- Creamos el diseo para el siguiente formulario.
BtnMostrar

DataGridView1

DataGridView2

DataGridView3

2.- Luego hacemos la conexin 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 botn 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

Programacin 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 aplicacin y se debe mostrar de la siguiente manera.

2da Forma.
1.- Agregamos otro formulario con el mismo diseo que el anterior.
BtnMost

DataGridVie

DataGridVie

DataGridVie

Pgina 135

Programacin Windows
2.- Luego hacemos la conexin 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 botn 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 Prctico N1
1.- Disear el siguiente formulario.

BtnDataSe

LstClientes

P i

136

Programacin 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 relacin entre dos tablas (objetos DataTable) de un DataSet, a travs de una columna o campo comn (objetos DataColumn). Ejercicio Practico N2 1.- Disear el siguiente formulario.
CboClientes

LstOrdenes

P i

137

Programacin 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

Programacin Windows
Ejercicio Practico N3 1.- Disear 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

Programacin 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

Relacin 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.
Pgina 140

Programacin Windows

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

6.- Nos mostrar una ventana donde aparecern las dos Tablas, Employees y Orders.

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

Pgina 141

Programacin 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 relacin entre ellas por el campo EmplyeeId.

10.- La relacin debe quedar de la siguiente manera.

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

Pgina 142

Programacin 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 cdigo para cargar los 2 SqlDataAdapter al DataSet. Private Sub Form2_Load Me.SqlDataAdapter1.Fill(Me.DsEmployeesorders1) Me.SqlDataAdapter2.Fill(Me.DsEmployeesorders1) End Sub

Pgina 143

Programacin 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


Vi w

Qu es el Objeto DataView?

 Para que Sirve?  Propiedad Sort y RowFilter  Navegacin de Registros (Control BindingSource)  DataBinding y BindingContext

Pgina 144

Programacin Windows

El objeto DataView
El objeto DataView permite manejar dentro de una aplicacin la informacin que recibe un objeto DataSet. La informacin 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 informacin que tiene el Objeto DataSet mediante su objeto DataTable. La siguiente instruccin enva el objeto DataView la informacin 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 informacin 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 informacin de una fila del DataView. La primera fila tiene el nmero 0 (cero). Para acceder a la informacin de una columna, podemos usar tambin la propiedad Item de esta propiedad utilizando el nmero de la columna o su nombre. La primera columna tiene el nmero 0 (cero). RowFilter: Esta propiedad se utiliza cuando deseamos seleccionar los registros del DataView. Aqu se escribe la condicin que deben cumplir los registros. Por Ejemplo: La siguiente instruccin slo 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 informacin del DataView. Por ejemplo, la siguiente instruccin ordena por la columna Nombre la informacin del DataView.

MiDataView.Sort=Nombre
P i 145

Programacin Windows
Ejercicio Prctico N1 1.- Disear 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 conexin 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

Programacin Windows
Ejercicio Prctico N2 1.- Disear 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

Programacin Windows
Ejercicio Prctico N3 1.- Disear 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

Programacin Windows

Usando el Control BindingSource


En general, un Objeto BindingSource hace de puente entre el control y el conjunto de datos, simplificando la conexin control-origen de datos, la actualizacin del contenido actual, la notificacin de cambios y otros servicios.
Control de un Formulario

BindingSource

Origen de Datos

Realizada la conexin control-origen de datos, toda interaccin con los datos, incluyendo navegacin, ordenacin, 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 opcin Agregar origen de Datos del Proyecto.

Pgina 149

Programacin Windows
3.- Aparecer la siguiente ventana y escogeremos Base de Datos y luego clic en el botn siguiente.

4.- Luego escogemos la conexin 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 conexin.

Pgina 150

Programacin Windows
6.- Despus clic en siguiente y luego escogemos los campos de la tabla que se mostrarn 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.

Pgina 151

Programacin 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 diseo 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 dems Cajas de Textos.

P i

152

Programacin 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 cdigo para los botones de desplazamiento y para el evento Load del Formulario Private Sub Form1_Load 'TODO: esta lnea de cdigo carga datos en la tabla 'DsSuppliers.Suppliers' Puede quitarla segn 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

Programacin Windows
Private Sub btnultimo_Click Me.BindingSource1.MoveLast() mostrarposicion() End Sub 14.- Por ultimo ejecutamos la aplicacin 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 in: txtNombre.DataBindings.Add("Text", dtEmpleados, "FirstName") Luego para administrar por ejemplo la posicin actual o lo que es lo mismo el registro activo se utiliza la siguiente instruccin: Me.BindingContext(dtEmpleados).Position = 0 Note en la instruccin anterior que se utiliza a propiedad BindingContext del formulario, como lo dicho en lneas arriba, la propiedad Position va a mantener sincronizados todos los controles enlazados al DataTable dtEmpleados.
Pgina 154

Programacin Windows
Ejemplo: Realizar el Siguiente Diseo:

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

Programacin 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 Parmetros


   
La Clase Command Bsqueda de Clientes Consultas de Fechas Trabajo de Consultas con parmetros.
P i 156

Programacin Windows

Las clases Command


Establecida una conexin con un almacn de datos, la siguiente operacin lgica consiste en enviarle sentencias para realizar los distintos tipos de operaciones que habitualmente realizamos con los datos. Las clases Command de ADO .NET sern 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 travs de un objeto Command tambin podremos obtener un conjunto de resultados del almacn de datos. En este caso, los resultados se pasarn a otros objetos de ADO .NET, como DataReader o DataAdapter; estos dos objetos los comentaremos ms adelante. Un objeto Command lo vamos a crear a partir de una conexin ya existente, y va a contener una sentencia SQL para ejecutar sobre la conexin 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 ejecucin 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 almacn 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. Coleccin de parmetros que se pueden utilizar para ejecutar el objeto Command, esta coleccin se utiliza cuando deseamos ejecutar sentencias SQL que hacen uso de parmetros, esta propiedad devuelve un objeto de la clase SqlParameterCollection o un objeto de la clase OleDbParameterCollection. Estas colecciones contendrn objetos de la clase SqlParamter y OleDbParameter, respectivamente, para represen a cada uno de los tar parmetros utilizados. Estos parmetros tambin son utilizados para ejecutar procedimientos almacenados.

P i

157

Programacin Windows
Una vez vistas algunas de las propiedades de las clases SqlCommand y OleDbCommand, vamos a pasar a comentar brevemente los principales mtodos de estas clases. Ejercicio Practico N1 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 diseo.
DataGridView BtnMostra

DataGridView

2.- Luego hacemos la conexin 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.- Despus 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

Programacin Windows
4.- Luego en el Botn 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 N2 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.- Diseamos el siguiente formulario.

BtnVer ComboBox DataGridView

P i

159

Programacin Windows
2.- Luego en declaraciones generales importamos lo siguiente. Imports System.Data Imports System.Data.SqlClient 3.- Luego a nivel formulario creamos la conexin. 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.

Pgina 160

Programacin 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 disear el siguiente formulario: 3.- Hacemos la conexin 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 Automticamente 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

Pgina 161

Programacin 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 aplicacin 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

Pgina 162

Programacin 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 aplicacin.

Entorno Conectado ExecuteNonQuer y ExecuteScalar anteni iento de una Tabla

Pgina 163

Programacin 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 aplicacin.

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

Accediendo a Entornos Conectados


En escenarios conectados los recursos estn disponibles hasta cerrar la conexin. a) Abrir Conexin b) Ejecutar el Comando c) Procesar las Filas de un Reader d) Cerrar el Reader e) Cerrar la Conexion

Pgina 164

Programacin Windows

Instruccin Execute NonQuery


Esto es lo que nos dice la ayuda de Visual Studio sobre el mtodo ExecuteNonQuery: y y Ejecuta una instruccin SQL en un objeto de conexin. Se puede utilizar ExecuteNonQuery para realizar operaciones de catlogo (por ejemplo, consultar la estructura de una base de datos o crear objetos de base de datos como tablas) o para cambiar la informacin de una base de datos ejecutando las instrucciones UPDATE, INSERT o DELETE. y Aunque ExecuteNonQuery no devuelva ninguna fila, los parmetros de salida o los valores devueltos asignados a los parmetros se rellenan con datos. y Para las instrucciones UPDATE, INSERT y DELETE, el valor devuelto corresponde al nmero de filas afectadas por el comando. Para los dems tipos de instrucciones, el valor devuelto es -1.

Abrir y Cerrar una Conexin 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 conexin va script. Imports System.Data.SqlClient Public Class Form1 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True")

Pgina 165

Programacin 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 conexin 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.

Pgina 166

Programacin 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 diseo en el formulario.

TxtProducto

btnAgregar

btnLimpiar

TxtProveedor

TxtCategoria

3.- Hacemos la Conexin. System.Data.SqlClient Public Class Form2 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True") 4.- Luego en el botn 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

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

Instruccin 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 dems columnas y filas. Utilice el mtodo ExecuteScalar para recuperar un nico valor (por ejemplo, un valor agregado) de una base de datos.

Por tanto, podemos deducir que ExecuteNonQuery lo usaremos para ejecutar la mayora 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 nmero de filas eliminadas. Por otro lado, ExecuteScalar lo usaremos cuando tengamos que ejecutar un cdigo de SQL del que queremos recuperar la primera columna de la primera fila. Este mtodo devuelve un valor de tipo Object que tendremos que convertir segn el valor devuelto. Por ejemplo, si queremos saber el nmero 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

Programacin Windows
En este caso, el valor devuelto ser del tipo Int32 y ser el nmero 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 parmetro 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 Prctico N1

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

Programacin 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.- Disear 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

Programacin 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

Programacin 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 Prctico

P i

172

Programacin 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 interaccin con el control DaraGridView. Podemos acceder a cualquiera de ellas a travs de la coleccin Cells de DataGridViewRow y a las que estn seleccionadas, a travs de la coleccin SelectedCells. El esquema de los datos almacenados en un DataGridView es expresado en columnas (objeto DataGridViewColumn), a las que podemos acceder a travs de su coleccin Columns y a las que estn seleccionadas, a travs de su coleccin SelectedColumns. Las filas (objeto DataGridViewRow) muestran los campos de los registros almacenados en un DataGridView. Podemos acceder a ellas a travs de su coleccin Rows, y a las que estn seleccionadas, a travs de su coleccin SelectedRows. 1.- Disear el siguiente formulario.

CboOrden CboProducto TxtPre TxtCan

DgvProductos

Imports System.Data Imports System.Data.SqlClient

P i

173

Programacin 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

Programacin 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

Programacin Windows

El Ob eto DataReader
 Qu es el Objeto DataReader?  Qu es el Objeto SQLDataReader?  Instruccin ExecuteReader  Ejemplo Prctico

Objeto DataReader
El objeto DataReader se utiliza en Ado.Net para leer la informacin que enva el origen de datos y manejarla en el cliente. Por Ejemplo: Si ha usado el objeto SQLConnection, tendrs que utilizar el objeto SQLDataReader.

Objeto SQLDataReader
El objeto SQLDataReader permite acceder a la informacin de una base de Datos de una manera muy rpida, mejorando el rendimiento de nuestra aplicacin por la velocidad que utiliza para acceder a ella y tambin porque requiere poco espacio de memoria ya que slo perm anece en ella un solo registr a la vez. Las caractersticas de acceso a la informacin de este objeto es que es en forma secuencial y hacia delante, es decir, desde la primera hasta la ltima fila. Otra caracterstica de este objeto es que la informacin que almacena es de solo lectura, es decir, que slo se puede utilizar cuando deseamos leer la informacin 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 continuacin:

Dim variable as SqlDataReader


Ejemplo:

Dim dr as SqlDataReader
Despus de definir la variable, crear el objeto SQLCommand y abrir la conexin, puede llenar el objeto SQLDataReader de la siguiente manera:

P i

176

Programacin Windows
Variable=Objeto SQLCommand.ExecuteReader
Ejemplo:

Dr=CmdClientes.ExecuteReader Ejercicio Practico N1


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

Pgina 177

Programacin Windows

Acceso al Sistema
1.- Disearemos el formulario para que quede de la siguiente manera.

PictureBox1 Y PictureBox2

TxtUsuario

TxtContrasea ProgressBar1 BtnIngresar BtnSalir 2.- Despus aadiremos 2 Timer; uno para el ProgressBar1 y el otro para los dos PictureBox

3.- Cargamos una imagen para cada PictureBox

4.- Luego hacemos la conexin 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

Pgina 178

Programacin Windows
"

6.- En el Botn 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.txtcontrasea.Text Then Me.Timer1.Enabled = True Else MsgBox("Contrasea 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 Botn 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

Programacin Windows
11.- Finalmente ejecutamos la aplicacin. Ingresamos un Usuario y una Contrasea.

Crear Proyectos de Instalaci n


 Como crear Proyectos de Instalacin  Personalizar el Proyecto  Generar el Instalador

Pgina 180

Programacin Windows
Una vez desarrollado un aplicativo, el paso siguiente lgico es generarle su instalador, para ello vamos a agregar a la Solucin un proyecto de Instalacin e Implementacin.

El proyecto de Instalacin contiene 6 vistas para configurar segn 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 Aplicacin= 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 dems archivos necesarios para que el aplicativo funcione bien. Escritorio del Usuario= Representa al Escritorio de la Maquina Cliente, aqu colocaremos los accesos directos.
Pgina 181

Programacin Windows
Men Programas del Usuario= Representa al Men Programas de la Maquina Cliente, Ac tambin 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

Pgina 182

Programacin 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:

Pgina 183

Programacin Windows Vista Interfaz de Usuario


Esta vista permite configurar las pantallas que se muestran en la instalacin Mediante la ventana de propiedades solo cambiaremos algunas propiedades, como el Banner de las pantallas

Pgina 184

Programacin Windows Vista Acciones personalizadas


Esta vista sirve para agregar un Ejecutable (proceso) que corra en paralelo a la inhalacin 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 ejecucin.

Vista Condiciones de Inicio


Esta vista permite hacer bsquedas en la Maquina del Cliente y en base a estas dejar o no la instalacin del Aplicativo:

Agregue una bsqueda de un archivo especificando el nombre y la extensin del mismo, no dejando de lado la carpeta donde se buscara el archivo.
Pgina 185

Programacin Windows

Ahora procederemos a agregar una Condicin basada en la bsqueda anterior

Ahora asigne a la condicin la bsqueda antes especificada

Compile el proyecto y tendr los archivos de instalacin del mismo.

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

Pgina 186

Das könnte Ihnen auch gefallen