You are on page 1of 186

Introducción al Entorno de

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

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

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

¿Que es Visual Studio Net?


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

¿Qué es el .NET Framework?

"El .NET Framework es un entorno multi-lenguaje para la construcción, distribución y ejecución de


Servicios Webs y aplicaciones."

El .NET Framework es el corazón de .NET, cualquier cosa que queramos hacer en cualquier lenguaje
.NET debe pasar por el filtro cualquiera de las partes integrantes del .NET Framework.

Pá gina 2
Programación Windows

El .NET Framework tiene dos componentes principales: el Common Language Runtime y la


biblioteca de clases.

CLR o Common Language Runtime


Una de las partes fundamentales de Microsoft .NET Framework, es el CLR o Common Language
Runtime, que no es otra cosa que el entorno o motor de ejecución de lenguaje común.
El CLR es el centro neurálgico del .NET Framework encargado de gestionar la ejecución de nuestras
aplicaciones, aplicar parámetros de seguridad y ejecutar el denominado recolector de basura entre
otras cosas.

Garbage Collector o GC
En su traducción más o menos exacta, lo definiremos como Recolector de Basura, y que tiene
la función digna o indigna, de hacer la tarea más sucia de .NET, es decir, de hacer las
funciones de gestor 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 programador y por el
usuario,

MSIL
MSIL o IL es conocido como Microsoft Intermediate Language o simplemente Intermediate
Language, o lo que es lo mismo, lenguaje intermedio.
Todos los lenguajes administrados de la plataforma .NET, deben cumplir un conjunto de
reglas y normas, y parte de este ajuste, es que una aplicación escrita en un lenguaje de
programación determinado, debe ser compilada en un lenguaje intermedio, de manera tal, que
una aplicación escrita por ejemplo en C# y otra igual en Visual Basic, se compilan al
prácticamente el mismo lenguaje intermedio.

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

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

Pá gina 3
Programación Windows

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

.NET
Aplica Biblioteca
Framew

ADO.NET
Web
Servicios
cione

Windows
datos
Tipos de
de clases Códi
s
Aplica ork go

XML
Visual
ciones de la
Basic El
Visual El compilador
compilador JIT
plataJIT produce
produce
Aplica
C# lenguaje máquina
lenguajeform
máquina
cione Common
El
El código
código fuente
s se
fuente se compila
compila como
como MSIL
MSIL a
Language .NET
Visual
FormasC++ de Ingreso Runtime
al Entorno
Hay dos formas de ingresar la Visual .Net:
1.- Inicio/Todos Los Programas/Microsoft Visual Studio 2005/ Microsoft Visual Studio 2005

2.- Inicio/Ejecutar:

Pá gina 4
Programación Windows

Crear un nuevo Proyecto


1.-Menú Archivo/Nuevo Proyecto o las combinaciones de las Teclas Ctrl + N aparecerá la siguiente
pantalla

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

Explorando el Entorno de Desarrollo


Esta lección introduce
las principales
características del
entorno de desarrollo
que utilizamos para crear
y modificar aplicaciones,
como el Diseñador
Windows Forms y los
controles del Cuadro de
herramientas.

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

Pá gina 5
Programación Windows

Cuadro de Herraminetas (Ctrl + Alt + X)


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

Ventana de Propiedades (F4)


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

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

Pá gina 6
Programación Windows

Editor de Código (Shift + F7)


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

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

Pá gina 7
Programación Windows

Como Agregar un Nuevo Formulario


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

2.- Ingresar el nombre


“FrmIngreso” y clic
Aceptar

Como Establecer Formulario de Inicio


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

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

Como Agregar Controles a un formulario

Pá gina 8
Programación Windows

Antes de todo, al formulario que deseamos agregar un control debe esta en modo Diseño (Shift + F7)
y el Cuadro de Controles tiene que estar activo (Ctrl + Alt + X). Para agregar controles hay varias
formas:
1.-Arrastre el control al formulario (Recomendado)
2.- Clic en el control/Enter
3.- Doble Clic en el control
Como Eliminar un formulario
Desde el Explorador de Soluciones Clic derecho sobre el formulario que desea eliminar (en este caso
Form1) / Clic en Eliminar
Nota: Cuando se crea un Proyecto debemos guardar y debemos saber donde guarda el proyecto para
esto haga clic en el icono de Guardar Todo ( )

Ejercicio Practico Nº1.

1. Diseñar el siguiente Formulario:

LblNombre TxtNombre

BtnMensaje

2. En el evento click del boton BtnMensaje codificamos lo siguiente:

Private Sub btnMensaje_Click


MsgBox("Bienvenido a Visual Basic .Net " & Me.txtnombre.Text)
End Sub

Ejercicio Practico Nº2.

1. Diseñar el siguiente Formulario:

TxtTexto

btnColorTexto

btnColorFondo

2.- Luego codificamos lo siguiente en el evento click de los botones:

Pá gina 9
Programación Windows

Private Sub BtnColorTexto_Click


Me.TxtTexto.ForeColor = Color.Blue
End Sub
Private Sub BtnColorFondo_Click
Me.BackColor = Color.Red
End Sub

Ejercicio Practico Nº3.

1. Diseñar el siguiente Formulario:

Txt1

Txt2

BtnMultiplicar
BtnSuma

BtnResta BtnPotencia

BtnDividir
BtnNuevo

TxtRes

2.- Luego codificamos lo siguiente 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

Ejercicio Práctico Nº4


1.- Diseñar el siguiente formulario
Pá gina 10
Programación Windows

TxtUsu

TxtPas

Btningresar BtnSalir

Escriba el Código a utilizar para este ejercicio.

…………………………………………………………………………………………………………
…………………………………………………………………………………………………………
…………………………………………………………………………………………………………
…………………………………………………………………………………………………………
…………………………………………………………………………………………………………
…………………………………………………………………………………………………………
………………………………………………………………………………………………………….

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

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

Pá gina 11
Programación Windows

5.- Desarrollar la siguiente aplicación

Funciones de Lenguaje

 Tipos de Datos
 Operadores
 Variables
 Sentencias Condicionales
 Bucles

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

Pá gina 12
Programación Windows

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

¿Como Escoger un Tipo de Dato?

Visual Basic no requiere que seleccione explícitamente un tipo de datos cuando declara una variable.
Sin embargo, es una buena idea hacerlo, ya que de esta forma sus aplicaciones serán más fiables y
requerirán menos memoria. El tipo de datos determina los valores permitidos para una variable, que,
a su vez, determinan las operaciones que pueden realizarse sobre esa variable.
Puede seguir las directrices generales que se muestran en la ilustración anterior para seleccionar el
tipo de datos adecuado para una variable.
Si usted declara variables sin tipo de datos, se les otorga de forma predeterminada el tipo de datos
Object. Esto facilita la escritura rápida de programas, pero puede hacer que éstos se ejecuten más
lentamente.

Pá gina 13
Programación Windows

Pero con todo y con esto, la declaración de variables en .NET puede hacerse más extensiva, ya que
podemos declarar las variables también, utilizando unos símbolos o caracteres detrás de las variables,
que indiquen el tipo de variable utilizada. La siguiente tabla aclarará en algo esto que comento, y el
posterior ejemplo, terminará por explicarlo de forma práctica.
Tipo de datos    Símbolo    Carácter   
Short N.A. S
Integer % I
Long & L
Single ! F
Double # R
Decimal @ D
UShort N.A. US
UInteger N.A. UI
ULong N.A. UL

Variables
¿Qué son las Variables?
Utilizamos variables para almacenar valores que pueden cambiar cuando una aplicación se está
ejecutando. Una variable tiene los siguientes elementos:
Ámbito: El conjunto de todo el código que puede acceder y utilizar la variable.
Nombre: La palabra que utilizamos para hacer referencia a la variable en código.
Tipo de Datos: El tipo y tamaño inicial de datos que la variable puede almacenar.
Antes de poder utilizar variables en su aplicación, debe asignarles un valor. Puede asignar un valor a
una variable después de declararla o mientras la declara.

Sintaxis para Declarar una Variable


Para declarar una variable, utilice la siguiente sintaxis:

Dim nombreVariable As Type

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

Cómo Declarar Variables

Pá gina 14
Programación Windows

Hemos visto que la declaración de una variable dentro de un procedimiento, se realiza anteponiendo
la palabra reservada Dim al nombre de la variable, seguida de la palabra reservada As y el tipo de
dato declarado.
Un ejemplo sencillo sería:
Dim strMiVar As String

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

Dim strMiVar1, strMiVar2, strMiVar3 As String

Estaremos declarando las tres variables strMiVar1, strMiVar2 y strMiVar3 como variables de tipo
String. En versiones anteriores a .NET de Visual Basic, esta misma declarativa, hacía que las dos
primeras variables se declararan de tipo Variant y la última de tipo String.

Nota: El tipo de declaración Variant de versiones de Visual Basic anteriores a .NET, ya no existe. El
tipo Object, es el tipo más adecuado para sustituir a este tipo de declaración.
De todas las maneras, en Visual Basic 2005, podemos declarar una variable y asignarla un valor
inicial a la hora de declarar esta variable. El siguiente ejemplo, ayudará a comprender mejor esto:

Dim strMiVar As String = "Ejemplo en Visual Basic 2005"

Inclusive podemos declarar variables de forma anidada y asignarle valores directamente, como por
ejemplo:

Dim Val1 As Integer = 2, Val2 As Integer = 3, Val3 As Integer = Val1 + Val2


MessageBox.Show(Val3)
Otra significación con la asignación directa o indirecta de valores es el apartado referente al trabajo
con fechas. Si queremos, podemos incluir una fecha entre los caracteres #, teniendo en cuenta que la
fecha debe ir en formato MES/DIA/AÑO. Sirva el siguiente ejemplo como demostración de esto que
estamos comentando:
Dim dateVar As Date
dateVar = #12/17/2005#
MsgBox(dateVar)

Ámbito de una Variable


Pá gina 15
Programación Windows

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

Ejercicio Práctico Nº1:


1.- Diseñar el siguiente formulario

BtnImagen1
PictureBox1
BtnImagen2

BtnImagen3

BtnImagen4

2.- Luego codificamos lo siguiente


Imports System.Drawing.Image

Pá gina 16
Programación Windows

Public Class Form1

Dim ruta As String = "Aqui pondremos la ruta donde se encuentran las imágenes unido con un \"

Private Sub btnimagen1_Click


Me.PictureBox1.Image = FromFile(ruta & "nombre de la imagen con su extension")
End Sub

End Class
3.- El codigo del evento click del boton BtnImagen1; es el mismo para los otros botones pero con
imágenes diferentes.

Uso de Estructuras de Decisión


En nuestro programa, podemos desear que algunas secciones de su código se ejecuten únicamente
cuando se cumpla una determinada condición. Esto se consigue utilizando una estructura de decisión.
Esta lección explica cómo utilizar las estructuras de decisión If…Then y Select Case. Estudiaremos
cómo incorporar expresiones condicionales en estas estructuras.

Cómo Utilizar Instrucciones If…Then...Else


Las instrucciones If…Then…Else son una extensión del concepto If…Then.
Utilizando un bloque If…Then…Else, podemos definir dos bloques de código y que nuestro
programa ejecute uno u otro dependiendo del resultado de una condición. Si es verdadera más de una
de las condiciones de una estructura condicional, únicamente se ejecutarán las instrucciones de
código incluidas en la primera condición verdadera.

Una instrucción If…Then…Else incluye los siguientes componentes:

 Una condición que evalúa si es True o False


 Una o más instrucciones que se ejecutan dependiendo del resultado de la prueba de la condición
 Una instrucción End If en el caso de un bloque

Para utilizar una instrucción If…Then…Else, utilizar la siguiente sintaxis:

If condition Then
statements
Else
statements
End If

Ejercicio Práctico Nº2

1.- Diseñar el siguiente formulario


Pá gina 17
Programación Windows

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

Cómo Utilizar Instrucciones Select Case

Pá gina 18
Programación Windows

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

Select Case testexpression


[Case expressionlist-n]
[statements-n1] . . .
[Case Else]
[elsestatement]
End Select

Ejercicio Práctico Nº3


TxtAlu
1.- Diseñar el siguiente formulario
LstCursos

TxtNP
TxtEP

LblCon TxtEF

TxtProm

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

Dim a As Short
If Me.txtnp.Text = "" Then
Pá gina 19
Programación Windows

a=1
ElseIf Me.txtep.Text = "" Then
a=2
ElseIf Me.txtef.Text = "" Then
a=3
End If

