aplicacion de vb.net 2003
-
Upload
jean199125 -
Category
Documents
-
view
2.141 -
download
13
Transcript of aplicacion de vb.net 2003
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ónVisual 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
Aplicaciones Visual Basic
Aplicaciones Visual C#Aplicaciones Visual C++
Código de la plataforma .NET
.NET Framew
orkBiblioteca de clases
Window
sServicios W
eb XML
AD
O.N
ETTipos de datos
Common Language Runtime
El código fuente se compila como MSILEl código fuente se compila como MSIL
Servicios de programació
n
Servicios de programació
n
El compilador JIT producelenguaje máquina
El compilador JIT producelenguaje máquina
Programación Windows
tradicionales hasta las aplicaciones basadas en las últimas innovaciones proporcionadas por
ASP.NET y los servicios Web XML.
Formas de Ingreso al EntornoHay 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
TxtNombreLblNombre
BtnMensaje
TxtTexto
btnColorTexto
btnColorFondo
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:
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:
2.- Luego codificamos lo siguiente en el evento click de los botones:
Página 9
Txt1
Txt2
BtnMultiplicar
TxtRes
BtnNuevo
BtnPotencia
BtnSuma
BtnResta
BtnDividir
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:
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
TxtUsu
TxtPas
BtnSalirBtningresar
Programación Windows
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 DatosEl 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 VariablePágina 15
PictureBox1
BtnImagen1
BtnImagen2
BtnImagen3
BtnImagen4
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
2.- Luego codificamos lo siguienteImports 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 Class3.- 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ónEn 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...ElseLas 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 ThenstatementsElsestatementsEnd If
Ejercicio Práctico Nº2
1.- Diseñar el siguiente formulario
Página 17
TxtUsuario
TxtPassword
ProgressBar1BtnIngresar
Programación Windows
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
TxtAlu
LstCursos
TxtNPTxtEP
TxtEF
TxtProm
LblCon
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
1.- Diseñar el siguiente formulario
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
BuclesEs 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
TxtNum
BtnCalcular
BtnLimpiar
ListBox3
ListBox2
ListBox1
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…NextUna 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
2.- Codificaremos lo siguiente en los siguientes eventos:
Página 22
btnLimpiar
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
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
BtnWhile
BtnUntil
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º31. - Diseñar el siguiente formulario
En el método clic del BtnWhile
Dim entrada as String
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
2.- Luego codificaremos lo siguiente.
Página 26
Programación Windows
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
TxtFechaSis
TxtHoraSis
TxtNF
DtpFechaBtnDife
BtnNumMes
TxtFechaIng
TxtFechaConver
Programación Windows
Funciones Cronológicas
Ejercicio Práctico Nº2
1.- Diseñar el siguiente formulario
Página 28
TxtDI
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º11.- Agregar una clase la cual se llamara CLSOPERACIONESPublic 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 FunctionPublic 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 SubEnd Class
2.- Luego Agregaremos un Modulo y codificaremos lo siguiente.
Public obj As New clsoperaciones
Página 30
Button1Button3
Button5Button4
Button7Button6
Button2
Programación Windows
3. - Diseñaremos los siguientes formularios.
Private Sub BtnCalcular_Click Me.Label1.Text = obj.promedio(Me.txtN1.Text, Me.txtN2.Text, Me.txtN3.Text)End Sub
Private Sub BtnConsultar_Click Me.Label1.Text = obj.parimpar(Me.TextBox1.Text)End Sub
Private Sub BtnCalcular_Click Dim num1, num2, hipo As Single num1 = InputBox("Ingrese lado A del Triangulo: ") num2 = InputBox("Ingrese lado B del Triangulo: ") hipo = obj.hipotenusa(num1, num2) MessageBox.Show("La Hipotenusa del Triangulo rectángulo es " & hipo)End Sub
Private Sub BtnLimpiar_Click obj.limpiar(Me)End Sub
Sub habilitar(ByVal sw As Boolean) Me.Button1.Enabled = sw Me.Button2.Enabled = Not sw Me.Button3.Enabled = sw Me.Button4.Enabled = Not sw Me.Button5.Enabled = sw Me.Button6.Enabled = Not sw Me.Button7.Enabled = sw End Sub
Private Sub Button6_Click habilitar(True) End Sub
Private Sub Button7_Click habilitar(False) 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
TxtNombres
BtnAgregar
BtnMostrar
BtnLimpiarLstNombres
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
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
txtnombre
txtcurso
txtpromediobtnagregar
btnconsultar
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 DatosAlumnosEnd Module
2.- Luego diseñar el siguiente formulario
3.- En el evento click del botón btnagregar codificaremos lo siguiente
Private Sub btnagregar_Click '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
txtconsulta
txtcodigo
txtnombre
txtcurso
txtpromediobtninscribir
btnconsultar
Programación Windows
4.- Luego diseñaremos el siguiente formualrio.
5.- Luego en el evento load del formulario frmconsulta.
Private Sub Frmconsulta_Load Frminscribir.Hide() End Sub
Private Sub btnconsultar_Click Dim mialumno As DatosAlumnos Dim x As String = txtconsulta.Text 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 SubPrivate 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
CboCiudad
TxtTotal
TxtCiudad
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:
Public Class Form1 'Declaramos nuestro ArrayList Dim lista As New ArrayList()
Private Sub Form1_Load 'Agregamos elementos a nuestro ArrayList 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 SubEnd Class
La Clase HashTablePágina 42
TxtCod
TxtNom
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:
Página 43
ListView1
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 SubEnd Class
La Clase SortedListEsta 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
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
1.- Diseñar el siguiente formulario.
Página 46
Programación Windows
2.- Codificaremos lo siguiente.
'Importamos el namespace para TrheadingImports 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 SubEnd Class
BackgroundWorkerPara 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.
RunWorkerCompleted...se terminó la ejecución de la tarea. La terminación puede deberse a que la
ejecución se completó o a que esta fue cancelada.
A traves del método RunWorkerAsync() le indicamos al BackgroundWorker que se debe iniciar la
ejecución de una tarea. Imediatamente luego de su ejecución, se produce el evento DoWork, y es ahi
donde debemos indicarle que hacer. Durante la ejecución podemos utilizar el método
ReportProgress() para lanzar el evento ProgressChanged, el cual podemos utilizar para actualizar un
contador, una barra de progreso o simplemente para hacer alguna otra tarea.
Si lo deseamos podemos utlizar el método CancelAsync() para cancelar la ejecución de la tarea, pero
cabe aclarar que la simple ejecución del método no cancela la tarea sino que setea en true la
propiedad CancellationPending del BackgroundWorker. Nosotros 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.ComponentModelPublic Class Form2
Página 48
TxtNombre
TxtArchivo
Programación Windows
Public Sub Calculo_1(ByVal hilotr1 As BackgroundWorker, ByVal e As DoWorkEventArgs) 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(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 SubEnd Class
Practica de Laboratorio
Implementando MultiThread y
Control de Excepciones
1.- Se va a crear una aplicación en la que
se implemente múltiples Threads para
iniciar la lectura de un archivo de
texto extenso y poder cancelar este
proceso si es necesario. Además para
evitar los errores en tiempo de
ejecución haremos uso del control
estructurado de excepciones.
2.- Diseñar el siguiente formulario.
3.- Codificaremos lo siguiente:
Public Class frmarchivo
Página 49
Programación Windows
'Creamos un Thread llamado Hilo Dim hilo As System.Threading.Thread '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()
Página 50
Programación Windows
Me.txtnombre.Focus() End Sub
Private Sub btnsuspender_Click 'Detiene la ejecucion del Thread hilo.Suspend() Me.btnleer.Enabled = False Me.btncontinuar.Enabled = True Me.btncancelar.Enabled = False End Sub
Private Sub btncontinuar_Click 'Reinicia la ejecucion del Thread hilo.Resume() End Sub Private Sub BtnVerificar_Click 'Verifica el estado de ejecucion del Thread If hilo.IsAlive() Then 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
Página 51
Programación Windows
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.
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 XMLLa 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
Página 52
TxtnomPro
TxtDescripcion
TxtCantidadBtnSerializar
BtnDeSerializar
Programación Windows
Get nombre = vname End Get 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
End Class
4.- Luego diseñaremos el siguiente formulario.
Imports System.IO'Importamos el NameSpace que me permitira la SerializacionImports 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)
Página 53
Programación Windows
'Lugar donde se creara el archivo XML Dim archivo As New StreamWriter("C:\Producto.xml") 'Crea el archivo XML en el lugar donde se le indica 'Y la clase a Serializar x.Serialize(archivo, p) archivo.Close()
MsgBox("Objeto XML creado", MsgBoxStyle.Information, "Serializacion")
End Sub
Private Sub BtnDeSerializar_Click Try Dim x As New XmlSerializer(p.GetType) 'Archivo XML que se Desearilizar Dim archivodes As New StreamReader("C:\Producto.xml") 'Variable que contendra la clase deserializada Dim p2 As New clsproductos 'Direccion del archivo a Deserealizar p2 = x.Deserialize(archivodes) archivodes.Close() MsgBox("Nombre:" & p2.nombre & vbCrLf & "Descripcion:" & p2.descripcion & vbCrLf & "Cantidad:" & CStr(p2.cantidad)) Catch ex As Exception MsgBox("El Archivo no Existe", MsgBoxStyle.Information, "Deserializacion") End Try End SubEnd 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
Página 55
TxtCarpeta
TxtArchivo
Programación Windows
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.
Algunas Clases de System.IO
Clase Descripción
DirectoryExpone métodos estáticos para crear, mover y enumerar archivos en directorios y subdirectorios
DirectoryInfoExpone métodos de instancia para crear, mover y enumerar archivos en directorios y subdirectorios.
File
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 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.
FileInfoProporciona métodos de instancia para crear, copiar, eliminar, mover y abrir archivos y contribuye a la creación de objetos FileStream.
FileStreamExpone un objeto Stream alrededor de un archivo; se admiten operaciones de lectura y escritura sincrónica y asincrónica. Un objeto Stream proporciona una vista genérica de una secuencia de bytes.
PathEjecuta operaciones en instancias de String que contienen información de 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
formulario.
Página 56
TxtArchi
TxtTexto
Programación Windows
2.- Luego codificaremos lo siguiente:
'Importamos el namesapce que nos permitira'manejar archivos, carpetas y unidadesImports System.IOPublic 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 SubEnd Class
Ejercicio Práctico Nº3
1.- Diseñar el siguiente formulario.
2.- Luego codificaremos lo siguiente:
'Importamos el namesapce que nos permitira'manejar archivos, carpetas y unidadesImports System.IOPublic Class Form3
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 SubEnd Class
Ejercicio Práctico Nº4
1.- Diseñar el siguiente formulario.
'Importamos el namesapce que nos permitira'manejar archivos, carpetas y unidadesImports System.IOPublic 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 SubEnd 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
Página 58
BtnMostrar
Programación Windows
Cuadros de Diálogos (OpenFileDialog, ColorDialog, FontDialog)
Ejercicio Práctico Nº1
(Explorador)
1.- Diseñar el siguiente
formulario.
2.- Luego codificaremos lo siguiente.
'Importación de la Clase Imports System.IOPublic 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
Página 60
LstAdjuntar
TxtPara
TxtDe
TxtAsunto BtnQuitar
Programación Windows
'Variable a la cual se le dira de que unidad y carpeta 'se va a buscar el archivo existente. Dim informacion As New FileInfo(Path.Combine(Path.Combine(unidad, carpeta), archivo))
'Se agregara al ListBox la informacion del archivo correspondiente Me.lstinformacion.Items.Add("Nombre:" & informacion.Name) Me.lstinformacion.Items.Add("Tamaño(Bytes): " & informacion.Length) Me.lstinformacion.Items.Add("Fecha de Creación: " & informacion.CreationTime.ToShortDateString) End Sub
End Class
3.- Ejecutaremos y deberá aparecer como se muestra en la figura.
Ejercicio Práctico Nº2 (Envió de Mensaje por Correo)
1.- Diseñar el siguiente formulario.
Página 61
Programación Windows
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 = "[email protected]" 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
Página 62
Programación Windows
datosadjuntos = New Net.Mail.Attachment(lstadjuntar.Items(counter)) correo.Attachments.Add(datosadjuntos) Next
'Cuerpo del correo correo.Body = txtMensaje.Text
'Mostrar como HTML correo.IsBodyHtml = True
'Prioridad de el correo correo.Priority = MailPriority.Normal
'acto 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("[email protected]", "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
Página 63
Programación Windows
MsgBox("El Archivo ya se cargo", MsgBoxStyle.Information, "Envio de Correo") End If Next End Sub
Private Sub BtnQuitar_Click_1 'Elimina el archivo adjuntado del ListBox If lstadjuntar.SelectedIndex > -1 Then lstadjuntar.Items.RemoveAt(lstadjuntar.SelectedIndex) End If End Sub
Private Sub RbColor_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 SubEnd 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 OfficeMicrosoft 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ónEste 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
btnCrear
btnAbrir
CboTamaño
CboFuente
ChkNegrita ChkCursiva
BtnGuardar
TxtDocumento
TxtContenido
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.
2.- Los combos contendrán lo siguiente:
3.- Codificaremos lo siguiente:
Página 69
Programación Windows
'Importamos el namespace para trabajar con officeImports Microsoft.Office.InteropPublic 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:
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
ListBox1
TxtMensaje
BtnMensaje
BtnMovimiento
BtnOcultar
BtnMostrar
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) NextEnd 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 'Ejecuta el Movimiento
Página 72
Programación Windows
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 ActiveXVisual 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 WebPara 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.
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
BtnIr
AxWebBrowser
TxtDir
AxWindowsMediaPlayer1
BtnVideoBtnAudio
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.
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.GlobalizationLa 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.
CurrencyDecimalSeparator
Obtiene o establece la cadena que se va a utilizar como separador decimal en valores de moneda.
CurrencyGroupSeparator Obtiene o establece la cadena que separa grupos de dígitos a la izquierda de la coma decimal en valores de moneda.
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.
Página 78
Programación Windows
NativeDigits Obtiene o establece una matriz de cadenas de dígitos nativos 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
Página 79
TxtSD
TxtSM
BtnVer
Txtnum
BtnVer
Programación Windows
de por mil.
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
formulario.
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.
Página 80
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
Página 81
Programación Windows
en minúscula asociado con un idioma, y un código de referencia cultural secundaria de dos letras en
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 cultural
Identificador de referencia cultural
Idioma-País/región
"" (cadena vacía) 0x007F referencia cultural invariableaf 0x0036 Afrikaansaf-ZA 0x0436 Afrikaans-Sudáfricasq 0x001C Albanéssq-AL 0x041C Albanés-Albaniaar 0x0001 Árabear-DZ 0x1401 Árabe-Argeliaar-BH 0x3C01 Árabe-Bahreinar-EG 0x0C01 Árabe-Egiptoar-IQ 0x0801 Árabe-Iraqar-JO 0x2C01 Árabe-Jordaniaar-KW 0x3401 Árabe-Kuwaitar-LB 0x3001 Árabe-Líbanoar-LY 0x1001 Árabe-Libiaar-MA 0x1801 Árabe-Marruecosar-OM 0x2001 Árabe-Ománar-QA 0x4001 Árabe-Qatarar-SA 0x0401 Árabe-Arabia Saudíar-SY 0x2801 Árabe-Siriaar-TN 0x1C01 Árabe-Túnez
Página 82
Programación Windows
ar-AE 0x3801 Árabe-Emiratos Árabes Unidosar-YE 0x2401 Árabe-Yemenhy 0x002B Armeniohy-AM 0x042B Armenio-Armeniaaz 0x002C Azeríaz-AZ-Cyrl 0x082C Azerí (cirílico)-Azerbaiyánaz-AZ-Latn 0x042C Azerí (latino)-Azerbaiyáneu 0x002D Vascoeu-ES 0x042D Vasco-Españabe 0x0023 Bielorrusobe-BY 0x0423 Bielorruso-Bielorrusiabg 0x0002 Búlgarobg-BG 0x0402 Búlgaro-Bulgariaca 0x0003 Catalánca-ES 0x0403 Catalán-Españazh-HK 0x0C04 Chino-Zona administrativa
especial de Hong Kongzh-MO 0x1404 Chino-Zona administrativa
especial de Macaozh-CN 0x0804 Chino-Chinazh-CHS 0x0004 Chino (simplificado)zh-SG 0x1004 Chino-Singapurzh-TW 0x0404 Chino-Taiwánzh-CHT 0x7C04 Chino (tradicional)hr 0x001A Croatahr-HR 0x041A Croata-Croaciacs 0x0005 Checocs-CZ 0x0405 Checo-República Checada 0x0006 Danésda-DK 0x0406 Danés-Dinamarcadiv 0x0065 Dhivehidiv-MV 0x0465 Dhivehi-Maldivasnl 0x0013 Holandésnl-BE 0x0813 Holandés-Bélgicanl-NL 0x0413 Holandés-Países Bajosen 0x0009 Inglésen-AU 0x0C09 Inglés-Australiaen-BZ 0x2809 Inglés-Beliceen-CA 0x1009 Inglés-Canadáen-CB 0x2409 Inglés-Caribeen-IE 0x1809 Inglés-Irlandaen-JM 0x2009 Inglés-Jamaicaen-NZ 0x1409 Inglés-Nueva Zelandaen-PH 0x3409 Inglés-Filipinasen-ZA 0x1C09 Inglés-Sudáfricaen-TT 0x2C09 Inglés-Trinidad y Tobago
Página 83
Programación Windows
en-GB 0x0809 Inglés-Reino Unidoen-US 0x0409 Inglés-Estados Unidosen-ZW 0x3009 Inglés-Zimbabueet 0x0025 Estonioet-EE 0x0425 Estonio-Estoniafo 0x0038 Feroésfo-FO 0x0438 Feroés-Islas Feroefa 0x0029 Persafa-IR 0x0429 Persa-Iránfi 0x000B Finlandésfi-FI 0x040B Finlandés-Finlandiafr 0x000C Francésfr-BE 0x080C Francés-Bélgicafr-CA 0x0C0C Francés-Canadáfr-FR 0x040C Francés-Franciafr-LU 0x140C Francés-Luxemburgofr-MC 0x180C Francés-Mónacofr-CH 0x100C Francés-Suizagl 0x0056 Gallegogl-ES 0x0456 Gallego-Españaka 0x0037 Georgianoka-GE 0x0437 Georgiano-Georgiade 0x0007 Alemánde-AT 0x0C07 Alemán-Austriade-DE 0x0407 Alemán-Alemaniade-LI 0x1407 Alemán-Liechtensteinde-LU 0x1007 Alemán-Luxemburgode-CH 0x0807 Alemán-Suizael 0x0008 Griegoel-GR 0x0408 Griego-Greciagu 0x0047 Gujaratigu-IN 0x0447 Gujarati-Indiahe 0x000D Hebreohe-IL 0x040D Hebreo-Israelhi 0x0039 Hindihi-IN 0x0439 Hindi-Indiahu 0x000E Húngarohu-HU 0x040E Húngaro-Hungríaes 0x000F Islandésis-IS 0x040F Islandés-Islandiaid 0x0021 Indonesioid-ID 0x0421 Indonesio-Indonesiait 0x0010 Italianoit-IT 0x0410 Italiano-Italiait-CH 0x0810 Italiano-Suizaja 0x0011 Japonés
Página 84
Programación Windows
ja-JP 0x0411 Japonés-Japónkn 0x004B Kannadakn-IN 0x044B Kannada-Indiakk 0x003F Kazajokk-KZ 0x043F Kazajo-Kazajistánkok 0x0057 Konkanikok-IN 0x0457 Konkani-Indiako 0x0012 Coreanoko-KR 0x0412 Coreano-Coreaky 0x0040 Kirguísky-KZ 0x0440 Kirguís-Kazajistánlv 0x0026 Letónlv-LV 0x0426 Letón-Letonialt 0x0027 Lituanolt-LT 0x0427 Lituano-Lituaniamk 0x002F Macedoniomk-MK 0x042F Macedonio-Antigua República
Yugoslava de Macedoniams 0x003E Malayoms-BN 0x083E Malayo-Brunéi Darussalamms-MY 0x043E Malayo-Malasiamr 0x004E Marathimr-IN 0x044E Marathi-Indiamn 0x0050 Mongolmn-MN 0x0450 Mongol-Mongoliano 0x0014 Noruegonb-NO 0x0414 Noruego (Bokmal)-Noruegann-NO 0x0814 Noruego (Nynorsk)-Noruegapl 0x0015 Polacopl-PL 0x0415 Polaco-Poloniapt 0x0016 Portuguéspt-BR 0x0416 Portugués-Brasilpt-PT 0x0816 Portugués-Portugalpa 0x0046 Punjabipa-IN 0x0446 Punjabí-Indiaro 0x0018 Rumanoro-RO 0x0418 Rumano-Rumaníaru 0x0019 Rusoru-RU 0x0419 Ruso-Rusiasa 0x004F Sánscritosa-IN 0x044F Sánscrito-Indiasr-SP-Cyrl 0x0C1A Serbio (cirílico)-Serbiasr-SP-Latn 0x081A Serbio (latino)-Serbiask 0x001B Eslovacosk-SK 0x041B Eslovaco-Eslovaquiasl 0x0024 Esloveno
Página 85
Programación Windows
sl-SI 0x0424 Esloveno-Esloveniaes 0x000A Españoles-AR 0x2C0A Español-Argentinaes-BO 0x400A Español-Boliviaes-CL 0x340A Español-Chilees-CO 0x240A Español-Colombiaes-CR 0x140A Español-Costa Ricaes-DO 0x1C0A Español-República Dominicanaes-EC 0x300A Español-Ecuadores-SV 0x440A Español-El Salvadores-GT 0x100A Español-Guatemalaes-HN 0x480A Español-Hondurases-MX 0x080A Español-Méxicoes-NI 0x4C0A Español-Nicaraguaes-PA 0x180A Español-Panamáes-PY 0x3C0A Español-Paraguayes-PE 0x280A Español-Perúes-PR 0x500A Español-Puerto Ricoes-ES 0x0C0A Español-Españaes-UY 0x380A Español-Uruguayes-VE 0x200A Español-Venezuelasw 0x0041 Suajilisw-KE 0x0441 Suajili-Keniasv 0x001D Suecosv-FI 0x081D Sueco-Finlandiasv-SE 0x041D Sueco-Sueciasyr 0x005A Siriosyr-SY 0x045A Sirio-Siriata 0x0049 Tamilta-IN 0x0449 Tamil-Indiatt 0x0044 Tártarott-RU 0x0444 Tártaro-Rusiate 0x004A Telugute-IN 0x044A Telugu-Indiath 0x001E Tailandésth-TH 0x041E Tailandés-Tailandiatr 0x001F Turcotr-TR 0x041F Turco-Turquíauk 0x0022 Ucranianouk-UA 0x0422 Ucraniano-Ucraniaur 0x0020 Urdúur-PK 0x0420 Urdú-Pakistánuz 0x0043 Uzbekouz-UZ-Cyrl 0x0843 Uzbeko (cirílico)-Uzbekistánuz-UZ-Latn 0x0443 Uzbeko (latino)-Uzbekistánvi 0x002A Vietnamita
Página 86
Programación Windows
vi-VN 0x042A Vietnamita-Vietnam
Ejercicio Práctico Nº3
1.- Diseñar el siguiente formulario.
2.- Luego codificaremos lo siguiente.
Imports SystemImports System.GlobalizationPublic 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
Página 87
CboCulturas
TxtFecha
TxtMoneda
BtnMostrar
Programación Windows
End Class
Programación Orientada a Objetos (POO)
En Visual Basic Net un objeto puede definirse como cualquier cosa, ente o entidad física o ló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()
Página 88
Programación Windows
Ratón dblclk Windows dblclk minimizar(), etc.
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
Página 90
TxtCod
TxtNom
TxtSue
Programación Windows
End Class
3.- Luego Agregaremos otro proyecto al cual llamaremos Probando Clase; para ello ir al Menú Archivo, luego Agregar y elegir Nuevo Proyecto.
4.-Agregaremos la referencia de nuestro proyecto POO en Visual a nuestro proyecto Probando Clase, para ello clic derecho y elegir Referencia.
5.- Diseñaremos el siguiente formulario.
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
TxtNom
DateTimePicker
BtnMostrar
LblMensaje
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.
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
Página 92
Programación Windows
'Propiedades 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
Página 93
Programación Windows
Public nombre As String Public remuneracion As Double 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
Página 94
txtCodtxtNom
CboCuentaBancaria
DtpFItxtHoras
txtCXHBtnRegistrar
ListView1
Programación Windows
End Function
End Class
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)
Página 95
Programación Windows
vista.SubItems.Add(oempleado.remuneracion)
End Sub
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
Página 96
Programación Windows
Public Property Precio() As Single Get Precio = Me.mvarPrecio 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")
Página 99
Programación Windows
Me.txtTasa.Clear() End Sub
Private Sub btnacsto_Click If Me.rbausto.Checked = True Then objproducto.ActualizarStock(1, Me.txtcan.Text) ElseIf Me.rbdissto.Checked = True Then objproducto.ActualizarStock(2, Me.txtcan.Text) End If 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
ConstructoresEl 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.
Página 100
Programación Windows
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.
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
Página 101
BtnMostrar1
BtnMostrar2
BtnMostrar3
Programación Windows
Public Property fechacrea() As Date Get Return fecha End Get Set(ByVal value As Date) fecha = value End Set End Property
'Método Constructor Public Sub New() 'Asignamos un valor inicial 'A una variable de propiedad fecha = Now End Sub
End Class
2.- Luego diseñaremos el siguiente formulario.
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
Página 102
Programación Windows
Get Return mvarfechacrea End Get Set(ByVal value As Date) mvarfechacrea = value End Set End Property
'Método constructor con parámetro Public Sub New(ByVal vfechacrea As Date) '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
Página 103
Programación Windows
End Class
7.- En el evento clic del botón BtnMostrar3 codificaremos lo siguiente:
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 PolimorfismoLa 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
Página 104
TxtNom
TxtSalario
NumericUpDown1
TxtIncentivo
Programación Windows
Public Overloads Sub Sueldo() 'Aqui mostramos el importe del sueldo formateado MsgBox("El sueldo es: " & Format(salario, "#,#.##")) End Sub
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.
Página 105
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
EventosUn 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.
Página 106
Programación Windows
Es fácil entender eventos asociados a objetos visuales como los controles, por ejemplo en el objeto
“button” se tiene el evento “Click” que se desencadena al seleccionar el botón, el evento
“MouseMove” que ocurre al pasar el mouse por el botón, y así hay muchos eventos asociados al
objeto botón; pero cuando trabajamos con clases, los eventos son más abstractos y un poco más
difíciles de entender, ya que podía confundirse con lo métodos.
Para aclarar el concepto de eventos definamos mentalmente una clase llamada “Cuenta” para un
componente llamado “Banco”. Esta clase cuenta tiene propiedades como “NumeroCta”,
“FechaApertura”, “TipoCta”, “NumeroTarjeta”, y “Saldo”. Además tiene métodos como “Depósito”,
“Retiro” y “Transferencia” que modifican el estado del saldo. Cuando hacemos un “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
Página 107
TxtCod
TxtNom
Programación Windows
End Property
Public Property Nombre() As String Get Nombre = mvarnombre End Get Set(ByVal value As String) mvarnombre = value End Set End Property
Public Property Sueldo() As Single Get Sueldo = mvarsueldo End Get Set(ByVal value As Single) mvarsueldo = Sueldo End Set End Property
'Metodos Public Sub crearempleado(ByVal vcodigo As Integer, ByVal vnombre As String, ByVal vsueldo As Single) mvarcodigo = vcodigo mvarnombre = vnombre mvarsueldo = vsueldo ‘El procedimiento creado el cual maneja los eventos lo llamaremos chequearsueldo() End Sub
Public Sub 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 SubEnd Class
2.- Luego diseñaremos el siguiente formulario.
Página 108
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
Página 109
Programación Windows
'Al evento lo llamaremos con Handles Public Sub Sbajo() Handles objempleado.SueldoBajo Me.txteventosueldo.ForeColor = Color.Green Me.txteventosueldo.Text = objempleado.Nombre + " tiene un Sueldo Bajo" End Sub
Public Sub SAlto() Handles objempleado.SueldoAlto Me.txteventosueldo.ForeColor = Color.Blue Me.txteventosueldo.Text = objempleado.Nombre + " tiene un Sueldo Alto" End SubEnd 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.
Página 110
TxtCod
TxtNom
TxtSue
BtnCrear
TxtVenta
Programación Windows
Sintaxis:
Inherits <Clase Base>
Nota:
Dos observaciones importantes que hay que tener en cuenta son:
1. La instrucción Inherits debe escribirse en la primera línea de la clase derivada
2. Solo puede existir una instrucción Inherits, ya que solo existe herencia simple.
Ejercicio Práctico Nº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 PropertyEnd Class
2.- Luego diseñaremos el siguiente formulario
Página 111
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 SubEnd Class
Página 112
Programación Windows
Herencia y Sobrecarga de MétodosPodemos 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
Página 113
TxtCod
BtnPadre
TxtSalario
BtnHijo
TxtNom
Programación Windows
Me.mvarincentivo = vhoras * 15 End Sub
End Class
3.- Luego diseñaremos el siguiente formulario.
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
Página 114
Programación Windows
'Llamamos el método sobrecargado de la clase Derivada Me.objadministrativo.calcularincentivo(horas) Me.objadministrativo.verincentivos() End SubEnd Class
Ado .Net Conexiones StringProveedores 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.
Página 115
Programación Windows
Imports System.Data
Si esta trabajando con una base de datos SQL Server 2000, también importará el namespace
System.Data.Sqlclient. Si esta trabajando con datos de otros orí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 .NETADO evoluciona hacia ADO .NET
Conexiones String en Visual Basic .Net 2005
Conexión Access 2003Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C: \mydatabase.mdb
Conexión a Access 2007Provider=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 2005Server =myServer; DataBase =myDataBase; User Id=myUsername; Password=myPassword
Página 117
PictureBox1btnAccess2003
btnAccess2007
btnSql2005
btnUsuario
lblConecta
Versión 2003 Versión 2007
Programación Windows
1.- Diseñar el Siguiente formulario:
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.
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.
Página 118
Programación Windows
Private Sub btnaccess2003_Click
Dim cn As New OleDbConnection("Provider=Microsoft.Jet.Oledb.4.0; Data Source=C:\
Neptuno.mdb")
Try
cn.Open()
Me.lblconecta.Text = "Conexion con Access 2003 Satisfactoria..."
Me.lblconecta.Refresh()
Catch ex As Exception
Me.lblconecta.Text = ex.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")
Página 119
Programación Windows
Try
cn.Open()
Me.lblconecta.Text = "Conexion a SQL 2005 Mediante el Usuario Castilla es Satisfactoria..."
Me.lblconecta.Refresh()
Catch ex As Exception
Me.lblconecta.Text = ex.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 de datos .Net
Propósito
Connection Proporciona la conectividad con el origen de datos
Command Proporciona el acceso para los comandos de Base de
Página 120
DatabaseDataAdapter
SelectCommand
Programación Windows
Datos
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
Página 121
Connection, Command
DataAdapterBase Datos
SQL
VBDataTableDataSet
SqlClient
1
2
Despachar Datos (Fill)
Programación Windows
.DataSet
Como Actúa el DataAdapter con respecto a una Base de Datos
Página 122
DatagridView
BtnCargar
Programación Windows
Consultas1.- Diseñamos el siguiente formulario.
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
Página 123
Programación Windows
5.- Despues cargamos la aplicaión y se debe mostrar de la siguiente manera.
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 SubEnd 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 SubEnd 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
DataSet
Tables
Columns
Programación Windows
DataRelation Via Código y
Usando Asistente
La Clase DataSetBá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.
Página 132
BtnMostrar
DataGridView1
Programación Windows
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 Forma1.- Creamos el diseño para el siguiente formulario.
Página 133
Programación Windows
2.- Luego hacemos la conexión con SQL, pero antes importamos los namespace.
Imports System.Data
Imports System.Data.SqlClient
Public Class 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
BtnMostrar
DataGridView1
DataGridView2
DataGridView3
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.
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
BtnDataSet
LstClientes
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
1.- Diseñar el siguiente formulario.
2.- Codificaremos lo siguiente:
'Importacion de los NameSpaceImports System.DataImports System.Data.SqlClientPublic Class Form1 'Declaracion de la cadena de conexion Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=SSPI")
Página 136
CboClientes
LstOrdenes
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 SubEnd Class
Relaciones entre tablas mediante objetos DataRelationLos 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.
2.- Luego Codificaremos lo siguiente:
'Importamos los NameSpaceImports System.DataImports System.Data.SqlClientPublic 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
CboClientes
DataGridView1
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 SubEnd Class
Ejercicio Practico Nº3
1.- Diseñar el siguiente formulario.
Página 138
Programación Windows
2.- Luego codificaremos lo siguiente:
Imports System.DataImports System.Data.SqlClientPublic 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 SubEnd 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.Fill(Me.DsEmployeesorders1)
End Sub
Página 143
Programación Windows
15.- Al final ejecutamos y se debe mostrar de la siguiente manera, escogemos un empleado en el
ListBox, y en el Datagrid se debe mostrar las ordenes emitidas por ese empleado.
El 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 DataViewEl 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 DataViewAllowDelete : 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.
2.- Luego codificaremos lo siguiente:
Imports System.DataImports System.Data.SqlClient
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 SubEnd Class
Página 146
BtnMostrar
LblTotal
TxtProducto
TxtStock
TxtPrecio
BtnCon1
BtnCon2
DataGridView
Programación Windows
Ejercicio Práctico Nº2
1.- Diseñar el siguiente Formulario.
Imports System.DataImports 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
TxtProducto
DataGridView
Programación Windows
Ejercicio Práctico Nº3
1.- Diseñar el siguiente Formulario.
Imports System.DataImports 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 SubEnd Class
Página 148
Control de un Formulario
BindingSource
Origen de Datos
Programación Windows
Usando el Control BindingSourceEn 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.
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
TxtCodigo
TxtNombre
TxtDireccion
TxtTelefono
BtnPrimero
BtnAnterior
BtnUltimo
BtnSiguiente
TxtRegistro
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.
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 BindingContextLos 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
txtCodigo
txtproducto
txtprecio
txtstock
btnultimobtnprimero
btnanterior btnsiguienteLblTotal
Programación Windows
Ejemplo:
Realizar el Siguiente Diseño:
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
BtnMostrar
DataGridView1
DataGridView2
DataGridView3
Programación Windows
Una vez vistas algunas de las propiedades de las clases SqlCommand y OleDbCommand,
vamos a pasar a comentar brevemente los principales métodos de estas clases.
Ejercicio Practico Nº1
En este ejemplo veremos como el Command llama a un procedimiento almacenado creado en la
Base de datos Northwind.
1.- Agregamos un formulario con
el siguiente diseño.
2.- Luego hacemos la conexión
con SQL, pero antes importamos
los namespace.
Imports System.Data
Imports System.Data.SqlClient
Public Class Form2
Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated
Security=True")
3.- Después creamos un procedimiento almacenado llamado ListarTablas
CREATE PROCEDURE ListarTablas
AS
Select Categoryid,Categoryname from Categories
Select Productid,Productname,Unitprice from Products
Select Supplierid,CompanyName, City, Country from Suppliers
RETURN
Página 158
BtnVer
DataGridView
ComboBox
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.
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 Almacenados1ra. 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 ConectadoDurante 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 ConectadosEn 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 NonQueryEsto 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
btnAgregar
btnLimpiar
TxtProveedor
TxtProducto
TxtCategoria
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.
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
BtnProductos
BtnEmpleados
Txtpro
Txtemp
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
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
TxtCod
TxtEmp
TxtTel
DgvEmpresa
BtnNuevo
BtnGuardar
BtnModificar
BtnEliminar
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.
2.- Luego Codificaremos lo siguiente:
Imports System.DataImports System.Data.SqlClientPublic 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 SubEnd Class
El Control DataGridView
¿Qué es un DatagridView?
¿Arquitectura del DataGridView?
Ejemplo Práctico
Página 172
CboOrden
CboProducto
TxtPre
TxtCan
DgvProductos
Programación Windows
Arquitectura de un Control DataGridViewUn 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.
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 DataReaderEl 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 SQLDataReaderEl 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
BtnVer
LstClientes
Programación Windows
Variable=Objeto SQLCommand.ExecuteReader
Ejemplo:
Dr=CmdClientes.ExecuteReader
Ejercicio Practico Nº1
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
TxtUsuario
TxtContraseña
ProgressBar1
BtnSalirBtnIngresar
PictureBox1Y PictureBox2
Programación Windows
Acceso al Sistema 1.- Diseñaremos el formulario para que quede de la siguiente manera.
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.DataImports System.Data.SqlClientPublic 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 If8.- 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 If9.- 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.
Crear Proyectos de Instalación Como crear Proyectos de Instalación
Personalizar el Proyecto
Generar el Instalador
Página 180
1 2
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