Beruflich Dokumente
Kultur Dokumente
Net
Qu es la plataforma Microsoft .NET? Qu es el .NET Framework? Conceptos bsicos de .NET Explorar el entorno de desarrollo Crear un proyecto Visual Basic .NET
Programacin Windows
Introduccin
Vi l B i .NET es l lti versi del sistema de desarrollo Visual Basi . Antes de empezar a crear aplicaciones en Visual Basic .NET, le ser til conocer y entender algunos conceptos bsicos de .NET.
Conceptos Bsicos
Qu es la Plataforma Net?
La plataforma .NET proporciona la base de la siguiente generacin de soft are que permite conectar sistemas, informacin, dispositivos y usuarios distintos de un modo ms unificado y personalizado. Incorpora servicios Web XML como el medio para permitir la interoperabilidad entre tecnologas diferentes.
Qu es el .NET Framework?
"El .NET Framework es un entorno multi-lenguaje para la construccin, distribucin y ejecucin de Servicios Webs y aplicaciones." El .NET Framework es el corazn de .NET, cualquier cosa que queramos hacer en cualquier lenguaje .NET debe pasar por el filtro cualquiera de las partes integrantes del .NET Framework.
Pgina 2
Programaci
biblioteca de clases.
ows
Garbage Collector o GC
En su traducci n ms o menos exacta, lo definiremos como Recolector de Basura, y que tiene la funci n di na o indi na, de hacer la tarea ms sucia de .NET, es decir, de hacer las funciones de estor de limpieza de .NET eliminando de la memoria, todos aquellos objetos que no sean tiles en un momento dado, liberando al sistema de recursos no utilizables. La ejecuci n del GC es una ejecuci n desatendida y trasparente por el pro ramador y por el usuario,
MSIL
MSIL o IL es conocido como Microsoft Intermediate Lan ua e o simplemente Intermediate Lan ua e, o lo que es lo mismo, len uaje intermedio. Todos los len uajes administrados de la plataforma .NET, deben cumplir un conjunto de re las y normas, y parte de este ajuste, es que una aplicaci n escrita en un len uaje de pro ramaci n determinado, debe ser compilada en un len uaje intermedio, de manera tal, que una aplicaci n escrita por ejemplo en C# y otra i ual en Visual Basic, se compilan al prcticamente el mismo len uaje intermedio.
JIT
El entorno de ejecuci n incluye una caracterstica denominada compilaci n Just In Time (JIT), que traduce c di o MSIL al len uaje mquina del sistema en el que la aplicaci n se ejecutar.
Biblioteca de Clases
La biblioteca de clases es una colecci n completa orientada a objetos de clases reutilizables y or anizadas en espacios de nombres jerrquicos en base a su funcionalidad. Podemos utilizar la biblioteca de clases para desarrollar aplicaciones que abarcan desde las aplicaciones clientes
P i
Programacin Windows
tradicionales hasta las aplicaciones basadas en las ltimas innovaciones proporcionadas por ASP.NET y los servicios Web XML.
2.- Inicio/Ejecutar:
Pgina 4
Programacin Windows
Crear un nuevo Proyecto 1.-Men Archivo/Nuevo Proyecto o las combinaciones de las Teclas Ctrl + N aparecer la siguiente pantalla
Ventanas Clsicas
Explorador se Soluciones (Ctrl + Alt + L) El Explorador de soluciones nos permite visualizar archivos y realizar tareas de administracin de archivos en una solucin o en un proyecto. Una nica solucin basada en Visual Basic .NET y sus proyectos aparecen en una lista jerrquica que proporciona informacin actualizada sobre el estado de nuestra solucin, proyectos y archivos.
Pgina 5
Programacin Windows
Cuadro de Herraminetas (Ctrl + Alt + X)
Para crear los objetos del interfaz de usuario de nuestra aplicacin, aadimos controles desde el Cuadro de herramientas a un formulario. Inicialmente, el Cuadro de herramientas se encuentra ubicado en el lado izquierdo del entorno de desarrollo. Hay varias pestaas para diferentes categoras de controles, como Windows Forms y Datos.
Barra de Herramientas
Cuando iniciamos un proyecto Visual Basic .NET y seleccionamos una plantilla de aplicaciones, aparece el entorno de desarrollo visual. El men principal y la barra de herramientas estndar proporcionan acceso a la mayora de comandos que controlan el entorno de programacin de Visual Studio .NET.
Pgina 6
Programacin Windows
Editor de Cdigo (Shift + F7)
Visual Studio .NET proporciona un Editor de cdigo en el que escribir y mantener el cdigo de nuestro proyecto. Podemos asociar cdigo directamente a un formulario de nuestro proyecto o ubicarlo en otro mdulo de cdigo distinto. Se muestra un Editor de c digo distinto para cada formulario o mdulo de nuestro proyecto, facilitando la organizacin, visualizacin y desplazamiento por el cdigo.
Como Ejecutar
Para poder probar lo que estamos haciendo debemos ejecutar, tambi n se dice iniciar depuracin. Para Iniciar Depuracin simplemente F5 o desde la Barra de Herramientas clic el icono de iniciar depuracin Nota: Cuando la aplicacin esta en ejecucin no podr modificar nada en el proyecto, entonces si desea hacer algo (Codificar, Cambiar de propiedades, etc.) entonces tiene que detener la ejecucin Para detener la ejecucin desde la Barra de Herramientas clic en el icono de detener Depuracin
Pgina 7
Programacin Windows
Como Agregar un Nuevo Formulario
1.-Desde el Explorador de Soluciones sobre Clic el derecho Proyecto (Introduccin) Agregar /Nuevo elemento; nos mostrara la siguiente pantalla.
Pgina 8
Programacin Windows
Como Agregar Controles a un formulario
Antes de todo, al formulario que deseamos agregar un control debe esta en modo Diseo (Shift + F7) y el Cuadro de Controles tiene que estar activo (Ctrl + Alt + X). Para agregar controles hay varias formas: 1.-Arrastre el control al formulario (Recomendado) 2.- Clic en el control/Enter 3.- Doble Clic en el control
BtnMensaje
2. En el evento click del boton BtnMensaje codificamos lo siguiente: Private Sub btnMensaje_Click MsgBox("Bienvenido a Visual Basic .Net " & Me.txtnombre.Text) End Sub Ejercicio Practico N2. 1. Disear el siguiente Formulario:
TxtTexto
btnColorTexto
btnColorFondo
Pgina 9
Programaci
ows
2. Lue o codificamos lo si uiente en el evento click de los botones: Private Sub BtnColorTexto_Click Me.TxtTexto.ForeColor = Color.Blue End Sub Private Sub BtnColorFondo_Click Me.BackColor = Color.Red End Sub E rcicio Practico 3 1. Disear el si uiente Formulario:
Txt1 Txt2 BtnSuma BtnResta BtnDividir TxtRes BtnMultiplicar BtnPotencia
BtnNuev
P i
10
Programacin Windows
Ejercicio Prctico N4 1.- Disear el siguiente formulario
TxtUsu TxtPas
Btningresar
BtnSalir
Resolver:
1.- Crear una aplicacin en la cual me permita realizar la siguiente ecuacion: y= 5x2+2x+2 10
Pgina 11
Programacin Windows
4.- Desarrollar una aplicacin que me permita calcular el promedio de notas obtenidos por los alumnos. Cuando el usuario ingrese la Nota 3 el botn de comando btncalcular se debe habilitar.
Fu ci
d L
gu j
Pgina 12
Programacin Windows
Tipo de Datos
El tipo de datos de un elemento de programacin hace referencia a la clase de datos que puede contener y a cmo se almacenan los datos.
La ilustracin anterior lista algunos de los tipos ms utilizados en Visual Basic .NET. El t rmino con signo significa que los nmeros pueden ser positivos o negativos, como en +48 o-48.
Visual Basic no requiere que seleccione explcitamente un tipo de datos cuando declara una variable. Sin embargo, es una buena idea hacerlo, ya que de esta forma sus aplicaciones sern ms fiables y requerirn menos memoria. El tipo de datos determina los valores permitidos para una variable, que, a su vez, determinan las operaciones que pueden realizarse sobre esa variable. Puede seguir las directrices generales que se muestran en la ilustracin anterior para seleccionar el tipo de datos adecuado para una variable.
Pgina 13
Programaci
ows
Si usted declara variables sin tipo de datos, se les otor a de forma predeterminada el tipo de datos Object. Esto facilita la escritura rpida de pro ramas, pero puede hacer que stos se ejecuten ms lentamente. Pero con todo y con esto, la declaraci n de variables en .NET puede hacerse ms extensiva, ya que podemos declarar las variables tambin, utilizando unos smbolos o caracteres detrs de las variables, que indiquen el tipo de variable utilizada. La si uiente tabla aclarar en al o esto que comento, y el posterior ejemplo, terminar por explicarlo de forma prctica.
Tipo de datos Short Integer Long Single Double Decimal UShort UInteger ULong Smbolo N.A. % & ! # @ N.A. N.A. N.A. Carcter S I L F R D US UI UL
Variabl s
son las Variabl s?
Utilizamos variables para almacenar valores que pueden cambiar cuando una aplicaci n se est ejecutando. Una variable tiene los si uientes elementos: mbito: El conjunto de todo el c di o que puede acceder y utilizar la variable. Nombre: La palabra que utilizamos para hacer referencia a la variable en c di o. Ti o e atos: El tipo y tamao inicial de datos que la variable puede almacenar. Antes de poder utilizar variables en su aplicaci n, debe asi narles un valor. Puede asi nar un valor a una variable despus de declararla o mientras la declara.
P i
14
Programaci n
Cmo
indows
eclarar Variables
im al nombre de la variable, se uida de la palabra reservada s y el tipo de
Hemos visto que la declaraci n de una variable dentro de un procedimiento, se realiza anteponiendo la palabra reservada dato declarado. Un ejemplo sencillo sera:
15
Programacin Windows
Pgina 16
Programacin
indows
2. Lue o codificamos lo si uiente Imports System.Drawin .Ima e Public Class Form1 Dim ruta As Strin = "Aqui pondremos la ruta donde se encuentran las im enes unido con un \" Private Sub btnima en1_Click Me.PictureBox1.Ima e = FromFile(ruta & "nombre de la ima en con su extension") End Sub End Class 3. El codi o del evento click del boton BtnIma en1; es el mismo para los otros botones pero con im enes diferentes.
P i
17
Programacin Windows
Ejercicio Prctico N2
1.- Disear el siguiente formulario
TxtUsuario TxtPassword
BtnIngresar
ProgressBar1
2.- Luego agregamos un control 3.- Codificaremos lo siguiente en los siguientes eventos: Private Sub btnIngresar_Click If Me.txtusuario.Text = "Carlos" And Me.txtpassword.Text = "123" Then Me.ProgressBar1.Visible = True Me.Timer1.Enabled = True ElseIf Me.txtusuario.Text = "David" And Me.txtpassword.Text = "456" Then Me.ProgressBar1.Visible = True Me.Timer1.Enabled = True ElseIf Me.txtusuario.Text = "Yahir" And Me.txtpassword.Text = "789" Then Me.ProgressBar1.Visible = True Me.Timer1.Enabled = True Else MsgBox("Acceso Denegado", MsgBoxStyle.Critical, "Sistema") End If End Sub Private Sub Timer1_Tick Me.ProgressBar1.Value = Me.ProgressBar1.Value + 1 If Me.ProgressBar1.Value = 100 Then Me.Timer1.Stop() MsgBox("Bienvenido al Sistema " & Me.txtusuario.Text, MsgBoxStyle.Information, "Sistema") End If End Sub
Pgina 18
Programacin Windows
Select Case testexpression [Case expressionlist-n] [statements-n1] . . . [Case Else] [elsestatement] End Select Ejercicio Prctico N
TxtAlu
TxtNP TxtEP
LblCon TxtProm
TxtEF
2.- Codificaremos lo siguiente en los siguientes eventos: Private Sub btncalcular_Click If Me.txtalu.Text = "" Then MsgBox("Ingrese un Nombre de Alumno", MsgBoxStyle.Information, "Alumno") Exit Sub End If 'Si no se selecciono ningun elemento del ListBox If Me.lstcursos.SelectedIndex = -1 Then MsgBox("Por Favor Seleccione un Curso", MsgBoxStyle.Information, "Cursos") Exit Sub End If
Pgina 19
Programacin
indows
Dim a As Short If Me.txtnp.Text = "" Then a=1 ElseIf Me.txtep.Text = "" Then a=2 ElseIf Me.txtef.Text = "" Then a=3 End If Select Case a Case 1 : Ms Box("In rese Nota de Prcticas", Ms BoxStyle.Information, "Nota1") Exit Sub Case 2 : Ms Box("In rese Exmen Parcial", Ms BoxStyle.Information, "Nota2") Exit Sub Case 3 : Ms Box("In rese Exmen Final", Ms BoxStyle.Information, "Nota3") Exit Sub End Select Dim n1, n2, n3, prom As Short n1 = CInt(Me.txtnp.Text) n2 = CInt(Me.txtep.Text) n3 = CInt(Me.txtef.Text) prom = (n1 + n2 + n3) / 3 Me.txtprom.Text = CStr(prom) If CInt(Me.txtprom.Text) >= 11 Then Me.lblcon.Text = "Aprobado" Me.lblcon.ForeColor = Color.Blue Else Me.lblcon.Text = "Desaprobado" Me.lblcon.ForeColor = Color.Red End If End Sub Private Sub txtnp_KeyPress 'Si la tecla que se presiona; no es un numero o no es un control If Not (Char.IsNumber(e.KeyChar) Or Char.IsControl(e.KeyChar)) Then Ms Box("Por In rese solo Numeros") 'Interrumpir el evento e.Handled = True End If End Sub Private Sub txtep_KeyPress 'Si la tecla que se presiona no es un numero; no es un numero o no es un control If Not (Char.IsNumber(e.KeyChar) Or Char.IsControl(e.KeyChar)) Then Ms Box("Por In rese solo Numeros") 'Interrumpir el evento e.Handled = True End If End Sub
P i 20
Programacin
indows
Private Sub txtef_KeyPress 'Si la tecla que se presiona no es un numero; no es un numero o no es un control If Not (Char.IsNumber(e.KeyChar) Or Char.IsControl(e.KeyChar)) Then Ms Box("Por In rese solo Numeros") 'Interrumpir el evento e.Handled = True End If End Sub Private Sub txtnp_Validatin If Me.txtnp.Text < 5 Or Me.txtnp.Text > 20 Then Ms Box("Nota no Valida") Me.ErrorProvider1.SetError(Me.txtnp, "Fuera de Ran o") e.Cancel = True Else Me.ErrorProvider1.Clear() End If End Sub Private Sub txtep_Validatin If Me.txtep.Text < 5 Or Me.txtep.Text > 20 Then Ms Box("Nota no Valida") Me.ErrorProvider1.SetError(Me.txtep, "Fuera de Ran o") e.Cancel = True Else Me.ErrorProvider1.Clear() End If End Sub Private Sub txtef_Validatin If Me.txtef.Text < 5 Or Me.txtef.Text > 20 Then Ms Box("Nota no Valida") Me.ErrorProvider1.SetError(Me.txtef, "Fuera de Ran o") e.Cancel = True Else Me.ErrorProvider1.Clear() End If End Sub
Bucles
Es probable que necesite frecuentemente repetir la ejecuci n de un bloque de c di o hasta que se cumpla una determinada condici n en los pro ramas que desarrolle. Para repetir la ejecuci n de un bloque de c di o en Visual Basic .NET, es conveniente utilizar estructuras de bucle condicionales. Esta lecci n describe c mo utilizar bucles condicionales para decidir si ejecutar o no c di o y cundo hacerlo. Esta lecci n tambin describe c mo decidir el uso de una instrucci n Exit para salir de un bucle.
P i
21
Programacin
indows
or counter = start To end [Step step [statements [Exit For Next [counter
TxtNum
ListBox1
BtnCalcular BtnLimpiar
P i
22
Programacin
indows
2. Codificaremos lo si uiente en los si uientes eventos: Private Sub btncalcular_Click Dim n, s, r As Inte er n = Val(Me.txtnum.Text) For s = 1 To 12 Me.ListBox2.Items.Add(s & " =") Next For r = 1 To 12 Me.ListBox3.Items.Add(n * r) Next End Sub Private Sub btnlimpiar_Click Me.ListBox2.Items.Clear() Me.ListBox3.Items.Clear() Me.txtnum.Clear() Me.txtnum.Focus() End Sub Ejercicio Practico N 1. Disear el si uiente formulario
btnLimpi
2. Codificaremos lo si uiente en los si uientes eventos: Private Sub BtnLimpiar_Click Dim con As Control For Each con In Me.Controls If TypeOf con Is TextBox Then con.Text = "" If TypeOf con Is GroupBox Then Dim con2 As Control For Each con2 In con.Controls If TypeOf con2 Is TextBox Then con2.Text = "" Next End If Next End Sub
P i
23
Programacin
indows
o Loop
Puede utilizar instrucciones DoLoop para ejecutar un bloque de instrucciones un nmero de veces indefinido dependiendo del valor de tipo bolean de una condici n. Las instrucciones pueden repetirse mientras el valor de la condici n sea True o hasta que sea True. Generalmente, la condici n es el resultado de comparar dos valores, pero tambin puede ser cualquier expresi n que da como resultado un valor de tipo Bolean (True o False). El bucle DO...LOOP es muy versatil. Con el se pueden crear ran variedad de bucles distintos, bucles que comprueben una condici n antes de ejecutar el bucle una vez, despus de la primera ejecuci n y con conbinaciones con mientras (WHILE) que se cumple una condici n o hasta (UNTIL) que esa condicion se cumpla. la sintaxis de esta estructura es la si uiente: DO [WHILE | UNTIL (condicion)] Sentencias ..... LOOP [WHILE | UNTIL (condici n)] Vamos a tratar de explicar esta sentencia de manera pausada para que sea ms fcil de entender. Lo que siempre tendremos en estos bucles es el DO y el LOOP, entre estos dos colocaremos las sentencias que queremos ejecutar en cada iteraci n del bucle. Los bucles tienen que evaluar entre cada iteraci n si se si uen ejecutando o no, para ello evala una condici n. Lo verstil de este bucle es que la condici n se puede expresar de muchas maneras distintas. Condicin expresada al lado del ejecutarse el bucle. O: en este caso la condici n se evala antes de empezar a
Condicin expresada al lado del LOOP: en este caso la condici n se evala despus de ejecutarse el bucle. Tiene como diferencia principal frente al otro mtodo que en este caso el bucle se ejecutar por lo menos una vez. Adems de poder expresar la condici n en estos dos sitios tambin se puede construir la condici n con un enunciado mientras (WHILE o un enunciado hasta (UNTIL . Las diferencias semnticas de estas dos posibilidades se trasladan tambin a su manera de funcionar. Vamos a ver un par de ejemplos de este bucle para comprender su funcionamiento. El ejemplo pide constantemente el nombre del autor de la p ina y no para hasta que el nombre sea "Castilla". Tambin tiene el usuario la posibilidad de escribir "out", en ese caso, comprobado con un enunciado IF, se sale del bucle rompindolo con la sentencia EXIT DO, utilizada para romper bucles. Ejercicio Practico N3 1. - Disear el si uiente formulario En el mtodo clic del BtnWhile
entrada = "" DO WHILE (entrada <> "Castilla") entrada = inputbox ("Dime el nombre del autor","se uridad","Castilla",2,3) if (entrada = "out") then ms box ("sal o por la puerta de atras") exit do end if
BtnWhile BtnUntil
P i
24
Programacin Windows
LOOP El si uiente ejemplo realiza una cuenta y entre cuenta y cuenta se muestra el valor de la cuenta actual en una ventanita donde sale un bot n de Reintentar y otro de Cancelar. Si se pulsa reintentar se si ue ejecutando el bucle y si se pulsa Cancelar se sale por la puerta de atrs, de manera similar a como se sala en el ejemplo anterior, con EXIT DO. En el mtodo clic del BtnUntil Dim cont Dim respuesta cont = 0 Do cont = cont + 1 respuesta = Ms Box(cont, 69, "Variable del bucle, con valor 6 se sale") If (respuesta = 2) Then Ms Box("Cuenta Cancelada", 16, "Cancelaste!") Exit Do End If Loop Until (cont = 6)
P i
25
Programacin Windows
Programacin Windows
btnMuestra (Evento Click) Me.lblLon itud.Text = Len(Trim(Me.txtFrase.Text)) Me.lblPrimero.Text = Microsoft.VisulBasic.Left(Trim(Me.txtFrase.Text), 1) Me.lblUltimo.Text = Microsoft.VisulBasic.Ri ht(Trim(Me.txtFrase.Text), 1) Me.lblSe Sex.Text = Microsoft.VisulBasic.Mid(Trim(Me.txtFrase.Text), 2, 5) Me.lblPosA.Text = InStr(Me.txtFrase.Text, "a") Me.lblMinusculas.Text = LCase(Me.txtFrase.Text) Me.lblMayusculas.Text = UCase(Me.txtFrase.Text) Me.lblSoloPrim.Text = StrConv(Me.txtFrase.Text, 3) BtnNuevo_Click Me.txtFrase.Text = "" Me.lblLon itud.Text = "" Me.lblMayusculas.Text = "" Me.lblMinusculas.Text = "" Me.lblPosA.Text = "" Me.lblPrimero.Text = "" Me.lblSe Sex.Text = "" Me.lblSoloPrim.Text = "" Me.lblUltimo.Text = "" Me.txtFrase.Focus() btnSalir (Evento Click) Me.Close()
P i
27
Programacin Windows
Funciones Cronolgicas
BtnDif BtnNumM
Pgina 28
DtpFec
Programacin Windows
2.- Lue o codificaremos lo si uiente
Private Sub btnverfecha_Click 'Fecha del Sistema Me.txtfechasis.Text = FormatDateTime(Today, DateFormat.Lon Date) End Sub Private Sub btnverhora_Click 'Hora del Sistema Me.txthorasis.Text = TimeOfDay End Sub Private Sub btnFechaNueva_Click 'Incrementar una Fecha Me.txtNF.Text = FormatDateTime(DateAdd(DateInterval.Day, CInt(Me.txtDI.Text), Today), DateFormat.Lon Date) End Sub Private Sub btndife_Click 'Diferencia entre Fechas Ms Box("Han pasado " & DateDiff(DateInterval.Month, Me.dtpFecha.Value, Today) & " meses " & vbCrLf & _ "desde la fecha " & FormatDateTime(Me.dtpFecha.Value, DateFormat.ShortDate) & " hasta hoy") End Sub Private Sub btnNumMes_Click 'Extraer parte de una Fecha Ms Box("El Numero de Mes de la Fecha Ele ida es " & DatePart(DateInterval.Month, Me.dtpFecha.Value)) End Sub Private Sub btnconvertir_Click 'Convertir un Caracter en Fecha Me.txtfechaconver.Text = DateValue(Me.txtfechain .Text) End Sub
Procedimientos Sub
Un procedimiento Sub ejecuta acciones, pero no devuelve nin n valor. Puede tomar ar umentos, como constantes, variables o expresiones, que le pasa el c di o de llamda. La sintaxis para declarar un procedimiento Sub es la si uiente: eclarcin: [ Public | Private | Friend ] Sub <Nombre Subrutina> ([Lista de Parmetros]) <Sentencias> [Exit Sub] End Sub
P i
29
Public Function parimpar(ByVal numero As Inte er) As Strin If numero Mod 2 = 0 Then parimpar = "Es par" Else parimpar = "Impar" End If End Function
Public Function hipotenusa(ByVal ladoA As Sin le, ByVal ladoB As Sin le) As Sin le hipotenusa = Math.Sqrt(Math.Pow(ladoA, 2) + Math.Pow(ladoB, 2)) End Function Public Sub limpiar(ByVal frm As Form) Dim con As Control For Each con In frm.Controls If TypeOf con Is TextBox Then con.Text = "" If TypeOf con Is GroupBox Or TypeOf con Is Panel Then Dim con2 As Control For Each con2 In con.Controls If TypeOf con2 Is TextBox Then con2.Text = "" If TypeOf con2 Is GroupBox Or TypeOf con2 Is Panel Then Dim con3 As Control For Each con3 In con2.Controls If TypeOf con3 Is TextBox Then con3.Text = "" Next End If Next End If Next End Sub End Class
P i
30
Programacin Windows
3. - Disearemos los siguientes formularios.
Private Sub BtnConsultar_Click Me.Label1.Text = obj.parimpar(Me.TextBox1.Text) End Sub Private Sub BtnCalcular_Click Dim num1, num2, hipo As Single num1 = InputBox("Ingrese lado A del Triangulo: ") num2 = InputBox("Ingrese lado B del Triangulo: ") hipo = obj.hipotenusa(num1, num2) MessageBox.Show("La Hipotenusa del Triangulo rectngulo es " & hipo) End Sub Private Sub BtnLimpiar_Click obj.limpiar(Me) End Sub
Sub habilitar(ByVal sw As Boolean) Me.Button1.Enabled = sw Me.Button2.Enabled = Not sw Me.Button3.Enabled = sw Me.Button4.Enabled = Not sw Me.Button5.Enabled = sw Me.Button6.Enabled = Not sw Me.Button7.Enabled = sw End Sub Button1 Private Sub Button6_Click habilitar(True) End Sub Private Sub Button7_Click habilitar(False) End Sub
Button2 Button3
Button4
Button5
Button6
Button7
Pgina 31
Programacin Windows
rreglos
rrays
Una de las formas en las que podemos a rupar varios datos es mediante los arrays (o matrices). Usando un array, podemos acceder a cualquiera de los valores que tenemos almacenado mediante un ndice numrico. Por ejemplo, si tenemos la variable discografa y queremos acceder al tercer disco, podramos hacerlo de la si uiente forma: discografa(3 . Sabiendo esto, podemos comprobar que sera fcil recorrer el contenido de los arrays mediante un bucle For. u tipos de datos se pueden usar para crear arrays? Los tipos de datos de las variables usadas como array, pueden ser de cualquier tipo, dependiendo de lo que queramos uardar. Por ejemplo, si queremos uardar los nombres de los discos que tenemos, podemos usar un array del tipo Strin
eclarar Variables Como rrays Para poder indicarle al VB que nuestra intenci n es crear un array podemos hacerlo de dos formas distintas, para este ejemplo crearemos un array de tipo Inte er: 1- La clsica (la usada en versiones anteriores) Dim a() As Inte er 2- La nueva forma introducida en .NET: Dim a As Inte er()
P i
32
Programacin Windows
Reservar Memoria Para Un rray Para poder hacerlo tenemos que usar la instrucci n ReDim:
ReDim a(5)
Al ejecutarse este c di o, tendremos un array con capacidad para 6 elementos. Y son seis y no cinco, (como por l ica habra que esperar), porque en .NET Framework el ndice menor de un array siempre es cero y en Visual Basic, el ndice superior es el indicado entre parntesis. Por tanto el array a tendr reservada memoria para 6 valores de tipo Inte er, los ndices seran desde 0 hasta 5 ambos inclusive. Adems de usar ReDim, que realmente sirve para "redimensionar" el contenido de un array, es decir, para volver a dimensionarlo o cambiarlo por un nuevo valor. Si sabemos con antelaci n el tamao que contendr el array, podemos hacerlo de esta forma:
a(3) = 5
Acceder A Un Elemento De Un Array De i ual forma, si queremos utilizar ese elemento que est en la posici n 3 para una operaci n, podemos hacerlo como con el resto de las variables, pero siempre usando el parntesis y el nmero de elemento al que queremos acceder:
i = b * a(3)
Los Lmites De Los ndices De Un Array Como ya he comentado antes, el ndice inferior de un array, siempre es cero, esto es invariable, todos los arrays de .NET Framework empiezan a contar por cero. Pero el ndice superior puede ser el que nosotros queramos, aunque sin pasarnos, que la memoria disponible se puede a otar si pretendemos usar un valor exa eradamente alto. Realmente el ndice superior de un array es 2^64 -1 (el valor mximo de un tipo Lon )
P i
33
Programacin Windows
Iniciali ar Un Array Al Declararla Al i ual que las variables normales se pueden declarar y al mismo tiempo asi narle un valor inicial, con los arrays tambin podemos hacerlo, pero de una forma diferente, ya que no es lo mismo asi nar un valor que varios. Aunque hay que tener presente que si inicializamos un array al declararla, no podemos indicar el nmero de elementos que tendr, ya que el nmero de elementos estar supeditado a los valores asi nados. Para inicializar un array debemos declarar ese array sin indicar el nmero de elementos que contendr, se uida de un si no i ual y a continuaci n los valores encerrados en llaves. Veamos un ejemplo:
Dim a() As Integer = {1, 42, 15, 90, 2}
Usando cualquiera de estas dos formas mostradas, el nmero de elementos ser 5, por tanto los ndices irn desde 0 hasta 4. Los Arrays Pueden Ser De Cualquier Tipo En todos estos ejemplos estamos usando valores de tipo Inte er, pero podramos hacer lo mismo si fuesen de tipo Strin o cualquier otro. En el caso de que sean datos de tipo Strin , los valores a asi nar debern estar entre comillas dobles o ser variables de tipo Strin . Por ejemplo:
Para poder conse uirlo, debemos usar ReDim se uida de la palabra clave Preserve, por tanto si
P i
34
Programacin Windows
A partir de ese momento, el array tendr 11 elementos (de 0 a 10), los 5 primeros con los valores que antes tena y los nuevos elementos tendrn un valor cero, que es el valor por defecto de los valores numricos. Si s lo usamos ReDim a(10), tambin tendremos once elementos en el array, pero todos tendrn un valor cero, es decir, si no se usa Preserve, se pierden los valores contenidos en el array. Eliminar Un Array De La Memoria. Si en al n momento del pro rama queremos eliminar el contenido de un array, por ejemplo para que no si a ocupando memoria, ya que es posible que no si a ocupando memoria, podemos usar Erase se uida del array que queremos "limpiar", por ejemplo:
Erase a
Esto eliminar el contenido del array a. Si despus de eliminar el contenido de un array queremos volver a usarlo, tendremos que ReDimensionarlo con el mismo nmero de dimensiones que tena, ya que Erase s lo borra el contenido, no la definici n del array.
Ejercicio Practico N1
1.- Disear el si uiente formulario
LstNombres
P i
35
Programacin Windows
Public Class Form1 Dim nombres(0) As Strin Private Sub btna re ar_Click If Me.txtnombre.Text.Trim <> "" Then nombres(UBound(nombres)) = Me.txtnombre.Text ReDim Preserve nombres(UBound(nombres) + 1) Ms Box("Guardado ...!", Ms BoxStyle.Information, "Arre los") Me.txtnombre.Clear() Me.txtnombre.Focus() Else Ms Box("Por Favor In rese un Nombre", Ms BoxStyle.Information, "Arre los") Me.txtnombre.Clear() Me.txtnombre.Focus() End If End Sub Private Sub btnmostrar_Click Dim x As Inte er For x = 0 To UBound(nombres) - 1 Me.lstnombres.Items.Add(nombres(x)) Next ReDim nombres(0) End Sub Private Sub btnlimpiar_Click Me.lstnombres.Items.Clear() End Sub End Class
Estructuras
Podemos combinar elementos de datos de distintos tipos para crear una combinaci n de tipos de datos nica denominada estructura. Las estructuras resultan tiles cuando deseamos que una nica variable uarde varias piezas de informaci n relacionadas. Despus de declarar una estructura, podemos declarar variables de ese tipo. Definicin.-Una estructura es una combinaci n de tipos de datos que se crea combinando otros tipos de datos. Las estructuras son de tipo valor (es decir, una variable de tipo estructura contiene los datos de la estructura, en lu ar de una referencia a los datos como hace el tipo referencia). Las estructuras pueden tener datos, propiedades, mtodos y procedimientos y pueden invocar y manipular eventos.
Ejemplo
P i 36
Programacin Windows
El uso ms simple y habitual de las estructuras es encapsular variables relacionadas, creando un tipo de datos definido por el usuario. Por ejemplo, es posible que deseemos guardar juntos el nombre, fecha de contratacin, cargo y salario de un empleado. Podramos utilizar varias variables para esta informacin, o podemos definir una estructura y utilizarla como la variable deun nico empleado. La ventaja de la estructura se hace patente cuando tiene muchos empleados y, por tanto, muchas instancias de la variable. El siguiente ejemplo muestra una estructura Employee simple: Public Structure Employee Public FirstName As String Public LastName As String Public HireDate As Date Public JobTitle As String Private Salary As Decimal End Structure
Pgina 37
Programacin Windows
Ejercicio Practico N 1.- A re ar un Modulo a la aplicaci n y escribir el si uiente c di o. Module Module1 'Declaramos la estructura Public Structure DatosAlumnos Public codi o As Inte er Public nombre As Strin Public curso As Strin Public promedio As Inte er End Structure 'Declaramos un arrays que me almacenen los valores Public alumnos(0) As DatosAlumnos End Module 2.- Lue o disear el si uiente formulario
txtnombr txtcurso txtpromedi
Programacin Windows
4.- Luego disearemos el siguiente formualrio. 5.- Luego en el evento load del formulario frmconsulta. Private Sub Frmconsulta_Load Frminscribir.Hide() End Sub
txtpromed Private Sub btnconsultar_Click Dim mialumno As DatosAlumnos Dim x As String = txtconsulta.Text btnconsult mialumno = alumnos(x - 1) txtcodigo.Text = mialumno.codigo txtnombre.Text = mialumno.nombre txtcurso.Text = mialumno.curso txtpromedio.Text = mialumno.promedio txtconsulta.Text = "" txtconsulta.Focus() End Sub Private Sub btninscribir_click Frminscribir.Show() Me.Close() End Sub txtconsul txtcodi txtnomb txtcurs btninscrib
Manejo de ArrayList
Esta es una coleccin donde podemos guardar cualquier tipo de objeto. Su mtodo ArrayList.Add() acepta el tipo object, por lo cual podemos coleccionar enteros, cadenas, listboxes, botones, y casi cualquier cosa que se nos ocurra El acceso a sus elementos se logra por medio de la posicin o ndice. Podemos utilizar su propiedad ArrayList.Count para preguntarle a la coleccin cuantos elementos tiene Esta clase permite la creacin y manipulacin de arrays cuyo tamao puede ser modificado dinmicamente.
Pgina 39
Programacin Windows
Este mejora comportamiento el rendimiento del y
objeto tiene la ventaja de que optimiza recursos, puesto que cada vez que aadimos o eliminamos valores, el array items no siempre tiene que ser redimensionado. Qu sucede, sin embargo, cuando se han aadido valores y el array est completo?, pues que el objeto ArrayList detecta esta situacin y en la siguiente ocasin en que se aade un nuevo valor, se automticamente
redimensiona duplicando el nmero de elementos inicial que nuevo contena. un Veamos esquema de de
funcionamiento.
Pgina 40
Programacin Windows
IEnumerator
Un objeto enumerador pertenece al interfaz IEnumerator, diseado para realizar un recorrido o iteraci n a travs de uno de los diferentes tipos de colecci n (arrays incluidos) existentes en .NET Framework. Mediante el mtodo GetEnumerator( ) de un objeto array, obtenemos un objeto que implementa el interfaz Ienumerator, que s lo puede realizar labores de lectura sobre el array, en nin n caso de modificaci n. La estructura de control utilizada para recorrer el array, puede ser indistintamente un bucle For...Next, For Each...Next, o la novedosa tcnica de los objetos enumeradores proporcionados por el objeto array.
Ejercicio Prctico N3
1.- Disear el si uiente formulario. 2.- Codificaremos lo si uiente: Public Class Form1 'Declaramos nuestro ArrayList Dim lista As New ArrayList() Private Sub Form1_Load 'A re amos elementos a nuestro ArrayList lista.Add("Lima") lista.Add("Lambayeque") lista.Add("Trujillo") lista.Add("Tacna") lista.Add("Arequipa") lista.Add("Puno") End Sub
TxtTot TxtCiud CboCiuda
Private Sub btnordenar_Click If Me.cbociudad.Items.Count <> 0 Then Me.cbociudad.Items.Clear() 'Sirve para ordenar los elementos de un ArrayList lista.Sort() 'Declaramos nuestro IEnumerator Dim recorrer As IEnumerator recorrer = lista.GetEnumerator While recorrer.MoveNext 'A re a el elemento actual del Array Me.cbociudad.Items.Add(recorrer.Current) End While Else Ms Box("Primero debe de Car ar las Ciudades", Ms BoxStyle.Information, "ArrayList") End If End Sub
P i
41
Programacin Windows
Private Sub btnVer_Click 'Muestra el Total de Elementos del ArrayList Me.txtTotal.Text = lista.Count End Sub Private Sub btncar ar_Click Me.cbociudad.Items.Clear() 'Car amos el combo con un For For x As Inte er = 0 To lista.Count - 1 Me.cbociudad.Items.Add(lista(x)) Next End Sub Private Sub btnenumerador_Click Me.cbociudad.Items.Clear() 'Car amos el Combo con un IEnumerator Dim recorrer As IEnumerator 'Asi na el numero de elementos de mi ArrayList recorrer = lista.GetEnumerator While recorrer.MoveNext Me.cbociudad.Items.Add(recorrer.Current) End While End Sub Private Sub btnlimpiar_Click 'Elimina los elementos del Combo Me.cbociudad.Items.Clear() End Sub Private Sub btncapacidad_Click 'Muestra la capacidad de almacenamiento del ArrayList Ms Box(lista.Capacity) End Sub Private Sub btna re ar_Click 'A re ar un elemento al ArrayList lista.Add(Me.txtciudad.Text) End Sub End Class
P i
42
Programacin Windows
La Clase HashTable
Esta clase tiene la particularidad de que el acceso a los valores del array que estiona internamente se realiza a travs de una clave asociada a cada elemento, al estilo de los objetos Dictionary de versiones anteriores de VB. Como dato si nificativo, esta clase implementa el interfaz IDictionary, por lo que si hemos utilizado anteriormente objetos Dictionary, ya conocemos ran parte de su filosofa de trabajo. En este tipo de colecci n no es necesario preocuparse por la posici n o ndice de los elementos, ya que accedemos a ellos a travs de literales, lo cual en al unas circunstancias es mucho ms c modo de manejar. Respecto a la asi naci n de valores a la colecci n, esta clase utiliza el mtodo Add( ), cuyo primer parmetro corresponde a la clave del elemento y el se undo corresponde al valor que vamos a asi nar a la posici n de su array. Las propiedades Keys y Values de la clase Hashtable, devuelven un array con los nombres de las claves y los valores de un objeto Hashtable respectivamente.
P i
43
Programacin Windows
Ejercicio Prctico N
1.- Disear el Si uiente Formulario:
TxtCod
2.- Codificaremos lo si uiente: Public Class Form2 'Declaramos un objeto HashTable Dim clientes As New Hashtable Private Sub btn uardar_Click 'A re amos elementos a nuestro HashTable 'Le asi namos un codi o y un valor para cada elemento in resado clientes.Add(Me.txtcod.Text, Me.txtnom.Text) Ms Box("Datos Guardados!...", Ms BoxStyle.Information, "HashTable") Me.txtcod.Clear() Me.txtnom.Clear() Me.txtcod.Focus() End Sub Private Sub btnmostrar_Click 'Recorremos el HashTable con el IDictonaryEnumerator 'Y cada elemento recorrido lo a re amos en los 'dos ListBoxs Dim RECO As IDictionaryEnumerator RECO = clientes.GetEnumerator While RECO.MoveNext Me.lstcod.Items.Add(RECO.Key) Me.lstnom.Items.Add(RECO.Value) End While End Sub End Class
La Clase SortedList
Esta clase es una variaci n de Hashtable, ya que nos permite crear colecciones basadas en pares de claves y valor, pero con la diferencia de que en una colecci n SortedList, los elementos se ordenan por la clave se n van siendo a re ados. El funcionamiento eneral, es bsicamente i ual que para los objetos Hashtable.
P i
44
Programacin Windows
Ejercicio Prctico N5
1.- Disear el si uiente formulario
2.- Codificaremos lo si uiente: Public Class Form3 'Declaramos nuestro SortedList Dim letras As New SortedList Private Sub Form3_Load 'A re amos valores letras.Add("H", 111) letras.Add("A", 222) letras.Add("J", 333) letras.Add("Z", 444) letras.Add("M", 555) End Sub
ListVie 1
Private Sub BtnMostrar_Click 'Recorremos los elementos del SortedList y lo a re aremos al ListView Dim reco As IDictionaryEnumerator reco = letras.GetEnumerator While reco.MoveNext Dim lst As New ListViewItem(reco.Key.ToStrin ) lst.SubItems.Add(reco.Value.ToStrin ) Me.ListView1.Items.Add(lst) End While
P i
45
Programacin Windows
Implementacin de Threads
Para implementar Threads se usa el namespace: System.Threading.Thread y lue o se hace uso de los mtodos que se definen a continuaci n:
y
Start : Inicia un Thread, el cual es un proceso de llamada asncrona. Para saber el estado del Thread hay que usar las propiedades ThreadState y IsAlive. Abort: Cancela un Thread iniciado, si deseamos saber el estado nuevamente podemos usar las propiedades ThreadState y IsAlive. Sleep: Ocasiona una pausa en milise undos del bloque de instrucciones. Suspend: Tambin ocasiona una pausa en el bloque de instrucci n. Resume: Reinicia una pausa ori inada con el mtodo Suspend. Interrupt: Interrumpe una pausa ori inando una exepci n. Join: Espera por un Thread.
y y y y y
P i
46
Programacin Windows
Ejercicio Prctico N1
1.- Disear el siguiente formulario. 2.- Codificaremos lo siguiente. 'Importamos el namespace para Trheading Imports System.Threading Public Class Form1 'Creamos 2 procedimientos Public Sub Calculo_1() Dim res As Long For I As Integer = 0 To 100000 res = res + I Next MessageBox.Show("Calculo_1 " & res) End Sub Public Sub Calculo_2() Dim res As Long For I As Integer = 0 To 500 res = res + I Next MessageBox.Show("Calculo_2 " & res) End Sub Private Sub BtnComenzar_Click 'Creamos 2 variables de tipo Threading Dim hilo1 As New Thread(AddressOf Calculo_1) Dim hilo2 As New Thread(AddressOf Calculo_2) 'Ejecutamos los 2 procesos hilo1.Start() hilo2.Start() End Sub End Class
BackgroundWorker
Para solucionar el problema anterior el Framework 2.0 trae una clase muy util que encapsula bastante cdigo que hasta ahora tenamos que escribir nosotros. Se trata de BackgroundWorker. Su uso es sencillo, y se basa en eventos. Los eventos que expone son los si uientes: g
Pgina 47
Programacin Windows
Evento curre Cuando... ...se solicita la ejecucin de una tarea. Dentro del event handler asociado a este evento debe encontrarse el cdigo a ejecutar en otro hilo. Solo ocurre DoWork cuando se ejecuta el mtodo RunWorkerAsync() (de hecho ese mtodo lo unico que hace es lanzar el evento y arreglar las cosas para que se ejecute en otro hilo). ProgressChanged RunWorkerCompleted ...se reporta un progreso en el trabajo. ...se termin la ejecucin de la tarea. La terminacin puede deberse a que la ejecucin se complet o a que esta fue cancelada.
A traves del mtodo RunWorkerAsync() le indicamos al BackgroundWorker que se debe iniciar la ejecucin de una tarea. Imediatamente luego de su ejecucin, se produce el evento DoWork, y es ahi donde debemos indicarle que hacer. Durante la ejecucin podemos utilizar el mtodo ReportProgress() para lanzar el evento ProgressChanged, el cual podemos utilizar para actualizar un contador, una barra de progreso o simplemente para hacer alguna otra tarea. Si lo deseamos podemos utlizar el mtodo CancelAsync() para cancelar la ejecucin de la tarea, pero cabe aclarar que la simple ejecucin del mtodo no cancela la tarea sino que setea en true la propiedad CancellationPending del BackgroundWorker. Nosotros vam a ser los encargados de os monitorear a esta bandera y cancelar el trabajo nosotros mismos. Una vez terminada la ejecucin de la tarea se lanza el evento RunWorkerCompleted. El delegado de evento posee un argumento del tipo RunWorkerCompletedEventArgs quenos ayudar a determinar si la tarea fue cancelada o no y cual fue su resultado. El cdigo que acompaa a este artculo tiene una pequea aplicacion que simula realizar una tarea pesada y reporta su estado cada tanto. Obviamente su funcionamiento se basa n el e BackgroundWorker.
Ejercicio Prctico N2
1.- Disear el siguiente formulario
Pgina 48
Programacin Windows
2.- Codificaremos lo si uiente. Imports System.ComponentModel Public Class Form2 Public Sub Calculo_1(ByVal hilotr1 As Back roundWorker, ByVal e As DoWorkEventAr s) Dim res As Lon For I As Inte er = 0 To 100000 res = res + I Next Messa eBox.Show("Calculo_1 " & res) End Sub Public Sub Calculo_2(ByVal hilotr2 As Back roundWorker, ByVal e As DoWorkEventAr s) Dim res As Lon For I As Inte er = 0 To 500 res = res + I Next Messa eBox.Show("Calculo_2 " & res) End Sub Private Sub BtnComenzar_Click Me.Back roundWorker1.RunWorkerAsync() Me.Back roundWorker2.RunWorkerAsync() Dim x As Inte er = 0 End Sub Private Sub Back roundWorker1_DoWork Dim hilotr1 As Back roundWorker = sender Calculo_1(hilotr1, e) End Sub Private Sub Back roundWorker2_DoWork Dim hilotr2 As Back roundWorker = sender Calculo_2(hilotr2, e) End Sub End Class
Practica de Laboratorio
Implementando MultiThread y Control de Excepciones 1.- Se va a crear una aplicaci n en la que se implemente mltiples Threads para iniciar la lectura de un archivo de texto extenso y poder cancelar este proceso si es necesario. Adems para evitar los errores en tiempo de ejecuci n haremos uso del control estructurado de excepciones. 2.- Disear el si uiente formulario.
P i
TxtNomb
TxtArchiv
49
Programacin Windows
3.- Codificaremos lo si uiente: Public Class frmarchivo 'Creamos un Thread llamado Hilo Dim hilo As System.Threadin .Thread 'Crearemos el procedimiento LeerArchivo 'El cual abrira un documento de Texto Sub leerarchivo() Dim flujo As System.IO.StreamReader Dim linea As Strin = "" Try flujo = System.IO.File.OpenText(Me.txtnombre.Text) Do Until IsNothin (linea) linea = flujo.ReadLine Me.txtarchivo.Text = Me.txtarchivo.Text & linea & Chr(13) & Chr(10) Loop Catch X As IO.IOException Ms Box(X.Messa e, Ms BoxStyle.Information, "No se Pudo") Exit Sub Me.txtnombre.Clear() End Try flujo.Close() Me.btnsuspender.Enabled = False Me.btncontinuar.Enabled = False Me.btncancelar.Enabled = False End Sub Private Sub btnleer_Click 'Instanciamos un nuevo thread 'El cual llamara al procedimiento LeerArchivo hilo = New System.Threadin .Thread(AddressOf leerarchivo) 'Ejecuta el Thread hilo.Start() Me.btnsuspender.Enabled = True Me.btncancelar.Enabled = True End Sub Private Sub txtnombre_TextChan ed Me.btnleer.Enabled = Me.txtnombre.Text <> "" End Sub Private Sub btncancelar_Click 'Cancela la ejecucion del Thread hilo.Abort() Me.btnleer.Enabled = False Me.btnsuspender.Enabled = False Me.btncancelar.Enabled = False End Sub
P i
50
Programacin Windows
Private Sub btnnuevo_Click Me.txtnombre.Clear() Me.txtarchivo.Clear() Me.txtnombre.Focus() End Sub Private Sub btnsuspender_Click 'Detiene la ejecucion del Thread hilo.Suspend() Me.btnleer.Enabled = False Me.btncontinuar.Enabled = True Me.btncancelar.Enabled = False End Sub Private Sub btncontinuar_Click 'Reinicia la ejecucion del Thread hilo.Resume() End Sub Private Sub BtnVerificar_Click 'Verifica el estado de ejecucion del Thread If hilo.IsAlive() Then Ms Box("En Ejecuci n", Ms BoxStyle.Information, "Vida del Threads") Else Ms Box("Termino su Ejecuci n", Ms BoxStyle.Information, "Vida del Threads") End If End Sub Private Sub btnsalir_Click Me.Close() End Sub End Class
P i
51
Programacin Windows
Introduccin
El prop sito de este Tema es mostrar un mecanismo sencillo que permita contenidos en los controles de una forma de Windows; en una archivo xml. Para lo rar este prop sito utilizaremos la clase XmlSerializer que permite crear una representaci n XML de un objeto para efectos de almacenamiento y transporte. Esta clase permite serializaci n XML y Desearializaci n XML. La serializaci n permite crear a partir de las variables y propiedades pblicas de una clase un objeto XML serializado. El mtodo Serialize de la clase XmlSerializer permite crear un archivo XML de tipo (System.IO.StreamWriter) a partir de una clase por medio de una objeto serializado. El mtodo Deserialize de la clase XmlSerializer permite crear objeto con la informaci n deseralizada proveniente de un archivo XML. uardar los valores
Ejercicio Prctico N1
1.Crearemos un proyecto llamado Serializaci n de Objetos. 2.- Lue o a nuestro proyecto a re aremos una clase llamada CLSPRODUCTOS.
3.- Dentro de nuestra clase clsproductos codificaremos lo si uiente. Public Class clsproductos 'Declaracion de Variables Private vname As Strin Private vdescription As Strin Private vqty As Inte er
P i
52
Programacin Windows
'Declaracion de las Propiedades Public Property nombre() As Strin Get nombre = vname End Get Set(ByVal value As Strin ) vname = value End Set End Property Public Property descripcion() As Strin Get descripcion = vdescription End Get Set(ByVal value As Strin ) vdescription = value End Set End Property Public Property cantidad() As Inte er Get cantidad = vqty End Get Set(ByVal value As Inte er) vqty = value End Set End Property End Class 4.- Lue o disearemos el si uiente formulario.
TxtnomPro TxtDescripcio TxtCantida BtnSerializar BtnDeSerializar
Imports System.IO 'Importamos el NameSpace que me permitira la Serializacion Imports System.Xml.Serialization Public Class Form1 'Declaramos una Variable del Tipo de La Clase ClsProductos Dim p As New clsproductos Private Sub BtnSerializar_Click 'Asi nacion de Valores Para la Clase Productos p.nombre = Me.txtnompro.Text p.descripcion = Me.txtdescripcion.Text p.cantidad = CInt(Me.txtcantidad.Text)
P i
53
Programacin Windows
'Declaracion de la Variable "X" que contendra la clase Dim x As New XmlSerializer(p.GetType) 'Lugar donde se creara el archivo XML Dim archivo As New StreamWriter("C:\Producto.xml") 'Crea el archivo XML en el lugar donde se le indica 'Y la clase a Serializar x.Serialize(archivo, p) archivo.Close() MsgBox("Objeto XML creado", MsgBoxStyle.Information, "Serializacion") End Sub Private Sub BtnDeSerializar_Click Try Dim x As New XmlSerializer(p.GetType) 'Archivo XML que se Desearilizar Dim archivodes As New StreamReader("C:\Producto.xml") 'Variable que contendra la clase deserializada Dim p2 As New clsproductos 'Direccion del archivo a Deserealizar p2 = x.Deserialize(archivodes) archivodes.Close() MsgBox("Nombre:" & p2.nombre & vbCrLf & "Descripcion:" & p2.descripcion & vbCrLf & "Cantidad:" & CStr(p2.cantidad)) Catch ex As Exception MsgBox("El Archivo no Existe", MsgBoxStyle.Information, "Deserializacion") End Try End Sub End Class 5.- Al ejecutar nuestra aplicacin introduciremos un nombre, descripcin, y cantidad de un producto .
Pgina 54
Programacin Windows
6.- Daremos clic en el botn Serializar objeto y nos saldr un mensaje como el que muestra la figura.
7.- Abriremos el archivo XML creado en la unidad C:\, y aparecer el cdigo como muestra la figura; el cual es cdigo XML.
8.- Luego al dar clic sobre el botn Deserializar nos mostrar la informacin del archivo serializado anteriormente.
Pgina 55
Programacin Windows
El NameSpace System.IO
Este NameSpace contiene todos los tipos que permiten leer y escribir en los archivos y secuencia de datos, as como tipos que proporcionan compatibilidad bsica con los archivos y directorios. Al unas Clases de System.IO
Clase
Directory DirectoryInfo
Descripcin
Expone mtodos estticos para crear, mover y enumerar archivos en directorios y subdirectorios Expone mtodos de instancia para crear, mover y enumerar archivos en directorios y subdirectorios.
ile
Proporciona mtodos estticos para crear, copiar, eliminar, mover y abrir archivos y contribuye a la creaci n de objetos FileStream. Utilice la clase ileStream para leer, escribir, abrir y cerrar archivos en un sistema de archivos, as como para manipular otros identificadores del sistema operativo relacionados con archivos, como canalizaciones, entrada estndar y salida estndar amd. Puede especificar que las operaciones de lectura y escritura sean sincr nicas o asincr nicas. FileStream almacena en el bfer la entrada y la salida para obtener un mejor rendimiento.
FileInfo
Proporciona mtodos de instancia para crear, copiar, eliminar, mover y abrir archivos y contribuye a la creaci n de objetos FileStream. Expone un objeto Stream alrededor de un archivo; se admiten operaciones de lectura y escritura sincr nica y asincr nica. Un objeto Stream proporciona una vista enrica de una secuencia de bytes. Ejecuta operaciones en instancias de Strin que contienen informaci n de rutas de archivos o directorios. Estas operaciones se ejecutan de forma adecuada para mltiples plataformas.
FileStream
Path
P i
56
Programacin Windows
Ejercicio Prctico N 1.- Disear el si uiente formulario.
TxtCarpet a
TxtArchivo
P i
57
Programacin Windows
Ejercicio Prctico N 1.- Disear el siguiente formulario. 2.- Luego codificaremos lo siguiente:
'Importamos el namesapce que nos permitira 'manejar archivos carpetas y unidades Imports System.IO Public Class Form Private Sub btncrear_Click 'Variable de tipo StreamWriter que me permite crear y escribir en un archivo de texto Dim archi As New StreamWriter( C:\ & Me.txtarchi.Text & ".txt") Dim texto As String texto = Me.txtTexto.Text archi.WriteLine(texto) archi.Flush() End Sub End Class
TxtArc i
TxtTexto
BtnCrea
Pgina 58
Programacin Windows
2.- Lue o codificaremos lo si uiente. 'Importaci n de la Clase Imports System.IO Public Class Form1 Private Sub BtnMostrar_Click 'Array de tipo Drive va a car ar las unidades de disco Dim unidades() As DriveInfo = DriveInfo.GetDrives 'Variable que recorrera las unidades de disco Dim unidad As DriveInfo Me.lstunidades.Items.Clear() 'Recorre cada una de las unidades y lo a re a al ListBox For Each unidad In unidades Me.lstunidades.Items.Add(unidad.Name) Next End Sub
P i
59
Programacin Windows
Private Sub lstunidades_MouseClick Me.lstcarpetas.Items.Clear() 'Variable que captura el nombre de la unidad 'Seleccionada en el ListBox Dim unidad As Strin = Me.lstunidades.SelectedItem.ToStrin 'Variable a la cual se le dira de que unidad 'se va a buscar las carpetas existentes Dim directorioraiz As New DirectoryInfo(unidad) 'Variable de tipo carpeta que recorrera todas las carpetas 'de la unidad indicada Dim directorio As DirectoryInfo Try For Each directorio In directorioraiz.GetDirectories 'Recorre todas las carpetas y lo va a re ando al ListBox Me.lstcarpetas.Items.Add(directorio) Next Catch ex As Exception Ms Box("No Hay Carpetas", Ms BoxStyle.Information) End Try End Sub Private Sub lstcarpetas_MouseClick Me.lstarchivos.Items.Clear() 'Variables que capturaran los nombres de la unidad 'y carpeta de la unidad seleccionada Dim unidad, carpeta As Strin unidad = Me.lstunidades.SelectedItem.ToStrin carpeta = Me.lstcarpetas.SelectedItem.ToStrin 'Variable a la cual se le dira de que unidad y carpeta 'se va a buscar los archivos existentes Dim ruta As New DirectoryInfo(Path.Combine(unidad, carpeta)) 'Variable de tipo archivo que recorrera los archivos existentes Dim archivo As FileInfo For Each archivo In ruta.GetFiles 'Recorre los archivos existentes y los a rea al ListBox Me.lstarchivos.Items.Add(archivo.Name) Next End Sub
P i
60
Programacin Windows
Private Sub lstarchivos_MouseClick Me.lstinformacion.Items.Clear() 'Varibles que almacenaran los nombres de la unidad 'carpeta y archivo seleccionados en los ListBoxs Dim unidad, carpeta, archivo As String unidad = Me.lstunidades.SelectedItem.ToString carpeta = Me.lstcarpetas.SelectedItem.ToString archivo = Me.lstarchivos.SelectedItem.ToString 'Variable a la cual se le dira de que unidad y carpeta 'se va a buscar el archivo existente. Dim informacion As New FileInfo(Path.Combine(Path.Combine(unidad, carpeta), archivo)) 'Se agregara al ListBox la informacion del archivo correspondiente Me.lstinformacion.Items.Add("Nombre:" & informacion.Name) Me.lstinformacion.Items.Add("Tamao(Bytes): " & informacion.Length) Me.lstinformacion.Items.Add("Fecha de Creacin: " & informacion.CreationTime.ToShortDateString) End Sub End Class 3.- Ejecutaremos y deber aparecer como se muestra en la figura.
Pgina 61
Programacin Windows
Ejercicio Prctico N (Envi de Mensaje por Correo)
TxtDe
LstAdjuntar
2.- Lue o codificaremos lo si uiente. Imports System.Net.Mail Public Class Form2 'Variable la cual contendra los datos adjuntos 'de nuestro mensaje Dim datosadjuntos As System.Net.Mail.Attachment Private Sub Form2_Load 'Texto que se car ara al car ar el formulario Me.txtDe.Text = "ejemplocorreosise@ mail.com" Me.txtDe.ReadOnly = True End Sub Private Sub BtnEnviar_Click 'creamos un nuevo mensaje de correo Dim correo As New MailMessa e 'De correo.From = New MailAddress(Me.txtDe.Text) 'Para
P i 62
Programacin Windows
correo.To.Add(Me.txtPara.Text) 'Asunto correo.Subject = txtAsunto.Text 'Archivo Adjunto Dim counter As Inte er 'Para poder car ar varios For counter = 0 To lstadjuntar.Items.Count - 1 'Cada archivo ya esta car ado o adjuntado al mensaje datosadjuntos = New Net.Mail.Attachment(lstadjuntar.Items(counter)) correo.Attachments.Add(datosadjuntos) Next 'Cuerpo del correo correo.Body = txtMensaje.Text 'Mostrar como HTML correo.IsBodyHtml = True 'Prioridad de el correo correo.Priority = MailPriority.Normal 'acto se uido le indicamos cual servidor utilizaremos 'aqu usaremos por default a mail y su puerto SMTP Dim smtp As New SmtpClient() smtp.Host = "smtp. mail.com" smtp.Port = 587 smtp.Credentials = New System.Net.NetworkCredential("ejemplocorreosise@ mail.com", "ejemplocorreo") smtp.EnableSsl = True Try 'listo tenemos la estructura de nuestro mensaje armada ahora enviemosla a nuestro destinatario y listo smtp.Send(correo) Ms Box("Mensaje enviado satisfactoriamente") Catch ex As Exception Ms Box("No se pudo Enviar su Mensaje " & ex.Messa e) End Try End Sub Private Sub BtnAdjuntar_Click Dim Counter As Inte er 'Muestra un mensaje si el archivo no existe OfdAbrir.CheckFileExists = True OfdAbrir.Title = "Seleccione Archivo(s) que quesee adjuntar" 'Se abre el OpenFileDialo
P i 63
Programacin Windows
OfdAbrir.ShowDialo () For Counter = 0 To UBound(OfdAbrir.FileNames) If Me.lstadjuntar.Items.Contains(Me.OfdAbrir.FileName) = False Then 'Si el archivo no se encuentra en el ListBox lo a re a lstadjuntar.Items.Add(OfdAbrir.FileNames(Counter)) Else 'De lo contrario muestra un mensaje 'si el archivo ya esta adjuntado Ms Box("El Archivo ya se car o", Ms BoxStyle.Information, "Envio de Correo") End If Next End Sub Private Sub BtnQuitar_Click_1 'Elimina el archivo adjuntado del ListBox If lstadjuntar.SelectedIndex > -1 Then lstadjuntar.Items.RemoveAt(lstadjuntar.SelectedIndex) End If End Sub Private Sub RbColor_CheckedChan ed 'Abre el Cuadro de Color If RbColor.Checked = True Then If Me.ColorDialo 1.ShowDialo = Windows.Forms.Dialo Result.OK Then Me.txtMensaje.ForeColor = Me.ColorDialo 1.Color End If End If End Sub Private Sub RbFuente_CheckedChan ed 'Abre el cuadro de Fuente If RbFuente.Checked = True Then If FontDialo 1.ShowDialo () = Windows.Forms.Dialo Result.OK Then Me.txtMensaje.Font = FontDialo 1.Font End If End If End Sub End Class
P i
64
Programacin Windows
P i
65
Programacin Windows
Una vez realizada este paso ya se puede crear una instancia de la aplicaci n Word. Imports Microsoft.Office.Interop Dim ApWord as New Word.Application
P i
66
Visuali ar un Documento
Se puede presentar el documento Word asi nando a la propiedad Visible del objeto aplicaci n el valor=True. ApWord.Visible=True
P i
67
P i
68
TxtContenido
Pgina 69
Programacin Windows
2.- Los combos contendrn lo siguiente:
3.- Codificaremos lo siguiente: 'Importamos el namespace para trabajar con office Imports Microsoft.Office.Interop Public Class Form1 Private Sub btncrear_Click Dim apword As New Word.Application Dim doc As Word.Document = apword.Documents.Add apword.Visible = True End Sub Private Sub btnabrir_Click Dim apword As New Word.Application Dim ruta As String Me.OpenFileDialog1.Filter = "Documentos de Word (*.doc)|*.doc" If Me.OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then ruta = Me.OpenFileDialog1.FileName End If Dim doc As Word.Document = apword.Documents.Open(ruta) End Sub Private Sub btnguardar_Click Dim apword As New Word.Application Dim docword As Word.Document = apword.Documents.Add apword.Visible = False 'Indica que se trabajar con el Documento Activo Dim doc As Word.Document = apword.ActiveDocument 'Inserta el Texto del TextBox en el Documento doc.Content.InsertAfter(Me.txtcontenido.Text) 'Pone en Negrita el Texto a Guardar en el Documento Dim rango As Word.Range = doc.Range(doc.Range.Paragraphs(1).Range.Start, doc.Range.Paragraphs(doc.Paragraphs.Count).Range.End) If Me.chkNegrita.Checked = True Then rango.Font.Bold = 1 End If
Pgina 70
Programacin Windows
'Pone en Cursiva el Texto a Guardar en el Documento If Me.chkcursiva.Checked = True Then rango.Font.Italic = 1 End If 'Indica el Tamao de Letra If Me.cbotamao.SelectedIndex <> -1 Then rango.Font.Size = Me.cbotamao.Text Else rango.Font.Size = 12 End If 'Indica la Fuente o Tipo de Letra If Me.cbofuente.SelectedIndex <> -1 Then rango.Font.Name = Me.cbofuente.Text Else rango.Font.Name = "Times New Roman" End If 'Guarda el Documento doc.SaveAs(Me.txtdocumento.Text & ".doc") 'Cierra el Documento doc.Close() MsgBox("Documento de Word Creado ...!", MsgBoxStyle.Information, "SISE") End Sub End Class
Pgina 71
Programacin Windows
Agregue la librera COM Microsoft Agent Control 2.0, para ello ir al Men Proyecto / Agregar Referencia as como se muestra en la figura:
Luego en la etiqueta COM de la ventana emergente escogeremos Microsoft Agent Control 2.0, as como se muestra en la figura.
Luego escribiremos el siguiente cdigo. y A nivel Formulario: Public Class Form1 'Declarar los Objetos Dim Agente As New AgentObjects.Agent Dim Mueco As AgentObjects.IAgentCtlCharacterEx En el evento Load del Formulario Private Sub Form1_Load 'Cargar un Character; es decir el mueco que va a aparecer Agente.Connected = True Agente.Characters.Load("Merlin", "merlin.acs") Mueco = Agente.Characters("Merlin") 'Bucle para Cargar Todos los Movimientos Dim Mov As Object For Each Mov In Mueco.AnimationNames Me.ListBox1.Items.Add(Mov) Next End Sub y En el evento clic de cada uno de los Botones:
Pgina 72
Programacin Windows
Private Sub btnmostrar_Click 'Muestra el Agente Mueco.Show() 'Desplaza de Posicion al Agente Mueco.MoveTo(450, 350) End Sub Private Sub btnocultar_Click 'Oculta al Agente Mueco.Hide() End Sub Private Sub btnmovimiento_Click 'Ejecuta el Movimiento Mueco.Play(Me.ListBox1.SelectedItem) End Sub Private Sub btnmensaje_Click 'Muestra el Mensaje Mueco.Speak(Me.txtmensaje.Text) End Sub Al final ejecutamos la aplicacin y se debe de mostrar de la siguiente manera:
Para que el agente Merlin pueda tener voz, es necesario instalar 2 archivos los cuales son: y y Microsoft SAPI 4.0 Para que Hablen en espaol
Un archivo es para el sistema operativo Windows y el otro es para el idioma. Para que puedan trabajar con estos archivos es necesario que su instructor les provea de la carpeta Ayudantes para Microsoft.
Pgina 73
Programacin Windows
Componentes ActiveX
Visual Basic.Net permite usar componentes ya definidos en nuestros formularios, dichos componentes no son mas que clases que trabajan de una forma concreta que han sido creados para realizar funciones especificas, dichos componentes, cuentan con eventos y propiedades, dado que son usados como objetos. Estos componentes forman parte de una lista de controles que Visual Basic.Net nos ofrece, as mismo podremos agregar ms componentes segn nuestro propiorequerimientos.
Explorador Web
Para poder comprender mejor el uso de componentes COM realizaremos un programa que nos permita crear un explorador de paginas web. 1.- Crear un formulario. 2.- Luego como nuestro componente Web no se encuentra en la lista, procederemos a sacarlo de la lista de elementos. Pulsamos clic derecho en el men de Componentes Elegimos la opcin Elegir Elementos
Pgina 74
Programacin Windows
3.- Seleccionaremos el componente Explorador del Web de Microsoft y luego en Aceptar.
4.- Luego nos mostrara el componente en nuestra lista de Elementos. 5.- Despus insertamos ese componente usndolo como control a nuestro formulario, tambin insertaremos un control TextBox y Button.
TxtDir BtnIr
AxWebBrowser
Pgina 75
Programacin Windows
AxWindowsMediaPlayer
BtnAudio
BtnVideo
3.- Lue o en el evento clic de cada bot n codificaremos lo si uiente. Private Sub btnaudio_Click Me.AxWindowsMediaPlayer1.URL = "D:\Rocky.mp3" End Sub Private Sub btnvideo_Click Me.AxWindowsMediaPlayer1.URL = "D:\madonna.mp " End Sub
P i
76
Programacin Windows
System.Globali ation
La lobalizaci n es el proceso de diseo y desarrollo de una aplicaci n que permite el uso de interfaces de usuario localizadas y datos re ionales para usuarios de varias referencias culturales. El espacio de nombres System.Globali ation contiene clases que definen informaci n relativa a la referencia cultural, incluido el idioma, el pas o re i n, los calendarios utilizados, los modelos de formato para las fechas, la moneda y los nmeros y el criterio de ordenaci n de las cadenas. Estas clases son tiles para escribir aplicaciones lobalizadas (internacionalizadas). Las clases como lobalizaci n, por ejemplo, Strin Info y TextInfo proporcionan funciones avanzadas de compatibilidad para suplentes y procesamiento de elementos de texto. En .NET Framework, la clase CultureInfo representa informaci n acerca de una referencia cultural especfica. Esa informaci n incluye el sistema de escritura, los calendarios utilizados, las convenciones de formato de fecha y hora, las convenciones de nmeros y de moneda, y las re las de ordenaci n. Antes de empezar la fase de diseo, debe determinar qu referencias culturales admitir la aplicaci n. De este modo, permitir disear caractersticas que admitan todas las referencias culturales identificadas. Adems, le posibilitar centrarse en la escritura de c di o que funcione i ual de bien en todas las referencias culturales admitidas. El espacio de nombres System.Globalization contiene clases que definen informaci n relativa a la referencia cultural, incluido el idioma, el pas o re i n, los calendarios utilizados, los modelos de formato de fecha, moneda y nmeros, y el criterio de ordenaci n de las cadenas. Utilice esas clases para simplificar el proceso de desarrollo de una aplicaci n de uso internacional. Al pasar un objeto CultureInfo para la referencia cultural actual a los mtodos de este espacio de nombres, puede iniciar el conjunto de re las y datos correctos para la referencia cultural del usuario actual.
P i 77
Programacin Windows
La clase CultureInfo contiene informaci n especfica de la referencia cultural, como el idioma, el pas o re i n, el calendario y las convenciones culturales asociadas a una referencia cultural especfica. Esta clase tambin proporciona la informaci n necesaria para realizar operaciones especficas de la referencia cultural, como la distinci n de maysculas y minsculas, el formato de fechas y nmeros, y la comparaci n de cadenas. En el c di o usado para averi uar el separador decimal (y el de miles) usamos la propiedad NumberFormat de la propiedad compartida CurrentCulture de la clase CultureInfo, y ese mtodo devuelve un objeto del tipo NumberFormatInfo que tiene las si uientes propiedades:
Propiedad CurrencyDecimalDigits Descripcin Indica el nmero de posiciones decimales que se van a utilizar en valores de moneda.
CurrencyDecimalSeparator Obtiene o establece la cadena que se va a utilizar como separador decimal en valores de moneda. CurrencyGroupSeparator Obtiene o establece la cadena que separa grupos de dgitos a la izquierda de la coma decimal en valores de moneda. Obtiene o establece el nmero de dgitos en cada grupo a la izquierda de la coma decimal en valores de moneda. Obtiene o establece el modelo de formato para los valores de moneda negativos. Obtiene o establece el modelo de formato para los valores de moneda positivos. Obtiene o establece la cadena que se va a utilizar como smbolo de moneda. Obtiene un NumberFormatInfo de slo lectura que aplica formato a los valores basndose en la referencia cultural actual. Obtiene o establece un valor que especifica cmo la interfaz grfica de usuario muestra la forma de un dgito. Obtiene la NumberFormatInfo predeterminada de slo lectura que es independiente de la referencia cultural (invariable). Obtiene un valor que indica si NumberFormatInfo es de slo
CurrencyGroupSizes
CurrencyNegativePattern
CurrencyPositivePattern
CurrencySymbol
CurrentInfo
DigitSubstitution
InvariantInfo
IsReadOnly
P i
78
Programacin Windows
lectura. NaNSymbol Obtiene o establece la cadena que representa el valor NaN (no un nmero) de IEEE. Obtiene o establece una matriz de cadenas de dgitos nativos equivalentes a los dgitos occidentales del 0 al 9. Obtiene o establece la cadena que representa un infinito negativo. Obtiene o establece la cadena que denota que el nmero asociado es negativo. Obtiene o establece el nmero de posiciones decimales que se van a utilizar en valores numricos. Obtiene o establece la cadena que se va a utilizar como separador decimal en valores numricos. Obtiene o establece la cadena que separa grupos de dgitos a la izquierda de la coma decimal en valores numricos. Obtiene o establece el nmero de dgitos en cada grupo a la izquierda de la coma decimal en valores numricos. Obtiene o establece el modelo de formato para los valores numricos negativos. Obtiene o establece el nmero de posiciones decimales que se van a utilizar en valores de porcentaje. Obtiene o establece la cadena que se van a utilizar como separador decimal en valores de porcentaje. Obtiene o establece la cadena que separa grupos de dgitos a la izquierda de la coma decimal en valores de porcentaje. Obtiene o establece el nmero de dgitos en cada grupo a la izquierda de la coma decimal en valores de porcentaje. Obtiene o establece el modelo de formato para los valores de porcentaje negativos. Obtiene o establece el modelo de formato para los valores de porcentaje positivos.
NativeDigits
NegativeInfinitySymbol
NegativeSign
NumberDecimalDigits
NumberDecimalSeparator
NumberGroupSeparator
NumberGroupSizes
NumberNegativePattern
PercentDecimalDigits
PercentDecimalSeparator
PercentGroupSeparator
PercentGroupSizes
PercentNegativePattern
PercentPositivePattern
P i
79
Programacin Windows
PercentSymbol Obtiene o establece la cadena que se va a utilizar como smbolo de porcentaje. Obtiene o establece la cadena que se va a utilizar como smbolo de por mil. Obtiene o establece la cadena que representa un infinito positivo. Obtiene o establece la cadena que denota que el nmero asociado es positivo.
PerMilleSymbol
PositiveInfinitySymbol PositiveSign
Nota: Esta es la tabla usada en la informaci n de Visual Studio 2005, pero todas las propiedades estn disponibles tambin en las versiones anteriores. Ejercicio Prctico N1 1.- Disear el si uiente formulario.
TxtSD BtnVer
TxtSM
2.- Lue o Codificaremos lo si uiente. Private Sub btnver_Click 'Variable que a arrara el separador decimal y separador rupal Dim s As Strin 'A arra el separador decimal de la confi uracion re ional del sistema s =System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator Me.TxtSD.Text = s 'A arra el separador de rupo de la confi uracion re ional del sistema s = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyGroupSeparator Me.TxtSM.Text = s End Sub
P i
80
Programacin Windows
Ejercicio Prctico N
1.- Disear el si uiente formulario.
Txtnum BtnVer
2.- Lue o Codificaremos lo si uiente. Private Sub btnver_Click 'Variable que captura el numero a dar formato re ional Dim x As Decimal = Val(Me.txtnum.Text) 'Variable que define el formato re ional de la Moneda Dim objculture As Globalization.NumberFormatInfo = New Globalization.CultureInfo("ESPE").NumberFormat objculture.CurrencyDecimalDi its = 1 objculture.CurrencyDecimalSeparator = "," objculture.CurrencyGroupSeparator = "." objculture.CurrencySymbol = "S/." 'Mostrar el numero convertido a un formato de Moneda 'El cual contiene la variable de tipo Globalization Me.txtfn.Text = x.ToStrin ("c", objculture) 'Variable que define el formato re ional de la Fecha y Hora Dim formatofecha As Globalization.DateTimeFormatInfo = New Globalization.CultureInfo("ES-ES", True).DateTimeFormat Dim dt As New DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day) Me.txtff.Text = dt.ToStrin (formatofecha.ShortDatePattern) Me.txtfh.Text = dt.ToStrin (formatofecha.ShortTimePattern) End Sub
P i
81
Programacin Windows
La Clase CultureInfo
La clase CultureInfo especifica un nombre nico para cada referencia cultural basndose en el estndar RFC 1766. El nombre es una combinaci n de un c di o de referencia cultural de dos letras en minscula asociado con un idioma, y un c di o de referencia cultural secundaria de dos letras en mayscula asociado con un pas o re i n. El c di o de referencia cultural secundaria si ue al c di o de referencia cultural, separados por un ui n (-). Los ejemplos incluyen "ja-JP" para el japons de Jap n, "en-US" para el in ls de EE.UU. y "de-DE" para el alemn de Alemania (a diferencia de "deAT" para el alemn de Austria). En los casos en los que no haya un c di o de idioma de dos letras disponible, se usa el c di o de tres letras que se deriva de ISO 639-2; por ejemplo, se usa el c di o de tres letras"div" para referencias culturales que utilizan el idioma dhivehi. Al unos nombres de referencias culturales tienen sufijos que especifican la escritura; por ejemplo, "-Cyrl" especifica las letras del cirlico, "-Latn" especifica las letras del latn. En este tema se utilizan las expresiones "referencia cultural neutra" y "referencia cultural especfica". Una referencia cultural neutra se especifica nicamente mediante el c di o de dos d itos de la referencia cultural en minscula. Por ejemplo, "fr" especifica la referencia cultural neutra para el francs y "de" especifica la referencia cultural neutra para el alemn. Una referencia cultural especfica se identifica por el c di o de referencia cultural se uido por el c di o de referencia cultural secundaria de dos d itos en mayscula. Por ejemplo, "fr-FR" especifica francs de Francia y "fr-CA" especifica francs de Canad. A continuaci n, se incluyen los nombres e identificadores de CultureInfo predefinidos aceptados y utilizados por esta y otras clases en el espacio de nombres System.Globalization. Nombre de referencia cultural "" (cadena vaca) af af-ZA sq sq-AL ar ar-DZ ar-BH ar-EG ar-IQ ar-JO ar-KW ar-LB ar-LY ar-MA Identificador de referencia cultural 0x007F 0x0036 0x0436 0x001C 0x041C 0x0001 0x1401 0x3C01 0x0C01 0x0801 0x2C01 0x3401 0x3001 0x1001 0x1801 Idioma-Pas/regin referencia cultural invariable Afrikaans Afrikaans-Sudfrica Albans Albans-Albania rabe rabe-Ar elia rabe-Bahrein rabe-E ipto rabe-Iraq rabe-Jordania rabe-Kuwait rabe-Lbano rabe-Libia rabe-Marruecos
P i 82
Programacin Windows
ar-OM ar-QA ar-SA ar-SY ar-TN ar-AE ar-YE hy hy-AM az az-AZ-Cyrl az-AZ-Latn eu eu-ES be be-BY b b -BG ca ca-ES zh-HK zh-MO zh-CN zh-CHS zh-SG zh-TW zh-CHT hr hr-HR cs cs-CZ da da-DK div div-MV nl nl-BE nl-NL en en-AU en-BZ en-CA en-CB en-IE 0x2001 0x4001 0x0401 0x2801 0x1C01 0x3801 0x2401 0x002B 0x042B 0x002C 0x082C 0x042C 0x002D 0x042D 0x0023 0x0423 0x0002 0x0402 0x0003 0x0403 0x0C04 0x1404 0x0804 0x0004 0x1004 0x0404 0x7C04 0x001A 0x041A 0x0005 0x0405 0x0006 0x0406 0x0065 0x0465 0x0013 0x0813 0x0413 0x0009 0x0C09 0x2809 0x1009 0x2409 0x1809 rabe-Omn rabe-Qatar rabe-Arabia Saud rabe-Siria rabe-Tnez rabe-Emiratos rabes Unidos rabe-Yemen Armenio Armenio-Armenia Azer Azer (cirlico)-Azerbaiyn Azer (latino)-Azerbaiyn Vasco Vasco-Espaa Bielorruso Bielorruso-Bielorrusia Bl aro Bl aro-Bul aria Cataln Cataln-Espaa Chino-Zona administrativa especial de Hon Kon Chino-Zona administrativa especial de Macao Chino-China Chino (simplificado) Chino-Sin apur Chino-Taiwn Chino (tradicional) Croata Croata-Croacia Checo Checo-Repblica Checa Dans Dans-Dinamarca Dhivehi Dhivehi-Maldivas Holands Holands-Bl ica Holands-Pases Bajos In ls In ls-Australia In ls-Belice In ls-Canad In ls-Caribe In ls-Irlanda
P i 83
Programacin Windows
en-JM en-NZ en-PH en-ZA en-TT en-GB en-US en-ZW et et-EE fo fo-FO fa fa-IR fi fi-FI fr fr-BE fr-CA fr-FR fr-LU fr-MC fr-CH l l-ES ka ka-GE de de-AT de-DE de-LI de-LU de-CH el el-GR u u-IN he he-IL hi hi-IN hu hu-HU es is-IS id 0x2009 0x1409 0x3409 0x1C09 0x2C09 0x0809 0x0409 0x3009 0x0025 0x0425 0x0038 0x0438 0x0029 0x0429 0x000B 0x040B 0x000C 0x080C 0x0C0C 0x040C 0x140C 0x180C 0x100C 0x0056 0x0456 0x0037 0x0437 0x0007 0x0C07 0x0407 0x1407 0x1007 0x0807 0x0008 0x0408 0x0047 0x0447 0x000D 0x040D 0x0039 0x0439 0x000E 0x040E 0x000F 0x040F 0x0021 In ls-Jamaica In ls-Nueva Zelanda In ls-Filipinas In ls-Sudfrica In ls-Trinidad y Toba o In ls-Reino Unido In ls-Estados Unidos In ls-Zimbabue Estonio Estonio-Estonia Feros Feros-Islas Feroe Persa Persa-Irn Finlands Finlands-Finlandia Francs Francs-Bl ica Francs-Canad Francs-Francia Francs-Luxembur o Francs-M naco Francs-Suiza Galle o Galle o-Espaa Geor iano Geor iano-Geor ia Alemn Alemn-Austria Alemn-Alemania Alemn-Liechtenstein Alemn-Luxembur o Alemn-Suiza Grie o Grie o-Grecia Gujarati Gujarati-India Hebreo Hebreo-Israel Hindi Hindi-India Hn aro Hn aro-Hun ra Islands Islands-Islandia Indonesio
P i 84
Programacin Windows
id-ID it it-IT it-CH ja ja-JP kn kn-IN kk kk-KZ kok kok-IN ko ko-KR ky ky-KZ lv lv-LV lt lt-LT mk mk-MK ms ms-BN ms-MY mr mr-IN mn mn-MN no nb-NO nn-NO pl pl-PL pt pt-BR pt-PT pa pa-IN ro ro-RO ru ru-RU sa sa-IN 0x0421 0x0010 0x0410 0x0810 0x0011 0x0411 0x004B 0x044B 0x003F 0x043F 0x0057 0x0457 0x0012 0x0412 0x0040 0x0440 0x0026 0x0426 0x0027 0x0427 0x002F 0x042F 0x003E 0x083E 0x043E 0x004E 0x044E 0x0050 0x0450 0x0014 0x0414 0x0814 0x0015 0x0415 0x0016 0x0416 0x0816 0x0046 0x0446 0x0018 0x0418 0x0019 0x0419 0x004F 0x044F Indonesio-Indonesia Italiano Italiano-Italia Italiano-Suiza Japons Japons-Jap n Kannada Kannada-India Kazajo Kazajo-Kazajistn Konkani Konkani-India Coreano Coreano-Corea Kir us Kir us-Kazajistn Let n Let n-Letonia Lituano Lituano-Lituania Macedonio Macedonio-Anti ua Repblica Yu oslava de Macedonia Malayo Malayo-Bruni Darussalam Malayo-Malasia Marathi Marathi-India Mon ol Mon ol-Mon olia Norue o Norue o (Bokmal)-Norue a Norue o (Nynorsk)-Norue a Polaco Polaco-Polonia Portu us Portu us-Brasil Portu us-Portu al Punjabi Punjab-India Rumano Rumano-Rumana Ruso Ruso-Rusia Snscrito Snscrito-India
P i 85
Programacin Windows
sr-SP-Cyrl sr-SP-Latn sk sk-SK sl sl-SI es es-AR es-BO es-CL es-CO es-CR es-DO es-EC es-SV es-GT es-HN es-MX es-NI es-PA es-PY es-PE es-PR es-ES es-UY es-VE sw sw-KE sv sv-FI sv-SE syr syr-SY ta ta-IN tt tt-RU te te-IN th th-TH tr tr-TR uk uk-UA ur 0x0C1A 0x081A 0x001B 0x041B 0x0024 0x0424 0x000A 0x2C0A 0x400A 0x340A 0x240A 0x140A 0x1C0A 0x300A 0x440A 0x100A 0x480A 0x080A 0x4C0A 0x180A 0x3C0A 0x280A 0x500A 0x0C0A 0x380A 0x200A 0x0041 0x0441 0x001D 0x081D 0x041D 0x005A 0x045A 0x0049 0x0449 0x0044 0x0444 0x004A 0x044A 0x001E 0x041E 0x001F 0x041F 0x0022 0x0422 0x0020 Serbio (cirlico)-Serbia Serbio (latino)-Serbia Eslovaco Eslovaco-Eslovaquia Esloveno Esloveno-Eslovenia Espaol Espaol-Ar entina Espaol-Bolivia Espaol-Chile Espaol-Colombia Espaol-Costa Rica Espaol-Repblica Dominicana Espaol-Ecuador Espaol-El Salvador Espaol-Guatemala Espaol-Honduras Espaol-Mxico Espaol-Nicara ua Espaol-Panam Espaol-Para uay Espaol-Per Espaol-Puerto Rico Espaol-Espaa Espaol-Uru uay Espaol-Venezuela Suajili Suajili-Kenia Sueco Sueco-Finlandia Sueco-Suecia Sirio Sirio-Siria Tamil Tamil-India Trtaro Trtaro-Rusia Telu u Telu u-India Tailands Tailands-Tailandia Turco Turco-Turqua Ucraniano Ucraniano-Ucrania Urd
P i 86
Programacin Windows
ur-PK uz uz-UZ-Cyrl uz-UZ-Latn vi vi-VN 0x0420 0x0043 0x0843 0x0443 0x002A 0x042A Urd-Pakistn Uzbeko Uzbeko (cirlico)-Uzbekistn Uzbeko (latino)-Uzbekistn Vietnamita Vietnamita-Vietnam
CboCulturas
BtnMostrar
TxtFecha
2.- Lue o codificaremos lo si uiente. Imports System Imports System.Globalization Public Class Form3 Dim colculturas As New Collection Dim nvalor As Double = 1234.56 Sub filtrarcombo() Dim ci As CultureInfo For Each ci In CultureInfo.GetCultures(CultureTypes.AllCultures) If Len(ci.ToStrin ) > 4 Then colculturas.Add(ci) End If Next Me.cboculturas.DataSource = colculturas End Sub Private Sub Form3_Load Me.txtfecha.Text = Now.ToStrin ("d", CultureInfo.InstalledUICulture) Me.txtmoneda.Text = nvalor.ToStrin ("c", CultureInfo.InstalledUICulture) filtrarcombo() End Sub Private Sub BtnMostrar_Click Try Dim newdate As New Date Dim cultura As Strin Dim indice As Inte er indice = Me.cboculturas.SelectedIndex cultura = Me.cboculturas.ValueMember Me.txtfecha.Text = Now.ToStrin ("d", colculturas(indice + 1)) Me.txtmoneda.Text = nvalor.ToStrin ("c", colculturas(indice + 1))
P i 87
TxtMoneda
Programacin Windows
Catch ex As Exception Ms Box("No se Reconoce", Ms BoxStyle.Information, "SISE") Me.txtfecha.Clear() Me.txtmoneda.Clear() End Try End Sub End Class
P i
88
Programacin Windows
Evento ato detecta ata ato detecta perro Rat n clic Windows Relacin Mtodos que se activan detectar maullar(), correr(), oler() detectar bufar(), saltar(), correr() clic maximizar(), cerrar() minimizar(), etc.
maestro ensena alumno Ensenar pasar lista(), pre untar(), etc. Rat n dblclk Windows dblclk
Un Pro rama o un SCRIPT en visual Basic Net se pueden considerar como un conjunto de una o ms p inas o formas donde cada una de ellas contiene un conjunto de objetos, componentes o controles. Un componente o propiamente dicho un control es un objeto que se especializa en una tarea especifica por ejemplo hay controles especializados en desple ar textos o mensajes, otros controles se especializan en desple ar im enes o videos, otros en manipular directorios o archivos en disco, etc. Pero en eneral tanto las formas como los controles no dejan de ser objetos en pro ramaci n de visual Basic y por tanto tienen sus propiedades, mtodos y estn sujetos a eventos. En visual Basic Net recordar adems que un conjunto de objetos que comparten o contienen caractersticas similares forman la llamada CLASE.
Programacin Windows
[[WriteOnly] Set (By Val Value [As <Tipo Dato>]) <Instrucciones> End Set] End Property
Ejercicio Prctico N
1.- Crear un Proyecto llamado POO en Visual 2.- A re ar una clase llamada Empleado en el cual crearemos las si uientes propiedades y Mtodos. Public Class Empleado 'Variables de Propiedad Private mvarcodi o As Inte er Private mvarnombre As Strin Private mvarsueldo As Sin le 'Propiedades Public Property Codi o() As Inte er Get Codi o = mvarcodi o End Get Set(ByVal value As Inte er) mvarcodi o = value End Set End Property Public Property Nombre() As Strin Get Nombre = mvarnombre End Get Set(ByVal value As Strin ) mvarnombre = value End Set End Property Public Property Sueldo() As Sin le Get Sueldo = mvarsueldo End Get Set(ByVal value As Sin le) mvarsueldo = Sueldo End Set End Property 'Metodos Public Sub crearempleado(ByVal vcodi o As Inte er, ByVal vnombre As Strin , ByVal vsueldo As Sin le)
P i 90
Programacin Windows
mvarcodigo = vcodigo mvarnombre = vnombre mvarsueldo = vsueldo End Sub Public Sub actualizarSueldo(ByVal vnuevosueldo As Single) mvarsueldo = vnuevosueldo End Sub End Class 3.- Luego Agregaremos otro proyecto al cual llamaremos Probando Clase; para ello ir al Men Archivo, luego Agregar y elegir Nuevo Proyecto. 4.-Agregaremos la referencia de nuestro proyecto POO en Visual a nuestro proyecto Probando Clase, para ello clic derecho y elegir Referencia.
6.- Codificaremos lo siguiente. Public Class Form1 'Declaracion de la variable que contendra toda la Clase Empleado
Pgina 91
Programacin Windows
'del Proyecto POO en Visual Dim objempleado As New POO_en_Visual.Empleado() Private Sub BtnCrear_Click 'Se llama al metodo CrearEmpleado objempleado.crearempleado(Me.txtcod.Text, Me.txtnom.Text, Me.txtsue.Text) Ms Box("Datos Guardados...!", Ms BoxStyle.Information, "SISE") End Sub Private Sub btnactualizar_Click Dim sueldo As Sin le Dim res As Strin res = InputBox("In rese Nuevo Sueldo") If res = "" Then Exit Sub Else sueldo = CDbl(res) End If 'Llamamos al mtodo ActualizarSueldo objempleado.actualizarSueldo(sueldo) Ms Box("Sueldo Actualizado...!", Ms BoxStyle.Information, "SISE") End Sub Private Sub btnmostrar_Click With objempleado Ms Box("Codi o: " & .Codi o & vbCrLf & "Nombre: " & .Nombre & vbCrLf & "Sueldo: " & .Sueldo, Ms BoxStyle.Information, "SISE") End With End Sub End Class
Ejercicio Prctico N5
1.- Disear el si uiente formulario.
TxtNom DateTimePicker
LblMensaje
BtnMostrar
P i
92
Programacin Windows
2.- Lue o a re aremos una clase llamado Persona el cual crearemos las si uientes propiedades y mtodos. Public Class Persona 'Variables de Propiedad Private _nombre As Strin Private _fechanacimiento As Date 'Propiedades Public Property nombre() As Strin Get Return _nombre End Get Set(ByVal value As Strin ) _nombre = value End Set End Property Public Property fechanacimiento() As Date Get Return _fechanacimiento End Get Set(ByVal value As Date) _fechanacimiento = value End Set End Property 'Metodos Public Function edad() As Inte er Dim tempedad As Strin tempedad = Microsoft.VisualBasic.DateDiff(DateInterval.Year, _fechanacimiento, Now()) Return tempedad End Function End Class 3.- Codificaremos lo si uiente en el evento clic del BtnMostrar Private Sub btnmostrar_Click 'Variable que contiene la clase Persona Dim opersona As New Persona opersona.nombre = Me.txtnom.Text opersona.fechanacimiento = Me.DateTimePicker1.Value Me.lblMensaje.Text = "La Edad de " & opersona.nombre & " es " & opersona.edad() & " aos" End Sub
P i 93
Programacin Windows
Ejercicio Prctico N6
1.- A re ar una clase llamada Empleado2 y a re aremos los si uientes campos, propiedades y mtodos. Public Class Empleado2 'Campos de la clase Public codi o As Inte er Public nombre As Strin Public remuneracion As Double Public CostoXhora As Decimal Public HorasTrabajadas As Inte er 'variables por propiedad Private cuentabancaria As Strin Private entidad As Strin Private fechain reso As Date 'Propiedad de Solo Escritura Public WriteOnly Property ctbancaria() As Strin Set(ByVal value As Strin ) Select Case Microsoft.VisualBasic.Left(value, 4) Case "1111" : entidad = "Banco de Credito" Case "2222" : entidad = "Banco Continental" Case "3333" : entidad = "Banco Interbank" Case "4444" : entidad = "Banco de la Nacion" Case "5555" : entidad = "Caja Municipal" Case Else : entidad = "No Existe Entidad" End Select End Set End Property 'Propiedad de Lectura y Escritura Public Property FechaIn () As Date Get Return fechain reso End Get Set(ByVal value As Date) fechain reso = value End Set End Property 'Propiedades de Solo Lectura Public ReadOnly Property banco() As Strin Get Return entidad End Get End Property Public ReadOnly Property mesin reso() As Strin Get
P i 94
Programacin Windows
Return Format(fechain reso, "MMMM") End Get End Property 'Funcion que calcula y devuelve el sueldo Public Function sueldo(ByVal horas As Inte er) remuneracion = horas * CostoXhora Return remuneracion End Function End Class 2.- Lue o diseamos el si uiente formulario.
txtCod txtNom CboCuentaBancaria
BtnRegistrar
ListView1
3.- Lue o en el evento Clic del Bot n BtnRe istrar codificaremos lo si uiente: Private Sub btnre istrar_Click 'Declaramos nuestra variable que contendra 'todo lo que conten a nuestra clase Empleado2 Dim oempleado As New Empleado2 'Campos de la Clase oempleado.codi o = Me.txtcod.Text oempleado.nombre = Me.txtnom.Text 'Propiedad ctbancaria de la clase Empleado2 oempleado.ctbancaria = Me.cbocuentabancaria.Text 'Propiedad FechaIn de la clase Empleado2 oempleado.FechaIn = Me.dtpfi.Value 'Campos de la Clase oempleado.CostoXhora = Me.txtCXH.Text oempleado.HorasTrabajadas = Me.txthoras.Text 'Campo Remuneracion de la Clase Empleado2 y 'Mtodo Sueldo de la clase Empleado2 oempleado.remuneracion = oempleado.sueldo(oempleado.HorasTrabajadas)
P i 95
Programacin Windows
Dim vista As New ListViewItem vista = Me.ListView1.Items.Add(oempleado.codi o) vista.SubItems.Add(oempleado.nombre) vista.SubItems.Add(oempleado.banco) vista.SubItems.Add(oempleado.mesin reso) vista.SubItems.Add(oempleado.HorasTrabajadas) vista.SubItems.Add(oempleado.CostoXhora) vista.SubItems.Add(oempleado.remuneracion) End Sub
Creando Propiedades para la clase Producto Private mvarCodi o As Strin Private mvarNombre As Strin Private mvarPrecio As Sin le Private mvarStock As Inte er Public Property Codi o() As Strin Get Codi o = Me.mvarCodi o End Get Set(ByVal value As Strin ) Me.mvarCodi o = value End Set End Property
P i
96
Programacin Windows
Public Property Nombre() As Strin Get Nombre = Me.mvarNombre End Get Set(ByVal value As Strin ) Me.mvarNombre = value End Set End Property Public Property Precio() As Sin le Get Precio = Me.mvarPrecio End Get Set(ByVal value As Sin le) Me.mvarPrecio = value End Set End Property Public Property Stock() As Inte er Get Stock = Me.mvarStock End Get Set(ByVal value As Inte er) Me.mvarStock = value End Set End Property
y
P i
97
Programacin Windows
2.- Luego, aadimos una aplicacin para Windows que me permita realizar el mantenim iento de productos usando la librera creada. 3.- Para eso seguir los siguientes pasos:
4.- El proyecto se llamar Probando Clase 5.- Diseamos un formulario llamado FrmProducto que tenga un TabControl con 3 fichas, una de ingreso de productos, otra de actualizacin de precios y stock y otra de consulta, diseadas tal como se muestran las figuras de abajo: y Ficha Ingreso del formulario FRMPRODUCTO
Pgina 98
Programacin Windows
y Ficha Consulta del formulario FRMPRODUCTO
Despus de realizar el diseo y antes de escribir cdigo, para usar la librera primero debemos hacer una referencia a esta. Clic derecho sobre nuestro proyecto Probando Clase y elegimos agregar Referencia, nos aparecer una ventana el cual elegiremos la pestaa proyecto y clic sobre el proyecto que contiene nuestra clase POO_en_Visual.
Declarar e inicializar una variable objeto de tipo de la clase Producto, tal como sigue: Dim objproducto As New POO_en_Visual.Producto y Programando en el botn Crear producto: Private Sub btncrear_Click objproducto.CrearProducto(Me.txtcod_ing.Text, Me.txtnom_ing.Text, Me.txtpre_ing.Text, Me.txtstock_ing.Text) MsgBox("Producto Registrado...!", MsgBoxStyle.Information, "SISE") Me.txtcod_ing.Clear() Me.txtnom_ing.Clear() Me.txtpre_ing.Clear() Me.txtstock_ing.Clear() Me.txtcod_ing.Focus() End Sub
Pgina 99
Programacin Windows
y
Programacin Windows
Constructores
El punto de inicio de cualquier clase, cuando se crea una instancia en la memoria, es un mtodo especial al que se le conoce como constructor. Un constructor no devuelve nin n valor, por tanto en Visual Basic sera un mtodo de tipo Sub llamado New. El primer mtodo que es ejecutado al instanciar un objeto de la clase se denomina constructor. Este tipo de mtodo resulta til para tareas de confi uraci n inciales sobre el objeto. No es necesario escribir un mtodo constructor en la clase, ya que en el caso de que no exista, el compilador se encar a de crearlo implcitamente. Todas las clases de Visual Basic .Net tienen un constructor por defecto que es mtodo New, pero se pueden a re ar varios constructores New diferencindose por el nmero de parmetros.
Sintaxis:
Public Sub New () <Instrucciones> End Sub Public Sub New ([<Param1>As <Tipo Dato>]) <Instrucciones> End Sub Public Sub New ([<Param1>As <Tipo Dato>,<Param2>As <Tipo Dato>]) <Instrucciones> End Sub Nota: Es requisito indispensable escribir los mtodos constructores al inicio de la clase, de lo contrario no funcionaran.
P i
101
Programacin Windows
Ejercicio Prctico N1
1.- Crearemos una Clase llamada ClsEmpleado Public Class ClsEmpleado Private fecha As Date Public Property fechacrea() As Date Get Return fecha End Get Set(ByVal value As Date) fecha = value End Set End Property 'Mtodo Constructor Public Sub New() 'Asi namos un valor inicial 'A una variable de propiedad fecha = Now End Sub End Class 2.- Lue o disearemos el si uiente formulario.
3.- En el evento clic del bot n BtnMostrar1 codificaremos lo si uiente: Private Sub btnMostrar_Click Dim objempleado As New ClsEmpleado Ms Box("El Empleado se creo " & objempleado.fechacrea) End Sub
P i
102
Programacin Windows
4.- Lue o crearemos otra Clase llamada ClsEmpleado2 Public Class ClsEmpleado2 Private mvarfechacrea As Date Public Property fechacrea() As Date Get Return mvarfechacrea End Get Set(ByVal value As Date) mvarfechacrea = value End Set End Property 'Mtodo constructor con parmetro Public Sub New(ByVal vfechacrea As Date) 'Asi namos el valor de parmetro 'A una variable de Propiedad mvarfechacrea = vfechacrea End Sub End Class 5.- En el evento clic del bot n BtnMostrar2 codificaremos lo si uiente: Private Sub btnmostrar2_Click 'Forma de Instanciar un objeto con un constructor parametrizado Dim objempleado2 As New ClsEmpleado2("07/12/2007") Ms Box("El Empleado se creo " & objempleado2.fechacrea) End Sub Nota: Los constructores tambin se pueden sobrecar ar, es decir, pueden existir varias versiones en las que cada una de ellas reciba distintos parmetros, en nmero y/o en tipo.
6.- Lue o crearemos otra Clase llamada ClsEmpleado3 Public Class ClsEmpleado3 'Campos de la Clase Public nombre As Strin Public apellido As Strin Public Sueldo As Sin le 'Metodo Constructor Public Sub New(ByVal vnombre As Strin , ByVal vapellido As Strin ) nombre = vnombre apellido = vapellido End Sub
P i 103
Programacin Windows
'Mtodo Constructor SobreCar ado Public Sub New(ByVal vnombre As Strin , ByVal vapellido As Strin , ByVal vsueldo As Sin le) nombre = vnombre apellido = vapellido Sueldo = vsueldo End Sub End Class 7.- En el evento clic del bot n BtnMostrar3 codificaremos lo si uiente: Private Sub btnmostrar3_Click Dim objempleado3 As New ClsEmpleado3("Ana", "Castilla", 1200) Ms Box("El Nombre es: " & objempleado3.nombre & vbNewLine & "Su Apellido es: " & objempleado3.apellido & vbNewLine & "Su Sueldo es: " & objempleado3.Sueldo) End Sub
Una situaci n que podra requerir la sobrecar a de mtodos sera la si uiente: la clase Empleado necesita manejar en diferentes formas, la informaci n que referente al sueldo existe sobre el empleado. Por tal motivo, vamos a crear tres mtodos con el nombre Sueldo( ), que variarn en su firma, o protocolo de llamada, y realizarn diferentes tareas, pero todas ellas relacionadas con el sueldo del empleado.
1.- Crearemos una clase llamado Empleado. Public Class Empleado 'Campo de la Clase Public nombre As Strin 'Variable de Propiedad Private mvarsalario As Double Public Property salario() As Double Get Return mvarsalario
P i 104
Programacin Windows
End Get Set(ByVal value As Double) mvarsalario = value End Set End Property 'Mtodos SobreCar ados Public Overloads Sub Sueldo() 'Aqui mostramos el importe del sueldo formateado Ms Box("El sueldo es: " & Format(salario, "#,#.##")) End Sub Public Overloads Function Sueldo(ByVal vdia As Inte er) As Strin ' aqu mostramos la fecha del mes actual ' en la que se realizar la transferencia ' del sueldo al banco del empleado Dim FechaActual As Date Dim FechaCobro As Strin FechaActual = Now FechaCobro = CStr(vdia) & "/" & CStr(Month(FechaActual)) & "/" & CStr(Year(FechaActual)) Return FechaCobro End Function Public Overloads Function Sueldo(ByVal ImporteIncentivo As Double, ByVal TipoIncentivo As Strin ) As Double ' aqu calculamos la cantidad de incentivo ' que se aadir al sueldo del empleado, ' en funci n del tipo de incentivo Dim incentivo As Double ' se n el tipo de incentivo, ' se descuenta un importe ' de la cantidad del incentivo Select Case TipoIncentivo Case "Viajes" incentivo = ImporteIncentivo - 30 Case "Extras" incentivo = ImporteIncentivo - 15 End Select Return incentivo End Function End Class
P i
105
Programacin Windows
2.Lue o disearemos el si uiente formulario.
BtnMostra
3.- Lue o codificaremos lo si uiente: Private Sub btnmostrar_Click 'Variable que maneja la clase Dim objempleado As New Empleado objempleado.nombre = Me.txtnom.Text objempleado.salario = CDbl(Me.txtsalario.Text) 'Variables que capturan el resultado Dim s2, s3 As Strin Dim resincentivo As Double 'llamada al primer mtodo sobrecar ado objempleado.Sueldo() 'llamada al se undo mtodo sobrecar ado s2 = "El Sueldo se Transferira el dia " & objempleado.Sueldo(Me.NumericUpDown1.Value) 'llamada al tercer mtodo sobrecar ado resincentivo = objempleado.Sueldo(Me.txtincentivo.Text, Me.cbotipoinc.Text) s3 = "El Incentivo a pa ar ser " & CStr(resincentivo) 'Resultado final que se mostrara en un Label Me.lblmensaje.Text = s2 & vbNewLine & s3 End Sub
P i
106
Programacin Windows
Eventos
Un evento es un suceso que le ocurre al objeto y que le indica sobre un cambio en sus atributos o propiedades. Un evento es necesario para controlar el estado de las propiedades e informar a las aplicaciones del nuevo estado, para que estas realizacen la acci n correspondiente. Es fcil entender eventos asociados a objetos visuales como los controles, por ejemplo en el objeto button se tiene el evento Click que se desencadena al seleccionar el bot n, el evento MouseMove que ocurre al pasar el mouse por el bot n, y as hay muchos eventos asociados al objeto bot n; pero cuando trabajamos con clases, los eventos son ms abstractos y un poco ms difciles de entender, ya que poda confundirse con lo mtodos. Para aclarar el concepto de eventos definamos mentalmente una clase llamada Cuenta para un componente llamado Banco. Esta clase cuenta tiene propiedades como NumeroCta, FechaApertura, TipoCta, NumeroTarjeta, y Saldo. Adems tiene mtodos como Dep sito, Retiro y Transferencia que modifican el estado del saldo. Cuando hacemos un Re tiro de nuestra cuenta donde el monto a retirar supera el Saldo se desencadena un evento llamado SaldoInsuficiente y tambin cuando durante el da hemos retirado mas dl monto permitido se desencadena el evento limiteRetiroDiario. Para crear un evento en la clase primero declare evento con la sentencia Event y lue o llmelo con RaiseEvent, tal como se muestra en la sintaxis. Declaracin Sintaxis: [Tipo Declaraci n] Event <Nombre> ([Parmetro(s)]) Declaracin Llamada: RaiseEvent <Nombre> ([Parmetro(s)]) Ejercicio Prctico N3 1.- Crearemos 2 eventos para una clase llamada Empleado, el cual estos eventos nos informarn cuando el sueldo es bajo o alto; para nuestra realidad un sueldo ser bajo cuando es menor a 500 y alto cuando sea mayor a 3000. Public Class Empleado 'Variables de Propiedad Private mvarcodi o As Inte er Private mvarnombre As Strin Private mvarsueldo As Sin le
P i
107
Programacin Windows
'Propiedades Public Property Codigo() As Integer Get Codigo = mvarcodigo End Get Set(ByVal value As Integer) mvarcodigo = value End Set End Property Public Property Nombre() As String Get Nombre = mvarnombre End Get Set(ByVal value As String) mvarnombre = value End Set End Property Public Property Sueldo() As Single Get Sueldo = mvarsueldo End Get Set(ByVal value As Single) mvarsueldo = Sueldo End Set End Property 'Metodos Public Sub crearempleado(ByVal vcodigo As Integer, ByVal vnombre As String, ByVal vsueldo As Single) mvarcodigo = vcodigo mvarnombre = vnombre mvarsueldo = vsueldo El procedimiento creado el cual maneja los eventos lo llamaremos chequearsueldo() End Sub Public Sub actuali arSueldo(ByVal vnuevosueldo As Single) mvarsueldo = vnuevosueldo El procedimiento creado el cual maneja los eventos lo llamaremos chequearsueldo() End Sub 'Creamos eventos Public Event SueldoBajo() Public Event SueldoAlto() 'Crearemos un procedimiento el cual 'desencadenara un evento de acuerdo 'a la condicion establecida Sub chequearsueldo() If mvarsueldo < 500 Then RaiseEvent SueldoBajo() ElseIf mvarsueldo > 3000 Then RaiseEvent SueldoAlto() End If End Sub End Class
P i
108
Programacin Windows
2.- Lue o disearemos el si uiente formulario.
3.- Codificaremos lo si uiente. Public Class FrmProducto 'Declaracion de la variable que contendra toda la Clase Empleado 'del Proyecto POO en Visual 'Pero como nuestra clase maneja 2 eventos 'Se declara de la si uiente manera para poder usar los eventos creados Private WithEvents objempleado As New Empleado() Private Sub BtnCrear_Click 'Se llama al metodo CrearEmpleado objempleado.crearempleado(Me.txtcod.Text, Me.txtnom.Text, Me.txtsue.Text) Ms Box("Datos Guardados...!", Ms BoxStyle.Information, "SISE") End Sub Private Sub btnactualizar_Click Dim sueldo As Sin le Dim res As Strin res = InputBox("In rese Nuevo Sueldo") If res = "" Then Exit Sub Else sueldo = CDbl(res) End If 'Llamamos al mtodo ActualizarSueldo objempleado.actualizarSueldo(sueldo) Ms Box("Sueldo Actualizado...!", Ms BoxStyle.Information, "SISE") End Sub
P i
109
Programacin Windows
Private Sub btnmostrar_Click With objempleado MsgBox("Codigo: " & .Codigo & vbCrLf & "Nombre: " & .Nombre & vbCrLf & "Sueldo: " & .Sueldo, MsgBoxStyle.Information, "SISE") End With End Sub 'Crearemos 2 procedimientos el cual cada uno 'indica lo que hara cada evento 'Al evento lo llamaremos con Handles Public Sub Sbajo() Handles objempleado.SueldoBajo Me.txteventosueldo.ForeColor = Color.Green Me.txteventosueldo.Text = objempleado.Nombre " tiene un Sueldo Bajo" End Sub Public Sub SAlto() Handles objempleado.SueldoAlto Me.txteventosueldo.ForeColor = Color.Blue Me.txteventosueldo.Text = objempleado.Nombre " tiene un Sueldo Alto" End Sub End Class
Herencia de Clases
Introduccin a la Herencia de Clases
La parte principal de la Pro ramaci n Orientada a Objetos (POO) es la herencia de clases, es decir, la caracterstica de definir una clase que sirve de base para otras clases derivadas, las clases derivadas tendrn los miembros de la clase base: propiedades, mtodos, eventos, etc. Los miembros heredados por la clase derivada pueden sobre escribirse e implementarse de otra forma, adems la clase derivada puede tener sus propios miembros y servir de clase base para otras clases, lo rndose la reutilizaci n de objetos a travs de la herencia. Otra forma de herencia es a travs del polimorfismo, que es una caracterstica POO que consiste en definir una Clase Abstracta con propiedades y mtodos que sern implementados de diferentes formas por otras clases, es decir, con un mismo nombre de propiedad o mtodo se obtiene funcionalidad distinta de acuerdo al tipo de objeto. En .Net solo existe herencia simple y no herencia mltiple, es decir, una clase derivada solo puede heredar de una clase Base. Haciendo una analo a, si a la clase base le llamamos Padre y a la clase derivada le llamamos Hijo diramos que la herencia simple consiste en que un Hijo solo puede tener un solo Padre, lo que parece al o natural y coherente. Si deseamos simular herencia mltiple en Visual Basic .Net recurrimos a las interfaces, que permiten definir propiedades y mtodos en una clase sin c di o, lue o desde una clase se puede implementar varias interfaces, lo rndose una herencia mltiple pero a nivel de definici n y no de c di o, ya que la implementaci n ser distinta en cada clase.
P i
110
Programacin Windows
En eneral, la herencia de clases permite rehusar c di o y facilitar el mantenimiento de las aplicaciones, ya que cuando se desee modificar caractersticas de un objeto solo hay que cambiar la clase adecuada.
Sintaxis:
Inherits <Clase Base> Nota: Dos observaciones importantes que hay que tener en cuenta son: 1. La instrucci n Inherits debe escribirse en la primera lnea de la clase derivada 2. Solo puede existir una instrucci n Inherits, ya que solo existe herencia simple. Ejercicio Prctico N
1.- Crearemos a continuaci n una clase llamada Vendedor que heredar todas sus propiedades, mtodos y eventos de clase creada anteriormente llamada Empleado.
Public Class Vendedor 'Esto quiere decir que se heredar de la clase Empleado Inherits Empleado 'Variables de Propiedad Private mvarventa As Sin le Private mvarcomision As Sin le 'Propiedades Public Property Venta() As Sin le Get Return mvarventa End Get Set(ByVal value As Sin le) mvarventa = value End Set End Property Public Property Comision() As Sin le Get Return mvarcomision End Get Set(ByVal value As Sin le) mvarcomision = value End Set End Property End Class
P i 111
Programacin Windows
2.- Lue o disearemos el si uiente formulario
3.- Codificaremos lo si uiente. Public Class FrmVendedor Dim objvendedor As New Vendedor Private Sub BtnCrear_Click 'Accedemos a los miembros de clase Padre objvendedor.Codi o = Me.txtcod.Text objvendedor.Nombre = Me.txtnom.Text objvendedor.Sueldo = Me.txtsue.Text 'Ahora Accedemos a los miembros de esta clase objvendedor.Venta = Me.txtventa.Text objvendedor.Comision = Me.txtcomi.Text End Sub Private Sub btnactualizar_Click Dim sueldo As Sin le Dim res As Strin res = InputBox("In rese Nuevo Sueldo") If res = "" Then Exit Sub Else sueldo = CDbl(res) End If 'Llamamos al mtodo ActualizarSueldo de la clase Padre objvendedor.actualizarSueldo(sueldo) Ms Box("Sueldo Actualizado...!", Ms BoxStyle.Information, "SISE") End Sub
P i
112
Programacin Windows
Private Sub btnmostrar_Click Ms Box("Codi o: " & objvendedor.Codi o & vbNewLine & _ "Nombre: " & objvendedor.Nombre & vbNewLine & _ "Sueldo: " & objvendedor.Sueldo & vbNewLine & _ "Venta: " & objvendedor.Venta & vbNewLine & _ "Comision: " & objvendedor.Comision) End Sub End Class
Ejercicio Prctico N5
1.- Crearemos la clase base Empleado. Public Class Empleado 'Campos de la clase Public mvarid As Inte er Public mvarnombre As Strin Public mvarsalario As Sin le Public mvarincentivo As Sin le 'Mtodos de la clase base Empleado Public Sub calcularincentivo() ' calcular los incentivos en base ' al salario Me.mvarincentivo = Me.mvarsalario / 10 End Sub Public Sub verincentivos() Ms Box("Los Incentivos de " & Me.mvarnombre & " son " & Me.mvarincentivo) End Sub End Class
P i
113
Programacin Windows
2.- Lue o crearemos la clase derivada Administrativo. Public Class Administrativo 'Heredamos de la clase Empleado Inherits Empleado 'Sobrecar amos el mtodo calcularincentivo de la clase Empleado Public Overloads Sub calcularincentivo(ByVal vhoras As Inte er) ' calcular los incentivos en base a horas Me.mvarincentivo = vhoras * 15 End Sub End Class 3.- Lue o disearemos el si uiente formulario.
4.- Codificaremos lo si uiente. Public Class Form1 'Instanciamos la clase base Dim objempleado As New Empleado 'Instanciamos la clase derivada Dim objadministrativo As New Administrativo Private Sub btnPadre_Click Me.objempleado.mvarid = Me.txtcod.Text Me.objempleado.mvarnombre = Me.txtnom.Text Me.objempleado.mvarsalario = Me.txtsalario.Text Me.objempleado.calcularincentivo() Me.objempleado.verincentivos() End Sub Private Sub btnhijo_Click Me.objadministrativo.mvarid = Me.txtcod.Text Me.objadministrativo.mvarnombre = Me.txtnom.Text Me.objadministrativo.mvarsalario = Me.txtsalario.Text
P i 114
Programacin Windows
Dim horas As Inte er Dim res As Strin res = InputBox("In rese Numero de Horas") If res = "" Then Exit Sub Else horas = CInt(res) End If 'Llamamos el mtodo sobrecar ado de la clase Derivada Me.objadministrativo.calcularincentivo(horas) Me.objadministrativo.verincentivos() End Sub End Class
! ! ! !
Qu es Ado.Net?
Ado.Net es un modelo de pro ramacin basado en estndares que permite crear aplicaciones distribuidas que accedan a datos compartidos. Por ser una Interfaz de Pro ramacin de Aplicaciones (API), est disponible desde muchas aplicaciones, herramientas de desarrollo, len uajes de pro ramacin y nave adores de Internet. Entre el software donde podemos usar Ado.Net tenemos: Visual Basic.Net Visual C++.Net Visual C# ASP.Net JScript.Net
P i 115
Imports System.Data
Si esta trabajando con una base de datos SQL Server 2000, tambin importar el namespace System.Data.Sqlclient. Si esta trabajando con datos de otros or enes de datos, necesitar importar el namespace System.Data.Oledb, para hacerlo debe usar la si uiente sentencia:
NameSpace
System.Data
Descripcin
Incluye las clases que hacen posible reali ar el trabajo en modo desconectado en la arquitectura de ADO .NET
System.Data.Common
Provee las clases e interfaces heredadas que permiten la implementacin de los .NET Data Providers.
Proveedor para SQL Server. Proveedor para OLE-DB para NET. Las clases y estructuras nativas de SQL Server Clases, interfases de XML.
P i
116
Programacin Windows
Para poder emplear el SQLClient en el editor de codigo de su aplicacin debe colocar la siguiente instruccin:
Pgina 117
Programacin Windows
SQL 2005
Va Autentificacin Windows
Server =myServer; DataBase =myDataBase; Integrated Security=True
btnAccess2003
PictureBox1
btnAccess2007
btnSql2005
btnUsuario
lblConecta
2.- Para realizar la Conexin con Access, se debe de contar con la Base de Datos Neptuno entre ada por el Profesor, en los 2 tipos de versiones uardadas en Access 2003 y Access 2007.
Versin 2003 Versin 2007
P i
118
Programacin Windows
3.- Para Hacer la conexin con Access y SQL se deben de Importar los si uientes NameSpace respectivamente: Imports System.Data.OleDb 'Para la conexion Access Imports System.Data.SqlClient 'Para la conexion con SQL Estos NameSpace los importamos en Declaraciones Generales, por encima del Public Class 4.- Lue o di itar el si uiente cdi o para las diferentes conexiones en sus respectivos botones. Private Sub btnaccess2003_Click Dim cn As New OleDbConnection("Provider=Microsoft.Jet.Oledb.4.0; Data Source=C:\Neptuno.mdb") Try cn.Open() Me.lblconecta.Text = "Conexion con Access 2003 Satisfactoria..." Me.lblconecta.Refresh() Catch ex As Exception Me.lblconecta.Text = ex.Messa e cn.Close() Finally cn.Close() End Try End Sub
Private Sub btnaccess2007_Click Me.lblconecta.Text = "" Dim cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Neptuno.accdb") Try cn.Open() Me.lblconecta.Text = "Conexion con Access 2007 Satisfactoria ..." Me.lblconecta.Refresh() Catch ex As Exception Me.lblconecta.Text = ex.Messa e cn.Close()
P i 119
Programacin Windows
Finally cn.Close() End Try End Sub
Private Sub btnusuario_Click Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; User Id=Castilla; Password=123") Try cn.Open() Me.lblconecta.Text = "Conexion a SQL 2005 Mediante el Usuario Castilla es Satisfactoria..." Me.lblconecta.Refresh() Catch ex As Exception Me.lblconecta.Text = ex.Messa e cn.Close() Finally cn.Close() End Try End Sub
Private Sub btnsql2005_Click Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True") Try cn.Open() Me.lblconecta.Text = "Conexion a SQL 2005 Satisfactoria..." Me.lblconecta.Refresh() Catch ex As Exception Me.lblconecta.Text = ex.Messa e cn.Close() Finally cn.Close() End Try End Sub
P i 120
Programacin Windows
Propsito
Proporciona la conectividad con el origen de datos Proporciona el acceso para los comandos de Base de Datos Utiliza el objeto Connection para proporcionar un enlace entre el DataSet y el proveedor de datos. El objeto DataAdapter actualiza los cambios que se han hecho a los datos en el DataSet
Hay que resaltar que estos componentes son implementados separadamente por cada .Net Data Provider.
Connection
Esta clase es empleada para representar una conexin hacia un especifico origen de datos.
Pgina 121
Programacin Windows
DataAdapter
Esta clase acta como un puente entre el origen de datos y el objeto desconectado del DataSet. Provee 2 interfaces, una a travs de la cual permite poblar el DataSet y actualizar la informacin en el origen de datos y la otra provee 4 propiedades cada una de tipo command: SelectCommand, InsertCommand, UpdateCommand y DeleteCommand.
DataAdapter
DataAdapter
SelectCommand InsertCommand UpdateCommand DeleteCommand
Database
DataSet
.DataSet
Pgina 122
Programacin Windows
Base atos
Consultas
1.- Diseamos el si uiente formulario.
BtnCargar
DatagridView
2.- Lue o en declaraciones enerales importamos lo si uiente. Imports System.Data Imports System.Data.SqlClient 3.- Lue o a nivel formulario creamos la conexin. Public Class Form1 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True")
P i
123
Programacin Windows
4.- codificamos lo siguiente en el botn btnCargar Private Sub Btncargar_Click Dim da As New SqlDataAdapter("Select * from Products", cn) Dim ds As New DataSet da.Fill(ds, "Productos") Me.DataGridView1.DataSource = ds.Tables("Productos") End Sub 5.- Despues cargamos la aplicain y se debe mostrar de la siguiente manera.
Pgina 124
Programacin Windows
P i
125
Programacin Windows
Public ReadOnly Property Edad() As Byte Get Return Me.mvarEdad End Get End Property Public Property Direccion() As String Get Return Me.mvarDireccion End Get Set(ByVal value As String) Me.mvarDireccion = value End Set End Property Public Sub CrearPersona(ByVal vNombre As String, ByVal vFechaNac As Date, ByVal vDireccion As String) Me.mvarNombre = vNombre Me.mvarFechaNac = vFechaNac Me.mvarDireccion = vDireccion Me.mvarEdad = Convert.ToByte(Date.Today.Year - vFechaNac.Year) End Sub End Class 2.- Crear la clase Alumno que hereda de Persona, para lo cual aadimos una clase al componente, y le pondremos como nombre Alumno. Luego escribimos el siguiente cdigo. Public Class Alumno 'Codigo que identifica que va heredar de la clase Persona Inherits Persona Private mvarCodigo As String Private mvarEspecialidad As String Public Property Codigo() As String Get Return Me.mvarCodigo End Get Set(ByVal value As String) Me.mvarCodigo = value End Set End Property Public Property Especialidad() As String Get Return Me.mvarEspecialidad End Get Set(ByVal value As String) Me.mvarEspecialidad = value End Set End Property
P i 126
Programacin Windows
Public Sub CrearAlumno(ByVal vNombre As String, ByVal vFechaNac As Date, ByVal vDireccion As String, ByVal vCodigo As String, ByVal vEspecialidad As String) CrearPersona(vNombre, vFechaNac, vDireccion) Me.mvarCodigo = vCodigo Me.mvarEspecialidad = vEspecialidad End Sub End Class 3.- Crear la clase Profesor que tambin hereda de Persona, para lo cual aadimos una clase al componente; y escribimos como nombre Profesor. Luego escribimos el siguiente cdigo: Public Class Profesor 'Codigo que identifica que va heredar de la clase Persona Inherits Persona Private mvarCodigo As String Private mvarTipo As String Public Property Codigo() As String Get Return Me.mvarCodigo End Get Set(ByVal value As String) Me.mvarCodigo = value End Set End Property Public Property Tipo() As String Get Return Me.mvarTipo End Get Set(ByVal value As String) Me.mvarTipo = value End Set End Property Public Sub CrearProfesor(ByVal vNombre As String, ByVal vFechaNac As Date, ByVal vDireccion As String, ByVal vCodigo As String, ByVal vTipo As String) CrearPersona(vNombre, vFechaNac, vDireccion) Me.mvarCodigo = vCodigo Me.mvarTipo = vTipo End Sub End Class
P i
127
Programacin Windows
4.- Finalmente crear la clase Curso, para lo cual aadimos una clase al componente, y escribimos como nombre Curso. Luego escribimos el siguiente cdigo: Public Class Curso Private mvarCodigo As String Private mvarNombre As String Private mvarTotalHoras As Byte Private mvarCostoTotal As Single Private mvarCostoHora As Single Public Property Codigo() As String Get Return mvarCodigo End Get Set(ByVal value As String) Me.mvarCodigo = value End Set End Property Public Property Nombre() As String Get Return Me.mvarNombre End Get Set(ByVal value As String) Me.mvarNombre = value End Set End Property Public Property TotalHoras() As Byte Get Return Me.mvarTotalHoras End Get Set(ByVal value As Byte) Me.mvarTotalHoras = value End Set End Property Public Property CostoTotal() As Single Get Return Me.mvarCostoTotal End Get Set(ByVal value As Single) Me.mvarCostoTotal = value End Set End Property Public ReadOnly Property CostoHora() As Single Get Return Me.mvarCostoHora End Get End Property
P i 128
Programacin Windows
Public Sub CrearCurso(ByVal vCodigo As String, ByVal vNombre As String, ByVal vTotalHoras As Byte, ByVal vCostoTotal As Single) Me.mvarCodigo = vCodigo Me.mvarNombre = vNombre Me.mvarTotalHoras = vTotalHoras Me.mvarCostoTotal = vCostoTotal Me.mvarCostoHora = Me.mvarCostoTotal / Me.mvarTotalHoras End Sub 2.- Luego, aadimos una aplicacin para Windows que me permita realizarla matricula usando la librera de clases creada. 3.- Para eso seguir los siguientes pasos:
4.- El proyecto se llamar Probando Librera Herencia 5.- Diseamos un formulario llamado FrmMatricula que tenga un TabControl con 3 fichas, una de ingreso de Datos del Alumno, otra el Curso y por ultimo el Profesor, diseadas tal como se muestran las figuras de abajo: y Ficha Alumno del formulario FRMMATRICULA
Pgina 129
Programacin Windows
y Ficha Curso del formulario FRMMATRICULA
Despus de realizar el diseo y antes de escribir cdigo, para usar la librera primero debemos hacer una referencia a esta. Clic derecho sobre nuestro proyecto Probando Librera Herencia y elegimos agregar Referencia, nos aparecer una ventana el cual elegiremos la pestaa proyecto y clic sobre el proyecto que contiene nuestra clase Librera de Clases Herencia.
Pgina 130
Programacin Windows
En las declaraciones generales definimos variables objetos para manipular datos del Alumno, Curso y Profesor. Public objAlumno As New Libreria_de_Clases_Herencia.Alumno Public objCurso As New Libreria_de_Clases_Herencia.Curso Public objProfesor As New Libreria_de_Clases_Herencia.Profesor
y
Programando en el botn Matricula: Private Sub btnMatricular_Click Me.objAlumno.CrearAlumno(Me.txtnomalu.Text, Me.dtpFechaNacAlu.Value, Me.txtdiralu.Text, Me.txtcodalu.Text, Me.CboEspecialidad.Text) Me.objCurso.CrearCurso(Me.txtcodcur.Text, Me.cbocurso.Text, Me.txtTotalHoras.Text, Me.txtCostoTotal.Text) Me.objProfesor.CrearProfesor(Me.txtnomprof.Text, Me.dtpfechanacprof.Value, Me.txtdirprof.Text, Me.txtcodprof.Text, Me.cbotipo.Text) MsgBox("Alumno Matriculado...!", MsgBoxStyle.Information, "SISE")
End Sub
y
Programando en el botn Consultar: Private Sub btnConsultar_Click MsgBox("El Alumno(a) " & Me.objAlumno.Nombre & vbNewLine & _ "con " & Me.objAlumno.Edad & " aos de edad" & vbNewLine & _ "Con una Especialidad en " & Me.objAlumno.Especialidad & vbNewLine & _ "Esta inscrito en el Curso de " & Me.objCurso.Nombre & vbNewLine & _ "El cual tiene un Costo X Hora de S/." & Me.objCurso.CostoHora & vbNewLine & _ "Sera dictado por el Profesor(a) " & Me.objProfesor.Nombre & vbNewLine & _ "con " & Me.objProfesor.Edad & " aos de edad", MsgBoxStyle.Information, "SISE") End Sub Finalmente, programamos el botn Salir de la aplicacin: Private Sub btnsalir_Click Me.Close() End Sub
P i
131
Programacin Windows
La Clase DataSet
Bsicamente, un objeto DataSet va a ser similar a un objeto Recordset de ADO, pero ms potente y complejo. Es el almacn de datos por excelencia en ADO .NET, representando una base de datos en memoria y desconectada del proveedor de datos, que contiene tablas y sus relaciones. El objeto DataSet nos proporciona el mejor concepto sobre datos desconectados: una copia en el cliente de la arquitectura de la base de datos, basada en un esquema XML que la independiza del fabricante, proporcionando al desarrollador la libertad de trabajo independiente de la plataforma. Cada tabla contenida dentro de un objeto DataSet se encuentra disponible a travs de su propiedad Tables, que es una coleccin de objetos System.Data.DataTable. Cada objeto DataTable contiene una coleccin de objetos DataRow que representan las filas de la tabla. Y si seguimos con esta analoga tenemos que decir que cada objeto DataRow, es decir, cada fila, posee una coleccin de objetos DataColumn, que representan cada una de las columnas de la fila actual. Existen adems, colecciones y objetos para representan las relaciones, claves y valores por defecto existentes dentro de un objeto DataSet. Para poder crear e inicializar las tablas del DataSet debemos hacer uso del objeto DataAdapter, que posee las dos versiones, es decir, el objeto SqlDataAdapter para SQL Server y OleDbDataAdapter genrico de OLE DB. Al objeto DataAdapter le pasaremos como parmetro una cadena que representa la consulta que se va a ejecutar, y que va a rellenar de datos el DataSet. Del objeto DataAdapter utilizaremos el mtodo Fill(), que posee dos parmetros; el primero es el DataSet a rellenar de informacin; y el segundo, una cadena con el nombre que tendr la tabla creada dentro del DataSet, producto de la ejecucin de la consulta.
P i 132
Programacin Windows
En lo que respecta a las propiedades de la clase DataSet, podemos remarcar las siguientes.
y
Relations. Esta propiedad devuelve una coleccin de objetos DataRelation, que representan todas las relaciones existentes entre las tablas del objeto DataSet. Tables. Devuelve una coleccin de objetos DataTable, que representan a cada una de las tablas existentes dentro del objeto DataSet.
DataSet Tables
olum s onstrain
R ow s Relation
Un DataTable, almacena datos de forma similar que una tabla en una base de datos, es decir que la informacin esta distribuida en un conjunto de registros cada una de ellas esta conteniendo un conjunto e columnas. Un DataTable esta constituido por las siguientes colecciones:
y
Columns, contiene el DataColumn, se define las caractersticas como nombre de la columna, tipos de datos y primary key. Rows, contiene el DataRow, que representa la informacin que se quiere manipular. Constraints, contiene ForeignKeyConstraint y/o UniqueConstraint.
y y
DataColumn
Define el nombre de columna y el tipo de datos que se almacenara. Se puede crear una nueva columna a travs de los siguientes formatos:
DataRow
Para poder poblar un DataTable debemos emplear el objeto DataRow, cada objeto DataRow puede referenciar a la coleccin Columns. Para crear un objeto DataRow debe emplear el metodo NewRow
P i 133
Programacin Windows
DataGridView1
DataGridView2
DataGridView3
2.- Luego hacemos la conexin con SQL, pero antes importamos los namespace. Imports System.Data Imports System.Data.SqlClient Public Class Form2 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True") 3.- En botn BtnMostrar codificamos lo siguiente. Private Sub btnMostrar_Click 'Declaramos los DataAdapter Dim da1 As New SqlDataAdapter("Select Categoryid,Categoryname from Categories", cn) Dim da2 As New SqlDataAdapter("Select Productid,Productname,Unitprice from Products", cn) Dim da3 As New SqlDataAdapter("Select Supplierid,CompanyName, City, Country from Suppliers", cn)
P i
134
Programacin Windows
'Declaramos el DataSet Dim ds As New DataSet 'Llenamos el DataSet da1.Fill(ds, "Categoria") da2.Fill(ds, "Productos") da3.Fill(ds, "Proveedor") 'Cargamos los DataGridView Me.DataGridView1.DataSource = ds.Tables("Categoria") Me.DataGridView2.DataSource = ds.Tables("Productos") Me.DataGridView3.DataSource = ds.Tables("Proveedor") End Sub 4.- Luego ejecutamos la aplicacin y se debe mostrar de la siguiente manera.
2da Forma.
1.- Agregamos otro formulario con el mismo diseo que el anterior.
BtnMost
DataGridVie
DataGridVie
DataGridVie
Pgina 135
Programacin Windows
2.- Luego hacemos la conexin con SQL, pero antes importamos los namespace. Imports System.Data Imports System.Data.SqlClient Public Class Form3 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True") 3.- En botn BtnMostrar codificamos lo siguiente. Private Sub BtnMostrar_Click 'Declaramos todo en un DataAdapter Dim da As New SqlDataAdapter ("Select Categoryid,Categoryname from Categories;" & _ "Select Productid,Productname,Unitprice from Products;" & _ "Select Supplierid,CompanyName, City, Country from Suppliers", cn) Dim ds As New DataSet da.Fill(ds) ds.Tables(0).TableName = "Categoria" ds.Tables(1).TableName = "Productos" ds.Tables(2).TableName = "Proveedor" Me.DataGridView1.DataSource = ds.Tables("Categoria") Me.DataGridView2.DataSource = ds.Tables("Productos") Me.DataGridView3.DataSource = ds.Tables("Proveedor") End Sub
Ejercicio Prctico N1
1.- Disear el siguiente formulario.
BtnDataSe
LstClientes
P i
136
Programacin Windows
2.- Codificaremos lo siguiente: 'Importacion de los NameSpace Imports System.Data Imports System.Data.SqlClient Public Class Form1 'Declaracion de la cadena de conexion Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=SSPI") Private Sub btnDataset_Click 'Declaracion del DataAdapter Dim da As New SqlDataAdapter("Select * from Customers order by CompanyName", cn) 'Declaracion del DataSet Dim ds As New DataSet 'Filtramos lo que contiene el DataAdapter al DataSet 'En una tabla temporal Customers da.Fill(ds, "Clientes") 'Declaramos una variable de tipo DataRow Dim Fila As DataRow 'La Variable Fila de Tipo DataRow 'Recorrera todas las filas de la tabla de nuestro DataSet 'y las agregara al ListBox For Each Fila In ds.Tables("Clientes").Rows Me.lstclientes.Items.Add(Fila.Item("CompanyName") & " - " & Fila.Item("ContactName") & " - " & Fila.Item("Country")) Next End Sub End Class
LstOrdenes
P i
137
Programacin Windows
2.- Luego Codificaremos lo siguiente: 'Importamos los NameSpace Imports System.Data Imports System.Data.SqlClient Public Class Form2 'Declaramos la cadena de conexion Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=SSPI") 'Declaramos nuestros DataAdapters 'para traer informacion de las 2 tablas 'a relacionar Dim daClientes As New SqlDataAdapter("Select * from Customers", cn) Dim daOrdenes As New SqlDataAdapter("Select * from Orders", cn) Dim ds As New DataSet Private Sub Form2_Load 'Llenamos el DataSet en 2 DataTables daClientes.Fill(ds, "Clientes") daOrdenes.Fill(ds, "Ordenes") 'Indicamos la relacion de los 2 DataTables ds.Relations.Add("ClientesOrdenes", ds.Tables("Clientes").Columns("Customerid"), ds.Tables("Ordenes").Columns("Customerid")) Dim fila As DataRow 'Llenamos el ComboBox For Each fila In ds.Tables("Clientes").Rows Me.cboClientes.Items.Add(fila.Item("CompanyName")) Next End Sub Private Sub cboClientes_SelectedIndexChanged 'Limpiamos el ListBox Me.LstOrdenes.Items.Clear() 'Variable de tipo DataRow que contendra 'Los registros de la Tabla Primaria (Customers) Dim FilaPadre As DataRow FilaPadre = ds.Tables("Clientes").Rows(Me.cboClientes.SelectedIndex) 'Arrays que contendra los registros de la tabla Hija 'Mediante la Relacion (Customers-Orders) Dim FilasHija() As DataRow FilasHija = FilaPadre.GetChildRows("ClientesOrdenes") Dim Filas As DataRow 'Llenar el listbox con valores de las filas hijas For Each Filas In FilasHija Me.LstOrdenes.Items.Add(Filas.Item("OrderId") & " - " & Filas.Item("OrderDate")) Next End Sub End Class
P i 138
Programacin Windows
Ejercicio Practico N3 1.- Disear el siguiente formulario.
CboClient
DataGridView
2.- Luego codificaremos lo siguiente: Imports System.Data Imports System.Data.SqlClient Public Class Form3 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=SSPI") Dim daClientes As New SqlDataAdapter("Select * from Customers", cn) Dim daOrdenes As New SqlDataAdapter("Select * from Orders", cn) Dim ds As New DataSet Private Sub Form3_Load daClientes.Fill(ds, "Clientes") daOrdenes.Fill(ds, "Ordenes") ds.Relations.Add("ClientesOrdenes", ds.Tables("Clientes").Columns("Customerid"), ds.Tables("Ordenes").Columns("Customerid")) Dim fila As DataRow For Each fila In ds.Tables("Clientes").Rows Me.cboClientes.Items.Add(fila.Item("CompanyName")) Next End Sub Private Sub cboClientes_SelectedIndexChanged Dim FilaPadre As DataRow FilaPadre = ds.Tables("Clientes").Rows(Me.cboClientes.SelectedIndex) Dim FilasHija() As DataRow FilasHija = FilaPadre.GetChildRows("ClientesOrdenes") 'Creacion de un DataTable Dim dtRelacion As New DataTable 'Declaracion de un DataColumn Dim columna As DataColumn 'Declaracion de un DataRow Dim fila As DataRow
P i
139
Programacin Windows
'Crearemos 2 columnas para nuestro DataTable columna = New DataColumn("Codigo") 'Indicamos el Tipo de Dato para la columna columna.DataType = Type.GetType("System.Int32") 'Agregaremos la columna al DataTable dtRelacion.Columns.Add(columna) columna = New DataColumn("Fecha Orden") columna.DataType = Type.GetType("System.DateTime") dtRelacion.Columns.Add(columna) 'Variable que recorrera las FilasHijas Dim Filas As DataRow For Each Filas In FilasHija 'Se crea una nueva fila en el DataTable fila = dtRelacion.NewRow 'Agregara los registros de los campos de la fila Hija 'En cada columna creada fila("Codigo") = Filas.Item("OrderId") fila("Fecha Orden") = Filas.Item("OrderDate") 'Agregaremos las filas al DataTable dtRelacion.Rows.Add(fila) Next 'Por ultimo mostraremos el contenido del DataTable 'en un DataGridView Me.DataGridView1.DataSource = dtRelacion End Sub End Class
2.- Luego seleccionamos los 2 SqlDataAdapter, y generaremos un conjunto de Datos. .- Ir al men Datos / Generar Conjunto de datos. 4.- En la ventana que aparecer le ponemos un nombre al DataSet que se va generar, luego escogeremos los 2 SqlDataAdapter.
Pgina 140
Programacin Windows
5.- Luego en el DataSet generado, clic sobre la flecha negra y escogeremos Diseador del DataSet.
6.- Nos mostrar una ventana donde aparecern las dos Tablas, Employees y Orders.
7.- Ahora usaremos la herramienta Relation del DataSet para relacionar esas 2 Tablas.
Pgina 141
Programacin Windows
8.- Al relacionar arrastraremos desde la Tabla Orders hacia la Tabla Employees (es decir de Padre a Hijo), en este caso la tabla padre va ser Employees y el hijo Orders. 9.- En la ventana que aparecer se debe mostrar la relacin entre ellas por el campo EmplyeeId.
Pgina 142
Programacin Windows
12.- En su propiedad DataSource del ListBox, escogeremos el DataSet generado, y en su propiedad DisplayMember, escogeremos el campo FirstName de la Tabla Employees, p los nombres de los ues empleados son los que se deben de mostrar al cargar mi formulario.
1 .- Luego en su propiedad DataSource del DataGrid cargaremos el DataSet creado, y en su propiedad DataMember escogeremos la Tabla Orders relacionada con la Tabla Employees.
14.- Luego en el evento Load del Formulario escribiremos el siguiente cdigo para cargar los 2 SqlDataAdapter al DataSet. Private Sub Form2_Load Me.SqlDataAdapter1.Fill(Me.DsEmployeesorders1) Me.SqlDataAdapter2.Fill(Me.DsEmployeesorders1) End Sub
Pgina 143
Programacin Windows
15.- Al final ejecutamos y se debe mostrar de la siguiente manera, escogemos un empleado en el ListBox, y en el Datagrid se debe mostrar las ordenes emitidas por ese empleado.
El Obj
Vi w
Qu es el Objeto DataView?
Para que Sirve? Propiedad Sort y RowFilter Navegacin de Registros (Control BindingSource) DataBinding y BindingContext
Pgina 144
Programacin Windows
El objeto DataView
El objeto DataView permite manejar dentro de una aplicacin la informacin que recibe un objeto DataSet. La informacin que recibe un DataSet se almacena en forma predeterminada en un objeto DataTable y esta la podemos enviar al objeto DataView para manejarla y presentarla de muchas formas. El objeto DataView se puede enlazar a controles y mostrarla ordenada o filtrada, es decir, crear un subconjunto de los datos obtenidos. Una de las formas de crear un objeto DataView es la siguiente:
MiDataView.Table=Ds.Tables(Empleados)
MiDataView.Sort=Nombre
P i 145
Programacin Windows
Ejercicio Prctico N1 1.- Disear el siguiente Formulario.
BtnMostrar
Public Class Form1 'Declaro mi cadena de conexin Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=SSPI") 'Declaro mi DataAdapter Dim da As New SqlDataAdapter("Select * from Products", cn) 'Declaro mi DataSet Dim ds As New DataSet 'Declaro mi vista Dim midataview As New DataView Private Sub BtnMostrar_Click da.Fill(ds, "Productos") 'Le asigno una tabla midataview.Table = ds.Tables("Productos") 'Ordena los registros por el campo Productname midataview.Sort = "ProductName" Me.DataGridView1.DataSource = midataview Me.lbltotal.Text = "Son " & midataview.Count & " registros" End Sub Private Sub DataGridView1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView1.DoubleClick 'Si la fila que selecciono Si contiene algo entonces... If Not IsDBNull(Me.DataGridView1.SelectedCells(0).Value) Then Me.txtproducto.Text = midataview.Item(Me.DataGridView1.CurrentRow.Index).Item("Productname") Me.txtprecio.Text = midataview.Item(Me.DataGridView1.CurrentRow.Index).Item("Unitprice") Me.txtStock.Text = midataview.Item(Me.DataGridView1.CurrentRow.Index).Item("UnitsInStock") End If End Sub End Class
P i
146
Programacin Windows
Ejercicio Prctico N2 1.- Disear el siguiente Formulario.
BtnCon1 BtnCon2
DataGridView
Imports System.Data Imports System.Data.SqlClient Public Class Form2 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=SSPI") Dim da As New SqlDataAdapter("Select Productid,Productname,Unitprice, UnitsInStock from Products", cn) Dim ds As New DataSet Dim dv As New DataView Private Sub Form2_Load 'Cargamos nuestra Vista da.Fill(ds, "Productos") dv.Table = ds.Tables("Productos") End Sub Private Sub btnCon1_Click 'Condicion de Filtrado dv.RowFilter = "ProductName like 'C%'" Me.DataGridView1.DataSource = dv End Sub Private Sub btnCon2_Click 'Condicion de Filtrado dv.RowFilter = "Unitprice=18 and Productname like 'S%'" Me.DataGridView1.DataSource = dv End Sub End Class
P i
147
Programacin Windows
Ejercicio Prctico N3 1.- Disear el siguiente Formulario.
TxtProducto
DataGridView
Imports System.Data Imports System.Data.SqlClient Public Class Form3 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=SSPI") Dim da As New SqlDataAdapter("Select Productid,Productname,Unitprice, UnitsInStock from Products", cn) Dim ds As New DataSet Dim dv As New DataView Private Sub Form3_Load 'Se llena la vista da.Fill(ds, "Productos") dv.Table = ds.Tables("Productos") End Sub Private Sub txtproducto_TextChanged 'La condicion de filtrado se concaneta o se une 'con lo que se escriba en la caja TxtProducto 'Entonces la condicion de filtrado lo pone la caja de Texto dv.RowFilter = "Productname like '" & Me.txtproducto.Text & "%'" Me.DataGridView1.DataSource = dv End Sub End Class
P i
148
Programacin Windows
BindingSource
Origen de Datos
Realizada la conexin control-origen de datos, toda interaccin con los datos, incluyendo navegacin, ordenacin, filtrado y actualizaciones, puede ser llevada a cabo utilizando la funcionalidad del componente BindingSource. 1.- Agregaremos un control BindingSource, que se encuentra en el grupo Datos del cuadro de Herramientas
2.- En su propiedad DataSource del BindingSource escogemos la opcin Agregar origen de Datos del Proyecto.
Pgina 149
Programacin Windows
3.- Aparecer la siguiente ventana y escogeremos Base de Datos y luego clic en el botn siguiente.
4.- Luego escogemos la conexin hecha en el Explorador de Servidores con la Base de Datos Northwind.
5.- Luego la ventana que aparece muestra el nombre que se le va a dar a la cadena de conexin.
Pgina 150
Programacin Windows
6.- Despus clic en siguiente y luego escogemos los campos de la tabla que se mostrarn y le pondremos un nombre al DataSet que se generar en este caso le pondremos DsSuppliers y clic en Finalizar.
Pgina 151
Programacin Windows
9.- Y por defecto se agregar un TableAdapter, que es un adaptador para acceder a la tabla de la Base de Datos.
11.- Ahora en lazaremos las Cajas de Textos al BindingSource, para ello en su propiedad DataBinding / Text de las Cajas de Textos, elegiremos el BindingSource y el campo de la tabla que queremos que se muestre en la Caja de Texto. Asi lo haremos para las dems Cajas de Textos.
P i
152
Programacin Windows
12.- Luego crearemos el siguiente procedimiento a nivel formulario. Private Sub mostrarposicion() Dim itotal As Integer = Me.BindingSource1.Count Dim ipos As Integer If itotal = 0 Then txtregistro.Text = "No Regsitros" Else ipos = Me.BindingSource1.Position + 1 txtregistro.Text = ipos.ToString & " de " & itotal.ToString End If End Sub 13.- Luego escribiremos el siguiente cdigo para los botones de desplazamiento y para el evento Load del Formulario Private Sub Form1_Load 'TODO: esta lnea de cdigo carga datos en la tabla 'DsSuppliers.Suppliers' Puede quitarla segn sea necesario. Me.SuppliersTableAdapter.Fill(Me.DsSuppliers.Suppliers) mostrarposicion() End Sub Private Sub btnprimero_Click Me.BindingSource1.MoveFirst() mostrarposicion() End Sub Private Sub btnanterior_Click Me.BindingSource1.MovePrevious() mostrarposicion() End Sub Private Sub btnsiguiente_Click Me.BindingSource1.MoveNext() mostrarposicion() End Sub moverla o
P i
153
Programacin Windows
Private Sub btnultimo_Click Me.BindingSource1.MoveLast() mostrarposicion() End Sub 14.- Por ultimo ejecutamos la aplicacin y se debe mostrar como la figura.
DataBinding y BindingContext
Los controles que con regularidad se utilizan en aplicaciones Windows as como en aplicaciones Web tienen la propiedad DataBinding, es necesario configurar la propiedad de cada control que contendr en enlace a los datos, luego para administrar esta se de utilizar la propiedad be BindingContext de la clase contenedora. Al usar el BindingContext obtiene el BindingManagerBase que mantiene sincronizados todos los controles enlazados al mismo origen de datos, se puede utilizar la propiedad Position del BindingManagerBase para especificar el elemento actualmente seleccionado de una lista. Por ejemplo, para enlazar una caja de texto con el campo FirsName de la Tabla Empleados (dtEmpleados) contenida en una DataSet previamente definido utilizo la siguiente instrucc in: txtNombre.DataBindings.Add("Text", dtEmpleados, "FirstName") Luego para administrar por ejemplo la posicin actual o lo que es lo mismo el registro activo se utiliza la siguiente instruccin: Me.BindingContext(dtEmpleados).Position = 0 Note en la instruccin anterior que se utiliza a propiedad BindingContext del formulario, como lo dicho en lneas arriba, la propiedad Position va a mantener sincronizados todos los controles enlazados al DataTable dtEmpleados.
Pgina 154
Programacin Windows
Ejemplo: Realizar el Siguiente Diseo:
btnultimo
Imports System.Data Imports System.Data.SqlClient Public Class Form1 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True") Dim ds As New DataSet Sub cuenta() Dim total As Integer = Me.BindingContext(ds.Tables("Productos")).Count Dim pos As Integer If total = 0 Then Me.lbltotal.Text = "No hay registros" Else pos = Me.BindingContext(ds.Tables("Productos")).Position + 1 Me.lbltotal.Text = pos & " de " & total End If End Sub Sub cargar() Me.txtcodigo.DataBindings.Add("text", ds.Tables("Productos"), "ProductId") Me.txtproducto.DataBindings.Add("text", ds.Tables("Productos"), "ProductName") Me.txtprecio.DataBindings.Add("text", ds.Tables("Productos"), "UnitPrice") Me.txtstock.DataBindings.Add("text", ds.Tables("Productos"), "UnitsInStock") End Sub
P i 155
Programacin Windows
Private Sub Form1_Load Dim da As New SqlDataAdapter("Select * from Products", cn) da.Fill(ds, "Productos") cargar() cuenta() End Sub Private Sub btnprimero_Click Me.BindingContext(ds.Tables("Productos")).Position = 0 cuenta() End Sub Private Sub btnanterior_Click Me.BindingContext(ds.Tables("Productos")).Position -= 1 cuenta() End Sub Private Sub btnsiguiente_Click Me.BindingContext(ds.Tables("Productos")).Position += 1 cuenta() End Sub Private Sub btnultimo_Click Me.BindingContext(ds.Tables("Productos")).Position = ds.Tables("Productos").Rows.Count 1 cuenta() End Sub End Class
Programacin Windows
CommandText. Contiene una cadena de texto que va a indicar la sentencia SQL o procedimiento almacenado que se va a ejecutar sobre el origen de los datos. CommandTimeout. Tiempo de espera en segundos que se va a aplicar a la ejecucin de un objeto Command. Su valor por defecto es de 30 segundos. CommandType. Indica el tipo de comando que se va a ejecutar contra el almacn de datos, es decir, indica como se debe interpretar el valor de la propiedad CommadText. Puede tener los siguientes valores: StoredProcedure, para indicar que se trata de un procedimiento almacenado; TableDirect se trata de obtener una tabla por su nombre (nicamente aplicable al objeto OleDbCommand); y Text que indica que es una sentencia SQL. EL valor por defecto es Text. Connection. Devuelve el objeto SqlConnection o OleDbConnection utilizado para ejecutar el objeto Command correspondiente. Parameters. Coleccin de parmetros que se pueden utilizar para ejecutar el objeto Command, esta coleccin se utiliza cuando deseamos ejecutar sentencias SQL que hacen uso de parmetros, esta propiedad devuelve un objeto de la clase SqlParameterCollection o un objeto de la clase OleDbParameterCollection. Estas colecciones contendrn objetos de la clase SqlParamter y OleDbParameter, respectivamente, para represen a cada uno de los tar parmetros utilizados. Estos parmetros tambin son utilizados para ejecutar procedimientos almacenados.
P i
157
Programacin Windows
Una vez vistas algunas de las propiedades de las clases SqlCommand y OleDbCommand, vamos a pasar a comentar brevemente los principales mtodos de estas clases. Ejercicio Practico N1 En este ejemplo veremos como el Command llama a un procedimiento almacenado creado en la Base de datos Northwind. 1.- Agregamos un formulario con el siguiente diseo.
DataGridView BtnMostra
DataGridView
2.- Luego hacemos la conexin con SQL, pero antes importamos los namespace. Imports System.Data Imports System.Data.SqlClient Public Class Form2 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True") 3.- Despus creamos un procedimiento almacenado llamado ListarTablas CREATE PROCEDURE ListarTablas AS Select Categoryid,Categoryname from Categories Select Productid,Productname,Unitprice from Products Select Supplierid,CompanyName, City, Country from Suppliers RETURN
DataGridView
P i
158
Programacin Windows
4.- Luego en el Botn BtnMostrar codificamos lo siguiente. Private Sub BtnMostrar_Click Dim comando As New SqlCommand("ListarTablas", cn) comando.CommandType = CommandType.StoredProcedure Dim da As New SqlDataAdapter(comando) Dim ds As New DataSet da.Fill(ds) ds.Tables(0).TableName = "Categoria" ds.Tables(1).TableName = "Producto" ds.Tables(2).TableName = "Proveedor" Me.DataGridView1.DataSource = ds.Tables("Categoria") Me.DataGridView2.DataSource = ds.Tables("Producto") Me.DataGridView3.DataSource = ds.Tables("Proveedor") End Sub Ejercicio Practico N2 En este ejemplo trabajaremos con el ComboBox y dos propiedades del mismo: ValueMember: Sirve para guardar un campo especifico cuando se elige un elemento del ComboBox. SelectedValue: Sirve para devolver el valor guardado en la propiedad ValueMember. 1.- Diseamos el siguiente formulario.
P i
159
Programacin Windows
2.- Luego en declaraciones generales importamos lo siguiente. Imports System.Data Imports System.Data.SqlClient 3.- Luego a nivel formulario creamos la conexin. Public Class Form3 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True") 4.- En el evento load del formulario codificamos lo siguiente. Private Sub Form3_Load Dim cmd As New SqlCommand("Select * from Categories", cn) Dim da As New SqlDataAdapter(cmd) Dim ds As New DataSet da.Fill(ds, "Categorias") Me.ComboBox1.DataSource = ds.Tables("Categorias") Me.ComboBox1.ValueMember = "CategoryId" Me.ComboBox1.DisplayMember = "CategoryName" End Sub Private Sub Btnver_Click Dim cmd As New SqlCommand("Select * from products where categoryid=" & Me.ComboBox1.SelectedValue, cn) Dim da As New SqlDataAdapter(cmd) Dim ds As New DataSet da.Fill(ds, "Productos") Me.DataGridView1.DataSource = ds.Tables("Productos") End Sub 6.- Por ltimo ejecutamos y se debe de mostrar de la siguiente manera.
Pgina 160
Programacin Windows
Pgina 161
Programacin Windows
5.- En el evento TextChange del TxtCliente Private Sub txtcliente_TextChanged Dim comando As New SqlCommand("BuscarClientes", cn) comando.CommandType = CommandType.StoredProcedure comando.Parameters.Add("@cliente", SqlDbType.NVarChar, 20).Value = Me.txtcliente.Text Dim da As New SqlDataAdapter(comando) Dim dt As New DataTable da.Fill(dt) Me.DataGridView1.DataSource = dt End Sub 6.- Luego ejecutar la aplicacin y se debe mostrar de la siguiente manera.
2da. Consulta
1.- Crear el siguiente procedimiento almacenado. CREATE PROCEDURE BuscarPorFechas @fecha datetime AS select o.orderid,p.productname,c.companyname,o.orderdate from orders o inner join customers c on o.customerid=c.customerid inner join [order details] d on o.orderid=d.orderid inner join products p on p.productid=d.productid where o.orderdate=@fecha RETURN 2.- Nos conectamos con la Base de Datos Imports System.Data Imports System.Data.SqlClient
Pgina 162
Programacin Windows
Public Class Form2 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True") 3.- En el evento ValueChanged del DataTimePicker Private Sub dtpfecha_ValueChanged Dim cmd As New SqlCommand("BuscarPorFechas", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@fecha", SqlDbType.DateTime).Value = Me.dtpfecha.Value Dim da As New SqlDataAdapter(cmd) Dim ds As New DataSet da.Fill(ds, "Fecha") Me.DataGrid1.DataSource = ds.Tables("Fecha") End Sub 4.- Luego ejecutamos la aplicacin.
Pgina 163
Programacin Windows
El Entorno Conectado
Durante mucho tiempo las aplicaciones que requerian el empleo de datos lo hacian a traves de un entorno conectado de datos, lo cual significa que un usuario y/o aplicacion esta conectado al origen de datos constantemente. Un escenario conectado ofrece como beneficio: y y Un entorno seguro de facil mantenimiento. Se puede controlar facilmente la concurrencia. Requiere de una conexion de Red Permanente. Afecta la escabilidad de la aplicacin.
Pero a su vez este modo de trabajo nos puede presentar algunas desventajas: y y
Pgina 164
Programacin Windows
Pgina 165
Programacin Windows
4.- Luego en el Button codificamos lo siguiente. Private Sub Button1_Click 'Lo codificamos dentro de un try Catch para que se maneje un error que 'se pueda cometer, asi tal vez si la tabla ya existe, que me mande un mensaje Try Dim comando As New SqlCommand("CrearTablaContactos", cn) comando.CommandType = CommandType.StoredProcedure 'Abre la conexion cn.Open() 'ejecuta el SQLCommand comando.ExecuteNonQuery() 'Muestra mensaje despues de Crear la Tabla MsgBox("Tabla "Mensaje") Catch ex As Exception 'Si la Tabla ya existe que me mande un mensaje MsgBox("La Tabla Contactos ya Existe", MsgBoxStyle.Information, "Mensaje") Finally 'Cierra la conexin cn.Close() End Try End Sub 5.- Luego ejecutamos y al dar clic sobre el button se debe mostrar el siguiente mensaje Contactos Creada Satisfactoriamente", MsgBoxStyle.Information,
Pgina 166
Programacin Windows
TxtProducto
btnAgregar
btnLimpiar
TxtProveedor
TxtCategoria
3.- Hacemos la Conexin. System.Data.SqlClient Public Class Form2 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True") 4.- Luego en el botn btnAgregar, codificamos lo siguiente: Private Sub btnagregar_Click Try Dim comando As New SqlCommand("InsertarProducto", cn) comando.CommandType = CommandType.StoredProcedure comando.Parameters.Add("@descripcion", SqlDbType.NVarChar, 40).Value = Me.txtproducto.Text comando.Parameters.Add("@categoria", SqlDbType.Int).Value = Val(Me.txtcategoria.Text) comando.Parameters.Add("@proveedor", SqlDbType.Int).Value = Val(Me.txtproveedor.Text)
P i
167
Programacin Windows
'Asi definimos un parmetro de retorno Dim prm1 As New SqlParameter("@return_value", SqlDbType.Int) prm1.Direction = ParameterDirection.ReturnValue comando.Parameters.Add(prm1) 'Abrir la Conexin cn.Open() 'Ejecuta el SQLCommand comando.ExecuteNonQuery() 'Mensaje de Producto Insertado MsgBox("Se ha Insertado un Producto con Cdigo " & prm1.Value) Catch ex As Exception MsgBox(ex.Message) Finally cn.Close() End Try End Sub 5.- Luego en botn btnlimpiar, codificamos: Private Sub btnlimpiar_Click Me.txtcategoria.Clear() Me.txtproducto.Clear() Me.txtproveedor.Clear() End Sub
Instruccin ExecuteScalar:
y
Ejecuta la consulta y devuelve la primera columna de la primera fila del conjunto de resultados que devuelve la consulta. Se omiten todas las dems columnas y filas. Utilice el mtodo ExecuteScalar para recuperar un nico valor (por ejemplo, un valor agregado) de una base de datos.
Por tanto, podemos deducir que ExecuteNonQuery lo usaremos para ejecutar la mayora de las instrucciones de SQL que ejecutar algo en la base de datos, pero que no devolver un valor. Bueno, en realidad, en algunos casos si que devolver un valor, pero ser para indicarnos, por ejemplo, si eliminamos varias filas de la tabla, devolver el nmero de filas eliminadas. Por otro lado, ExecuteScalar lo usaremos cuando tengamos que ejecutar un cdigo de SQL del que queremos recuperar la primera columna de la primera fila. Este mtodo devuelve un valor de tipo Object que tendremos que convertir segn el valor devuelto. Por ejemplo, si queremos saber el nmero de registros (filas) de una tabla que cumple cierto criterio, podemos usar un comando SQL como este:
SELECT Count(*) FROM Prueba WHERE FechaAlta >= @Param1
P i
168
Programacin Windows
En este caso, el valor devuelto ser del tipo Int32 y ser el nmero de filas que hay en la tabla Prueba de la base de datos indicada en el objeto Connection que previamente habremos abierto que tenga una fecha igual o superior a la indicada en el parmetro proporcionado a ese comando. Si no hay ninguna fila que cumpla ese criterio, devolver cero. Nota: Instrucciones de SQL no significa que hay que usarlo con SQL Server, sino que son instrucciones en "lenguaje" SQL, que en SQL Server se conoce como T-SQL o Transact SQL, y que por tanto podemos usar con cualquier tipo de base de datos, (o casi).
Ejercicio Prctico N1
Txtpro
BtnProductos
BtnEmpleados Txtemp
Imports System.Data Imports System.Data.SqlClient Dim cn As New SqlConnection("Server=(local); Database=Northwind; Integrated Security=True") Private Sub Btnproductos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim cmd As New SqlCommand("Select count(*) from products", cn) cn.Open() Dim x As Integer x = cmd.ExecuteScalar Me.txtpro.Text = x.ToString cn.Close() End Sub
P i
169
Programacin Windows
Private Sub BtnEmpleados_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim cmd As New SqlCommand("Select count(*) from employees", cn) cn.Open() Dim y As Integer y = cmd.ExecuteScalar Me.txtemp.Text = y.ToString cn.Close() End Sub
TxtEmp TxtTel
BtnEliminar
DgvEmpresa
2.- Luego Codificaremos lo siguiente: Imports System.Data Imports System.Data.SqlClient Public Class Form1 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=SSPI") Sub filtrar() Dim da As New SqlDataAdapter("Select * from Shippers", cn) Dim dt As New DataTable da.Fill(dt) Me.DgvEmpresa.DataSource = dt End Sub
P i 170
Programacin Windows
Private Sub Form1_Load filtrar() End Sub Private Sub BtnGuardar_Click Try Dim cmd As New SqlCommand("Insert Into Shippers Values(@empresa,@telefono)", cn) cmd.Parameters.Add("@empresa", SqlDbType.VarChar, 40).Value = Me.txtemp.Text cmd.Parameters.Add("@telefono", SqlDbType.VarChar, 9).Value = Me.txtTel.Text cn.Open() cmd.ExecuteNonQuery() MsgBox("Empresa Registrada...!", MsgBoxStyle.Information, "SISE") filtrar() Catch ex As Exception MsgBox(ex.Message) Finally cn.Close() End Try Dim x As Integer Dim cmd1 As New SqlCommand("Select max(shipperid) from Shippers", cn) cn.Open() x = cmd1.ExecuteScalar Me.txtcod.Text = x.ToString cn.Close() End Sub Private Sub BtnActualizar_Click Try Dim cmd As New SqlCommand("Update Shippers Set CompanyName=@empresa,Phone=@telefono where Shipperid=@codigo", cn) cmd.Parameters.Add("@empresa", SqlDbType.VarChar, 40).Value = Me.txtemp.Text cmd.Parameters.Add("@telefono", SqlDbType.VarChar, 9).Value = Me.txtTel.Text cmd.Parameters.Add("@codigo", SqlDbType.Int).Value = CInt(Me.txtcod.Text) cn.Open() cmd.ExecuteNonQuery() MsgBox("Datos Actualizados...!", MsgBoxStyle.Information, "SISE") filtrar() Catch ex As Exception MsgBox(ex.Message) Finally cn.Close() End Try End Sub Private Sub BtnEliminar_Click Try Dim cmd As New SqlCommand("Delete from Shippers where Shipperid=@codigo", cn) cmd.Parameters.Add("@codigo", SqlDbType.Int).Value = Me.txtcod.Text cn.Open() cmd.ExecuteNonQuery()
P i 171
Programacin Windows
MsgBox("Empresa Eliminada...!", MsgBoxStyle.Information, "SISE") filtrar() Catch ex As Exception MsgBox(ex.Message) Finally cn.Close() End Try End Sub Private Sub DgvEmpresa_DoubleClick If Not IsDBNull(Me.DgvEmpresa.SelectedCells(0).Value) Then Me.txtcod.Text = Me.DgvEmpresa.SelectedCells(0).Value Me.txtemp.Text = Me.DgvEmpresa.SelectedCells(1).Value Me.txtTel.Text = Me.DgvEmpresa.SelectedCells(2).Value End If End Sub Private Sub BtnNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.txtcod.Clear() Me.txtemp.Clear() Me.txtTel.Clear() End Sub End Class
El Control DataGrid ie
Qu es un DatagridView? Arquitectura del DataGridView? Ejemplo Prctico
P i
172
Programacin Windows
DgvProductos
P i
173
Programacin Windows
Public Class Form3 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True")
Private Sub Form3_Load Dim dr As SqlDataReader Dim cmd As New SqlCommand("Select * from orders", cn) cn.Open() dr = cmd.ExecuteReader Do While dr.Read Me.cboorden.Items.Add(dr("OrderId")) Loop dr.Close() cn.Close() Dim cmd2 As New SqlCommand("Select * from products", cn) Dim da As New SqlDataAdapter(cmd2) Dim dt As New DataTable da.Fill(dt) Me.cboproducto.DataSource = dt Me.cboproducto.DisplayMember = "Productname" Me.cboproducto.ValueMember = "Productid" Me.dgvdetalle.Columns(0).Width = 45 Me.dgvdetalle.Columns(1).Width = 45 Me.dgvdetalle.Columns(2).Width = 90 Me.dgvdetalle.Columns(3).Width = 60 Me.dgvdetalle.Columns(4).Width = 60 Me.dgvdetalle.Columns(5).Width = 60 Me.cboproducto.Text = "" Me.txtpre.Clear() End Sub
Private Sub cboproducto_SelectedIndexChanged Dim x As Double Dim cmd3 As New SqlCommand("Select UnitPrice from Products where productname='" & Me.cboproducto.Text.Trim & "'", cn) cn.Open() x = CDec(cmd3.ExecuteScalar) cn.Close() Me.txtpre.Text = x.ToString("###,##0.00")
P i
174
Programacin Windows
End Sub
Private Sub btnagregar_Click Me.dgvdetalle.Rows.Add(Me.cboorden.Text, Me.cboproducto.SelectedValue, Me.cboproducto.Text, Me.txtpre.Text, Me.txtcant.Text, Val(Me.txtcant.Text) * Val(Me.txtpre.Text)) End Sub
Private Sub btneliminar_Click If Me.dgvdetalle.Rows.Count = 1 Then MsgBox("No se puede Eliminar", MsgBoxStyle.Information, "DataGridView") Else Me.dgvdetalle.Rows.Remove(Me.dgvdetalle.CurrentRow) End If End Sub
Private Sub btnguardar_Click Dim x As Integer Try For x = 0 To Me.dgvdetalle.Rows.Count - 2 Dim cmd As New SqlCommand("insert [Order details] values(@orden,@producto,@precio,@cantidad,0)", cn) cmd.Parameters.Add("@orden", SqlDbType.Int).Value = Me.dgvdetalle.Item(0, x).Value cmd.Parameters.Add("@producto", SqlDbType.Int).Value = Me.dgvdetalle.Item(1, x).Value cmd.Parameters.Add("@precio", SqlDbType.Money).Value = Me.dgvdetalle.Item(3, x).Value cmd.Parameters.Add("@cantidad", SqlDbType.Int).Value = Me.dgvdetalle.Item(4, x).Value cn.Open() cmd.ExecuteNonQuery() cn.Close() Next MsgBox("Detalle de Orden Generado", MsgBoxStyle.Information, "Sistema") Me.dgvdetalle.Rows.Clear() Catch ex As Exception MsgBox(ex.Message) Finally cn.Close() End Try End Sub End Class
P i
175
Programacin Windows
El Ob eto DataReader
Qu es el Objeto DataReader? Qu es el Objeto SQLDataReader? Instruccin ExecuteReader Ejemplo Prctico
Objeto DataReader
El objeto DataReader se utiliza en Ado.Net para leer la informacin que enva el origen de datos y manejarla en el cliente. Por Ejemplo: Si ha usado el objeto SQLConnection, tendrs que utilizar el objeto SQLDataReader.
Objeto SQLDataReader
El objeto SQLDataReader permite acceder a la informacin de una base de Datos de una manera muy rpida, mejorando el rendimiento de nuestra aplicacin por la velocidad que utiliza para acceder a ella y tambin porque requiere poco espacio de memoria ya que slo perm anece en ella un solo registr a la vez. Las caractersticas de acceso a la informacin de este objeto es que es en forma secuencial y hacia delante, es decir, desde la primera hasta la ltima fila. Otra caracterstica de este objeto es que la informacin que almacena es de solo lectura, es decir, que slo se puede utilizar cuando deseamos leer la informacin del servidor, por ejemplo, para los programas de listado que se necesitan desarrollar. Para utilizar el objeto SQLDataReader, primero debe de definir una variable de este tipo como se muestra a continuacin:
Dim dr as SqlDataReader
Despus de definir la variable, crear el objeto SQLCommand y abrir la conexin, puede llenar el objeto SQLDataReader de la siguiente manera:
P i
176
Programacin Windows
Variable=Objeto SQLCommand.ExecuteReader
Ejemplo:
LstCliente
Imports System.Data Imports System.Data.SqlClient Public Class Form1 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=SSPI") Private Sub BtnVer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim dr As SqlDataReader Dim cmd As New SqlCommand("Select * from customers", cn) cn.Open() dr = cmd.ExecuteReader Do While dr.Read Me.lstclientes.Items.Add(dr(1)) Loop dr.Close() cn.Close() End Sub End Class El resultado ser el siguiente
Pgina 177
Programacin Windows
Acceso al Sistema
1.- Disearemos el formulario para que quede de la siguiente manera.
PictureBox1 Y PictureBox2
TxtUsuario
TxtContrasea ProgressBar1 BtnIngresar BtnSalir 2.- Despus aadiremos 2 Timer; uno para el ProgressBar1 y el otro para los dos PictureBox
Imports System.Data Imports System.Data.SqlClient Public Class Form1 Dim cn As New SqlConnection("Server=(Local); DataBase=Northwind; Integrated Security=True")
5.- En el Evento Load del Formulario codificamos:
Private Sub Form1_Load Me.Timer2.Enabled = True Me.PictureBox1.Visible = False Me.PictureBox2.Visible = False End Sub
Pgina 178
Programacin Windows
"
Private Sub btningresar_Click Dim cmd As New SqlCommand("Select Employeeid, LastName, FirstName, Extension from Employees where LastName='" & Me.txtusuario.Text & "'", cn) Dim dr As SqlDataReader cn.open() dr = cmd.ExecuteReader If dr.Read() Then If dr("Extension") = Me.txtcontrasea.Text Then Me.Timer1.Enabled = True Else MsgBox("Contrasea Incorrecta") End If Else MsgBox("Usuario No Existe") End If cn.Close() End Sub
7.- Luego en el Evento Tick del Timer1, codificamos lo siguiente (Este Timer es para el control del ProgressBar)
Private Sub Timer1_Tick Me.ProgressBar1.Visible = True Me.ProgressBar1.Value = Me.ProgressBar1.Value + 1 If Me.ProgressBar1.Value = 100 Then Me.Timer1.Enabled = False MsgBox("Bienvido al Sistema Usuario " & Me.txtusuario.Text, MsgBoxStyle.Information, "Sistema") MDIParent1.Show() End If
8.- En el evento Tick del Timer2, codificamos lo siguiente(Este Timer es para los PictureBox)
Private Sub Timer2_Tick Static a As Integer If a = 0 Then Me.PictureBox1.Visible = True Me.PictureBox2.Visible = False a=1 Else If a = 1 Then Me.PictureBox1.Visible = False Me.PictureBox2.Visible = True a=0 End If End If
9.- En el evento Clic del Botn BtnSalir codificamos:
P i
179
Programacin Windows
11.- Finalmente ejecutamos la aplicacin. Ingresamos un Usuario y una Contrasea.
Pgina 180
Programacin Windows
Una vez desarrollado un aplicativo, el paso siguiente lgico es generarle su instalador, para ello vamos a agregar a la Solucin un proyecto de Instalacin e Implementacin.
El proyecto de Instalacin contiene 6 vistas para configurar segn el tipo de instalador que deseemos crear, ahora vamos a detallar 1 a 1 el uso de las vistas:
En esta vista se muestran 3 carpetas que representan a las carpeta de la maquina en donde se s instalara el Aplicativo. Carpeta de la Aplicacin= Representa a la carpeta en donde el Usuario escogi instalar el Aplicativo, por defecto ser Archivos de Programa. Es aqu donde debemos agregar el Ejecutable, sus dependencias y los dems archivos necesarios para que el aplicativo funcione bien. Escritorio del Usuario= Representa al Escritorio de la Maquina Cliente, aqu colocaremos los accesos directos.
Pgina 181
Programacin Windows
Men Programas del Usuario= Representa al Men Programas de la Maquina Cliente, Ac tambin colocaremos un acceso directo. Ahora procederemos a configurar las carpetas: Agregue Carpetas para administrar mejor los archivos a instalar, comience con la carpeta con el Nombre de la Empresa luego con el nombre del Aplicativo y por ult mo por carpetas para administrar i los archivos del aplicativo, de la siguiente manera:
Pgina 182
Programacin Windows
Ahora crearemos los accesos directos que luego arrastraremos al Escritorio y al Men programas de usuario.
Una vez agregado el acceso directo tenemos que asignarle el icono antes agregado, de la siguiente manera:
El siguiente paso es arrastrar los accesos directos creados hacia las carpetas correspondientes:
Pgina 183
Pgina 184
Solo debemos agregar en la vista Sistema de Archivos el Ejecutable a insertar en esta vista:
Recuerde que no todos los ejecutables poseen los mismos argumentos de ejecucin.
Agregue una bsqueda de un archivo especificando el nombre y la extensin del mismo, no dejando de lado la carpeta donde se buscara el archivo.
Pgina 185
Programacin Windows
Y por ltimo se generar el instalador correctamente, el cual se encontrar dentro de la carpeta Debug.
Pgina 186