Select Case a
Case 1 : MsgBox("Ingrese Nota de Prácticas", MsgBoxStyle.Information, "Nota1")
Exit Sub
Case 2 : MsgBox("Ingrese Exámen Parcial", MsgBoxStyle.Information, "Nota2")
Exit Sub
Case 3 : MsgBox("Ingrese Exámen Final", MsgBoxStyle.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
MsgBox("Por Ingrese 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
MsgBox("Por Ingrese solo Numeros")
'Interrumpir el evento
e.Handled = True
End If
End Sub
Private Sub txtef_KeyPress
'Si la tecla que se presiona no es un numero; no es un numero o no es un control

Pá gina 20
Programación Windows

If Not (Char.IsNumber(e.KeyChar) Or Char.IsControl(e.KeyChar)) Then


MsgBox("Por Ingrese solo Numeros")
'Interrumpir el evento
e.Handled = True
End If
End Sub

Private Sub txtnp_Validating


If Me.txtnp.Text < 5 Or Me.txtnp.Text > 20 Then
MsgBox("Nota no Valida")
Me.ErrorProvider1.SetError(Me.txtnp, "Fuera de Rango")
e.Cancel = True
Else
Me.ErrorProvider1.Clear()
End If
End Sub

Private Sub txtep_Validating


If Me.txtep.Text < 5 Or Me.txtep.Text > 20 Then
MsgBox("Nota no Valida")
Me.ErrorProvider1.SetError(Me.txtep, "Fuera de Rango")
e.Cancel = True
Else
Me.ErrorProvider1.Clear()
End If
End Sub

Private Sub txtef_Validating


If Me.txtef.Text < 5 Or Me.txtef.Text > 20 Then
MsgBox("Nota no Valida")
Me.ErrorProvider1.SetError(Me.txtef, "Fuera de Rango")
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ódigo hasta que se
cumpla una determinada condición en los programas que desarrolle. Para repetir la ejecución de un
bloque de código 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ódigo y cuándo
hacerlo. Esta lección también describe cómo decidir el uso de una instrucción Exit para salir de un
bucle.

Cómo Utilizar Instrucciones For…Next

Pá gina 21
Programación Windows

Podemos utilizar un bucle For…Next cuando conocemos el número de veces que es necesario que se
ejecute un bucle. Una instrucción For…Next repite un conjunto de instrucciones un número
específico de veces.
Un bucle For…Next se ejecuta un determinado número de veces fijado por un contador de bucles. El
valor del contador de un bucle For…Next puede incrementarse o disminuir dependiendo de si step es
positivo o negativo.
La sintaxis de una instrucción For…Next es la siguiente:
For counter = start To end [Step step]
[statements]
[Exit For]
Next [counter]

Cómo Utilizar Instrucciones For Each…Next


Una instrucción For Each…Next ejecuta un bloque de instrucciones para cada elemento de una
colección o una matriz.
Una colección es un conjunto de objetos agrupados conjuntamente y a los que se hace referencia
como una unidad.
La sintaxis para la instrucción For Each…Next es la siguiente:
For Each elementvariable In collection
' Statement block to be executed for each value
' of elementvariable
Next [elementvariable]
Ejercicio Practico Nº1

1. - Diseñar el siguiente formulario

ListBox3
TxtNum

ListBox2

BtnCalcular
ListBox1

BtnLimpiar

2.- Codificaremos lo siguiente en los siguientes eventos:

Pá gina 22
Programación Windows

Private Sub btncalcular_Click


Dim n, s, r As Integer
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º2

1. - Diseñar el siguiente formulario

btnLimpiar

2.- Codificaremos lo siguiente en los siguientes 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

Como Utilizar Instrucción Do …Loop

Pá gina 23
Programación Windows

Puede utilizar instrucciones Do…Loop para ejecutar un bloque de instrucciones un número de veces
indefinido dependiendo del valor de tipo bolean de una condición.
Las instrucciones pueden repetirse mientras el valor de la condición sea True o hasta que sea True.
Generalmente, la condición es el resultado de comparar dos valores, pero también puede ser
cualquier expresión que da como resultado un valor de tipo Bolean (True o False).
El bucle DO...LOOP es muy versatil. Con el se pueden crear gran variedad de bucles distintos, bucles
que comprueben una condición antes de ejecutar el bucle una vez, después de la primera ejecución y
con conbinaciones con mientras (WHILE) que se cumple una condición o hasta (UNTIL) que esa
condicion se cumpla. la sintaxis de esta estructura es la siguiente:
DO [WHILE | UNTIL (condicion)]
      Sentencias
      .....
LOOP [WHILE | UNTIL (condición)]
Vamos a tratar de explicar esta sentencia de manera pausada para que sea más fácil de entender. Lo
que siempre tendremos en estos bucles es el DO y el LOOP, entre estos dos colocaremos las
sentencias que queremos ejecutar en cada iteración del bucle. Los bucles tienen que evaluar entre
cada iteración si se siguen ejecutando o no, para ello evalúa una condición. Lo versátil de este bucle
es que la condición se puede expresar de muchas maneras distintas.
Condición expresada al lado del DO: en este caso la condición se evalúa antes de empezar a
ejecutarse el bucle.
Condición expresada al lado del LOOP: en este caso la condición se evalúa después de ejecutarse
el bucle. Tiene como diferencia principal frente al otro método que en este caso el bucle se ejecutará
por lo menos una vez.
Además de poder expresar la condición en estos dos sitios también se puede construir la condición
con un enunciado mientras (WHILE) o un enunciado hasta (UNTIL). Las diferencias semánticas de
estas dos posibilidades se trasladan también a su manera de funcionar.
Vamos a ver un par de ejemplos de este bucle para comprender su funcionamiento. El ejemplo pide
constantemente el nombre del autor de la página y no para hasta que el nombre sea "Castilla".
También tiene el usuario la posibilidad de escribir "out", en ese caso, comprobado con un enunciado
IF, se sale del bucle rompiéndolo con la sentencia EXIT DO, utilizada para romper bucles.

Ejercicio Practico Nº3


1. - Diseñar el siguiente formulario BtnWhile
En el método clic del BtnWhile
Dim entrada as String BtnUntil
entrada = ""
DO WHILE (entrada <> "Castilla")
   entrada = inputbox ("Dime el nombre del autor","seguridad","Castilla",2,3)
  if (entrada = "out") then
     msgbox ("salgo por la puerta de atras")
      exit do
   end if
LOOP

Pá gina 24
Programación Windows

El siguiente 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 sigue
ejecutando el bucle y si se pulsa Cancelar se sale por la puerta de atrás, de manera similar a como se
salía en el ejemplo anterior, con EXIT DO.
En el método clic del BtnUntil
Dim cont
Dim respuesta
cont = 0
Do
cont = cont + 1
respuesta = MsgBox(cont, 69, "Variable del bucle, con valor 6 se sale")
If (respuesta = 2) Then
MsgBox("Cuenta Cancelada", 16, "Cancelaste!")
Exit Do
End If
Loop Until (cont = 6)

Funciones del Sistema y Funciones


Definidas por el Usuario

Pá gina 25
Programación Windows

Funciones Tipo Cadena

Una cadena es un dato de tipo String (Carácter); es decir se refiere a letras o letras y números,
ahora veremos las funciones de cadenas mas utilizadas y posteriormente realizaremos una
aplicación para que les quede mas claro, sobre las funciones de cadena.

 Right: Obtiene de una cadena, una cantidad de caracteres empezando por la derecha: Sintaxis;
Microsoft.VisulBasic.Right(Cadena,N)
 Left: Obtiene de una cadena, una cantidad de caracteres empezando por la izquierda: Sintaxis;
Microsoft.VisulBasic.Left(Cadena,N)
 Mid: Obtiene de una cadena, una cantidad de caracteres a partir de una posición
determinada: Sintaxis; Microsoft.VisulBasic.Mid(Cadena,N)
 Len: Obtiene la longitud de una cadena, es decir la cantidad de caracteres que contiene
incluyendo los espacios en blanco: Sintaxis; Len(Cadena)
 Trim: Quita los espacios en blanco al final de una cadena: Sintaxis; Trim(Cadena)
 RTrim: Quita los espacios en blanco al final de una cadena: Sintaxis; RTrim(Cadena)
 LTrim: Quita los espacios en blanco al inicio de una cadena: Sintaxis; LTrim(Cadena)
 UCase: Convierte una cadena en mayúsculas: Sintaxis; UCase(Cadena)
 LCase: Convierte una cadena en minúsculas: Sintaxis; LCase(Cadena)
 StrConv: Convierte una cadena en 3 formas diferentes, en mayúsculas = 1, minúsculas = 2,
la primera letra de cada palabra en mayúsculas = 3 : Sintaxis; StrConv(Cadena,Valor)
 InStr: Obtiene un número que indica la posición de una subcadena dentro de una cadena:
Sintaxis; InStr(Cadena,SubCadena)
Ejercicio Práctico Nº1
1.- Diseñar el siguiente formulario

Pá gina 26
Programación Windows

2.- Luego codificaremos lo siguiente.


btnMuestra (Evento Click)
Me.lblLongitud.Text = Len(Trim(Me.txtFrase.Text))
Me.lblPrimero.Text = Microsoft.VisulBasic.Left(Trim(Me.txtFrase.Text), 1)
Me.lblUltimo.Text = Microsoft.VisulBasic.Right(Trim(Me.txtFrase.Text), 1)
Me.lblSegSex.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.lblLongitud.Text = ""
Me.lblMayusculas.Text = ""
Me.lblMinusculas.Text = ""
Me.lblPosA.Text = ""
Me.lblPrimero.Text = ""
Me.lblSegSex.Text = ""
Me.lblSoloPrim.Text = ""
Me.lblUltimo.Text = ""
Me.txtFrase.Focus()
btnSalir (Evento Click)
Me.Close()

Pá gina 27
Programación Windows

Funciones Cronológicas

TxtFechaSis

TxtHoraSis

Ejercicio Práctico Nº2


TxtNF
1.- Diseñar el siguiente formulario

DtpFecha
BtnDife
BtnNumMes

TxtDI
TxtFechaIng

TxtFechaConver

Pá gina 28
Programación Windows

2.- Luego codificaremos lo siguiente

Private Sub btnverfecha_Click


'Fecha del Sistema
Me.txtfechasis.Text = FormatDateTime(Today, DateFormat.LongDate)
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.LongDate)
End Sub

Private Sub btndife_Click


'Diferencia entre Fechas
MsgBox("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
MsgBox("El Numero de Mes de la Fecha Elegida es " & DatePart(DateInterval.Month,
Me.dtpFecha.Value))
End Sub

Private Sub btnconvertir_Click


'Convertir un Caracter en Fecha
Me.txtfechaconver.Text = DateValue(Me.txtfechaing.Text)
End Sub

Procedimientos Sub
Un procedimiento Sub ejecuta acciones, pero no devuelve ningún valor. Puede tomar argumentos,
como constantes, variables o expresiones, que le pasa el código de llamda.
La sintaxis para declarar un procedimiento Sub es la siguiente:
Declarción:

[ Public | Private | Friend ] Sub <Nombre Subrutina> ([Lista de Parámetros])


<Sentencias>
[Exit Sub]
End Sub

Pá gina 29
Programación Windows

Procedmientos Function
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 siguiente:
[ Public | Private | Friend ] Function <Nombre Función> ([Lista de Parámetros])
As <Tipo de Dato>
<Sentencias>
[Exit Function]
End Function
Ejercicio Practico Nº1
1.- Agregar 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 Integer) As String


If numero Mod 2 = 0 Then
parimpar = "Es par"
Else
parimpar = "Impar"
End If
End Function

Public Function hipotenusa(ByVal ladoA As Single, ByVal ladoB As Single) As Single


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.- Luego Agregaremos un Modulo y codificaremos lo siguiente.

Public obj As New clsoperaciones

Pá gina 30
Programación Windows

3. - Diseñaremos los siguientes formularios.

Private Sub BtnCalcular_Click


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

Private Sub BtnConsultar_Click


Me.Label1.Text = obj.parimpar(Me.TextBox1.Text)
End Sub

Private Sub BtnCalcular_Click


Dim num1, num2, hipo As Single
num1 = InputBox("Ingrese lado A del Triangulo: ")
num2 = InputBox("Ingrese lado B del Triangulo: ")
hipo = obj.hipotenusa(num1, num2)
MessageBox.Show("La Hipotenusa del Triangulo rectángulo es " & hipo)
End Sub

Private Sub BtnLimpiar_Click


obj.limpiar(Me)
End Sub

Sub habilitar(ByVal sw As Boolean)


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

Private Sub Button7_Click


habilitar(False) Button6
Button7
End Sub

Pá gina 31
Programación Windows

Manejo de Colecciones – Arreglos,


ArrayList, HashTable y SortedList

 Recorrido de un ArrayList con el IEnumerator


 Recorrido de un HashTable con el IDictionaryEnumerator

Arreglos
Arrays
Una de las formas en las que podemos agrupar varios datos es mediante los arrays (o matrices).
Usando un array, podemos acceder a cualquiera de los valores que tenemos almacenado mediante un
índice numérico. Por ejemplo, si tenemos la variable discografía y queremos acceder al tercer disco,
podríamos hacerlo de la siguiente forma: discografía(3).
Sabiendo esto, podemos comprobar que sería fácil recorrer el contenido de los arrays mediante un
bucle For.

¿Qué 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 guardar. Por ejemplo, si queremos guardar los nombres de los discos que tenemos,
podemos usar un array del tipo String

Declarar Variables Como Arrays


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 Integer:
1- La clásica (la usada en versiones anteriores)
Dim a() As Integer
2- La nueva forma introducida en .NET:
Dim a As Integer()

Pá gina 32
Programación Windows

Reservar Memoria Para Un Array


Para poder hacerlo tenemos que usar la instrucción ReDim:
ReDim a(5)
Al ejecutarse este código, tendremos un array con capacidad para 6 elementos.
Y son seis y no cinco, (como por lógica habría que esperar), porque en .NET Framework el índice
menor de un array siempre es cero y en Visual Basic, el índice superior es el indicado entre
paréntesis. Por tanto el array a tendrá reservada memoria para 6 valores de tipo Integer, los índices
serían desde 0 hasta 5 ambos inclusive.
Además de usar ReDim, que realmente sirve para "redimensionar" el contenido de un array, es decir,
para volver a dimensionarlo o cambiarlo por un nuevo valor. Si sabemos con antelación el tamaño
que contendrá el array, podemos hacerlo de esta forma:
Dim a(5) As Integer
Con este código estaríamos declarando la variable a como un array de 6 elementos (de 0 a 5) del tipo
Integer.
Cuando indicamos la cantidad de elementos que contendrá el array no podemos usar la segunda
forma de declaración que te mostré anteriormente: Dim a As Integer(5) ya que esto produciría un
error sintáctico.
Asignar Valores A Un Array
Para asignar 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 guardará el valor.
Por ejemplo, para almacenar el valor 15 en la posición 3 del array a, haríamos lo siguiente:
a(3) = 15
Acceder A Un Elemento De Un Array
De igual forma, si queremos utilizar ese elemento que está en la posición 3 para una operación,
podemos hacerlo como con el resto de las variables, pero siempre usando el paréntesis y el número
de elemento al que queremos acceder:
i = b * a(3)
Los Límites De Los Índices De Un Array
Como ya he comentado antes, el índice inferior de un array, siempre es cero, esto es invariable, todos
los arrays de .NET Framework empiezan a contar por cero.
Pero el índice superior puede ser el que nosotros queramos, aunque sin pasarnos, que la memoria
disponible se puede agotar si pretendemos usar un valor exageradamente alto. Realmente el índice
superior de un array es 2^64 -1 (el valor máximo de un tipo Long)

Pá gina 33
Programación Windows

Inicializar Un Array Al Declararla


Al igual que las variables normales se pueden declarar y al mismo tiempo asignarle un valor inicial,
con los arrays también podemos hacerlo, pero de una forma diferente, ya que no es lo mismo asignar
un valor que varios.
Aunque hay que tener presente que si inicializamos un array al declararla, no podemos indicar el
número de elementos que tendrá, ya que el número de elementos estará supeditado a los valores
asignados.
Para inicializar un array debemos declarar ese array sin indicar el número de elementos que
contendrá, seguida de un signo igual y a continuación los valores encerrados en llaves. Veamos un
ejemplo:

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

También podemos hacerlo de esta otra forma:

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

Usando cualquiera de estas dos formas mostradas, el número de elementos será 5, por tanto los
índices irán desde 0 hasta 4.

Los Arrays Pueden Ser De Cualquier Tipo


En todos estos ejemplos estamos usando valores de tipo Integer, pero podríamos hacer lo mismo si
fuesen de tipo String o cualquier otro.
En el caso de que sean datos de tipo String, los valores a asignar deberán estar entre comillas dobles
o ser variables de tipo String. Por ejemplo:
Dim s As String() = {"Hola", "Mundo, ", "te", "saludo"}

Cambiar El Tamaño De Un Array Y Mantener Los Elementos Que Tuviera.


Para poder conseguirlo, debemos usar ReDim seguida de la palabra clave Preserve, por tanto si
tenemos la siguiente declaración:
Dim a() As Integer = {1, 2, 3, 4, 5}
Y queremos que en lugar de 5 elementos (de 0 a 4) tenga, por ejemplo 10 y no perder los otros
valores, usaremos la siguiente instrucción:
ReDim Preserve a(10)

Pá gina 34
Programación Windows

A partir de ese momento, el array tendrá 11 elementos (de 0 a 10), los 5 primeros con los valores que
antes tenía y los nuevos elementos tendrán un valor cero, que es el valor por defecto de los valores
numéricos.
Si sólo usamos ReDim a(10), también tendremos once elementos en el array, pero todos tendrán un
valor cero, es decir, si no se usa Preserve, se pierden los valores contenidos en el array.
Eliminar Un Array De La Memoria.
Si en algún momento del programa queremos eliminar el contenido de un array, por ejemplo para que
no siga ocupando memoria, ya que es posible que no siga ocupando memoria, podemos usar Erase
seguida del array que queremos "limpiar", por ejemplo:
Erase a
Esto eliminará el contenido del array a.
Si después de eliminar el contenido de un array queremos volver a usarlo, tendremos que
ReDimensionarlo con el mismo número de dimensiones que tenía, ya que Erase sólo borra el
contenido, no la definición del array.

Ejercicio Practico Nº1

1.- Diseñar el siguiente formulario

TxtNombres

BtnAgregar

BtnMostrar

BtnLimpiar
LstNombres

Pá gina 35
Programación Windows

Public Class Form1


Dim nombres(0) As String

Private Sub btnagregar_Click


If Me.txtnombre.Text.Trim <> "" Then
nombres(UBound(nombres)) = Me.txtnombre.Text
ReDim Preserve nombres(UBound(nombres) + 1)
MsgBox("Guardado ...!", MsgBoxStyle.Information, "Arreglos")
Me.txtnombre.Clear()
Me.txtnombre.Focus()
Else
MsgBox("Por Favor Ingrese un Nombre", MsgBoxStyle.Information, "Arreglos")
Me.txtnombre.Clear()
Me.txtnombre.Focus()
End If
End Sub

Private Sub btnmostrar_Click


Dim x As Integer
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 guarde varias piezas de información relacionadas. Después de declarar una estructura,
podemos declarar variables de ese tipo.
Definición.-Una estructura es una combinación de tipos de datos que se crea combinando otros tipos
de datos. Las estructuras son de tipo valor (es decir, una variable de tipo estructura contiene los datos
de la estructura, en lugar de una referencia a los datos como hace el tipo referencia). Las estructuras
pueden tener datos, propiedades, métodos y procedimientos y pueden invocar y manipular eventos.

Ejemplo
Pá gina 36
Programación Windows

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

Cómo Utilizar Las Estructuras

Pá gina 37
Programación Windows

Ejercicio Practico Nº2

1.- Agregar un Modulo a la aplicación y escribir el siguiente código.

Module Module1
'Declaramos la estructura
Public Structure DatosAlumnos
Public codigo As Integer
Public nombre As String
Public curso As String
Public promedio As Integer
End Structure
'Declaramos un arrays que me almacenen los valores
Public alumnos(0) As DatosAlumnos
End Module

2.- Luego diseñar el siguiente formulario txtnombre

txtcurso
3.- En el evento click del botón btnagregar
codificaremos lo siguiente
txtpromedio
btnagregar

Private Sub btnagregar_Click btnconsultar


'Declarar una variable para manipular la estructura
Dim mialumno As DatosAlumnos
'Asignar valores a la estructura
With mialumno
.codigo = UBound(alumnos) + 1
.nombre = txtnombre.Text
.curso = txtcurso.Text
.promedio = txtpromedio.Text
End With
'Agregar 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 Agregados
MsgBox("Datos Agregados...", MsgBoxStyle.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á gina 38
Programación Windows

4.- Luego diseñaremos el siguiente formualrio.


txtconsulta
5.- Luego en el evento load
del formulario frmconsulta. txtcodigo

Private Sub Frmconsulta_Load txtnombre


Frminscribir.Hide()
End Sub txtcurso

Private Sub btnconsultar_Click txtpromedio


btninscribir
Dim mialumno As DatosAlumnos
Dim x As String = txtconsulta.Text btnconsultar
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
Manejo de ArrayList
Esta es una colección donde podemos guardar cualquier tipo de objeto.  Su método ArrayList.Add()
acepta el tipo object, por lo cual podemos coleccionar enteros, cadenas, listboxes, botones, y casi
cualquier cosa que se nos ocurra…  El acceso a sus elementos se logra por medio de la posición o
índice.  Podemos utilizar su propiedad ArrayList.Count para preguntarle a la colección cuantos
elementos tiene
Esta clase permite la creación y manipulación de arrays cuyo tamaño puede ser modificado
dinámicamente.

Pá gina 39
Programación Windows

Este comportamiento del


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

Borrado de Elementos en una Colección Arraylist


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

IEnumerator
Pá gina 40
Programación Windows

Un objeto enumerador pertenece al interfaz IEnumerator, diseñado para realizar un recorrido o


iteración a través de uno de los diferentes tipos de colección (arrays incluidos) existentes en .NET
Framework. Mediante el método GetEnumerator( ) de un objeto array, obtenemos un objeto que
implementa el interfaz Ienumerator, que sólo puede realizar labores de lectura sobre el array, en
ningún caso de modificación.
La estructura de control utilizada para recorrer el array, puede ser indistintamente un bucle
For...Next, For Each...Next, o la novedosa técnica de los objetos enumeradores proporcionados por el
objeto array.
Ejercicio Práctico Nº3
1.- Diseñar el siguiente formulario.
2.- Codificaremos lo siguiente: CboCiudad

Public Class Form1


'Declaramos nuestro ArrayList
Dim lista As New ArrayList()
TxtTotal
Private Sub Form1_Load
'Agregamos elementos a nuestro ArrayList TxtCiudad
lista.Add("Lima")
lista.Add("Lambayeque")
lista.Add("Trujillo")
lista.Add("Tacna")
lista.Add("Arequipa")
lista.Add("Puno")
End Sub

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
'Agrega el elemento actual del Array
Me.cbociudad.Items.Add(recorrer.Current)
End While
Else
MsgBox("Primero debe de Cargar las Ciudades", MsgBoxStyle.Information, "ArrayList")
End If
End Sub

Private Sub btnVer_Click


'Muestra el Total de Elementos del ArrayList

Pá gina 41
Programación Windows

Me.txtTotal.Text = lista.Count
End Sub

Private Sub btncargar_Click


Me.cbociudad.Items.Clear()
'Cargamos el combo con un For
For x As Integer = 0 To lista.Count - 1
Me.cbociudad.Items.Add(lista(x))
Next
End Sub

Private Sub btnenumerador_Click


Me.cbociudad.Items.Clear()
'Cargamos el Combo con un IEnumerator
Dim recorrer As IEnumerator
'Asigna 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
MsgBox(lista.Capacity)
End Sub

Private Sub btnagregar_Click


'Agregar un elemento al ArrayList
lista.Add(Me.txtciudad.Text)
End Sub
End Class

La Clase HashTable
Pá gina 42
Programación Windows

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

Manejo del IDictonaryEnumerator


Si queremos recorrer el array al completo contenido en el objeto, podemos utilizar el método
GetEnumerator( ), que nos devuelve un enumerador para poder obtener todos los valores del objeto
en un bucle. La diferencia con los otros algoritmos 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 adaptado para manipular
arrays de este tipo.
Como habrá comprobado el lector, un enumerador IDictionaryEnumerator proporciona la
información de la colección mediante las propiedades Key y Value, a diferencia de un enumerador
simple, basado en IEnumerator, en el que usamos la propiedad Current, para extraer los datos.
La clase Hashtable no sitúa los valores que se añaden al array en posiciones consecutivas, por lo que
al obtener los valores mediante un enumerador posiblemente no aparecerán en el mismo orden en el
que los añadimos inicialmente. Dada la filosofía de funcionamiento de este tipo de objetos, el orden
en el que se graban los valores dentro del array no debería ser un problema, ya que nosotros
accedemos al array utilizando claves y no índices, como sucede en un array estándar.

Ejercicio Práctico Nº4


1.- Diseñar el Siguiente Formulario:
TxtCod
Pá gina 43

TxtNom
LstCod

LstNom
Programación Windows

2.- Codificaremos lo siguiente:

Public Class Form2


'Declaramos un objeto HashTable
Dim clientes As New Hashtable

Private Sub btnguardar_Click


'Agregamos elementos a nuestro HashTable
'Le asignamos un codigo y un valor para cada elemento ingresado
clientes.Add(Me.txtcod.Text, Me.txtnom.Text)
MsgBox("Datos Guardados!...", MsgBoxStyle.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 agregamos 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 según van siendo agregados. El funcionamiento general, es básicamente igual que para
los objetos Hashtable.

Ejercicio Práctico Nº5


1.- Diseñar el siguiente formulario
ListView1
Pá gina 44
Programación Windows

2.- Codificaremos lo siguiente:

Public Class Form3


'Declaramos nuestro SortedList
Dim letras As New SortedList

Private Sub Form3_Load


'Agregamos valores
letras.Add("H", 111)
letras.Add("A", 222)
letras.Add("J", 333)
letras.Add("Z", 444)
letras.Add("M", 555)
End Sub

Private Sub BtnMostrar_Click


'Recorremos los elementos del SortedList y lo agregaremos al ListView
Dim reco As IDictionaryEnumerator
reco = letras.GetEnumerator
While reco.MoveNext
Dim lst As New ListViewItem(reco.Key.ToString)
lst.SubItems.Add(reco.Value.ToString)
Me.ListView1.Items.Add(lst)
End While

Manejo de Hilos (Threads) y


Componente BackGroundWorker

 Definición de un Threading
 Componente BackgroundWorker
 Práctica de Laboratorio de Hilos

Manejo de THREADS (Hilos)

Pá gina 45
Programación Windows

Todas las aplicaciones se ejecutan en un Thread (o hilo de ejecución). Pero cada aplicación puede
tener más de un Thread al mismo tiempo, es decir se pueden estar haciendo varias cosas a un mismo
tiempo. En Visual Basic.Net, a diferencia de las versiones anteriores, se pueden crear Threads para
que podamos realizar diferentes tareas a un mismo tiempo, el uso o no de Threads lo decidirás tú, ya
no es algo que no podamos hacer aunque quisiéramos.
Cuando se define un nuevo Thread, lo que hay que hacer es indicarle al compilador cual será el
procedimiento que queremos usar de forma paralela al resto de la aplicación. Este procedimiento
debe ser obligatoriamente del tipo SUB.
La ventaja principal de los Threads es tener varias actividades ocurriendo en forma simultánea, lo
cual es una gran 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 registro.
Se recomienda el uso de Threads en las siguientes 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 segundo plano, etc.

Implementación de Threads
Para implementar Threads se usa el namespace: “System.Threading.Thread” y luego se hace uso
de los métodos que se definen a continuación:
 Start : Inicia un Thread, el cual es un proceso de llamada asíncrona. Para saber el estado del
Thread hay que usar las propiedades ThreadState y IsAlive.
 Abort: Cancela un Thread iniciado, si deseamos saber el estado nuevamente podemos usar
las propiedades ThreadState y IsAlive.
 Sleep: Ocasiona una pausa en milisegundos del bloque de instrucciones.
 Suspend: También ocasiona una pausa en el bloque de instrucción.
 Resume: Reinicia una pausa originada con el método Suspend.
 Interrupt: Interrumpe una pausa originando una exepción.
 Join: Espera por un Thread.

Ejercicio Práctico Nº1

Pá gina 46
Programación Windows

1.- Diseñar el siguiente formulario.


2.- Codificaremos lo siguiente.
'Importamos el namespace para Trheading
Imports System.Threading

Public Class Form1


'Creamos 2 procedimientos
Public Sub Calculo_1()
Dim res As Long
For I As Integer = 0 To 100000
res = res + I
Next
MessageBox.Show("Calculo_1 " & res)
End Sub

Public Sub Calculo_2()


Dim res As Long
For I As Integer = 0 To 500
res = res + I
Next
MessageBox.Show("Calculo_2 " & res)
End Sub

Private Sub BtnComenzar_Click


'Creamos 2 variables de tipo Threading
Dim hilo1 As New Thread(AddressOf Calculo_1)
Dim hilo2 As New Thread(AddressOf Calculo_2)
'Ejecutamos los 2 procesos
hilo1.Start()
hilo2.Start()
End Sub
End Class

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

Evento Ocurre Cuando...


DoWork ...se solicita la ejecución de una tarea. Dentro del event handler asociado a

Pá gina 47
Programación Windows

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

A traves del método RunWorkerAsync() le indicamos al BackgroundWorker que se debe iniciar la


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

Ejercicio Práctico Nº2


1.- Diseñar el siguiente formulario

2.- Codificaremos lo siguiente.


Imports System.ComponentModel
Public Class Form2
Public Sub Calculo_1(ByVal hilotr1 As BackgroundWorker, ByVal e As DoWorkEventArgs)
Dim res As Long
Pá gina 48
Programación Windows

For I As Integer = 0 To 100000


res = res + I
Next
MessageBox.Show("Calculo_1 " & res)
End Sub
Public Sub Calculo_2(ByVal hilotr2 As BackgroundWorker, ByVal e As DoWorkEventArgs)
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
Me.BackgroundWorker1.RunWorkerAsync()
Me.BackgroundWorker2.RunWorkerAsync()
Dim x As Integer = 0
End Sub
Private Sub BackgroundWorker1_DoWork
Dim hilotr1 As BackgroundWorker = sender
Calculo_1(hilotr1, e)
End Sub
Private Sub BackgroundWorker2_DoWork
Dim hilotr2 As BackgroundWorker = sender
Calculo_2(hilotr2, e)
End Sub
End Class

Practica de Laboratorio TxtNombre


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

3.- Codificaremos lo siguiente:

Public Class frmarchivo


'Creamos un Thread llamado Hilo
Dim hilo As System.Threading.Thread
Pá gina 49
Programación Windows

'Crearemos el procedimiento LeerArchivo


'El cual abrira un documento de Texto
Sub leerarchivo()
Dim flujo As System.IO.StreamReader
Dim linea As String = ""
Try
flujo = System.IO.File.OpenText(Me.txtnombre.Text)
Do Until IsNothing(linea)
linea = flujo.ReadLine
Me.txtarchivo.Text = Me.txtarchivo.Text & linea & Chr(13) & Chr(10)
Loop
Catch X As IO.IOException
MsgBox(X.Message, MsgBoxStyle.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.Threading.Thread(AddressOf leerarchivo)
'Ejecuta el Thread
hilo.Start()
Me.btnsuspender.Enabled = True
Me.btncancelar.Enabled = True
End Sub

Private Sub txtnombre_TextChanged


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

Private Sub btnnuevo_Click


Me.txtnombre.Clear()
Me.txtarchivo.Clear()
Me.txtnombre.Focus()
End Sub

Pá gina 50
Programación Windows

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
MsgBox("En Ejecución", MsgBoxStyle.Information, "Vida del Threads")
Else
MsgBox("Termino su Ejecución", MsgBoxStyle.Information, "Vida del Threads")
End If
End Sub

Private Sub btnsalir_Click


Me.Close()
End Sub

End Class

Serialización y Deserializacion de
Objetos – Administración de Archivos

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

Introducción
El propósito de este Tema es mostrar un mecanismo sencillo que permita guardar los valores
contenidos en los controles de una forma de Windows; en una archivo xml.

Pá gina 51
Programación Windows

Para lograr este propósito utilizaremos la clase XmlSerializer que permite crear una representación
XML de un objeto para efectos de almacenamiento y transporte.
Esta clase permite serialización XML y Desearialización XML. La serialización permite crear a partir
de las variables y propiedades públicas de una clase un objeto XML serializado. El método Serialize
de la clase XmlSerializer permite crear un archivo XML de tipo (System.IO.StreamWriter) a partir de
una clase por medio de una objeto serializado. El método Deserialize de la clase XmlSerializer
permite crear objeto con la información deseralizada proveniente de un archivo XML.

Descripción de la Serialización XML


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

Ejercicio Práctico Nº1


1.- Crearemos un proyecto
llamado Serialización de Objetos.
2.- Luego a nuestro proyecto
agregaremos una clase llamada
CLSPRODUCTOS.

3.- Dentro de nuestra clase clsproductos codificaremos lo siguiente.


Public Class clsproductos

'Declaracion de Variables
Private vname As String
Private vdescription As String
Private vqty As Integer

'Declaracion de las Propiedades


Public Property nombre() As String
Get
nombre = vname
End Get

Pá gina 52
Programación Windows

Set(ByVal value As String)


vname = value
End Set
End Property

Public Property descripcion() As String


Get
descripcion = vdescription
End Get
Set(ByVal value As String)
vdescription = value
End Set
End Property

Public Property cantidad() As Integer


Get
cantidad = vqty
End Get
Set(ByVal value As Integer)
vqty = value
End Set
End Property
TxtnomPro
End Class
4.- Luego diseñaremos el siguiente formulario. TxtDescripcion

TxtCantidad
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


'Asignacion de Valores Para la Clase Productos
p.nombre = Me.txtnompro.Text
p.descripcion = Me.txtdescripcion.Text
p.cantidad = CInt(Me.txtcantidad.Text)

'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

Pá gina 53
Programación Windows

'Y la clase a Serializar


x.Serialize(archivo, p)
archivo.Close()

MsgBox("Objeto XML creado", MsgBoxStyle.Information, "Serializacion")

End Sub

Private Sub BtnDeSerializar_Click


Try
Dim x As New XmlSerializer(p.GetType)
'Archivo XML que se Desearilizar
Dim archivodes As New StreamReader("C:\Producto.xml")
'Variable que contendra la clase deserializada
Dim p2 As New clsproductos
'Direccion del archivo a Deserealizar
p2 = x.Deserialize(archivodes)
archivodes.Close()
MsgBox("Nombre:" & p2.nombre & vbCrLf & "Descripcion:" & p2.descripcion & vbCrLf &
"Cantidad:" & CStr(p2.cantidad))
Catch ex As Exception
MsgBox("El Archivo no Existe", MsgBoxStyle.Information, "Deserializacion")
End Try
End Sub
End Class
5.- Al ejecutar nuestra aplicación introduciremos un nombre, descripción, y cantidad de un producto.

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

Pá gina 54
Programación Windows

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

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

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

Pá gina 55
Programación Windows

Algunas Clases de System.IO

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

Proporciona métodos estáticos para crear, copiar, eliminar, mover y abrir


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

Proporciona métodos de instancia para crear, copiar, eliminar, mover y


FileInfo
abrir archivos y contribuye a la creación de objetos FileStream.

Expone un objeto Stream alrededor de un archivo; se admiten operaciones


FileStream de lectura y escritura sincrónica y asincrónica. Un objeto Stream
proporciona una vista genérica de una secuencia de bytes.

Ejecuta operaciones en instancias de String que contienen información de


Path rutas de archivos o directorios. Estas operaciones se ejecutan de forma
adecuada para múltiples plataformas.

Ejercicio Práctico Nº2


1.- Diseñar el siguiente TxtCarpeta

formulario.

TxtArchivo
Pá gina 56
Programación Windows

2.- Luego codificaremos lo siguiente:

'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
'Codigo para crear la carpeta
carpeta = Directory.CreateDirectory("C:\" & Me.txtcarpeta.Text)
MsgBox("Carpeta Creada", MsgBoxStyle.Information, "Manejo de Archivos")
Catch ex As Exception
MsgBox("La Carpeta ya Existe", MsgBoxStyle.Critical, "Manejo de Archivos")
End Try
End Sub
Private Sub Btncreararchivo_Click
Try
'Codigo para crear el archivo
archivo = File.Create("C:\" & Me.txtarchivo.Text)
MsgBox("Archivo Creada", MsgBoxStyle.Information, "Manejo de Archivos")
Catch ex As Exception

End Try
End Sub

Private Sub BtnExisArchivo_Click


'Codigo de existencia de un archivo
If File.Exists("C:\" & Me.txtarchivo.Text) Then
MsgBox("El Archivo ya existe", MsgBoxStyle.Information)
Else
MsgBox("El Archivo no existe", MsgBoxStyle.Information)
End If
End Sub

Private Sub BtnExisCarpeta_Click


'Codigo de existencia de una carpeta
If Directory.Exists("C:\" & Me.txtcarpeta.Text) Then
MsgBox("La Carpeta ya existe", MsgBoxStyle.Information)
Else
MsgBox("La Carpeta no existe", MsgBoxStyle.Information)
End If
End Sub
End Class

Ejercicio Práctico Nº3


1.- Diseñar el siguiente formulario.
2.- Luego codificaremos lo siguiente:
TxtArchi
'Importamos el namesapce que nos permitira
'manejar archivos, carpetas y unidades
Imports System.IO
Public Class Form3
TxtTexto

Pá gina 57
Programación Windows
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
Ejercicio Práctico Nº4
1.- Diseñar el siguiente formulario.
'Importamos el namesapce que nos permitira
'manejar archivos, carpetas y unidades
Imports System.IO
Public Class Form4
Private Sub btnAbrir_Click
'Variable que capturara la direccion del archivo a abrir
Dim ruta As String
'variable que contendra el texto del archivo a cargar
Dim texto As String = ""
'Extension que solo podra abrir el openfiledialog
Me.OpenFileDialog1.Filter = "Archivos de Texto (*.txt)|*.txt"

If Me.OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then


'Direccion del archivo capturado por el openfiledialog
'el cual lo contendra la variable
ruta = Me.OpenFileDialog1.FileName
'Declaro mi variable que leera el archivo
Dim lectura As StreamReader
'Indicamos que archivo va a leer
lectura = File.OpenText(ruta)

'Que se ejecute siempre y cuando la variable texto


'contenga algo
Do Until IsNothing(texto)
'Cada linea de mi archivo lo pasará a
'la variable texto
texto = lectura.ReadLine
'Muestra cada línea de texto de mi archivo
'en la caja de texto
Me.txtTexto.Text = Me.txtTexto.Text & texto & Chr(13) & Chr(10)
Loop
End If
End Sub
End Class

Manejo de Archivos y Envió de


Mensaje por Correo Electrónico
 Creación de un Explorador con System.IO
 Clases a utilizar para enviar un mensaje vía Mail
 Cuadros de Diálogos (OpenFileDialog, ColorDialog, FontDialog)
Pá gina 58
Programación Windows

Ejercicio Práctico Nº1 BtnMostrar


(Explorador)
1.- Diseñar el siguiente
formulario.

2.- Luego codificaremos lo


siguiente.

'Importación de la Clase
Imports System.IO
Public Class Form1

Private Sub BtnMostrar_Click


'Array de tipo Drive va a cargar 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 agrega al ListBox
For Each unidad In unidades
Me.lstunidades.Items.Add(unidad.Name)
Next
End Sub

Private Sub lstunidades_MouseClick


Me.lstcarpetas.Items.Clear()

'Variable que captura el nombre de la unidad


'Seleccionada en el ListBox
Dim unidad As String = Me.lstunidades.SelectedItem.ToString

'Variable a la cual se le dira de que unidad


'se va a buscar las carpetas existentes
Dim directorioraiz As New DirectoryInfo(unidad)

Pá gina 59
Programación Windows

'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 agregando al ListBox
Me.lstcarpetas.Items.Add(directorio)
Next
Catch ex As Exception
MsgBox("No Hay Carpetas", MsgBoxStyle.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 String
unidad = Me.lstunidades.SelectedItem.ToString
carpeta = Me.lstcarpetas.SelectedItem.ToString

'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 agreag al ListBox
Me.lstarchivos.Items.Add(archivo.Name)
Next

End Sub

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

Pá gina 60
Programación Windows

'se va a buscar el archivo existente.


Dim informacion As New FileInfo(Path.Combine(Path.Combine(unidad, carpeta), archivo))

'Se agregara al ListBox la informacion del archivo correspondiente


Me.lstinformacion.Items.Add("Nombre:" & informacion.Name)
Me.lstinformacion.Items.Add("Tamaño(Bytes): " & informacion.Length)
Me.lstinformacion.Items.Add("Fecha de Creación: " &
informacion.CreationTime.ToShortDateString)
End Sub

End Class

3.- Ejecutaremos y deberá aparecer como se muestra en la figura.

Ejercicio Práctico Nº2 (Envió de Mensaje por Correo)


1.- Diseñar el siguiente formulario.

TxtDe LstAdjuntar

TxtPara

TxtAsunto BtnQuitar
Pá gina 61
RbColor

Programación Windows BtnEnviar


TxtMensaje

2.- Luego codificaremos lo siguiente.

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 cargara al cargar el formulario
Me.txtDe.Text = "ejemplocorreosise@gmail.com"
Me.txtDe.ReadOnly = True
End Sub

Private Sub BtnEnviar_Click


'creamos un nuevo mensaje de correo
Dim correo As New MailMessage

'De
correo.From = New MailAddress(Me.txtDe.Text)

'Para
correo.To.Add(Me.txtPara.Text)

'Asunto
correo.Subject = txtAsunto.Text

'Archivo Adjunto
Dim counter As Integer

'Para poder cargar varios


For counter = 0 To lstadjuntar.Items.Count - 1
'Cada archivo ya esta cargado o adjuntado al mensaje
datosadjuntos = New Net.Mail.Attachment(lstadjuntar.Items(counter))

Pá gina 62
Programación Windows

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 seguido le indicamos cual servidor utilizaremos


'aquì usaremos por default a gmail y su puerto SMTP
Dim smtp As New SmtpClient()
smtp.Host = "smtp.gmail.com"
smtp.Port = 587
smtp.Credentials = New System.Net.NetworkCredential("ejemplocorreosise@gmail.com",
"ejemplocorreo")
smtp.EnableSsl = True

Try
'listo tenemos la estructura de nuestro mensaje armada ahora enviemosla a nuestro
destinatario y listo
smtp.Send(correo)
MsgBox("Mensaje enviado satisfactoriamente")
Catch ex As Exception
MsgBox("No se pudo Enviar su Mensaje " & ex.Message)
End Try
End Sub

Private Sub BtnAdjuntar_Click


Dim Counter As Integer

'Muestra un mensaje si el archivo no existe


OfdAbrir.CheckFileExists = True
OfdAbrir.Title = "Seleccione Archivo(s) que quesee adjuntar"

'Se abre el OpenFileDialog


OfdAbrir.ShowDialog()

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 agrega
lstadjuntar.Items.Add(OfdAbrir.FileNames(Counter))

Else
'De lo contrario muestra un mensaje
'si el archivo ya esta adjuntado
MsgBox("El Archivo ya se cargo", MsgBoxStyle.Information, "Envio de Correo")

Pá gina 63
Programación Windows

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_CheckedChanged


'Abre el Cuadro de Color
If RbColor.Checked = True Then
If Me.ColorDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
Me.txtMensaje.ForeColor = Me.ColorDialog1.Color
End If
End If
End Sub

Private Sub RbFuente_CheckedChanged


'Abre el cuadro de Fuente
If RbFuente.Checked = True Then
If FontDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
Me.txtMensaje.Font = FontDialog1.Font
End If
End If
End Sub
End Class

Componentes COM, Controles Active X


y Interacción con Office

 Interacción con Word

Pá gina 64
Programación Windows

 Manejo de Agentes
 Manejo de Controles Active X

Interacción con Office


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

Utilización de Word en una Aplicación


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

Crear una Instancia de Word


Una aplicación de Visual Basic que quiere acceder a un documento Word, lo primero que debe hacer
es crear una instancia de la aplicación Microsoft Office Word. Esta operación requiere crear un

Pá gina 65
Programación Windows

nuevo proyecto y agregar al mismo una referencia de la Biblioteca Microsoft Word 12.0 Object
Library, que se encuentra en la pestaña COM.

Una vez realizada este paso ya se puede crear una instancia de la aplicación Word.

Imports Microsoft.Office.Interop
………
Dim ApWord as New Word.Application

Crear Nuevos Documentos


Para crear un documento nuevo basado en la plantilla Normal.dot hay que invocar al método Add de
la colección Documents.

Dim doc as Word.Document=ApWord.Documents.Add()

Cuando se crea un document Nuevo, se agrega 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.

Pá gina 66
Programación Windows

Visualizar un Documento
Se puede presentar el documento Word asignando a la propiedad Visible del objeto aplicación el
valor=True.

ApWord.Visible=True

Abrir Documentos Existentes


Para abrir un documento existente hay que invocar al método Open de la colección Documents
pasando el nombre del fichero como argumento:

Dim doc as Word.Document=ApWord.Documents.Open(“C:\XXX\midocumento.doc”)

Este método devuelve una referencia al documento abierto.

Hacer Referencia al Documento Activo


Para hacer referencia al documento activo se puede utilizar la propiedad ActiveDocument del objeto
aplicación.

Dim doc as Word.Document=ApWord.ActiveDocument

Insertar texto en un Documento Word


Existen distintas formas de insertar texto en un documento Word. Quizás, la mas sencilla sea
utilizando el método InsertAfter o InsertBefore para insertar texto después o antes de una selección
(objeto Selection) o un rango (objeto Range). Por ejemplo, las siguientes líneas de código 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 rango del documento doc. En este ejemplo, el objeto
Range (devuelto por la función Range) se refiere a todo el texto del documento doc.

doc.Range.InsertAfter(“Texto a insertar”)

Definir y Seleccionar Rangos


Un rango representa un área de texto contigua en un documento. Esta definido por la posición del
carácter inicial y final del mismo.

Se puede utilizar la propiedad Range de muchos objetos (Paragraph, Bookmark, etc.) para devolver el
objeto Range definido por los mismos. Por ejemplo, el siguiente código inserta texto al final del
primer párrafo de doc, definido en este caso por el objeto rango:

Dim rango as Word.Range=doc.Paragraphs(1).Range

Pá gina 67
Programación Windows

Rango.InsertAfter(“Texto a Insertar”)

El siguiente ejemplo define un rango desde el inicio del Segundo párrafo hasta el final del tercer
párrafo; después, selecciona el texto definido por el mismo y lo corta:

Rango=doc.Range(doc.Paragraphs(2).Range.Start, doc.Paragraphs(3).Range.End)

Rango.Select()

doc.ActiveWindow.Selection.Cut()

Este otro ejemplo borra el texto del document doc. En este caso, el objeto Range se refiere a todo el
texto del documento doc.

Doc.Range.Delete()

Dar Formato al Texto en Documentos de Word


Para dar formato al texto de un documento, hay que definir un rango que incluya el texto al cual se
refiere aplicar el formato.

El siguiente ejemplo define un rango compuesto por los párrafos segundo y tercero del documento y
asigna a ese texto el estilo cursiva.

Rango=doc.Range(doc.Paragraphs(2).Range.Start, doc.Paragraphs(3).Range.End)

Rango.Font.Italic=1

Este otro ejemplo pone en negrita el texto que se añade a continuación del párrafo especificado.

Dim siguienteparrafo as Integer=doc.Paragraphs.Count

doc.Paragraphs(siguienteparrafo).Range.Font.Bold=1

Guardar y Cerrar Documentos


Para guardar un documento se puede utilizar alguno de los métodos siguientes: Save, SaveAs o
Close. Los métodos Save y Close sólo afectan al documento para el que son invocados. En cambio,
cuando se aplican a la colección Documents, se verán afectados todos los documentos que estén
abiertos.

El método Close cierra el documento para el que es invocado o los documentos que estén abiertos de
la colección Documents. Por ejemplo, la siguiente sentencia cierra el documento doc.

doc.Close
Pá gina 68
Programación Windows

El método Save guarda los cambios efectuados en el objeto Document especificado. Por Ejemplo.

doc.Save()

El método SaveAs permite guardar un documento con otro nombre. Es preciso especificar el nuevo
nombre, pero hay otros argumentos opcionales.

doc.SaveAs(“C:\docs\miDocu.doc”)

Ejercicio Práctico Nº1

1.- Diseñar el
siguiente
formulario. btnCrear

CboFuente
btnAbrir

CboTamañ o

ChkNegrita ChkCursiva
TxtDocumento

BtnGuardar

TxtContenido

2.- Los combos contendrán lo siguiente:

3.- Codificaremos lo siguiente:

Pá gina 69
Programación Windows

'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

'Pone en Cursiva el Texto a Guardar en el Documento


If Me.chkcursiva.Checked = True Then
rango.Font.Italic = 1
End If

'Indica el Tamaño de Letra


If Me.cbotamaño.SelectedIndex <> -1 Then
rango.Font.Size = Me.cbotamaño.Text
Else
rango.Font.Size = 12
End If

'Indica la Fuente o Tipo de Letra

Pá gina 70
Programación Windows

If Me.cbofuente.SelectedIndex <> -1 Then


rango.Font.Name = Me.cbofuente.Text
Else
rango.Font.Name = "Times New Roman"
End If

'Guarda el Documento
doc.SaveAs(Me.txtdocumento.Text & ".doc")

'Cierra el Documento
doc.Close()

MsgBox("Documento de Word Creado ...!", MsgBoxStyle.Information, "SISE")

End Sub

End Class

Consumo de Bibliotecas COM


En este laboratorio usaremos la librería COM [Microsoft Agent Object] para el uso de los “Agentes
de Microsoft”, los mismos que utiliza el Microsoft Office para mostrar ayuda al usuario. Los agentes
son pequeños objetos que pueden interactuar con el usuario a base de movimientos, gestos, leyendas
e incluso por voz.

Diseñe el siguiente formulario:

BtnMostrar
ListBox1

BtnOcultar
TxtMensaje

BtnMovimiento

BtnMensaje

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

Pá gina 71
Programación Windows

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

Luego escribiremos el siguiente código.

 A nivel Formulario:

Public Class Form1


'Declarar los Objetos
Dim Agente As New AgentObjects.Agent
Dim Muñeco As AgentObjects.IAgentCtlCharacterEx
 En el evento Load del Formulario

Private Sub Form1_Load


'Cargar un Character; es decir el muñeco que va a aparecer
Agente.Connected = True
Agente.Characters.Load("Merlin", "merlin.acs")
Muñeco = Agente.Characters("Merlin")

'Bucle para Cargar Todos los Movimientos


Dim Mov As Object
For Each Mov In Muñeco.AnimationNames
Me.ListBox1.Items.Add(Mov)
Next
End Sub

 En el evento clic de cada uno de los Botones:

Private Sub btnmostrar_Click


'Muestra el Agente
Muñeco.Show()
'Desplaza de Posicion al Agente
Muñeco.MoveTo(450, 350)
End Sub
Private Sub btnocultar_Click
'Oculta al Agente
Muñeco.Hide()
End Sub
Private Sub btnmovimiento_Click

Pá gina 72
Programación Windows

'Ejecuta el Movimiento
Muñeco.Play(Me.ListBox1.SelectedItem)
End Sub
Private Sub btnmensaje_Click
'Muestra el Mensaje
Muñeco.Speak(Me.txtmensaje.Text)
End Sub

Al final ejecutamos la aplicación y se debe de


mostrar de la siguiente manera:

Para que el agente Merlin pueda tener voz, es


necesario instalar 2 archivos los cuales son:

 Microsoft SAPI 4.0


 Para que Hablen en español

Un archivo es para el sistema operativo Windows y el otro es para el idioma.


Para que puedan trabajar con estos archivos es necesario que su instructor les provea de la carpeta
Ayudantes para Microsoft.

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

Pá gina 73
Programación Windows

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

3.- Seleccionaremos el componente Explorador del Web de Microsoft y luego en Aceptar.

Pá gina 74
Programación Windows

4.- Luego nos mostrara el componente en nuestra lista de Elementos.


5.- Después insertamos ese componente usándolo como control a nuestro formulario, también
insertaremos un control TextBox y Button.

TxtDir
BtnIr

AxWebBrowser

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

Private Sub btnIr_Click

Me.AxWebBrowser1.Navigate(Me.txtdir.Text.Trim)

End Sub

Reproductor de Música y Video


Pá gina 75
Programación Windows

Crearemos un reproductor de música y Video usando componentes COM, dicho programa 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
agregaremos de nuestra lista de Elegir Elementos.
2.- Luego 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 siguiente manera.

AxWindowsMediaPlayer1

BtnAudio BtnVideo

3.- Luego en el evento clic de cada botón codificaremos lo siguiente.

Private Sub btnaudio_Click

Me.AxWindowsMediaPlayer1.URL = "D:\Rocky.mp3"

End Sub

Private Sub btnvideo_Click

Me.AxWindowsMediaPlayer1.URL = "D:\madonna.mpg"

End Sub

Globalización y POO (Programación


Orientada a Objetos)
Pá gina 76
Programación Windows

 Clase System.Globalization
 Clase CultureInfo
 Definición de una Clase
 Atributos de una Clase
 Propiedades de un a Clase
 Métodos de una Clase
System.Globalization
La globalización es el proceso de diseño y desarrollo de una aplicación que permite el uso de
interfaces de usuario localizadas y datos regionales para usuarios de varias referencias culturales.
El espacio de nombres System.Globalization contiene clases que definen información relativa a la
referencia cultural, incluido el idioma, el país o región, los calendarios utilizados, los modelos de
formato para las fechas, la moneda y los números y el criterio de ordenación de las cadenas. Estas
clases son útiles para escribir aplicaciones globalizadas (internacionalizadas). Las clases como
StringInfo y TextInfo proporcionan funciones avanzadas de globalización, por ejemplo,
compatibilidad para suplentes y procesamiento de elementos de texto.
En .NET Framework, la clase CultureInfo representa información acerca de una referencia cultural
específica. Esa información incluye el sistema de escritura, los calendarios utilizados, las
convenciones de formato de fecha y hora, las convenciones de números y de moneda, y las reglas de
ordenación.
Antes de empezar la fase de diseño, debe determinar qué referencias culturales admitirá la aplicación.
De este modo, permitirá diseñar características que admitan todas las referencias culturales
identificadas. Además, le posibilitará centrarse en la escritura de código que funcione igual de bien
en todas las referencias culturales admitidas.
El espacio de nombres System.Globalization contiene clases que definen información relativa a la
referencia cultural, incluido el idioma, el país o región, los calendarios utilizados, los modelos de
formato de fecha, moneda y números, y el criterio de ordenación de las cadenas. Utilice esas clases
para simplificar el proceso de desarrollo de una aplicación de uso internacional. Al pasar un objeto
CultureInfo para la referencia cultural actual a los métodos de este espacio de nombres, puede
iniciar el conjunto de reglas y datos correctos para la referencia cultural del usuario actual.
La clase CultureInfo contiene información específica de la referencia cultural, como el idioma, el
país o región, el calendario y las convenciones culturales asociadas a una referencia cultural
específica. Esta clase también proporciona la información necesaria para realizar operaciones

Pá gina 77
Programación Windows

específicas de la referencia cultural, como la distinción de mayúsculas y minúsculas, el formato de


fechas y números, y la comparación de cadenas.

En el código usado para averiguar el separador decimal (y el de miles) usamos la propiedad


NumberFormat de la propiedad compartida CurrentCulture de la clase CultureInfo, y ese método
devuelve un objeto del tipo NumberFormatInfo que tiene las siguientes propiedades:
Propiedad Descripción

CurrencyDecimalDigits Indica el número de posiciones decimales que se van a utilizar en


valores de moneda.

CurrencyDecimalSeparato Obtiene o establece la cadena que se va a utilizar como


r separador decimal en valores de moneda.

CurrencyGroupSeparator Obtiene o establece la cadena que separa grupos de dígitos a la


izquierda de la coma decimal en valores de moneda.

CurrencyGroupSizes Obtiene o establece el número de dígitos en cada grupo a la


izquierda de la coma decimal en valores de moneda.

CurrencyNegativePattern Obtiene o establece el modelo de formato para los valores de


moneda negativos.

CurrencyPositivePattern Obtiene o establece el modelo de formato para los valores de


moneda positivos.

CurrencySymbol Obtiene o establece la cadena que se va a utilizar como símbolo


de moneda.

CurrentInfo Obtiene un NumberFormatInfo de sólo lectura que aplica formato


a los valores basándose en la referencia cultural actual.

DigitSubstitution Obtiene o establece un valor que especifica cómo la interfaz


gráfica de usuario muestra la forma de un dígito.

InvariantInfo Obtiene la NumberFormatInfo predeterminada de sólo lectura


que es independiente de la referencia cultural (invariable).

IsReadOnly Obtiene un valor que indica si NumberFormatInfo es de sólo


lectura.

NaNSymbol Obtiene o establece la cadena que representa el valor NaN (no un


número) de IEEE.

NativeDigits Obtiene o establece una matriz de cadenas de dígitos nativos

Pá gina 78
Programación Windows

equivalentes a los dígitos occidentales del 0 al 9.

NegativeInfinitySymbol Obtiene o establece la cadena que representa un infinito


negativo.

NegativeSign Obtiene o establece la cadena que denota que el número


asociado es negativo.

NumberDecimalDigits Obtiene o establece el número de posiciones decimales que se


van a utilizar en valores numéricos.

NumberDecimalSeparator Obtiene o establece la cadena que se va a utilizar como


separador decimal en valores numéricos.

NumberGroupSeparator Obtiene o establece la cadena que separa grupos de dígitos a la


izquierda de la coma decimal en valores numéricos.

NumberGroupSizes Obtiene o establece el número de dígitos en cada grupo a la


izquierda de la coma decimal en valores numéricos.

NumberNegativePattern Obtiene o establece el modelo de formato para los valores


numéricos negativos.

PercentDecimalDigits Obtiene o establece el número de posiciones decimales que se


van a utilizar en valores de porcentaje.

PercentDecimalSeparator Obtiene o establece la cadena que se van a utilizar como


separador decimal en valores de porcentaje.

PercentGroupSeparator Obtiene o establece la cadena que separa grupos de dígitos a la


izquierda de la coma decimal en valores de porcentaje.

PercentGroupSizes Obtiene o establece el número de dígitos en cada grupo a la


izquierda de la coma decimal en valores de porcentaje.

PercentNegativePattern Obtiene o establece el modelo de formato para los valores de


porcentaje negativos.

PercentPositivePattern Obtiene o establece el modelo de formato para los valores de


porcentaje positivos.

PercentSymbol Obtiene o establece la cadena que se va a utilizar como símbolo


de porcentaje.

PerMilleSymbol Obtiene o establece la cadena que se va a utilizar como símbolo


de por mil.

Pá gina 79
Programación Windows

PositiveInfinitySymbol Obtiene o establece la cadena que representa un infinito positivo.

PositiveSign Obtiene o establece la cadena que denota que el número


asociado es positivo.

Nota:
Esta es la tabla usada en la información de Visual Studio 2005, pero todas las propiedades están
disponibles también en las versiones anteriores.

Ejercicio Práctico Nº1


1.- Diseñar el siguiente
TxtSD
formulario.
BtnVer

TxtSM

2.- Luego Codificaremos lo siguiente.

Private Sub btnver_Click


'Variable que agarrara el separador decimal y separador grupal
Dim s As String
'Agarra el separador decimal de la configuracion regional del sistema
s =System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator
Me.TxtSD.Text = s

'Agarra el separador de grupo de la configuracion regional del sistema


s = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyGroupSeparator
Me.TxtSM.Text = s
End Sub

Ejercicio Práctico Nº2


1.- Diseñar el siguiente formulario.

Txtnum

BtnVer

Pá gina 80
Txtfn
Txtfh

Programación Windows

2.- Luego Codificaremos lo siguiente.

Private Sub btnver_Click


'Variable que captura el numero a dar formato regional
Dim x As Decimal = Val(Me.txtnum.Text)

'Variable que define el formato regional de la Moneda


Dim objculture As Globalization.NumberFormatInfo = New Globalization.CultureInfo("ES-
PE").NumberFormat

objculture.CurrencyDecimalDigits = 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.ToString("c", objculture)

'Variable que define el formato regional 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.ToString(formatofecha.ShortDatePattern)
Me.txtfh.Text = dt.ToString(formatofecha.ShortTimePattern)

End Sub

La Clase CultureInfo
La clase CultureInfo especifica un nombre único para cada referencia cultural basándose en el
estándar RFC 1766. El nombre es una combinación de un código de referencia cultural de dos letras
en minúscula asociado con un idioma, y un código de referencia cultural secundaria de dos letras en

Pá gina 81
Programación Windows

mayúscula asociado con un país o región. El código de referencia cultural secundaria sigue al código
de referencia cultural, separados por un guión (-). Los ejemplos incluyen "ja-JP" para el japonés de
Japón, "en-US" para el inglés de EE.UU. y "de-DE" para el alemán de Alemania (a diferencia de "de-
AT" para el alemán de Austria). En los casos en los que no haya un código de idioma de dos letras
disponible, se usa el código de tres letras que se deriva de ISO 639-2; por ejemplo, se usa el código
de tres letras"div" para referencias culturales que utilizan el idioma dhivehi. Algunos nombres de
referencias culturales tienen sufijos que especifican la escritura; por ejemplo, "-Cyrl" especifica las
letras del cirílico, "-Latn" especifica las letras del latín.
En este tema se utilizan las expresiones "referencia cultural neutra" y "referencia cultural específica".
Una referencia cultural neutra se especifica únicamente mediante el código de dos dígitos de la
referencia cultural en minúscula. Por ejemplo, "fr" especifica la referencia cultural neutra para el
francés y "de" especifica la referencia cultural neutra para el alemán. Una referencia cultural
específica se identifica por el código de referencia cultural seguido por el código de referencia
cultural secundaria de dos dígitos en mayúscula. Por ejemplo, "fr-FR" especifica francés de Francia y
"fr-CA" especifica francés de Canadá.
A continuación, se incluyen los nombres e identificadores de CultureInfo predefinidos aceptados y
utilizados por esta y otras clases en el espacio de nombres System.Globalization.
Nombre de referencia Identificador de referencia Idioma-País/región
cultural cultural
"" (cadena vacía) 0x007F referencia cultural invariable
af 0x0036 Afrikaans
af-ZA 0x0436 Afrikaans-Sudáfrica
sq 0x001C Albanés
sq-AL 0x041C Albanés-Albania
ar 0x0001 Árabe
ar-DZ 0x1401 Árabe-Argelia
ar-BH 0x3C01 Árabe-Bahrein
ar-EG 0x0C01 Árabe-Egipto
ar-IQ 0x0801 Árabe-Iraq
ar-JO 0x2C01 Árabe-Jordania
ar-KW 0x3401 Árabe-Kuwait
ar-LB 0x3001 Árabe-Líbano
ar-LY 0x1001 Árabe-Libia
ar-MA 0x1801 Árabe-Marruecos
ar-OM 0x2001 Árabe-Omán
ar-QA 0x4001 Árabe-Qatar
ar-SA 0x0401 Árabe-Arabia Saudí
ar-SY 0x2801 Árabe-Siria
ar-TN 0x1C01 Árabe-Túnez
ar-AE 0x3801 Árabe-Emiratos Árabes Unidos

Pá gina 82
Programación Windows

ar-YE 0x2401 Árabe-Yemen


hy 0x002B Armenio
hy-AM 0x042B Armenio-Armenia
az 0x002C Azerí
az-AZ-Cyrl 0x082C Azerí (cirílico)-Azerbaiyán
az-AZ-Latn 0x042C Azerí (latino)-Azerbaiyán
eu 0x002D Vasco
eu-ES 0x042D Vasco-España
be 0x0023 Bielorruso
be-BY 0x0423 Bielorruso-Bielorrusia
bg 0x0002 Búlgaro
bg-BG 0x0402 Búlgaro-Bulgaria
ca 0x0003 Catalán
ca-ES 0x0403 Catalán-España
zh-HK 0x0C04 Chino-Zona administrativa
especial de Hong Kong
zh-MO 0x1404 Chino-Zona administrativa
especial de Macao
zh-CN 0x0804 Chino-China
zh-CHS 0x0004 Chino (simplificado)
zh-SG 0x1004 Chino-Singapur
zh-TW 0x0404 Chino-Taiwán
zh-CHT 0x7C04 Chino (tradicional)
hr 0x001A Croata
hr-HR 0x041A Croata-Croacia
cs 0x0005 Checo
cs-CZ 0x0405 Checo-República Checa
da 0x0006 Danés
da-DK 0x0406 Danés-Dinamarca
div 0x0065 Dhivehi
div-MV 0x0465 Dhivehi-Maldivas
nl 0x0013 Holandés
nl-BE 0x0813 Holandés-Bélgica
nl-NL 0x0413 Holandés-Países Bajos
en 0x0009 Inglés
en-AU 0x0C09 Inglés-Australia
en-BZ 0x2809 Inglés-Belice
en-CA 0x1009 Inglés-Canadá
en-CB 0x2409 Inglés-Caribe
en-IE 0x1809 Inglés-Irlanda
en-JM 0x2009 Inglés-Jamaica
en-NZ 0x1409 Inglés-Nueva Zelanda
en-PH 0x3409 Inglés-Filipinas
en-ZA 0x1C09 Inglés-Sudáfrica
en-TT 0x2C09 Inglés-Trinidad y Tobago
en-GB 0x0809 Inglés-Reino Unido

Pá gina 83
Programación Windows

en-US 0x0409 Inglés-Estados Unidos


en-ZW 0x3009 Inglés-Zimbabue
et 0x0025 Estonio
et-EE 0x0425 Estonio-Estonia
fo 0x0038 Feroés
fo-FO 0x0438 Feroés-Islas Feroe
fa 0x0029 Persa
fa-IR 0x0429 Persa-Irán
fi 0x000B Finlandés
fi-FI 0x040B Finlandés-Finlandia
fr 0x000C Francés
fr-BE 0x080C Francés-Bélgica
fr-CA 0x0C0C Francés-Canadá
fr-FR 0x040C Francés-Francia
fr-LU 0x140C Francés-Luxemburgo
fr-MC 0x180C Francés-Mónaco
fr-CH 0x100C Francés-Suiza
gl 0x0056 Gallego
gl-ES 0x0456 Gallego-España
ka 0x0037 Georgiano
ka-GE 0x0437 Georgiano-Georgia
de 0x0007 Alemán
de-AT 0x0C07 Alemán-Austria
de-DE 0x0407 Alemán-Alemania
de-LI 0x1407 Alemán-Liechtenstein
de-LU 0x1007 Alemán-Luxemburgo
de-CH 0x0807 Alemán-Suiza
el 0x0008 Griego
el-GR 0x0408 Griego-Grecia
gu 0x0047 Gujarati
gu-IN 0x0447 Gujarati-India
he 0x000D Hebreo
he-IL 0x040D Hebreo-Israel
hi 0x0039 Hindi
hi-IN 0x0439 Hindi-India
hu 0x000E Húngaro
hu-HU 0x040E Húngaro-Hungría
es 0x000F Islandés
is-IS 0x040F Islandés-Islandia
id 0x0021 Indonesio
id-ID 0x0421 Indonesio-Indonesia
it 0x0010 Italiano
it-IT 0x0410 Italiano-Italia
it-CH 0x0810 Italiano-Suiza
ja 0x0011 Japonés
ja-JP 0x0411 Japonés-Japón

Pá gina 84
Programación Windows

kn 0x004B Kannada
kn-IN 0x044B Kannada-India
kk 0x003F Kazajo
kk-KZ 0x043F Kazajo-Kazajistán
kok 0x0057 Konkani
kok-IN 0x0457 Konkani-India
ko 0x0012 Coreano
ko-KR 0x0412 Coreano-Corea
ky 0x0040 Kirguís
ky-KZ 0x0440 Kirguís-Kazajistán
lv 0x0026 Letón
lv-LV 0x0426 Letón-Letonia
lt 0x0027 Lituano
lt-LT 0x0427 Lituano-Lituania
mk 0x002F Macedonio
mk-MK 0x042F Macedonio-Antigua República
Yugoslava de Macedonia
ms 0x003E Malayo
ms-BN 0x083E Malayo-Brunéi Darussalam
ms-MY 0x043E Malayo-Malasia
mr 0x004E Marathi
mr-IN 0x044E Marathi-India
mn 0x0050 Mongol
mn-MN 0x0450 Mongol-Mongolia
no 0x0014 Noruego
nb-NO 0x0414 Noruego (Bokmal)-Noruega
nn-NO 0x0814 Noruego (Nynorsk)-Noruega
pl 0x0015 Polaco
pl-PL 0x0415 Polaco-Polonia
pt 0x0016 Portugués
pt-BR 0x0416 Portugués-Brasil
pt-PT 0x0816 Portugués-Portugal
pa 0x0046 Punjabi
pa-IN 0x0446 Punjabí-India
ro 0x0018 Rumano
ro-RO 0x0418 Rumano-Rumanía
ru 0x0019 Ruso
ru-RU 0x0419 Ruso-Rusia
sa 0x004F Sánscrito
sa-IN 0x044F Sánscrito-India
sr-SP-Cyrl 0x0C1A Serbio (cirílico)-Serbia
sr-SP-Latn 0x081A Serbio (latino)-Serbia
sk 0x001B Eslovaco
sk-SK 0x041B Eslovaco-Eslovaquia
sl 0x0024 Esloveno
sl-SI 0x0424 Esloveno-Eslovenia

Pá gina 85
Programación Windows

es 0x000A Español
es-AR 0x2C0A Español-Argentina
es-BO 0x400A Español-Bolivia
es-CL 0x340A Español-Chile
es-CO 0x240A Español-Colombia
es-CR 0x140A Español-Costa Rica
es-DO 0x1C0A Español-República Dominicana
es-EC 0x300A Español-Ecuador
es-SV 0x440A Español-El Salvador
es-GT 0x100A Español-Guatemala
es-HN 0x480A Español-Honduras
es-MX 0x080A Español-México
es-NI 0x4C0A Español-Nicaragua
es-PA 0x180A Español-Panamá
es-PY 0x3C0A Español-Paraguay
es-PE 0x280A Español-Perú
es-PR 0x500A Español-Puerto Rico
es-ES 0x0C0A Español-España
es-UY 0x380A Español-Uruguay
es-VE 0x200A Español-Venezuela
sw 0x0041 Suajili
sw-KE 0x0441 Suajili-Kenia
sv 0x001D Sueco
sv-FI 0x081D Sueco-Finlandia
sv-SE 0x041D Sueco-Suecia
syr 0x005A Sirio
syr-SY 0x045A Sirio-Siria
ta 0x0049 Tamil
ta-IN 0x0449 Tamil-India
tt 0x0044 Tártaro
tt-RU 0x0444 Tártaro-Rusia
te 0x004A Telugu
te-IN 0x044A Telugu-India
th 0x001E Tailandés
th-TH 0x041E Tailandés-Tailandia
tr 0x001F Turco
tr-TR 0x041F Turco-Turquía
uk 0x0022 Ucraniano
uk-UA 0x0422 Ucraniano-Ucrania
ur 0x0020 Urdú
ur-PK 0x0420 Urdú-Pakistán
uz 0x0043 Uzbeko
uz-UZ-Cyrl 0x0843 Uzbeko (cirílico)-Uzbekistán
uz-UZ-Latn 0x0443 Uzbeko (latino)-Uzbekistán
vi 0x002A Vietnamita
vi-VN 0x042A Vietnamita-Vietnam

Pá gina 86
Programación Windows

CboCulturas BtnMostrar
Ejercicio Práctico Nº3

1.- Diseñar el siguiente formulario.


TxtFecha

2.- Luego codificaremos lo siguiente.


TxtMoneda
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.ToString) > 4 Then
colculturas.Add(ci)
End If
Next
Me.cboculturas.DataSource = colculturas
End Sub

Private Sub Form3_Load


Me.txtfecha.Text = Now.ToString("d", CultureInfo.InstalledUICulture)
Me.txtmoneda.Text = nvalor.ToString("c", CultureInfo.InstalledUICulture)
filtrarcombo()
End Sub

Private Sub BtnMostrar_Click


Try
Dim newdate As New Date
Dim cultura As String
Dim indice As Integer
indice = Me.cboculturas.SelectedIndex
cultura = Me.cboculturas.ValueMember
Me.txtfecha.Text = Now.ToString("d", colculturas(indice + 1))
Me.txtmoneda.Text = nvalor.ToString("c", colculturas(indice + 1))
Catch ex As Exception
MsgBox("No se Reconoce", MsgBoxStyle.Information, "SISE")
Me.txtfecha.Clear()
Me.txtmoneda.Clear()
End Try
End Sub
End Class

Pá gina 87
Programación Windows

Programación Orientada a Objetos (POO)


En Visual Basic Net un objeto puede definirse como cualquier cosa, ente o entidad física o lógica de
información.
En este sentido todos los elementos materiales o inmateriales pueden clasificarse como objetos.
En particular cualquier objeto considerado presenta los siguientes tres elementos:

a) Propiedades: Son las características propias de un objeto estas propiedades o atributos son los que
permiten diferenciar o individualizar un objeto de otro objeto ya sea de la misma o diferente clase o
categoría.
Las propiedades más generales son forma, color, tamaño, peso, etc., pero ya en particular:
Chamarra → Marca, material, precio, color, tamaño, etc.
Alumno → Matricula, nombre, edad, domicilio, etc.
Gato → Raza, nombre, color, edad, etc.
Ventana Windows–>Tamaño, Color, Font, etc.

b) Métodos: Son las conductas propias de la naturaleza del objeto.


Así como las propiedades son el ser (que es) del objeto, los métodos son el hacer (que hacer) del
objeto.
Ejemplo de métodos:
Gato —> Maullar (), comer (), correr (), saltar (), etc.
Alumno—> Estudiar (), comer (), asistir clase (), pintear ()
Cuaderno–>Es escrito (), es rayado (), es borrado (), etc.
Ventana Windows–> Abrir (), cerrar (), maximizar (), etc.

c) Eventos: Es la relación (de varias maneras) que se puede dar entre dos objetos ya sean de la misma
o diferente clase.
Un evento se manifiesta como una interacción entre dos objetos, en general al momento de la
relación al mismo tiempo se dará una reacción o respuesta por parte de los dos objetos que se
manifiestan como una serie, cadena o conjuntos de métodos propios que se activan o disparan,
ejemplo:

Evento Relación Métodos que se activan


gato detecta gata detectar maullar(), correr(), oler()
gato detecta perro detectar bufar(), saltar(), correr()
maestro ensena alumno Ensenar pasar lista(), preguntar(), etc.
Ratón clic Windows clic maximizar(), cerrar()
Ratón dblclk Windows dblclk minimizar(), etc.

Pá gina 88
Programación Windows

Un Programa o un SCRIPT en visual Basic Net se pueden considerar como un conjunto de una o más
páginas 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 desplegar textos o mensajes, otros controles
se especializan en desplegar imágenes o videos, otros en manipular directorios o archivos en disco,
etc.
Pero en general tanto las formas como los controles no dejan de ser objetos en programación de
visual Basic y por tanto tienen sus propiedades, métodos y están sujetos a eventos.
En visual Basic Net recordar además que un conjunto de objetos que comparten o contienen
características similares forman la llamada CLASE.

Creación de Propiedades para la Clase


Una propiedad en una clase se define, por normal general, 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 encarga de guardar el valor de
propiedad. Por su parte el procedimiento de propiedad o Property, es el encargado de actuar de
puente entre el código cliente y la variable de propiedad, realizando las operaciones de acceso y
asignación de valores a dicha variable.
Por lo tanto, para crear una propiedad en nuestra clase, declararemos en primer lugar una variable
Private, y en segundo lugar 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 asignárselo (aquí debe usar un parámetro con el nombre Value, que
contiene el valor para asignárselo). La sintaxis a emplear se muestra en el siguiente código fuente.
Sintaxis:

[Tipo de Declaración] Property <Nombre> [as <Tipo Dato>]

[[ReadOnly] Get

<Instrucciones>

End Get]

[[WriteOnly] Set (By Val Value [As <Tipo Dato>])

<Instrucciones>

End Set]

End Property

Pá gina 89
Programación Windows

Ejercicio Práctico Nº4


1.- Crear un Proyecto llamado POO en Visual
2.- Agregar una clase llamada Empleado en el cual crearemos las siguientes propiedades y Métodos.
Public Class Empleado
'Variables de Propiedad
Private mvarcodigo As Integer
Private mvarnombre As String
Private mvarsueldo As Single

'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
End Sub

Public Sub actualizarSueldo(ByVal vnuevosueldo As Single)


mvarsueldo = vnuevosueldo
End Sub
End Class

Pá gina 90
Programación Windows

3.- Luego Agregaremos otro proyecto al cual llamaremos Probando Clase; para ello ir al Menú
Archivo, luego Agregar y elegir Nuevo Proyecto.

4.-Agregaremos la referencia de nuestro proyecto POO en Visual a nuestro proyecto Probando Clase,
para ello clic derecho y elegir Referencia.

5.- Diseñaremos el siguiente


formulario.

TxtCod

TxtNom

TxtSue

6.- Codificaremos lo siguiente.

Public Class Form1

'Declaracion de la variable que contendra toda la Clase Empleado


'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)
MsgBox("Datos Guardados...!", MsgBoxStyle.Information, "SISE")
End Sub

Pá gina 91
Programación Windows

Private Sub btnactualizar_Click


Dim sueldo As Single
Dim res As String

res = InputBox("Ingrese Nuevo Sueldo")

If res = "" Then


Exit Sub
Else
sueldo = CDbl(res)
End If

'Llamamos al método ActualizarSueldo


objempleado.actualizarSueldo(sueldo)
MsgBox("Sueldo Actualizado...!", MsgBoxStyle.Information, "SISE")
End Sub

Private Sub btnmostrar_Click


With objempleado
MsgBox("Codigo: " & .Codigo & vbCrLf & "Nombre: " & .Nombre & vbCrLf & "Sueldo: "
& .Sueldo, MsgBoxStyle.Information, "SISE")
End With
End Sub

End Class

Ejercicio Práctico Nº5


1.- Diseñar el siguiente formulario.

TxtNom

DateTimePicker
LblMensaje

BtnMostrar

2.- Luego agregaremos una clase llamado Persona el cual crearemos las siguientes propiedades y
métodos.

Public Class Persona

'Variables de Propiedad
Private _nombre As String
Private _fechanacimiento As Date

'Propiedades

Pá gina 92
Programación Windows

Public Property nombre() As String


Get
Return _nombre
End Get

Set(ByVal value As String)


_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 Integer
Dim tempedad As String
tempedad = Microsoft.VisualBasic.DateDiff(DateInterval.Year, _fechanacimiento,
Now())
Return tempedad
End Function

End Class

3.- Codificaremos lo siguiente en el evento clic del BtnMostrar

Private Sub btnmostrar_Click

'Variable que contiene la clase Persona


Dim opersona As New Persona
opersona.nombre = Me.txtnom.Text
opersona.fechanacimiento = Me.DateTimePicker1.Value
Me.lblMensaje.Text = "La Edad de " & opersona.nombre & " es " & opersona.edad() & " años"
End Sub

Ejercicio Práctico Nº6


1.- Agregar una clase llamada Empleado2 y agregaremos los siguientes campos, propiedades y
métodos.

Public Class Empleado2


'Campos de la clase
Public codigo As Integer
Public nombre As String
Public remuneracion As Double
Pá gina 93
Programación Windows

Public CostoXhora As Decimal


Public HorasTrabajadas As Integer

'variables por propiedad


Private cuentabancaria As String
Private entidad As String
Private fechaingreso As Date

'Propiedad de Solo Escritura


Public WriteOnly Property ctbancaria() As String
Set(ByVal value As String)
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 FechaIng() As Date
Get
Return fechaingreso
End Get
Set(ByVal value As Date)
fechaingreso = value
End Set
End Property

'Propiedades de Solo Lectura


Public ReadOnly Property banco() As String
Get
Return entidad
End Get
End Property

Public ReadOnly Property mesingreso() As String


Get
Return Format(fechaingreso, "MMMM")
End Get
End Property

'Funcion que calcula y devuelve el sueldo


Public Function sueldo(ByVal horas As Integer)
remuneracion = horas * CostoXhora
Return remuneracion
End Function

txtCod Pá gina 94
txtNom
DtpFI
txtHoras

Programación Windows txtCXH


BtnRegistrar

End Class
ListView1
2.- Luego diseñamos el siguiente formulario.

3.- Luego en el evento Clic del Botón BtnRegistrar codificaremos lo siguiente:

Private Sub btnregistrar_Click


'Declaramos nuestra variable que contendra
'todo lo que contenga nuestra clase Empleado2
Dim oempleado As New Empleado2

'Campos de la Clase
oempleado.codigo = Me.txtcod.Text
oempleado.nombre = Me.txtnom.Text
'Propiedad ctbancaria de la clase Empleado2
oempleado.ctbancaria = Me.cbocuentabancaria.Text
'Propiedad FechaIng de la clase Empleado2
oempleado.FechaIng = Me.dtpfi.Value
'Campos de la Clase
oempleado.CostoXhora = Me.txtCXH.Text
oempleado.HorasTrabajadas = Me.txthoras.Text

'Campo Remuneracion de la Clase Empleado2 y


'Método Sueldo de la clase Empleado2
oempleado.remuneracion = oempleado.sueldo(oempleado.HorasTrabajadas)

Dim vista As New ListViewItem


vista = Me.ListView1.Items.Add(oempleado.codigo)
vista.SubItems.Add(oempleado.nombre)
vista.SubItems.Add(oempleado.banco)
vista.SubItems.Add(oempleado.mesingreso)
vista.SubItems.Add(oempleado.HorasTrabajadas)
vista.SubItems.Add(oempleado.CostoXhora)
vista.SubItems.Add(oempleado.remuneracion)

End Sub

Pá gina 95
Programación Windows

Programación Orientada a Objetos


(POO) - Usando una Librería de Clases

Práctica de Laboratorio
Este laboratorio pretende enseñar como se trabajan con componentes en Visual Basic .Net, primero
se verá un laboratorio de cómo crear una Librería de Clases y luego veremos como trabajar con
herencia de clases.

Creando y Usando una Librería de Clases


Se va a construir una librería que permita manejar el inventario de productos en almacén y realizar un
mantenimiento de estos. Para esto realizar los siguientes pasos:

1.-Elegir un nuevo proyecto “Visual Basic” el cual se llamara POO_en_Visual y agregar una Clase
llamada Producto.

 Creando Propiedades para la clase Producto

Private mvarCodigo As String


Private mvarNombre As String
Private mvarPrecio As Single
Private mvarStock As Integer

Public Property Codigo() As String


Get
Codigo = Me.mvarCodigo
End Get
Set(ByVal value As String)
Me.mvarCodigo = value
End Set
End Property

Public Property Nombre() As String


Get
Nombre = Me.mvarNombre
End Get
Set(ByVal value As String)
Me.mvarNombre = value
End Set
End Property

Public Property Precio() As Single


Get
Precio = Me.mvarPrecio
Pá gina 96
Programación Windows

End Get
Set(ByVal value As Single)
Me.mvarPrecio = value
End Set
End Property

Public Property Stock() As Integer


Get
Stock = Me.mvarStock
End Get
Set(ByVal value As Integer)
Me.mvarStock = value
End Set
End Property

 Creando Métodos para la clase Producto.

Public Sub CrearProducto(ByVal vcodigo As String, ByVal vnombre As String, ByVal vprecio As
Single, ByVal vstock As Integer)
Me.mvarCodigo = vcodigo
Me.mvarNombre = vnombre
Me.mvarPrecio = vprecio
Me.mvarStock = vstock
End Sub

Public Sub ActualizarPrecio(ByVal vOperacionPrecio As Byte, ByVal vTasa As Single)


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 Integer)


If vOperacionStock = 1 Then
Me.mvarStock = Me.mvarStock + vCantidad
ElseIf vOperacionStock = 2 Then
Me.mvarStock = Me.mvarStock - vCantidad
End If
End Sub

2.- Luego, añadimos una aplicación para Windows que me permita realizar el mantenimiento de
productos usando la librería creada.

3.- Para eso seguir los siguientes pasos:

Pá gina 97
Programación Windows

4.- El proyecto se llamará Probando Clase

5.- Diseñamos un formulario llamado FrmProducto que tenga un TabControl con 3 fichas, una de
ingreso de productos, otra de actualización de precios y stock y otra de consulta, diseñadas tal como
se muestran las figuras de abajo:

 Ficha “Ingreso“ del formulario


FRMPRODUCTO

 Ficha “Actualización“ del formulario FRMPRODUCTO

 Ficha “Consulta“ del formulario


FRMPRODUCTO

Pá gina 98
Programación Windows

Después de realizar el diseño y antes de escribir código, para usar la librería primero debemos hacer
una referencia a esta.

Clic derecho sobre nuestro proyecto “Probando Clase” y elegimos agregar Referencia, nos aparecerá
una ventana el cual elegiremos la pestaña proyecto y clic sobre el proyecto que contiene nuestra clase
“POO_en_Visual”.

Declarar e inicializar una variable objeto de tipo de la clase Producto, tal como sigue:

Dim objproducto As New POO_en_Visual.Producto

 Programando en el botón Crear producto:

Private Sub btncrear_Click


objproducto.CrearProducto(Me.txtcod_ing.Text, Me.txtnom_ing.Text,
Me.txtpre_ing.Text, Me.txtstock_ing.Text)
MsgBox("Producto Registrado...!", MsgBoxStyle.Information, "SISE")
Me.txtcod_ing.Clear()
Me.txtnom_ing.Clear()
Me.txtpre_ing.Clear()
Me.txtstock_ing.Clear()
Me.txtcod_ing.Focus()
End Sub

 Programando los botones de actualizar 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
MsgBox("Precio Actualizado...!", MsgBoxStyle.Information, "SISE")
Me.txtTasa.Clear()
End Sub

Private Sub btnacsto_Click

Pá gina 99
Programación Windows

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
MsgBox("Stock Actualizado...!", MsgBoxStyle.Information, "SISE")
Me.txtcan.Clear()
End Sub

 Finalmente, mostrando los datos del producto:

Private Sub btnmostrar_Click


With objproducto
Me.txtcod_con.Text = .Codigo
Me.txtnom_con.Text = .Nombre
Me.txtpre_con.Text = .Precio
Me.txtstock_con.Text = .Stock
End With
End Sub

Constructores, SobreCarga de
Métodos o Polimorfismo,
Eventos y Herencia
 ¿Qué son Constructores?
 Definición de Sobrecarga de Métodos
 Concepto de Eventos
 Herencia de una Clase
 Herencia y Sobrecarga

Constructores
El punto de inicio de cualquier clase, cuando se crea una instancia en la memoria, es un método
especial al que se le conoce como constructor.
Un constructor no devuelve ningún valor, por tanto en Visual Basic sería un método de tipo Sub
llamado New.
El primer método que es ejecutado al instanciar un objeto de la clase se denomina constructor. Este
tipo de método resulta útil para tareas de configuración iníciales sobre el objeto.

Pá gina 100
Programación Windows

No es necesario escribir un método constructor en la clase, ya que en el caso de que no exista, el


compilador se encarga de crearlo implícitamente.
Todas las clases de Visual Basic .Net tienen un constructor por defecto que es método “New”, pero
se pueden agregar varios constructores “New” diferenciándose por el número de parámetros.
Sintaxis:
Public Sub New ()
<Instrucciones>
End Sub

Public Sub New ([<Param1>As <Tipo Dato>])


<Instrucciones>
End Sub

Public Sub New ([<Param1>As <Tipo Dato>,<Param2>As <Tipo Dato>])


<Instrucciones>
End Sub

Nota:
Es requisito indispensable escribir los métodos constructores al inicio de la clase, de lo contrario no
funcionarían.

Ejercicio Práctico Nº1


1.- Crearemos una Clase llamada ClsEmpleado

Public Class ClsEmpleado

Private fecha As Date

Public Property fechacrea() As Date


Get
Return fecha

Pá gina 101
Programación Windows

End Get
Set(ByVal value As Date)
fecha = value
End Set
End Property

'Método Constructor
Public Sub New()
'Asignamos un valor inicial
'A una variable de propiedad
fecha = Now
End Sub

End Class

2.- Luego diseñaremos el siguiente formulario.

BtnMostrar1

BtnMostrar2

BtnMostrar3

3.- En el evento clic del botón BtnMostrar1 codificaremos lo siguiente:

Private Sub btnMostrar_Click

Dim objempleado As New ClsEmpleado


MsgBox("El Empleado se creo " & objempleado.fechacrea)

End Sub

4.- Luego crearemos otra Clase llamada ClsEmpleado2

Public Class ClsEmpleado2

Private mvarfechacrea As Date

Public Property fechacrea() As Date


Get
Return mvarfechacrea
End Get

Pá gina 102
Programación Windows

Set(ByVal value As Date)


mvarfechacrea = value
End Set
End Property

'Método constructor con parámetro


Public Sub New(ByVal vfechacrea As Date)
'Asignamos el valor de parámetro
'A una variable de Propiedad
mvarfechacrea = vfechacrea
End Sub

End Class

5.- En el evento clic del botón BtnMostrar2 codificaremos lo siguiente:

Private Sub btnmostrar2_Click


'Forma de Instanciar un objeto con un constructor parametrizado
Dim objempleado2 As New ClsEmpleado2("07/12/2007")
MsgBox("El Empleado se creo " & objempleado2.fechacrea)
End Sub

Nota: Los constructores también se pueden sobrecargar, es decir, pueden existir varias versiones en
las que cada una de ellas reciba distintos parámetros, en número y/o en tipo.

6.- Luego crearemos otra Clase llamada ClsEmpleado3

Public Class ClsEmpleado3


'Campos de la Clase
Public nombre As String
Public apellido As String
Public Sueldo As Single

'Metodo Constructor
Public Sub New(ByVal vnombre As String, ByVal vapellido As String)
nombre = vnombre
apellido = vapellido
End Sub

'Método Constructor SobreCargado


Public Sub New(ByVal vnombre As String, ByVal vapellido As String, ByVal
vsueldo As Single)
nombre = vnombre
apellido = vapellido
Sueldo = vsueldo
End Sub
End Class
7.- En el evento clic del botón BtnMostrar3 codificaremos lo siguiente:

Pá gina 103
Programación Windows

Private Sub btnmostrar3_Click


Dim objempleado3 As New ClsEmpleado3("Ana", "Castilla", 1200)

MsgBox("El Nombre es: " & objempleado3.nombre & vbNewLine & "Su Apellido es: " &
objempleado3.apellido & vbNewLine & "Su Sueldo es: " & objempleado3.Sueldo)
End Sub

Sobrecarga de Métodos o Polimorfismo


La sobrecarga de métodos, es una técnica que consiste en crear varios métodos con idéntico nombre
dentro de la misma clase, distinguiéndose entre sí por su lista de parámetros. Para declarar un método
como sobrecargado, debemos utilizar la palabra clave Overloads después del modificador de ámbito.
Podemos sobrecargar métodos de tipo Sub y Function.

Ejercicio Práctico Nº2


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

'Campo de la Clase
Public nombre As String

'Variable de Propiedad
Private mvarsalario As Double

Public Property salario() As Double


Get
Return mvarsalario
End Get
Set(ByVal value As Double)
mvarsalario = value
End Set
End Property

'Métodos SobreCargados
Public Overloads Sub Sueldo()
'Aqui mostramos el importe del sueldo formateado
MsgBox("El sueldo es: " & Format(salario, "#,#.##"))
End Sub
Pá gina 104
Programación Windows

Public Overloads Function Sueldo(ByVal vdia As Integer) As String


' aquí mostramos la fecha del mes actual
' en la que se realizará la transferencia
' del sueldo al banco del empleado
Dim FechaActual As Date
Dim FechaCobro As String
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 String) As Double
' aquí calculamos la cantidad de incentivo
' que se añadirá al sueldo del empleado,
' en función del tipo de incentivo
Dim incentivo As Double

' segú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

2.- Luego diseñaremos el


siguiente formulario.

TxtNom

TxtSalario

NumericUpDown1

TxtIncentivo
Pá gina 105
CboTipoInc
BtnMostrar
Programación Windows

3.- Luego codificaremos lo siguiente:

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 String
Dim resincentivo As Double

'llamada al primer método sobrecargado


objempleado.Sueldo()

'llamada al segundo método sobrecargado


s2 = "El Sueldo se Transferira el dia " & objempleado.Sueldo(Me.NumericUpDown1.Value)

'llamada al tercer método sobrecargado


resincentivo = objempleado.Sueldo(Me.txtincentivo.Text, Me.cbotipoinc.Text)
s3 = "El Incentivo a pagar será " & CStr(resincentivo)

'Resultado final que se mostrara en un Label


Me.lblmensaje.Text = s2 & vbNewLine & s3

End Sub

Eventos
Un evento es un suceso que le ocurre al objeto y que le indica sobre un cambio en sus atributos o
propiedades. Un evento es necesario para controlar el estado de las propiedades e informar a las
aplicaciones del nuevo estado, para que estas realizacen la acción correspondiente.
Es fácil entender eventos asociados a objetos visuales como los controles, por ejemplo en el objeto
“button” se tiene el evento “Click” que se desencadena al seleccionar el botón, el evento
“MouseMove” que ocurre al pasar el mouse por el botón, y así hay muchos eventos asociados al

Pá gina 106
Programación Windows

objeto botón; pero cuando trabajamos con clases, los eventos son más abstractos y un poco más
difíciles de entender, ya que podía confundirse con lo métodos.
Para aclarar el concepto de eventos definamos mentalmente una clase llamada “Cuenta” para un
componente llamado “Banco”. Esta clase cuenta tiene propiedades como “NumeroCta”,
“FechaApertura”, “TipoCta”, “NumeroTarjeta”, y “Saldo”. Además tiene métodos como “Depósito”,
“Retiro” y “Transferencia” que modifican el estado del saldo. Cuando hacemos un “Retiro” de
nuestra cuenta donde el monto a retirar supera el “Saldo” se desencadena un evento llamado
“SaldoInsuficiente” y también cuando durante el día hemos retirado mas dl monto permitido se
desencadena el evento “limiteRetiroDiario”.
Para crear un evento en la clase primero declare evento con la sentencia “Event” y luego llámelo con
“RaiseEvent”, tal como se muestra en la sintaxis.
Declaración Sintaxis:
[Tipo Declaración] Event <Nombre> ([Parámetro(s)])
Declaración Llamada:
RaiseEvent <Nombre> ([Parámetro(s)])

Ejercicio Práctico Nº3


1.- Crearemos 2 eventos para una clase llamada Empleado, el cual estos eventos nos informarán
cuando el sueldo es bajo o alto; para nuestra realidad un sueldo será bajo cuando es menor a 500 y
alto cuando sea mayor a 3000.
Public Class Empleado
'Variables de Propiedad
Private mvarcodigo As Integer
Private mvarnombre As String
Private mvarsueldo As Single

'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
Pá gina 107
Programación Windows
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 actualizarSueldo(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

2.- Luego diseñaremos el siguiente formulario.

TxtCod
TxtNom

BtnCrear TxtSue
Pá gina 108
BtnMostrar

BtnActualizar TxtEventoSueldo
Programación Windows

3.- Codificaremos lo siguiente.

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 siguiente 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)
MsgBox("Datos Guardados...!", MsgBoxStyle.Information, "SISE")
End Sub

Private Sub btnactualizar_Click


Dim sueldo As Single
Dim res As String

res = InputBox("Ingrese Nuevo Sueldo")

If res = "" Then


Exit Sub
Else
sueldo = CDbl(res)
End If

'Llamamos al método ActualizarSueldo


objempleado.actualizarSueldo(sueldo)
MsgBox("Sueldo Actualizado...!", MsgBoxStyle.Information, "SISE")
End Sub

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

Pá gina 109
Programación Windows
Public Sub SAlto() Handles objempleado.SueldoAlto
Me.txteventosueldo.ForeColor = Color.Blue
Me.txteventosueldo.Text = objempleado.Nombre + " tiene un Sueldo Alto"
End Sub
End Class

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

Implementando Herencia a una Clase


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

Sintaxis:
Inherits <Clase Base>
Nota:

Pá gina 110
Programación Windows

Dos observaciones importantes que hay que tener en cuenta son:


1. La instrucción Inherits debe escribirse en la primera línea de la clase derivada
2. Solo puede existir una instrucción Inherits, ya que solo existe herencia simple.

Ejercicio Práctico Nº4

1.- Crearemos a continuación una clase llamada Vendedor que heredará todas sus propiedades, métodos y
eventos de clase creada anteriormente llamada Empleado.

Public Class Vendedor


'Esto quiere decir que se heredará de la clase Empleado
Inherits Empleado

'Variables de Propiedad
Private mvarventa As Single
Private mvarcomision As Single

'Propiedades
Public Property Venta() As Single
Get
Return mvarventa
End Get
Set(ByVal value As Single)
mvarventa = value
End Set
End Property

Public Property Comision() As Single


Get
Return mvarcomision
End Get
Set(ByVal value As Single)
mvarcomision = value
End Set
End Property
End Class

2.- Luego diseñaremos el siguiente formulario

TxtCod
TxtNom

TxtSue

TxtVenta
BtnCrear
TxtComision
Pá gina 111
BtnMostrar

BtnActualizar
Programación Windows

3.- Codificaremos lo siguiente.

Public Class FrmVendedor


Dim objvendedor As New Vendedor
Private Sub BtnCrear_Click
'Accedemos a los miembros de clase Padre
objvendedor.Codigo = 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 Single
Dim res As String

res = InputBox("Ingrese Nuevo Sueldo")

If res = "" Then


Exit Sub
Else
sueldo = CDbl(res)
End If

'Llamamos al método ActualizarSueldo de la clase Padre


objvendedor.actualizarSueldo(sueldo)
MsgBox("Sueldo Actualizado...!", MsgBoxStyle.Information, "SISE")
End Sub

Private Sub btnmostrar_Click


MsgBox("Codigo: " & objvendedor.Codigo & vbNewLine & _
"Nombre: " & objvendedor.Nombre & vbNewLine & _
"Sueldo: " & objvendedor.Sueldo & vbNewLine & _
"Venta: " & objvendedor.Venta & vbNewLine & _
"Comision: " & objvendedor.Comision)
End Sub
End Class

Herencia y Sobrecarga de Métodos

Pá gina 112
Programación Windows

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

Ejercicio Práctico Nº5


1.- Crearemos la clase base Empleado.
Public Class Empleado
'Campos de la clase
Public mvarid As Integer
Public mvarnombre As String
Public mvarsalario As Single
Public mvarincentivo As Single

'Métodos de la clase base Empleado


Public Sub calcularincentivo()
' calcular los incentivos en base
' al salario
Me.mvarincentivo = Me.mvarsalario / 10
End Sub

Public Sub verincentivos()


MsgBox("Los Incentivos de " & Me.mvarnombre & " son " & Me.mvarincentivo)
End Sub

End Class

2.- Luego crearemos la clase derivada Administrativo.


Public Class Administrativo
'Heredamos de la clase Empleado
Inherits Empleado

'Sobrecargamos el método calcularincentivo de la clase Empleado


Public Overloads Sub calcularincentivo(ByVal vhoras As Integer)
' calcular los incentivos en base a horas
Me.mvarincentivo = vhoras * 15
End Sub

Pá gina 113
Programación Windows

End Class
3.- Luego diseñaremos el siguiente formulario.

TxtCod

TxtNom

TxtSalario

BtnPadre BtnHijo

4.- Codificaremos lo siguiente.

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

Dim horas As Integer


Dim res As String
res = InputBox("Ingrese Numero de Horas")

If res = "" Then


Exit Sub
Else
horas = CInt(res)
End If

'Llamamos el método sobrecargado de la clase Derivada

Pá gina 114
Programación Windows

Me.objadministrativo.calcularincentivo(horas)
Me.objadministrativo.verincentivos()
End Sub
End Class

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

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

¿Qué es un NameSpace de Acceso de Datos?


Hay tres Namespace que puede importar dentro de una aplicación.Net que utiliza ADO.Net. En
primer lugar usará siempre el namespace System.Data, y luego elegir entre System.Data.SqlClient o
System.Data.Oledb, dependiendo del origen de los datos.
Cuando utiliza Ado.Net debe importar el namespace System.Data, para hacerlo debe usar la palabra
clave Imports.
Imports System.Data
Pá gina 115
Programación Windows

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

NameSpace Descripción
System.Data Incluye las clases que hacen posible realizar el trabajo
en modo desconectado en la arquitectura de ADO .NET

System.Data.Common Provee las clases e interfaces heredadas que permiten la


implementación de los .NET Data Providers.

System.Data.SqlClient Proveedor para SQL Server.

System.Data.OleDb Proveedor para OLE-DB para NET.

System.Data.SqlTypes Las clases y estructuras nativas de SQL Server

System.Xml Clases, interfases de XML.

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

Pá gina 116
Programación Windows

ADO à ADO .NET


ADO evoluciona hacia ADO .NET

Conexiones String en Visual Basic .Net 2005


Conexión Access 2003
Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C: \mydatabase.mdb

Conexión a Access 2007


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

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

Vía Usuario de SQL Server 2005


Server =myServer; DataBase =myDataBase;
User Id=myUsername; Password=myPassword

1.- Diseñar el Siguiente formulario:

Pá gina 117
btnAccess2003

btnAccess2007
Programación Windows

btnSql2005

btnUsuario

lblConecta

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

Versió n 2003 Versió n 2007

3.- Para Hacer la conexión con Access y SQL se deben de Importar los siguientes 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.- Luego digitar el siguiente código para las diferentes conexiones en sus respectivos botones.

Private Sub btnaccess2003_Click

Pá gina 118
Programación Windows

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.Message
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.Message
cn.Close()
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

Pá gina 119
Programación Windows

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.Message
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.Message
cn.Close()
Finally
cn.Close()
End Try
End Sub

¿Qué son los proveedores de Datos?


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

Objetos del proveedor Propósito


de datos .Net
Connection Proporciona la conectividad con el origen de datos

Command Proporciona el acceso para los comandos de Base de


Datos

Pá gina 120
Programación Windows

DataAdapter Utiliza el objeto Connection para proporcionar un


enlace entre el DataSet y el proveedor de datos. El
objeto DataAdapter actualiza los cambios que se han
hecho a los datos en el DataSet

.Net Data Provider


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

Hay que resaltar que estos componentes son implementados separadamente por cada .Net Data
Provider.
Connection
Esta clase es empleada para representar una conexión hacia un especifico origen de datos.

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

DataAdapter

DataAdapter
SelectCommand Database
Pá gina 121

InsertCommand
UpdateCommand

DeleteCommand
Programación Windows DataSet

.DataSet

Como Actúa el DataAdapter con respecto a una Base de


Datos

Connection, Command SqlClient

1
VB
DataAdapter DataTable
Base Datos DataSet
SQL
Despachar Datos (Fill)
2

Pá gina 122
Programación Windows

Consultas
1.- Diseñamos el siguiente formulario.

BtnCargar

DatagridView

2.- Luego en declaraciones generales importamos lo siguiente.


Imports System.Data
Imports System.Data.SqlClient
3.- Luego a nivel formulario creamos la conexión.
Public Class Form1
Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated
Security=True")

4.- codificamos lo siguiente en el botón btnCargar


Private Sub Btncargar_Click
Dim da As New SqlDataAdapter("Select * from Products", cn)
Dim ds As New DataSet
da.Fill(ds, "Productos")
Me.DataGridView1.DataSource = ds.Tables("Productos")
End Sub

5.- Despues cargamos la aplicaión y se debe mostrar de la siguiente manera.

Pá gina 123
Programación Windows

Programación Orientada a Objetos


(POO) - Usando una Librería de
Herencia
Práctica de Laboratorio

Pá gina 124
Programación Windows

En este laboratorio vamos a construir una librería de clases para un Instituto Superior Tecnológico
que permita matricular a los alumnos en un cierto curso libre dictado por un cierto profesor. Para lo
cual realizamos los siguientes pasos.

Trabajando con Herencia de Clases


1.-Elegir un nuevo proyecto “Visual Basic” y una plantilla “Biblioteca de Clases” el cual se llamara
“Librería de Clases Herencia”

2.- Crear la clase “Persona”, luego escribir el código siguiente para crear las propiedades: Nombre,
FechaNac, Edad y Dirección y el método CrearPersona:

Public Class Persona

Private mvarNombre As String


Private mvarFechaNac As Date
Private mvarEdad As Byte
Private mvarDireccion As String

Public Property Nombre() As String


Get
Return Me.mvarNombre
End Get
Set(ByVal value As String)
Me.mvarNombre = value
End Set
End Property

Public Property FechaNac() As Date


Get
Return Me.mvarFechaNac
End Get
Set(ByVal value As Date)
Me.mvarFechaNac = value
End Set
End Property

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
Pá gina 125
Programación Windows

End Set
End Property

Public Sub CrearPersona(ByVal vNombre As String, ByVal vFechaNac As Date, ByVal


vDireccion As String)
Me.mvarNombre = vNombre
Me.mvarFechaNac = vFechaNac
Me.mvarDireccion = vDireccion
Me.mvarEdad = Convert.ToByte(Date.Today.Year - vFechaNac.Year)
End Sub
End Class

2.- Crear la clase “Alumno” que hereda de “Persona”, para lo cual añadimos una clase al
componente, y le pondremos como nombre “Alumno”. Luego escribimos el siguiente código.

Public Class Alumno


'Codigo que identifica que va heredar de la clase Persona
Inherits Persona

Private mvarCodigo As String


Private mvarEspecialidad As String

Public Property Codigo() As String


Get
Return Me.mvarCodigo
End Get
Set(ByVal value As String)
Me.mvarCodigo = value
End Set
End Property

Public Property Especialidad() As String


Get
Return Me.mvarEspecialidad
End Get
Set(ByVal value As String)
Me.mvarEspecialidad = value
End Set
End Property

Public Sub CrearAlumno(ByVal vNombre As String, ByVal vFechaNac As Date, ByVal


vDireccion As String, ByVal vCodigo As String, ByVal vEspecialidad As String)
CrearPersona(vNombre, vFechaNac, vDireccion)
Me.mvarCodigo = vCodigo
Me.mvarEspecialidad = vEspecialidad
End Sub
End Class

3.- Crear la clase “Profesor” que también hereda de “Persona”, para lo cual añadimos una clase al
componente; y escribimos como nombre “Profesor”. Luego escribimos el siguiente código:

Public Class Profesor


Pá gina 126
Programación Windows

'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

4.- Finalmente crear la clase “Curso”, para lo cual añadimos una clase al componente, y escribimos
como nombre “Curso”. Luego escribimos el siguiente código:

Public Class Curso


Private mvarCodigo As String
Private mvarNombre As String
Private mvarTotalHoras As Byte
Private mvarCostoTotal As Single
Private mvarCostoHora As Single

Public Property Codigo() As String


Get
Return mvarCodigo
Pá gina 127
Programación Windows

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

Public Sub CrearCurso(ByVal vCodigo As String, ByVal vNombre As String, ByVal


vTotalHoras As Byte, ByVal vCostoTotal As Single)
Me.mvarCodigo = vCodigo
Me.mvarNombre = vNombre
Me.mvarTotalHoras = vTotalHoras
Me.mvarCostoTotal = vCostoTotal
Me.mvarCostoHora = Me.mvarCostoTotal / Me.mvarTotalHoras
End Sub
2.- Luego, añadimos una aplicación para Windows que me permita realizar la matricula usando la
librería de clases creada.

3.- Para eso seguir los siguientes pasos:

Pá gina 128
Programación Windows

4.- El proyecto se llamará Probando Librería Herencia

5.- Diseñamos un formulario llamado FrmMatricula que tenga un TabControl con 3 fichas, una de
ingreso de Datos del Alumno, otra el Curso y por ultimo el Profesor, diseñadas tal como se muestran
las figuras de abajo:

 Ficha “Alumno“ del formulario FRMMATRICULA

 Ficha “Curso“ del formulario FRMMATRICULA

Pá gina 129
Programación Windows

 Ficha “Profesor“ del formulario FRMMATRICULA

Después de realizar el diseño y antes de escribir código, para usar la librería primero debemos hacer
una referencia a esta.

Clic derecho sobre nuestro proyecto “Probando Librería Herencia” y elegimos agregar Referencia,
nos aparecerá una ventana el cual elegiremos la pestaña proyecto y clic sobre el proyecto que
contiene nuestra clase “Librería de Clases Herencia”.

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

 Programando en el botón Matricula:

Private Sub btnMatricular_Click

Me.objAlumno.CrearAlumno(Me.txtnomalu.Text, Me.dtpFechaNacAlu.Value,
Me.txtdiralu.Text, Me.txtcodalu.Text, Me.CboEspecialidad.Text)

Pá gina 130
Programación Windows

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

 Programando en el botón Consultar:

Private Sub btnConsultar_Click

MsgBox("El Alumno(a) " & Me.objAlumno.Nombre & vbNewLine & _


"con " & Me.objAlumno.Edad & " años de edad" & vbNewLine & _
"Con una Especialidad en " & Me.objAlumno.Especialidad & vbNewLine & _
"Esta inscrito en el Curso de " & Me.objCurso.Nombre & vbNewLine & _
"El cual tiene un Costo X Hora de S/." & Me.objCurso.CostoHora & vbNewLine & _
"Sera dictado por el Profesor(a) " & Me.objProfesor.Nombre & vbNewLine & _
"con " & Me.objProfesor.Edad & " años de edad", MsgBoxStyle.Information, "SISE")

End Sub

 Finalmente, programamos el botón Salir de la aplicación:

Private Sub btnsalir_Click


Me.Close()
End Sub

Data Sets,
DataTable y DataRelation
 ¿Qué es un DataSet?
 ¿Qué es un DataTable?
 DataColumns, DataRows

Pá gina 131
Programación Windows

 DataRelation Via Código y


Usando Asistente

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

DataSet

Tables Pá gina 132


Constraint
Programación Windows

Rows

Relation

Un DataTable, almacena datos de forma similar que una tabla en una base de datos, es decir que la
información esta distribuida en un conjunto de registros cada una de ellas esta conteniendo un
conjunto e columnas.
Un DataTable esta constituido por las siguientes colecciones:
 Columns, contiene el DataColumn, se define las características como nombre de la
columna, tipos de datos y primary key.
 Rows, contiene el DataRow, que representa la información que se quiere manipular.
 Constraints, contiene ForeignKeyConstraint y/o UniqueConstraint.

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

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

Realizando Consultas Múltiples


1ra Forma
1.- Creamos el diseño para el siguiente formulario.
BtnMostrar

DataGridView1
Pá gina 133
DataGridView2

Programación Windows
DataGridView3

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

'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

Pá gina 134
Programación Windows

Me.DataGridView1.DataSource = ds.Tables("Categoria")
Me.DataGridView2.DataSource = ds.Tables("Productos")
Me.DataGridView3.DataSource = ds.Tables("Proveedor")
End Sub

4.- Luego ejecutamos la aplicación y se debe mostrar


de la siguiente manera.

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

DataGridView1

DataGridView2

DataGridView3

2.- Luego hacemos la conexión con SQL, pero antes importamos los namespace.
Imports System.Data
Imports System.Data.SqlClient
Public Class Form3
Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated
Security=True")
3.- En botón BtnMostrar codificamos lo siguiente.

Pá gina 135
Programación Windows

Private Sub BtnMostrar_Click


'Declaramos todo en un DataAdapter
Dim da As New SqlDataAdapter ("Select Categoryid,Categoryname from Categories;" & _
"Select Productid,Productname,Unitprice from Products;" & _
"Select Supplierid,CompanyName, City, Country from Suppliers", cn)
Dim ds As New DataSet
da.Fill(ds)
ds.Tables(0).TableName = "Categoria"
ds.Tables(1).TableName = "Productos"
ds.Tables(2).TableName = "Proveedor"
Me.DataGridView1.DataSource = ds.Tables("Categoria")
Me.DataGridView2.DataSource = ds.Tables("Productos")
Me.DataGridView3.DataSource = ds.Tables("Proveedor")
End Sub

Ejercicio Práctico Nº1 BtnDataSet


1.- Diseñar el siguiente formulario.

LstClientes

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")

Pá gina 136
Programación Windows

Private Sub btnDataset_Click


'Declaracion del DataAdapter
Dim da As New SqlDataAdapter("Select * from Customers order by CompanyName", cn)
'Declaracion del DataSet
Dim ds As New DataSet
'Filtramos lo que contiene el DataAdapter al DataSet
'En una tabla temporal Customers
da.Fill(ds, "Clientes")
'Declaramos una variable de tipo DataRow
Dim Fila As DataRow
'La Variable Fila de Tipo DataRow
'Recorrera todas las filas de la tabla de nuestro DataSet
'y las agregara al ListBox
For Each Fila In ds.Tables("Clientes").Rows
Me.lstclientes.Items.Add(Fila.Item("CompanyName") & " - " & Fila.Item("ContactName") &
" - " & Fila.Item("Country"))
Next
End Sub
End Class

Relaciones entre tablas mediante objetos DataRelation


Los objetos DataRelation nos permiten establecer una relación entre dos tablas (objetos DataTable)
de un DataSet, a través de una columna o campo común (objetos DataColumn).

Ejercicio Practico Nº2

1.- Diseñar el siguiente


formulario.
CboClientes

LstOrdenes

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
Pá gina 137
Programación Windows

'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

Ejercicio Practico Nº3

1.- Diseñar el siguiente formulario.

CboClientes

DataGridView1

Pá gina 138
Programación Windows

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

'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)
Pá gina 139
Programación Windows

'Variable que recorrera las FilasHijas


Dim Filas As DataRow

For Each Filas In FilasHija


'Se crea una nueva fila en el DataTable
fila = dtRelacion.NewRow
'Agregara los registros de los campos de la fila Hija
'En cada columna creada
fila("Codigo") = Filas.Item("OrderId")
fila("Fecha Orden") = Filas.Item("OrderDate")
'Agregaremos las filas al DataTable
dtRelacion.Rows.Add(fila)
Next

'Por ultimo mostraremos el contenido del DataTable


'en un DataGridView
Me.DataGridView1.DataSource = dtRelacion
End Sub
End Class

Relación de 2 Tablas Usando la Herramienta Relation del DataSet


1.- Agregaremos otro formulario al proyecto, y en el nuevo formulario agregaremos 2
SqlDataAdapter, uno para la tabla empleados y el otro para la tabla orders.
En la Tabla Empleado escogeremos los campos EmployeeId, y FirstName.
En la Tabla Orders escogeremos los campos OrderId, OrderDate y EmployeeId.
Al final debe mostrarse los 2 SqlDataAdapter.

2.- Luego seleccionamos los 2 SqlDataAdapter, y generaremos un conjunto de Datos.


3.- Ir al menú Datos / Generar Conjunto de datos.
4.- En la ventana que aparecerá le ponemos un nombre al DataSet que se va generar, luego
escogeremos los 2 SqlDataAdapter.

Pá gina 140
Programación Windows

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

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

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

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

Pá gina 141
Programación Windows

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

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

12.- En su propiedad DataSource del ListBox, escogeremos el DataSet generado, y en su propiedad


DisplayMember, escogeremos el campo FirstName de la Tabla Employees, pues los nombres de los
empleados son los que se deben de mostrar al cargar mi formulario.

Pá gina 142
Programación Windows

13.- Luego en su propiedad DataSource del DataGrid cargaremos el DataSet creado, y en su


propiedad DataMember escogeremos la Tabla Orders relacionada con la Tabla Employees.

14.- Luego en el evento Load del Formulario escribiremos el siguiente código para cargar los 2
SqlDataAdapter al DataSet.
Private Sub Form2_Load
Me.SqlDataAdapter1.Fill(Me.DsEmployeesorders1)
Me.SqlDataAdapter2.
F ill(Me.DsEmployeesor
d ers1)
End Sub
15.- Al final ejecutamos y se debe
mostrar de la siguiente manera,

Pá gina 143
Programación Windows

escogemos un empleado en el ListBox, y en el Datagrid se debe mostrar las ordenes emitidas por ese
empleado.

El Objeto DataView
 ¿Qué es el Objeto DataView?
 ¿Para que Sirve?
 Propiedad Sort y RowFilter
 Navegación de Registros
(Control BindingSource)
 DataBinding y BindingContext

Pá gina 144
Programación Windows

El objeto DataView
El objeto DataView permite manejar dentro de una aplicación la información que recibe un objeto
DataSet.
La información que recibe un DataSet se almacena en forma predeterminada en un objeto DataTable
y esta la podemos enviar al objeto DataView para manejarla y presentarla de muchas formas.
El objeto DataView se puede enlazar a controles y mostrarla ordenada o filtrada, es decir, crear un
subconjunto de los datos obtenidos.
Una de las formas de crear un objeto DataView es la siguiente:
Dim Nombre as New DataView
Una vez creado el objeto DataView se utiliza su propiedad Table para enviarle información que tiene
el Objeto DataSet mediante su objeto DataTable.
La siguiente instrucción envía el objeto DataView la información que contiene el objeto DataTable
llamado Empleados de DataSet Ds.
MiDataView.Table=Ds.Tables(“Empleados”)

Principales Propiedades del Objeto DataView


AllowDelete : Permite que se pueda eliminar o no registros del DataView
AllowEdit: Permite que se pueda editar la información del DataView
AllowAddNew: Permite que pueda o no agregar nuevos registros al DataView.
Count: Devuelve la cantidad de registros que contiene el DataView
Item: Permite acceder a la información de una fila del DataView. La primera fila tiene el número 0
(cero). Para acceder a la información de una columna, podemos usar también la propiedad Item de
esta propiedad utilizando el número de la columna o su nombre. La primera columna tiene el número
0 (cero).
RowFilter: Esta propiedad se utiliza cuando deseamos seleccionar los registros del DataView. Aquí
se escribe la condición que deben cumplir los registros.
Por Ejemplo:
La siguiente instrucción sólo selecciona en el DataView las personas cuyo nombre empieza con Ca:
MiDataView.RowFilter=”Nombre like ‘Ca%’”
Sort: Esta propiedad se utilize para indicar la columna por la cual se debe de ordenar la información
del DataView.
Por ejemplo, la siguiente instrucción ordena por la columna Nombre la información del DataView.
MiDataView.Sort=”Nombre”

Pá gina 145
Programación Windows

Ejercicio Práctico Nº1

1.- Diseñar el siguiente Formulario.


BtnMostrar

2.- Luego codificaremos lo siguiente:


TxtPrecio LblTotal
Imports System.Data
Imports System.Data.SqlClient TxtProducto
TxtStock
Public Class Form1
'Declaro mi cadena de conexión
Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated
Security=SSPI")
'Declaro mi DataAdapter
Dim da As New SqlDataAdapter("Select * from Products", cn)
'Declaro mi DataSet
Dim ds As New DataSet
'Declaro mi vista
Dim midataview As New DataView

Private Sub BtnMostrar_Click


da.Fill(ds, "Productos")
'Le asigno una tabla
midataview.Table = ds.Tables("Productos")
'Ordena los registros por el campo Productname
midataview.Sort = "ProductName"
Me.DataGridView1.DataSource = midataview
Me.lbltotal.Text = "Son " & midataview.Count & " registros"
End Sub

Private Sub DataGridView1_DoubleClick(ByVal sender As Object, ByVal e As


System.EventArgs) Handles DataGridView1.DoubleClick
'Si la fila que selecciono Si contiene algo entonces...
If Not IsDBNull(Me.DataGridView1.SelectedCells(0).Value) Then
Me.txtproducto.Text =
midataview.Item(Me.DataGridView1.CurrentRow.Index).Item("Productname")
Me.txtprecio.Text =
midataview.Item(Me.DataGridView1.CurrentRow.Index).Item("Unitprice")
Me.txtStock.Text =
midataview.Item(Me.DataGridView1.CurrentRow.Index).Item("UnitsInStock")
End If
End Sub
End Class

Pá gina 146
Programación Windows

Ejercicio Práctico Nº2

1.- Diseñar el siguiente Formulario.

BtnCon1

BtnCon2

DataGridView

Imports System.Data
Imports System.Data.SqlClient

Public Class Form2


Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated
Security=SSPI")
Dim da As New SqlDataAdapter("Select Productid,Productname,Unitprice, UnitsInStock from
Products", cn)
Dim ds As New DataSet
Dim dv As New DataView

Private Sub Form2_Load


'Cargamos nuestra Vista
da.Fill(ds, "Productos")
dv.Table = ds.Tables("Productos")
End Sub

Private Sub btnCon1_Click


'Condicion de Filtrado
dv.RowFilter = "ProductName like 'C%'"
Me.DataGridView1.DataSource = dv
End Sub

Private Sub btnCon2_Click


'Condicion de Filtrado
dv.RowFilter = "Unitprice=18 and Productname like 'S%'"
Me.DataGridView1.DataSource = dv
End Sub

End Class

Pá gina 147
Programación Windows

Ejercicio Práctico Nº3

1.- Diseñar el siguiente Formulario.


TxtProducto

DataGridView

Imports System.Data
Imports System.Data.SqlClient

Public Class Form3


Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated
Security=SSPI")
Dim da As New SqlDataAdapter("Select Productid,Productname,Unitprice, UnitsInStock from
Products", cn)
Dim ds As New DataSet
Dim dv As New DataView

Private Sub Form3_Load


'Se llena la vista
da.Fill(ds, "Productos")
dv.Table = ds.Tables("Productos")
End Sub

Private Sub txtproducto_TextChanged


'La condicion de filtrado se concaneta o se une
'con lo que se escriba en la caja TxtProducto
'Entonces la condicion de filtrado lo pone la caja de Texto
dv.RowFilter = "Productname like '" & Me.txtproducto.Text & "%'"
Me.DataGridView1.DataSource = dv
End Sub
End Class

Pá gina 148
Programación Windows

Usando el Control BindingSource


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

Control de un Formulario

BindingSource

Origen de Datos

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

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

Pá gina 149
Programación Windows

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

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

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

Pá gina 150
Programación Windows

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

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

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

Pá gina 151
Programación Windows

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

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

TxtCodigo

TxtNombre

TxtDireccion

TxtRegistro TxtTelefono

BtnPrimero
BtnUltimo

BtnAnterior
BtnSiguiente

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

Pá gina 152
Programación Windows

12.- Luego crearemos el siguiente procedimiento a nivel formulario.


Private Sub mostrarposicion()
Dim itotal As Integer = Me.BindingSource1.Count
Dim ipos As Integer
If itotal = 0 Then
txtregistro.Text = "No Regsitros"
Else
ipos = Me.BindingSource1.Position + 1
txtregistro.Text = ipos.ToString & " de " & itotal.ToString
End If
End Sub

13.- Luego escribiremos el siguiente código para los botones de desplazamiento y para el evento
Load del Formulario
Private Sub Form1_Load
'TODO: esta línea de código carga datos en la tabla 'DsSuppliers.Suppliers' Puede moverla o
quitarla según sea necesario.
Me.SuppliersTableAdapter.Fill(Me.DsSuppliers.Suppliers)
mostrarposicion()
End Sub
Private Sub btnprimero_Click
Me.BindingSource1.MoveFirst()
mostrarposicion()
End Sub
Private Sub btnanterior_Click
Me.BindingSource1.MovePrevious()
mostrarposicion()
End Sub
Private Sub btnsiguiente_Click
Me.BindingSource1.MoveNext()
mostrarposicion()
End Sub

Pá gina 153
Programación Windows

Private Sub btnultimo_Click


Me.BindingSource1.MoveLast()
mostrarposicion()
End Sub

14.- Por ultimo ejecutamos la aplicación y se debe mostrar como la figura.

DataBinding y BindingContext
Los controles que con regularidad se utilizan en aplicaciones  Windows así como en aplicaciones
Web tienen la propiedad DataBinding, es necesario configurar la propiedad de cada control que
contendrá en enlace a los datos, luego para administrar esta se debe utilizar la propiedad
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 instrucción:
txtNombre.DataBindings.Add("Text", dtEmpleados, "FirstName")
Luego para administrar por ejemplo la posición actual o lo que es lo mismo el registro activo se
utiliza la siguiente instrucción:
Me.BindingContext(dtEmpleados).Position = 0
Note en la instrucción anterior que se utiliza ña propiedad BindingContext del formulario, como lo
dicho en líneas arriba, la propiedad Position va a mantener sincronizados todos los controles
enlazados al DataTable dtEmpleados.

Pá gina 154
Programación Windows

Ejemplo:
Realizar el Siguiente Diseño:

txtCodigo
txtproducto

txtprecio

txtstock

btnprimero btnultimo
btnanterior LblTotal btnsiguiente

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á gina 155
Programación Windows

Private Sub Form1_Load


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

Consultas con Procedimientos


Almacenados con Parámetros
 La Clase Command
 Búsqueda de Clientes
 Consultas de Fechas
 Trabajo de Consultas con
parámetros.

Pá gina 156
Programación Windows

Las clases Command


Establecida una conexión con un almacén de datos, la siguiente operación lógica consiste en enviarle
sentencias para realizar los distintos tipos de operaciones que habitualmente realizamos con los datos.
Las clases Command de ADO .NET serán las usaremos para realizar tales operaciones.
SqlCommand y OleDbCommand, son muy similares al objeto Command existente en ADO. El
objeto Command nos va a permitir ejecutar una sentencia SQL o un procedimiento almacenado sobre
la fuente de datos a la que estamos accediendo.
A través de un objeto Command también podremos obtener un conjunto de resultados del almacén de
datos. En este caso, los resultados se pasarán a otros objetos de ADO .NET, como DataReader o
DataAdapter; estos dos objetos los comentaremos más adelante.
Un objeto Command lo vamos a crear a partir de una conexión ya existente, y va a contener una
sentencia SQL para ejecutar sobre la conexión establecida con el origen de datos.
Entre las propiedades que ofrecen los objetos SqlCommand y OleDbCommand, caben destacar las
siguientes.
 CommandText. Contiene una cadena de texto que va a indicar la sentencia SQL o
procedimiento almacenado que se va a ejecutar sobre el origen de los datos.
 CommandTimeout. Tiempo de espera en segundos que se va a aplicar a la ejecución de un
objeto Command. Su valor por defecto es de 30 segundos.
 CommandType. Indica el tipo de comando que se va a ejecutar contra el almacén de datos,
es decir, indica como se debe interpretar el valor de la propiedad CommadText. Puede tener
los siguientes valores: StoredProcedure, para indicar que se trata de un procedimiento
almacenado; TableDirect se trata de obtener una tabla por su nombre (únicamente aplicable al
objeto OleDbCommand); y Text que indica que es una sentencia SQL. EL valor por defecto
es Text.
 Connection. Devuelve el objeto SqlConnection o OleDbConnection utilizado para ejecutar el
objeto Command correspondiente.
 Parameters. Colección de parámetros que se pueden utilizar para ejecutar el objeto
Command, esta colección se utiliza cuando deseamos ejecutar sentencias SQL que hacen uso
de parámetros, esta propiedad devuelve un objeto de la clase SqlParameterCollection o un
objeto de la clase OleDbParameterCollection. Estas colecciones contendrán objetos de la
clase SqlParamter y OleDbParameter, respectivamente, para representar a cada uno de los
parámetros utilizados. Estos parámetros también son utilizados para ejecutar procedimientos
almacenados.

Pá gina 157
Programación Windows

Una vez vistas algunas de las propiedades de las clases SqlCommand y OleDbCommand,
vamos a pasar a comentar brevemente los principales métodos de estas clases.

Ejercicio Practico Nº1


En este ejemplo veremos como el Command llama a un procedimiento almacenado creado en la
Base de datos Northwind. BtnMostrar

1.- Agregamos un formulario con


el siguiente diseño.
DataGridView1

DataGridView2

2.- Luego hacemos la conexión


con SQL, pero antes importamos DataGridView3
los namespace.
Imports System.Data
Imports System.Data.SqlClient
Public Class Form2
Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated
Security=True")

3.- Después creamos un procedimiento almacenado llamado ListarTablas


CREATE PROCEDURE ListarTablas
AS
Select Categoryid,Categoryname from Categories
Select Productid,Productname,Unitprice from Products
Select Supplierid,CompanyName, City, Country from Suppliers

RETURN

Pá gina 158
Programación Windows

4.- Luego en el Botón BtnMostrar codificamos lo siguiente.


Private Sub BtnMostrar_Click
Dim comando As New SqlCommand("ListarTablas", cn)
comando.CommandType = CommandType.StoredProcedure
Dim da As New SqlDataAdapter(comando)
Dim ds As New DataSet
da.Fill(ds)
ds.Tables(0).TableName = "Categoria"
ds.Tables(1).TableName = "Producto"
ds.Tables(2).TableName = "Proveedor"
Me.DataGridView1.DataSource = ds.Tables("Categoria")
Me.DataGridView2.DataSource = ds.Tables("Producto")
Me.DataGridView3.DataSource = ds.Tables("Proveedor")
End Sub

Ejercicio Practico Nº2


En este ejemplo trabajaremos con el ComboBox y dos propiedades del mismo:
ValueMember: Sirve para guardar un campo especifico cuando se elige un elemento del
ComboBox.
SelectedValue: Sirve para devolver el valor guardado en la propiedad ValueMember.

1.- Diseñamos el siguiente formulario.

BtnVer

ComboBox

DataGridView

Pá gina 159
Programación Windows

2.- Luego en declaraciones generales importamos lo siguiente.


Imports System.Data
Imports System.Data.SqlClient
3.- Luego a nivel formulario creamos la conexión.
Public Class Form3
Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated
Security=True")

4.- En el evento load del formulario codificamos lo siguiente.


Private Sub Form3_Load
Dim cmd As New SqlCommand("Select * from Categories", cn)
Dim da As New SqlDataAdapter(cmd)
Dim ds As New DataSet
da.Fill(ds, "Categorias")
Me.ComboBox1.DataSource = ds.Tables("Categorias")
Me.ComboBox1.ValueMember = "CategoryId"
Me.ComboBox1.DisplayMember = "CategoryName"
End Sub
Private Sub Btnver_Click
Dim cmd As New SqlCommand("Select * from products where categoryid=" &
Me.ComboBox1.SelectedValue, cn)
Dim da As New SqlDataAdapter(cmd)
Dim ds As New DataSet
da.Fill(ds, "Productos")
Me.DataGridView1.DataSource = ds.Tables("Productos")
End Sub
6.- Por último ejecutamos y se debe de mostrar de la siguiente manera.

Pá gina 160
Programación Windows

Consultas con Procedimientos Almacenados


1ra. Consulta
1.- Crear el siguiente procedimiento almacenado.
CREATE PROCEDURE BuscarClientes
@cliente varchar(20)
AS
select customerid,companyname,city,country
from customers
where companyname like @cliente + '%'
return

2.- Luego diseñar el siguiente formulario:

3.- Hacemos la conexión con la Base de Datos.


Imports System.Data
Imports System.Data.SqlClient
Public Class Form1
Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated
Security=True")

4.- En el evento Load del Formulario.


Private Sub Form1_Load
'Da el ancho de las Columnas Automáticamente deacuerdo a sus contenidos
Me.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
Dim cmd As New SqlCommand("Select customerid,companyname,city,country from
Customers", cn)
Dim da As New SqlDataAdapter(cmd)
Dim dt As New DataTable
da.Fill(dt)
Me.DataGridView1.DataSource = dt
End Sub

Pá gina 161
Programación Windows

5.- En el evento TextChange del TxtCliente


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

2da. Consulta
1.- Crear el siguiente procedimiento
almacenado.

CREATE PROCEDURE BuscarPorFechas


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

Pá gina 162
Programación Windows

Public Class Form2


Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True")

3.- En el evento ValueChanged del DataTimePicker


Private Sub dtpfecha_ValueChanged
Dim cmd As New SqlCommand("BuscarPorFechas", cn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@fecha", SqlDbType.DateTime).Value = Me.dtpfecha.Value
Dim da As New SqlDataAdapter(cmd)
Dim ds As New DataSet
da.Fill(ds, "Fecha")
Me.DataGrid1.DataSource = ds.Tables("Fecha")
End Sub

4.- Luego ejecutamos la aplicación.

Entorno Conectado
ExecuteNonQuery y ExecuteScalar -
Mantenimiento de una Tabla

Pá gina 163
Programación Windows

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

Accediendo a Entornos Conectados


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

Pá gina 164
Programación Windows

Instrucción Execute NonQuery


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

Abrir y Cerrar una Conexión Ejecutando el SQLCommand


1.- Crearemos el siguiente procedimiento almacenado:
CREATE PROCEDURE CrearTablaContactos
AS
Create table Contactos
(
CodContacto int identity(1,1),
CodEmpleado int not null,
Fecha Datetime
)
RETURN
2.- Luego en nuestro formulario insertaremos un
Button y quedará de la siguiente manera.

3.- Luego hacemos la conexión vía script.


Imports System.Data.SqlClient
Public Class Form1
Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated
Security=True")

Pá gina 165
Programación Windows

4.- Luego en el Button codificamos lo siguiente.


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

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

Pá gina 166
Programación Windows

Insertar Registros a una Tabla


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

TxtProducto
btnAgregar

btnLimpiar

TxtProveedor TxtCategoria

3.- Hacemos la Conexión.


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

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

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

Pá gina 168
Programación Windows

En este caso, el valor devuelto será del tipo Int32 y será el número de filas que hay en la tabla Prueba
de la base de datos indicada en el objeto Connection que previamente habremos abierto que tenga
una fecha igual o superior a la indicada en el parámetro proporcionado a ese comando. Si no hay
ninguna fila que cumpla ese criterio, devolverá cero. 

Nota:
Instrucciones de SQL no significa que hay que usarlo con SQL Server, sino que son instrucciones en
"lenguaje" SQL, que en SQL Server se conoce como T-SQL o Transact SQL, y que por tanto
podemos usar con cualquier tipo de base de datos, (o casi).

Ejercicio Práctico Nº1

Txtpro BtnProductos

BtnEmpleados

Txtemp

Imports System.Data
Imports System.Data.SqlClient

Dim cn As New SqlConnection("Server=(local); Database=Northwind; Integrated Security=True")


Private Sub Btnproductos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
Dim cmd As New SqlCommand("Select count(*) from products", cn)
cn.Open()
Dim x As Integer
x = cmd.ExecuteScalar
Me.txtpro.Text = x.ToString
cn.Close()
End Sub

Pá gina 169
Programación Windows

Private Sub BtnEmpleados_Click(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles Button2.Click
Dim cmd As New SqlCommand("Select count(*) from employees", cn)
cn.Open()
Dim y As Integer
y = cmd.ExecuteScalar
Me.txtemp.Text = y.ToString
cn.Close()
End Sub

Mantenimiento de la Tabla Shippers (Empresa)


1.- Diseñar el siguiente Formulario.

BtnNuevo

TxtCod
BtnGuardar

TxtEmp BtnModificar

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á gina 170
Programación Windows

Private Sub Form1_Load


filtrar()
End Sub

Private Sub BtnGuardar_Click


Try
Dim cmd As New SqlCommand("Insert Into Shippers Values(@empresa,@telefono)", cn)
cmd.Parameters.Add("@empresa", SqlDbType.VarChar, 40).Value = Me.txtemp.Text
cmd.Parameters.Add("@telefono", SqlDbType.VarChar, 9).Value = Me.txtTel.Text
cn.Open()
cmd.ExecuteNonQuery()
MsgBox("Empresa Registrada...!", MsgBoxStyle.Information, "SISE")
filtrar()
Catch ex As Exception
MsgBox(ex.Message)
Finally
cn.Close()
End Try

Dim x As Integer
Dim cmd1 As New SqlCommand("Select max(shipperid) from Shippers", cn)
cn.Open()
x = cmd1.ExecuteScalar
Me.txtcod.Text = x.ToString
cn.Close()

End Sub

Private Sub BtnActualizar_Click


Try
Dim cmd As New SqlCommand("Update Shippers Set
CompanyName=@empresa,Phone=@telefono where Shipperid=@codigo", cn)
cmd.Parameters.Add("@empresa", SqlDbType.VarChar, 40).Value = Me.txtemp.Text
cmd.Parameters.Add("@telefono", SqlDbType.VarChar, 9).Value = Me.txtTel.Text
cmd.Parameters.Add("@codigo", SqlDbType.Int).Value = CInt(Me.txtcod.Text)
cn.Open()
cmd.ExecuteNonQuery()
MsgBox("Datos Actualizados...!", MsgBoxStyle.Information, "SISE")
filtrar()
Catch ex As Exception
MsgBox(ex.Message)
Finally
cn.Close()
End Try
End Sub
Private Sub BtnEliminar_Click
Try
Dim cmd As New SqlCommand("Delete from Shippers where Shipperid=@codigo", cn)
cmd.Parameters.Add("@codigo", SqlDbType.Int).Value = Me.txtcod.Text
cn.Open()
cmd.ExecuteNonQuery()

Pá gina 171
Programación Windows

MsgBox("Empresa Eliminada...!", MsgBoxStyle.Information, "SISE")


filtrar()
Catch ex As Exception
MsgBox(ex.Message)
Finally
cn.Close()
End Try
End Sub

Private Sub DgvEmpresa_DoubleClick


If Not IsDBNull(Me.DgvEmpresa.SelectedCells(0).Value) Then
Me.txtcod.Text = Me.DgvEmpresa.SelectedCells(0).Value
Me.txtemp.Text = Me.DgvEmpresa.SelectedCells(1).Value
Me.txtTel.Text = Me.DgvEmpresa.SelectedCells(2).Value
End If
End Sub

Private Sub BtnNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles Button1.Click
Me.txtcod.Clear()
Me.txtemp.Clear()
Me.txtTel.Clear()
End Sub
End Class

El Control DataGridView

 ¿Qué es un DatagridView?
 ¿Arquitectura del DataGridView?
 Ejemplo Práctico

Pá gina 172
Programación Windows

Arquitectura de un Control DataGridView


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

1.- Diseñar el siguiente formulario.

CboOrden

CboProducto
TxtPre

TxtCan

DgvProductos

Imports System.Data
Imports System.Data.SqlClient

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

Private Sub Form3_Load


Dim dr As SqlDataReader
Dim cmd As New SqlCommand("Select * from orders", cn)
cn.Open()
dr = cmd.ExecuteReader
Do While dr.Read
Me.cboorden.Items.Add(dr("OrderId"))
Loop
dr.Close()
cn.Close()

Dim cmd2 As New SqlCommand("Select * from products", cn)


Dim da As New SqlDataAdapter(cmd2)
Dim dt As New DataTable
da.Fill(dt)
Me.cboproducto.DataSource = dt
Me.cboproducto.DisplayMember = "Productname"
Me.cboproducto.ValueMember = "Productid"

Me.dgvdetalle.Columns(0).Width = 45
Me.dgvdetalle.Columns(1).Width = 45
Me.dgvdetalle.Columns(2).Width = 90
Me.dgvdetalle.Columns(3).Width = 60
Me.dgvdetalle.Columns(4).Width = 60
Me.dgvdetalle.Columns(5).Width = 60

Me.cboproducto.Text = ""
Me.txtpre.Clear()
End Sub

Private Sub cboproducto_SelectedIndexChanged


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

Pá gina 174
Programación Windows
End Sub

Private Sub btnagregar_Click


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

Private Sub btneliminar_Click


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

Private Sub btnguardar_Click


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

Pá gina 175
Programación Windows

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

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

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

Pá gina 176
Programación Windows

Variable=Objeto SQLCommand.ExecuteReader
Ejemplo:
Dr=CmdClientes.ExecuteReader
Ejercicio Practico Nº1 BtnVer

LstClientes

Imports System.Data
Imports System.Data.SqlClient

Public Class Form1


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

Pá gina 177
Programación Windows

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

PictureBox1 TxtUsuario
Y PictureBox2

TxtContraseñ a

ProgressBar1

BtnIngresar
BtnSalir

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

3.- Cargamos una imagen para cada PictureBox

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

Imports System.Data
Imports System.Data.SqlClient
Public Class Form1
Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated
Security=True")

5.- En el Evento Load del Formulario codificamos:

Private Sub Form1_Load


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

Pá gina 178
Programación Windows

6.- En el Botón BtnIngresar codificamos:

Private Sub btningresar_Click

Dim cmd As New SqlCommand("Select Employeeid, LastName, FirstName, Extension from Employees
where LastName='" & Me.txtusuario.Text & "'", cn)
Dim dr As SqlDataReader
cn.open()
dr = cmd.ExecuteReader
If dr.Read() Then
If dr("Extension") = Me.txtcontraseña.Text Then
Me.Timer1.Enabled = True
Else
MsgBox("Contraseña Incorrecta")
End If
Else
MsgBox("Usuario No Existe")
End If
cn.Close()
End Sub

7.- Luego en el Evento Tick del Timer1, codificamos lo siguiente (Este Timer es para el control del ProgressBar)

Private Sub Timer1_Tick


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

Private Sub Timer2_Tick


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

Private Sub Button1_Click


Me.Close()
End Sub

10.- En el evento Load del MdiParent1 codificamos:

Private Sub MDIParent1_Load


Form1.Hide()
End Sub

Pá gina 179
Programación Windows

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

1 2

Crear Proyectos de Instalación


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

Pá gina 180
Programación Windows

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

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

Vista: Sistema de Archivos

En esta vista se muestran 3 carpetas que representan a las carpetas de la maquina en donde se
instalara el Aplicativo.

Carpeta de la Aplicación= Representa a la carpeta en donde el Usuario escogió instalar el


Aplicativo, por defecto será Archivos de Programa. Es aquí donde debemos agregar el Ejecutable,
sus dependencias y los demás archivos necesarios para que el aplicativo funcione bien.
Escritorio del Usuario= Representa al Escritorio de la Maquina Cliente, aquí colocaremos los
accesos directos.

Pá gina 181
Programación Windows

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

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

Pá gina 182
Programación Windows

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

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

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

Pá gina 183
Programación Windows

Vista Interfaz de Usuario


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

Pá gina 184
Programación Windows

Vista Acciones personalizadas


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

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

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

Vista Condiciones de Inicio


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

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

Pá gina 185
Programación Windows

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

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

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

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


Debug.

Pá gina 186

You might also like