Documente Academic
Documente Profesional
Documente Cultură
pagina 10
pagina 17
pagina 27
5.- Programando con controles en Visual Basic 5.1- El cuadro de herramienta 5.2.-Controles Window Basicos 5.3.- Control Label 5.4.- Control TextBox 5.5. Control Button 5.6.- Foco de entrada 5.7.- Funciones para presentar mensajes 5.8.- Funcion InputBox() 5.9- Funcion MsgBox() 5.10.- Codificando con los eventos de controles 5.11.- Codificando otros eventos de control 5.12.- Orden de tabulacin de los controles 5.13.- Control ListBox 5.14.- Control Combobox 5.15.- Control CheckBox 5.16.- Controles RadioButton y GroupBox 5.17.- Controles tipo men 5.18.- Controles avanzados de Visual Basic Control temporizadores (Timer) Control ImageList Control ToolBar Control StatusBar Control DateTimePiker Control NumericUpDown Control DomainUpDown Control MonthCalender Control LinkLabel Control NotifyIcon 6.- Programacion Orientada a Objeto (POO) en Visual Basic 6.1.- Que es una clase 6.2.- Crear la primea clase 6.3.- Propiedades de solo lectura y escritura 6.4.- Agregar mtodos a una clase 6.5.- Agregar evento a una clase 6.6.- Crear una instancia de clase 6.7.- Como utilizar los constructores 6.8.- Como utilizar los destructores 6.9.- Como utilizar los miembros datos compartidos 6.10.- Como utilizar los mtodos compartidos
pagina 67
pagina 119
6.11.- Polimorfismo en Visual Basic NET 6.12.- Probar controladores de eventos 6.13.- Herencia de clases en Visual Basic NET
7.- Impresin en Visual Basic pagina 172 7.1.- La solucion: Como imprimier en .NET 7.2.- Las clases para imprimir en .NET Clase PrintDocument Clase PrintSetting Clase PrintDialog Clase PrintPreviewDialog Calse PrintPreviewControl 7.4.- Conclusion Imprimir en .NET es fcil 7.5.-Hacer Crystal Report con DataSet en Visual Basic.NET 8.- Acceso a Datos con ADO.NET en Visual Basic pagina 184 8.1.- Acercandonos a ADO.NET 8.2.- SystemData 8.3.- Los proveedores de acceso a datos 8.4.- El concepto DataBinding 8.5.- Otras consideraciones 8.6.- El paradigama de conexin 8.7.- Conociendo el objeto DataReader 8.8.- Un primer contacto con el objeto DataReader 8.9.- Trabaja DatReader en un ambiente conectado realmente? 8.10.- Usando DataSource con DataReader 8.11.- Usando componentes de acceso a datos de .NET 8.12.- Esquema general de la estrucutra desconectada de acceso a datos 8.13.- Conociendo el objeto DataAdapter 8.14.- Insertando datos a travs del Objeto DataAdapter 8.15.- Actualizando datos a travs del objeto DataAdapter 8.16.- Eliminando datos a travs del objeto DataAdapter 8.17.- Qu son los datos Maestro Detalle? 8.18.- Configurando la fuente de datos 8.19.- Preparando el origen de datos 8.20.- Inscrustando los datos Maestro Detalle 8.21.- Manipulando los datos.
que trabajan las aplicaciones escritas con cualquier lenguaje .NET. Este entorno virtual se ocupa de multitud de cosas importantes para una aplicacin: desde la gestin de la memoria y la vida de los objetos hasta la seguridad y la gestin de subprocesos.
Lo mejor de todo es que cualquier componente creado con uno de estos lenguajes puede ser utilizado de forma transparente desde cualquier otro lenguaje .NET. Adems, como ya se ha comentado, es posible ejecutar el cdigo .NET en diferentes plataformas y sistemas operativos
La siguiente figura ilustra a vista de pjaro la arquitectura conceptual de la plataforma .NET. En ella se pueden observar los elementos que se han mencionado en apartados anteriores (lenguajes, CLR, CLS...) y en qu lugar de se ubican las bibliotecas de clases base:
Todo lo que se encuentra en la BCL forma parte de la plataforma .NET. De hecho existe tal cantidad de funcionalidad integrada dentro de estas bibliotecas (hay decenas de miles de clases) que el mayor esfuerzo que todo programador que se inicia en .NET debe hacer es el aprendizaje de las ms importantes. De todos modos Visual Studio ofrece mucha ayuda contextual (documentacin, Intellisense...) y una vez que se aprenden los rudimentos resulta fcil ir avanzando en el conocimiento de la BCL a medida que lo vamos necesitando.
As, por ejemplo, todo lo que tiene que ver con el manejo de estructuras de datos XML en la plataforma .NET se encuentra bajo el espacio de nombres System.Xml. La funcionalidad fundamental para crear aplicaciones Web est en el espacio de nombres System.Web. ste a su vez contiene otros espacios de nombres ms
Si usted ha programado con Visual Basic 6.0 o con ASP, ha empleado en su cdigo con total seguridad la interfaz de acceso a datos conocida como ADO (ActiveX Data Objects), puede que combinado con ODBC (Open Database Connectivity). Si adems es usted de los programadores con solera y lleva unos cuantos aos en esto es probable que haya usado RDO o incluso DAO, todos ellos mtodos mucho ms antiguos.
ADO.NET ofrece una funcionalidad completamente nueva, que tiene poco que ver con lo existente hasta la fecha en el mercado. Sin embargo, con el nimo de retirar barreras a su aprendizaje, Microsoft denomin a su nuevo modelo de acceso a datos con un nombre similar y algunas de sus clases recuerdan a objetos de propsito anlogo en el vetusto ADO.
ADO.NET es un modelo de acceso mucho ms orientado al trabajo desconectado de las fuentes de datos de lo que nunca fue ADO. Si bien este ltimo ofreca la posibilidad de desconectar los Recordsets y ofreca una forma de serializacin de estos a travs de las diferentes capas de una aplicacin, el mecanismo no es ni de lejos tan potente como el que nos ofrece ADO.NET.
El objeto ms importante a la hora de trabajar con el nuevo modelo de acceso a datos es el DataSet. Sin exagerar demasiado podramos calificarlo casi como un motor de datos relacionales en memoria. Aunque hay quien lo asimila a los clsicos Recordsets su funcionalidad va mucho ms all como se ver en el correspondiente mdulo.
En la plataforma .NET el espacio de nombres que ofrece las clases necesarias para construir aplicaciones de escritorio bajo Windows se denomina Windows Forms. Este es tambin el nombre genrico que se le otorga ahora a este tipo de programas basados en ventanas.
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
Windows Forms est constituido por multitud de clases especializadas que ofrecen funcionalidades para el trabajo con ventanas, botones, rejillas, campos de texto y todo este tipo de controles habituales en las aplicaciones de escritorio. Visual Studio ofrece todo lo necesario para crear visualmente este tipo de programas, de un modo similar aunque ms rico al que ofreca el entorno de desarrollo integrado de Visual Basic.
Este es el aspecto que presenta parte del cdigo que genera la interfaz mostrada en la anterior figura:
10
VARIANT
Recordar Tambien que en Visual Basic NET toda variable usada en un programa se debera declarar al principio del programa el formato de declaracion mas sencillo es: DIM VARIABLE AS TIPO Ejemplos DIM ALFA AS INTEGER DIM ALFA AS LONG, BETA AS LONG DIM ALFA AS INTEGER, NOMBRE AS STRING DIM CIUDAD AS STRING * 20, ALFA AS DOUBLE Observar ltimo caso de ciudad asi de esta manera se consigue una string de tamano definido. En Visual Basic NET un problema comun a lo largo de este curso, es la necesidad de convertir variables numericas a strings y tambien el problema inverso es decir convertir strings a su representacion numerica. Para este ltimo problema por ejemplo se tiene: DIM ALFA AS STRING ALFA = 3.1416 Como se observa del ejemplo anterior, se puede dar en algun momento la necesidad de convertir la string ALFA a su valor numerico, para resolver este problema se deberan usar las siguientes funciones de conversion numerica que proporciona Visual Basic NET. En Visual Basic NET para el ejemplo anterior se tendria: DIM ALFA AS STRING DIM BETA AS SINGLE ALFA = 3.1416 BETA= CINT (ALFA)
Nota: Estamos usando una funcin de Visual Basic para tomar solo el valor entero de ALFA
Tambien podemos declarar variables utilizando unos smbolos o caracteres detrs de las variables que indiquen el tipo de variable utilizada, la tabla muestra estos smbolos: Tipo de dato Short Integer Long Single Double Simbolo % & ! # Caracter S I L F R
11
D US UI UL $
12
Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click Dim valor As valores Valor = valores.valor2 MessageBox.show(Valor) End sub
As
System.Object,
ByVal
As
Nota: Si deseamos conocer el nombre de la variable seleccionada de la lista enumerada, podemos utilizar: Dim valor As valores Valor = valores.valor2 MessageBox.show(Valor.ToString() & : & Valor) Se presentara: valor2: 5
Dim MiAlumno As Alumno MiAlumno.nombre = Carlos MiAlumno.edad = 23 Mialumno.Id = 2011-23056 MessageBox.show(MiAlumno.nombre & tiene & MiAlumno.edad & aos) End sub
13
Se presentara en pantalla: Carlos tiene 23 aos Tambien podemos utilizar la palabra reservada With para realizar acciones que se repiten, evitando escribir una parte del cdigo, analicemos el siguiente ejemplo: Private Structure Alumno Public nombre As String Public Edad As Integer Public Id As String End Structure Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click As System.Object, ByVal e As
Dim MiAlumno As Alumno With MiAlumno .nombre = Carlos .edad = 23 .Id = 2011-23056 MessageBox.show(MiAlumno.nombre & tiene & MiAlumno.edad & aos) End sub
Global, en todo el proyecto. En la clase declarada o en una derivada. En el Assemblie. Solo en el mdulo. Solo en el Procedimiento. Solo en el Procedimiento.
14
En escencia una variable local solo es conocida por el codigo de esa funcion o procedimiento y es desconocida por otras funciones o procedimientos. En la programacion formal no es acostumbrado usar muchas variables globales por varias razones, una de ellas es que variables globales estan vivas todo el tiempo de ejecucion del programa. Si una variable global solo la ocupa unos cuantos procedimientos no tiene caso que este viva para todo el resto, otra razon es que es peligroso tener variables globales porque todo el conjunto de procedimiento y funciones que componen un programa tienen acceso o comparten su valor y se corre el riesgo de que inadvertidamente alguno de ellos modifique su valor. Programa ' Creando y cargando una variable global Dim varglobaluno as integer = 50 Fuera de todo procedimiento Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Este es un ' creando, cargando y mandando una var local procedimiento en Dim varlocaldos = 20 Call PROC1(varlocaldos) Visual Basic NET End Sub
Sub PROC1(ByVal varlocaltres As Single) 'aqui se puede usar varglobaluno por ser global 'y varlocaltres por ser local pero no se puede usar varlocaldos ' porque es local en otro procedimiento Label1.Text = varglobaluno + varlocaltres End Sub
15
El Operador (/) Division Flotante es el operador de division normal. El Operador (\) tambien es division pero los datos: a) Primero son redondeados al entero ms cercano (byte, integer, long) b) Al final visual basic trunca la parte residual. El Operador (^), resuelve dos problemas: a) Ejemplo 5 2 se resuelve enVisual Basic NET: dim alfa as integer alfa = 5 ^ 2 Desplegar alfa, sale 9 en pantalla b) Ejemplo para Raices solo recordar la ley de exponentes que dice: Para estos casos:
9
= 5^8/3 = 9^1/2 En Visual Basic el operador (MOD) devuelve el residuo entero de una division entre enteros, ejemplo: Dim alfa As Single alfa = 23 MOD 4 Visualizar alfa; El resultado en pantalla es 3
3
16
Otro ejemplo; alfa = 108 MOD 10; Visualizar alfa; El resultado en pantalla es 8
8
Ejercicios de programacion
Resolver algebraicamente en papel las siguientes ecuaciones expresndolas en formato de Visual Basic NET 1.2.3.-
b) si calif1 = 60 y calif2 = 80 ; Entonces si en programa se usa promedio = calif1 + calif2/2 ; Da como resultado promedio = 100 En Visual Basic NET recordar siempre, que antes de plantear una formula en un programa se debera evaluar respecto al orden siguiente:
17
3.- Multiplicaciones y divisiones 4.- Sumas y restas 5.- Dos o ms de la misma jerarquia u orden, entonces resolver de izquierda a derecha Nota: Si se quiere alterar el orden normal de operaciones, entonces usar parentesis. Nota: Tampoco es bueno usar parentesis cuando no es necesario en una operacion, esto solo indica que no se evaluo bien la formula
Ejemplo: area = ( base * altura ) / 2 Aqui los parentesis estan de mas porque por orden de operaciones, multiplicacion y division tienen la misma jerarquia y entonces se resuelven de izquierda a derecha en otras palabras en visual basic NET ni que falten parentesis ni que sobren parentesis
18
19
Nota importante: Recordar que aunque no es un componente necesario en los programas ya que el cdigo se puede asociar o pegar a cualquier evento de cualquier forma o componente del programa, Microsoft ya acostumbro a todos los usuarios al boton OK, de acuerdo, OK. RECORDAR que todos los componentes vistos incluyendo el propio form y ventana estos tienen muchas propiedades que se pueden asignar o modificar y tambien tienen muchos eventos a los cuales les podemos asociar o cargar el codigo del programa, todos estas propiedades y eventos las podemos accesar dentro de la ventana de propiedades. No olvidar que las palabras reservadas del lenguaje NO se deben utilizar como variables, esto producir un error en al aplicacion Regresando a Form1, es sobre esta forma donde se construira el programa y esta forma se convierte en ventana al momento de ejecutarse el programa.
20
Es decir sera la primera ventana que el usuario ve al momento de ejecutarse el programa, su nombre es Form1. Esta forma o ventana es un objeto de VISUAL BASIC NET y como todos los objetos de Visual Basic y del universo, la forma o ventana tiene asociados propiedades y eventos.
NomObjeto.Propiedad = nvovalor;
Ejemplo: Form2.BackColor = Yellow
Eventos: son todos aquellos sucesos de caracter externo que afectan o llaman la
atencion del objeto, para estos casos la forma o ventana u objeto: 1. Debe tener capacidad de detectar el evento 2. Aun ms importante debe tener capacidad de reaccionar y emitir una respuesta, mensaje o conducta apropiada al evento detectado. Evento es por ejemplo que otro objeto llamado humano pulse el objeto tecla ESC, o haga click derecho con el objeto raton en alguna parte de la ventana, etc. es en estos casos, cuando la ventana u objeto detecte un evento de estos la propia forma u objeto debera responder de manera apropiada. Nota: Esta respuesta no es automatica, sino son la serie de instrucciones del lenguaje (o programa) que los ingenieros de software disean (o programan) en otras palabras son los eventos quienes contendran los programas.
Es tambien la VENTANA DE PROPIEDADES, quien contiene todos los posibles eventos asociados a la forma. Para los primeros programas en VISUAL BASIC solo se usaran propiedades sencillas como color, font, etc. de Form1 y los objetos ya mencionados (LABEL, TEXTBOX, BUTTON, INPUTBOX, MESSAGEBOX, LISTBOX, COMBOBOX) y no se usan de momento los eventos que puede detectar Form1.
21
Procedimiento detallado
1.- Crear un folder o directorio en su disco duro C:\ llamado PROGRAM1 2.- Cargar VISUAL BASIC desde la barra de start de windows 3.- Usar la opcin FILE > NEW PROJECT > WINDOWS APPLICATION 4.-Usar Ahora la opcion FILE > SAVEALL De la pantalla de grabacin que sale ponerle un nombre al proyecto (dejar el default ) y apuntarlo al directorio que se hizo de programas:
22
Recordar que pueden agregar TOOLBOX, (VENTANA DE PROPIEDADES Y EXPLORADOR DE SOLUCIONES) usando la opcin VIEW de la barra del men. 6.- Observar que en grafica de arriba esta seleccionada la propia forma o ventana. Dentro del programa se estarn cargando todos los objetos que usa el programa y por ejemplo Visual Basic NET a los dos textbox's que se estarn usando los nombra por DEFAULT como TextBox1 y TextBox2, con esas maysculas y minsculas as que estar dificil estar recordando su nombre por defecto Es conveniente estar usando la propiedad NAME de todos los objetos sobre todo textbox y label que se coloquen en una forma o ventana.
23
Es decir es mas fcil construir una formula que diga num1.Text = num2.Text + 5 a el original que seria TextBox1.Text = TextBox2.Text + 5 por esta razn es conveniente asignarle un nombre relevante a cada TextBox usando la propiedad NAME de la pagina de propiedades, en este curso se les asigna NAME a todos los textbox's y muchos de los otros componentes que se usan. 7.- Arrastrar y acomodar desde la CAJA DE HERRAMIENTAS a FORM1 3 (tres) compontes LABEL y cargarles su PROPIEDAD TEXT con las palabras BASE, ALTURA y AREA respectivamente para escribir esto solo hacerlo usando la cajita que esta a un lado de la propiedad dentro dela pagina de propiedades.
NOTA: si de alguna manera el editor los manda al cdigo del programa, observar que arriba de FORM1 hay tres pestaas: FORM1.VB la que contiener el codigo del programa en los procedimientos y eventos FORM1 DESIGN que contiene el diseo START PAGE contiene las caracteristicas de la pagina de inicio De solo click en form1 design para regresar al ambiente visual.
8.- Arrastrar y acomodar ahora tres componentes textBox de los cuales en su propiedad TEXT, limpiarla y dejarla en blanco y en su propiedad (NAME) cargarlos con las palabras BASE, ALTURA y AREA respectivamente. 9.- Arrastrar y acomodar ahora un componente o control BUTTON, poner su propiedad text=OK. La pantalla diseada es: 10.-Colocaremos el siguiente codigo dentro del evento click de BUTTON Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click AREA.Text=(BASE.Text*ALTURA.Text / 2) End Sub
24
Para escribir este cdigo solo haga CLIK dentro de BUTTON1 y VISUAL BASIC los mandara a la pantalla de cdigo, donde ya estar cargado el evento button1_clik(){}.
Atencin solo se escribe el cdigo en rojo, el evento button1.click(){} ya lo escribe visual basic por default y respetar todas las mayusculas y minusculas dentro del codigo. Los dos parmetros que van dentro de button_click (OBJETO, variable e)> son para indicarle al compilador que se estarn enviando OBJETOS entre la forma o ventana y el usuario del programa ( LOS TEXTBOXS son los objetos y primero se mandan vacios al usuario y luego el sistema los recoge con datos desde el usuario). La VARIABLE e (environment) es donde el sistema o compilador los va almacenando temporalmente, si ya vieron algo de msdos y conocen el comando set ah observaran los textbox's con sus datos. Regresando al cdigo: a.- Son las propiedades TEXT de los TEXTBOX'S quienes contienen los datos tanto capturados como los de salida. b.- Recordar adems que cualquier propiedad TEXT de cualquier CONTROL o COMPONENTE solo maneja datos de tipo TEXTO o STRING y por tanto para poder realizar operaciones con los TEXTBOX.TEXT visual basic NET internamente los convierte a los tipos apropiados. c.- [VARNUMERICA COMPONENTE EXPRESION] .ToString() > se uso para convertir el valor numrico a tipo string Y PODERLO FORMATEAR para que salga el resultado con dos decimales ( este tema de formateo se ve en el tema siguiente), para poderlo almacenar en la propiedad TEXT del TEXTBOX. 11.- Ya cargada la forma con sus componente y el evento click con su cdigo respectivo, grabar el programa con la opcin FILESAVE o usar el icono de grabacin (el disquito o disquitos que esta en la barra de iconos arriba) y luego ejecutar el programa usando el icono de RUN que tambin se encuentra en la barra de herramientas arriba o DEBUG START o F5. 12.- El programa en ejecucion:
25
Nota: Si buscan muy bien dentro del folder project1 se encontraran con muchos archivos que creo VISUAL BASIC, dos de ellos son los interesantes: FORM1.VB que contiene todo el cdigo fuente, es decir el programa original y WINDOWSAPPLICATION1.EXE (dentro del folder bin\debug) que es el archivo ejecutable, basta darle un click desde el explorer de windows y se ejecutara solo sin necesidad de que este cargado el compilador de visual basic.
26
27
c) Solo hacer click en form2.vb en el administrador de proyectos (o usar la pestaa arriba en el compilador que ya debe mostrar las dos formas o ventanas) para tener en la pantalla de diseno la segunda ventana, cargarle con sus propios label's, textbox's y buttons, es decir contruirle su programa, recordar tambien asignarles sus propios NAME'S. d) El codigo del BUTTON1 de la primera ventana Form1 es: Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click Form2.Show() End Sub As System.Object, ByVal e As
Solo usar propiedad SHOW() con la ventana2 o FORM2 Recordar que si se quiere que FORM1 haga otro proceso u operacin solo agregarle componentes y mas BUTTON's El Cdigo del botn OK de la segunda ventana Form2, es: Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click Me.Close() End Sub As System.Object, ByVal e As
Estamos viendo ahora un nuevo operador de visual basic NET, el operador ME, este operador es una referencia o enlace directo al objeto activo, el evento button1_Clic() est contenido dentro de esta FORM2 por tanto el objeto activo es FORM2 Me.Close() sera equivalente a FORM2.CLOSE() pero visual basic prefiere trabajar mejor con referencias o enlaces a objetos, por eso es mejor usar THIS. Corrida: form1 Nota:
Recordar que si se quiere que FORM2 haga otro proceso u operacin solo agregarle componentes y mas BUTTON's
Recordar que les indique que windowsforms tiene muchos y valiosos controles o componentes en esta ventana se uso CALENDAR y se ve elegante
28
Corrida form2: Recordar otra vez que windowsforms tiene muchos y valiosos controles o componentes en esta ventana se uso WEBBROWSER y se ve elegante
29
30
Como se observa, son cuatro partes bien diferenciadas entre si; La propia instruccion condicional en si La condicion El grupo cierto de instrucciones El grupo falso de instrucciones Cuando el computador evalua una condicion el resultado de esa evaluacion solo es evaluado de dos maneras o la condicion es CIERTA o la condicion es FALSA. Esto depender del valor que tenga asignado o que se haya capturado para la variable que est en la condici Por ejemplo si se capturo 8000 en sueldo en el ejemplo a) entonces el computador indicara que la condicion es CIERTA pero en otro caso si a la variable sueldo primero se le asigno un valor de 250 entonces el computador indicara que la condicion es FALSA. Dependiendo del resultado de la evaluacion, el programa realiza las instrucciones contenidas en el grupo de cierto o falso respectivamente. Empezaremos el anlisis por la CONDICION presentada. CONDICIONES SIMPLES VISUAL BASIC En general todas las condiciones se forman con tres elementos los cuales son: Variables sexo sueldo Carrera Operadores relacionales = > = Constantes o variables m 30000 informatica
Una condicion simple en visual basic NET se define como el conjunto de variables y/o constantes unidas por los llamados operadores relacionales.
31
If condicion Then Instrucciones cuando la condicion sea cierta Else Instrucciones cuando la condicion sea falsa End If
Si un if no ocupa un grupo falso de instrucciones entonces no usar la clausula else Private Sub Button1_Click(ByVal sender As System.Object, ByVal e System.EventArgs) Handles Button1.Click If SUELDO.Text > 3000 Then MessageBox.Show("RICO") Else MessageBox.Show("POBRE") End If End Sub Si lo corremos veremos algo asi: As
32
En Visual Basic NET es valido usar mas de una instruccion dentro del grupo cierto o falso del if.
EJERCICIOS DE PROGRAMACION EN VISUAL BASIC NET 1.- Capturar un nmero cualesquiera e informar si es o no es mayor de 100 2.- Capturar un nmero entero cualesquiera e informar si es o no es multiplo de 4 (recordar el operador mod analizado en el tema de operadores aritmeticos). 3.- Capturar los cinco datos ms importantes de un Empleado, incluyendo el sueldo diario y los dias trabajados desplegarle su cheque semanal solo si gano mas de $500.00 en la semana, en caso contrario desplegarle un bono de despensa semanal de $150.00, PUEDEN USAR PANELS PARA SEPARAR O MEJOR AUN OTRAS VENTANAS O FORMAS. 4.- Capturar los datos mas importantes de un estudiante incluyendo tres calificaciones construir una boleta de calificaciones en un PANEL O VENTANA de respuesta bien bonita si el estudiante es de la carrera de medicina, en caso contrario construir un PANEL O VENTANA mas bonita todavia que despliega un oficio citando a los padres del estudiante a una platica amistosa con los maestros de la escuela. 5.- Capturar los datos ms importantes de un producto cualesquiera, incluyendo cantidad, precio, etc. desplegar una orden de compra, solo si el producto es de origen nacional, en caso contrario no hacer nada.
Nota: Es muy importante realizar siempre un diseo visual de lo que queremos realizar en el grograma y como esto se vera en la aplicacin, Visual Basic NET facilita mucho esta situacion
33
Una condicion compuesta se define como dos o ms condiciones simples unidas por los llamados operadores lgicos. Los operadores logicos que VISUAL BASIC NET reconoce son: OPERADOR AND OR NOT Xor AndAlso DESCRIPCION Es verdadera si las dos expresiones comparadas son verdadera Es verdadera si una de las dos expresiones es verdadera Invierte el valor de la expresin. Dos negaciones es una afirmacin y negar una afirmacin es el valor contrario de la afirmacion Es verdadera si una de las dos expresiones comparadas es verdadera Es verdadera si las dos expresiones comparadas son verdadera, con al particularidad de que evalua la segunda parte de la expresin si la primera la cumple Es verdadera si una de las dos expresiones comparadas son verdadera, con al particularidad de que si cumple la primera expresin no continua la siguientedando como verdadera la comparacin logica
OrElse
La cantidad total de casos posibles cuando se unen dos o mas condiciones simples esta dada por la relacion 2n donde n es la cantidad de condiciones, la primera mitad de ellos empieza en cierto y la segunda mitad en falso. Ejemplo, si formamos una condicion compuesta con dos condiciones simples y el operador logico y, la cantidad total de casos posibles serian 22 = 4, y se puede construir la siguiente tabla de verdad. Tabla de verdad con AND PRIMERA SIMPLE C C F F CONDICION SEGUNDA SIMPLE C F C F CONDICION EVALUACION C F F F
La evaluacion final, se obtiene usando la regla anteriormente descrita para una condicion compuesta, que contiene el operador AND. Esta tabla significa lo siguiente: 1.- Cualquiera que sean la cantidad de datos procesados, siempre caera en uno de estos cuatro casos generales. La tabla de verdad para una condicion compuesta con OR es la siguiente:
34
PRIMERA SIMPLE C C F F
CONDICION EVALUACION C C C F
Otro ejemplo: Construir una tabla de verdad para una condicion compuesta de tres o mas condiciones simples es tambien tarea sencilla, solo recordar que; 1.- La cantidad posible de casos es 23 = 8 casos posibles, la mitad empiezan con Cierto y la otra mitad empiezan con Falso. 2.- Para evaluar esta condicion triple primero se evaluan las dos primeras incluyendo su operador bajo las reglas ya descritas y luego se evalua el resultado parcial contra la ultima condicion y ultimo operador para obtener la evaluacion final. Ejemplo una condicion compuesta de tres condiciones simples, donde el primer operador logico es el AND y el segundo operador logico es el OR, daria la siguiente tabla de verdad. PRIMERA CONDICION SIMPLE C C C C F F F F SEGUNDA CONDICION SIMPLE C C F F C C F F EVALUACION TERCERA DE PRIMERA Y CONDICION SEGUNDA SIMPLE CONDICION C C C F F C F F F C F F F C F F EVALUACION OR DE TERCERA Y CUARTA COL. C C C F C F C F
Programa ejemplo: Determinar de acuerdo a la edad si los datos del ususario son de un joven o de una persona anciana, (edad limite = 30) Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click If EDAD.Text < 30 And SEXO.Text = "H" Then Label3.Text = "Muchacho Joven" Else Label3.Text = "Anciano" End If End Sub As System.Object, ByVal e As
35
EJERCICIOS DE PROGRAMACION 1.- Construir un programa que capture un nmero cualesquiera e informe si es o no es mayor de 50 y mltiplo de tres. (Solo escribir el mensaje de respuesta de manera muy clara y esto resuelve el problema) 2.- Construir un programa que indique si un nmero es un par positivo. 3.- Capturar los datos de un producto incluyendo su cantidad en existencia, desplegar una orden de compra si la cantidad en existencia del producto es menor que el punto de reorden, o si el origen del producto es nacional. 4.- Construir un programa que capture los datos de un empleado, desplegar en un panel o ventana su cheque semanal si gana mas de $500.00 y si esta en el departamento de produccin en caso contrario desplegarle en otro panel o ventana un bono de despensa del 25% de su sueldo semanal.
36
intentar convertir el problema a uno que se pueda resolver usando la instruccin SELECT CASE.
Select Case variableopcion case const1 instruccion(es) case const2 instruccion(es) case const3 Instruccion(es) case Else instruccion(es) End Select
Esta instruccin es una instruccin de decisin mltiple donde el compilador prueba o busca el valor contenido en una variable ENTERA, CHARACTER, STRING contra una lista de constantes apropiadas, cuando el computador encuentra el valor de igualdad entre variable y constante entonces ejecuta el grupo de instrucciones asociados a dicha constante, si no encuentra el valor de igualdad entre variable y constante, entonces ejecuta un grupo de instrucciones asociados a un default, aunque este ultimo es opcional. El formato de esta instruccin es el siguiente:
Programa ejemplo : Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click As System.Object, ByVal e As
Select Case LETRA.TEXT Case "A" ANIMALITO.TEXT = "AGUILA" Case "B", "b" ANIMALITO.TEXT = "BESTIA" Case "C" Dim ALFA As Integer ALFA = 100 + 5 ' observar como se encadenan strings usando simbolo & ANIMALITO.TEXT = ALFA & " CABALLOS" Case Else ANIMALITO.TEXT = "NO HAY" End Select End Sub
37
Observar el caso b, se pueden usar ms de dos constantes. En el caso C recordar que cada CASE puede llevar un conjunto de instrucciones que se ejecutaran hasta que el compilador encuentre el siguiente case. Observar y recordar en caso C como se unen dos o mas strings, usando el signo &.
As
System.Object,
ByVal
As
38
El ciclo for es muy sencillo y no ocupa mucha explicacion, solo empieza en UNO y se va incrementando de UNO en UNO
39
Dim MiArreglo() As String = {Uno,Dos,Tres} Dim SCadena As String Dim Smensaje As String = For Each SCadena In MiArreglo Smensaje += SCadena &
Next
MessageBox.Show(Smensaje.trim) End Sub
EJERCICIOS DE PROGRAMACION 1.- Construir un programa que despliegue los numeros del 20 al 30. 2.- Desplegar los enteros entre 50 y 30 acompaados de su potencia cuadrada y raiz cubica respectiva (revisar tema de operadores aritmeticos y buscar la libreria de funciones matematicas de Visual Basic). 3.- Desplegar los multiplos de 5, entre 10 y 50, acompaados de su factorial y logaritmo respectivo (La misma recomendacion del ejercio anterior). 4.- Desplegar la tabla de multiplicar que el usuario indique 5.- Evaluar la funcion y = 5x2 + 3x + 8 cuando x= -310 (rango de -3 hasta 10)
Programa
Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click As System.Object, ByVal e As
40
Dim X As Integer X=1 LISTA.Items.Clear() Do While X <= 10 LISTA.Items.Add(X & "= GATO") X=X+1 Loop End Sub
Corrida
Nota:
While puede llevar dos condiciones; en este caso inicializar 2 variables de condicion y cuidar que existan 2 de rompimiento o terminacion de ciclo. El grupo cierto de instrucciones puede ser una sola instruccion o todo un grupo de instrucciones. La condicion puede ser simple o compuesta.
A este ciclo tambien se le conoce tambien como ciclo de condicion de entrada o prueba por arriba porque este ciclo evalua primero la condicion y posteriormente ejecuta las instrucciones.
Actividades de reforzamiento de lo aprendido EJERCICIOS DE PROGRAMACION 1.- Desplegar enteros entre 50 y 80 2.- Desplegar multiplos de 4 entre 60 y 20 acompanados de su logaritmos de base 10 y base e respectivos (revisar tema operadores atitmeticos) 3.- Construir la tabla de dividir que el usuario indique 4.- Evaluar una funcin cualesquiera para el rango de valores de x de -3 a +5
41
42
Sin embargo sus problemas son similares a los de variables normales es decir hay que declararlos, capturarlos, hacer operaciones con ellos, desplegarlos, compararlos, etc. En programacion tradicional siempre se manejan dos tipos de arreglos los arreglos tipo listas, vectores o unidimensionales y los arreglos tipo tablas, cuadros, concentrados, matrices o bidimensionales en ambos casos son variables que permiten almacenar un conjunto de datos del mismo tipo a la vez, su diferencia es en la cantidad de columnas que cada uno de estos tipos contiene, como en los siguientes ejemplos: a) LISTAS EDAD
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
43
18 34 22 15 22 45
B) TABLAS CIA ACME S.A. INGRESOS MENSUALES DE VENTAS (MILES DE $) SUCURSAL SUCURSAL A SUCURSAL B SUCURSAL D ENERO 10 60 100 FEBRERO 20 70 110 MARZO 30 80 90 ABRIL 40 90 120
Como se observa la diferencia principal entre un arreglo tipo lista y un arreglo tipo tabla son las cantidades de columnas que contienen. En algebra matricial, si son importantes los conceptos de vectores y matrices, pero las operaciones y metodos son precisamente los del algebra matricial.
44
Recordar tambien que como objeto arreglo, tambien puede usar una serie de metodos pertenecientes a dicha clase system.array, los metodos principales de dicha clase y por tanto de los arreglos derivados de la misma puede estudiarlos en la ayuda del lenguaje. En visual Basic recordar que la primera posicion o renglon en una lista es la posicion o renglon 0 (cero). La captura del dato, puede venir de momento de un objeto textbox y/o se usan tantos de estos controles como elementos tenga el arreglo o mas facil aun se debera controlar la captura de elementos usando algun algoritmo sencillo de validacion como lo muestra el programa ejemplo. Private Sub Button2_Click(ByVal sender System.EventArgs) Handles Button2.Click As System.Object, ByVal e As
Dim MiArreglo(10) As Integer Dim I As Integer LISTA2.Items.Clear() ' CARGANDO EL ARREGLO LISTA ORIGINAL CON DATOS For I = 0 To 10 MiArreglo(I) = I * 2
Next
' DESPLEGANDO Dim SValores As String = For I = 0 To 10 SValores += MiArreglo(I) Next MessageBox.Show(SValores.trim) End Sub Otro Ejemplo: ' DECLARANDO LISTA GLOBAL Y ESTA DECLARACION ESTAN FUERA DEL SUB Shared EDADARR(4) As Integer ' DECLARANDO RENG COMO GLOBAL Dim RENG As Integer
0 2 4 6 8 10 12 14 16 18 20
PROCESO
Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'En este modulo solo se trabaja con el arreglo en memoria If RENG <= 5 Then EDADARR(RENG) = EDAD.Text RENG = RENG + 1 EDAD.Text = "" End If
45
If RENG >= 5 Then EDAD.Visible = False RENG = 0 End If End Sub Private Sub Button2_Click(ByVal sender System.EventArgs) Handles Button2.Click As System.Object, ByVal e As
' LIMPIANDO LISTAS LISTA1.Items.Clear() LISTA2.Items.Clear() ' CARGANDO LISTA ORIGINAL CON EDAD CAPTURADA For RENG = 0 To 4 LISTA1.Items.Add(EDADARR(RENG))
Next
' A MESES Y Y DESPLEGANDO For RENG = 0 To 4 EDADARR(RENG) = EDADARR(RENG) * 12 LISTA2.Items.Add(EDADARR(RENG)) Next End Sub Corrida
Observar que en el programa el arreglo edad y la variable renglon se declararon de tipo GLOBAL porque los dos metodos el de captura y el de operacion-despliegue, las estan compartiendo.
Ademas observar que se declararon antes de los eventos clickButton, para crearlos como objetos globales.
Para el caso de operaciones y comparaciones con todos los elementos de la lista a la vez se debera usar un ciclo for con una variable entera llamada renglon, misma que tambien se usa como indice de la lista. Recordar que todos los datos internos de la lista estaran almacenados en la memoria ram del computador, para despliegues se usa un componente visual que permite manipular un conjunto de datos a la vez, el ListBox con sus metodos apropiados pero
46
se tiene que usar un ciclo for para ir anadiendo o agregando elemento por elemento como se observa en el problema ejemplo que se ha venido desarrollando, en este caso se quiere desplegar las cinco edades convertidas a meses. La ultima intruccion y muy importante es poner en cero las variables de control de ciclos o indice de arreglos, esto es porque el servidor mantiene el programa ejecutandose continuamente en memoria y si se vuelve a pedir la ejecucion del programa, en cuento se intente capturar un nuevo dato va a marcar el error arreglo fuera de limite o arrayofbound, estan avisados. Para inicializar una lista con valores se debe usar el siguiente formato: Shared Dim nomlista() As <tipodato> = {lista de valores separados por comas} Ejemplo: Shared Dim edad() as Integer = {15,16,17,18} Shared Dim sueldo() as Double = {40.85, 65.30, 33.33} Shared Dim ciudad() as String = {Managua, Leon, Masaya, Granada} EJERCICIOS DE PROGRAMACION DE ARREGLOS TIPO LISTA 1.- Capturar y desplegar 5 precios de productos cualesquiera usando dos panel uno para capturar y uno para desplegar 2.- Capturar 4 sueldos en un panel desplegarlos aumentados en un 25% en otro panel 3.- Capturar los datos de 5 productos comprados en una tienda, incluyendo nombre, precio y cantidad en sus 3 listas respectivas, despues calcular una cuarta lista con el gasto total por cada producto desplegarlo todo en un segundo panel e incluir tambien el gran total 4.- Capturar en una lista solamente 6 numeros multiplos de 5, se debe de estar capture y capture numeros hasta que se completen los 6 multiplos de 5
47
La declaracion de una tabla sera de acuerdo al siguiente formato: SHARED DIM NOMTABLA(RENG-1,COL-1) AS <TIPODATO> Ejemplo: SHARED DIM SUELDO(3,4) AS DOUBLE Recordar que va a generar una matriz que tendra cuatro renglones y cinco columnas empieza en sueldo(0,0) Para capturar sus elementos, usaremos un textbox y un boton de captura, solo tener cuidado o mucho control sobre los indices rEN y col como lo muestra el ejemplo. Para efectuar otros procesos tales como operaciones, despliegues con todos los elementos de la tabla se deberan usar 2 ciclos un for externo para controlar renglon y un for interno para controlar columna. Programa ' DECLARANDO LISTA GLOBAL ' RECORDAR QUE SON 3 RENG Y 4 COLUMNAS Shared CALIFICACION(2, 3) As Integer ' DECLARANDO RENG Y COL COMO GLOBAL Dim R, C As Integer Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' EN ESTE MODULO SOLO SE TRABAJA CON EL ARREGLO ' EN MEMORIA CALIFICACION(R, C) = CALIF.Text C=C+1 CALIF.Text = "" If C = 4 Then R=R+1 C=0 End If If R = 3 Then CALIF.Visible = False End If End Sub Private Sub Button2_Click(ByVal sender System.EventArgs) Handles Button2.Click As System.Object, ByVal e As
48
Dim TEMP As String ' PROCESANDO Y REGALANDO 50 PUNTOS A TODOS For R = 0 To 2 For C = 0 To 3 CALIFICACION(R, C) = CALIFICACION(R, C) + 50 Next C Next R ' desplegando For R = 0 To 2 TEMP = CALIFICACION(R, 0) & " " & CALIFICACION(R, 1) & " " & CALIFICACION(R, 2) & " " & CALIFICACION(R, 3) LISTA1.Items.Add(TEMP) ' limpiando temporal antes de otro renglon TEMP = " " Next End Sub Notas: Observar el formato de declaracion y como se controlan los indices de captura r, c Para procesar los elementos se usan dos ciclos for y el formato tabla (reng,col). En este problema se usa el objeto LISTBOX para presentar el resultado mas adelante se usara un objeto mas apropiado. Diseo: Corrida:
Las matrices en Visual Basic tienen la capacidad de cambiar o modificar su tamao, es decir su dimensin en memoria, utilizando las palabras reservadas: ReDim ReDim Preserve Ejemplo:
49
Dim MiArreglo() As String Declaro mi arreglo ReDim MiArreglo(2) Declaro nuevamente mi arreglo de dimension 3 MiArreglo(0) = Uno : MiArreglo(1) = Dos : MiArreglo(2) = Tres ReDim Preserve MiArreglo(3) Declaro nueva dimensin preservando los valores MiArreglo(3) = Cuatro MessageBox.Show(MiArreglo(0)) Muestro el valor del primer dato
Nota : Podemos concatenar varias lneas de cdigo separadas por : Importante: Si deseamos conocer el tamao o dimensin, podemos utilizar unmetodo de los arreglos : MiArreglo.Length Ejemplo, utilizando el anterior podemos escribir MessageBox.Show(MiArreglo.Length) Nos visualizara 4, que es la dimensin del arreglo Importante: Si deseamos eliminar los elementos de un arreglo de forma rpida utilizamos la palabra rservada Nothing, ejemplo: MiArreglo = Nothing If MiArreglo IsNothing then MessageBox.Show( Nada) Else MessageBox.Show(MiArreglo.Length) presenta la dimension Endif Importante: Si deseamos copiar una matriz en otra podemos hacerlo de esta forma: MiArreglo.CopyTo(OtroArreglo,0) Ejemplo: Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim MiArreglo() As String = {Mercurio,Venus,Tierra} Dim OtroArreglo() As String ReDim OtroArreglo(MiArreglo.Lenght 1) MiArreglo.CopyTo(OtroArreglo,0) MessageBox.Show(OtroArreglo(0)) End Sub
50
TAREAS PROGRAMACION DE TABLAS 1.- Construir un cuadro que contenga los costos fijos de cuatro productos cualesquiera, que se producen en tres plantas diferentes de una empresa maquiladora (2 prog uno capturado y otro inicializado). 2.- Construir un cuadro que contenga los ingresos mensuales por ventas durante los tres primeros meses del ano de cuatro sucursales de una cadena de auto refacciones, agregar al final una lista que muestre los ingresos mensuales totales por meses y una segunda lista que muestre los ingresos mensuales totales por sucursal(2 progs uno capturado y otro inicializado). 3.-Construir un cuadro que contenga las comisiones ganadas por tres vendedores, de los 5 tipos de linea blanca de conocida muebleria, ademas listas de comisiones totales y promedios ganadas por los vendedores, asi como listas de comisiones totales y promedios por tipo de linea blanca Analizar este codigo: ' PARA TOTALES Y PROMEDIOS POR RENGLON (FILAS) FOR R = 0 TO 3 FOR C = 0 TO 2 TOTRENG(R) = TOTRENG(R) + TABLA(R,C) NEXT C PROMRENG(R) = TOTRENG(R)/3 NEXT R 'PARA TOTALES Y PROMEDIOS POR COLUMNA FOR C = 0 TO 2 FOR R = 0 TO 3 TOTCOL(C)=TOTCOL(C) + TABLA(R,C) NEXT R PROMCOL(C) = TOTCOL(C) / 4 NEXT C
51
contenan un gran nmero de funciones para realizar operaciones aritmticas, manipular cadenas, fechas, etc. VB.NET tambin tiene funciones para las operaciones antes comentadas. No obstante, debido a la orientacin a objetos sobre la que est construida la plataforma .NET, la gran potencia a la hora de resolver cualquier situacin la encontraremos en el gran nmero de clases proporcionadas por el entorno para resolver las ms variadas situaciones, lo que veremos en el tema dedicado a OOP. En este apartado y organizadas por categoras, vemos una pequea muestra de las funciones disponibles en VB.NET. Consulte el lector la documentacin de la plataforma, para obtener informacin ms detallada de todas las funciones disponibles.
Funciones Numricas
Int(Nmero), Fix(Nmero). Estas funciones devuelven la parte entera del parmetro Nmero. La diferencia entre ambas reside en que cuando el parmetro pasado es negativo, Int() devuelve el entero negativo menor o igual que Nmero, mientras que Fix( ) devuelve el entero negativo mayor o igual que Nmero. Ver el Cdigo Dim Resultado As Integer Resultado = Int(66.87) ' 66 Resultado = Fix(66.87) ' 66 Resultado = Int(-66.87) ' -67 Resultado = Fix(-66.87) ' 66 Randomize([Nmero]). Inicializa el generador de nmeros aleatorios, que utilizaremos posteriormente en la funcin Rnd( ). Opcionalmente recibe un nmero como parmetro que sirve al generador como valor inicial o semilla para la creacin de estos nmeros. Rnd([Nmero]). Devuelve un nmero aleatorio de tipo Single, que ser menor que 1, pero mayor o igual a cero. Podemos, opcionalmente, variar el modo de generacin del nmero pasando un valor al parmetro de esta funcin. En funcin de si el parmetro es mayor, menor de cero, o cero, el comportamiento de Rnd( ) a la hora de generar el nmero ser diferente. Ver el Cdigo Dim Contador As Integer Dim Aleatorio As Single Randomize() For Contador = 1 To 5 Aleatorio = Rnd()
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
52
Numero generado: 0,706402 Numero generado: 0,4058605 Numero generado: 0,337209 Numero generado: 0,8914912 Numero generado: 0,8711619
Generacin de nmeros aleatorios con Rnd( ). Si necesitamos que el nmero aleatorio est comprendido en un intervalo de nmeros enteros, utilizaremos la frmula del Cdigo para generarlo. Int((LmiteSuperior - LmiteInferior + 1) * Rnd() + LmiteInferior) El ejemplo del Cdigo crea nmeros aleatorios comprendidos entre el intervalo de los nmeros 7 y 12. Dim Contador As Integer Dim Aleatorio As Single Randomize() For Contador = 1 To 10 Aleatorio = Int((12 - 7 + 1) * Rnd() + 7) MsgBox("Nmero generado: "& Aleatorio) Next
53
Dim ConEspacios As String ConEspacios = "Hola" & Space(7) & "a todos" MsgBox("La cadena con espacios tiene el valor:" & ControlChars.CrLf & ConEspacios) ' Hola a todos InStr([Comienzo, ]CadenaBuscar, CadenaBuscada [, TipoComparacin]). Busca dentro de CadenaBuscar la cadena contenida en el parmetro CadenaBuscada. Opcionalmente podemos establecer en Comienzo, la posicin en la que comienza la bsqueda y el tipo de comparacin (texto, binaria) en el parmetro TipoComparacin. Ver el Cdigo Dim CadBuscar As String Dim CadBuscada As String Dim PosComienzo As Integer CadBuscar = "El castillo del bosque" PosComienzo = InStr(CadBuscar, "tillo") MsgBox("La posicin de comienzo de la cadena encontrada es: " & ,PosComienzo) '7 Left(Cadena, Longitud). Esta funcin extrae, comenzando por la parte izquierda de Cadena, una subcadena de Longitud de caracteres. Right(Cadena, Longitud). Esta funcin extrae, comenzando por la parte derecha de Cadena, una subcadena de Longitud de caracteres. El Cdigo muestra ejemplos de Left( ) y Right( ). Dim CadIzquierda As String Dim CadDerecha As String CadIzquierda = Left("Especial", 3) MsgBox("Resultado de la funcin Left(): "& CadIzquierda) ' Esp CadDerecha = Right("Especial", 3) MsgBox("Resultado de la funcin Right(): "& CadDerecha) ' ial Mid(Cadena, Inicio [, Longitud]). Extrae de Cadena, comenzando en la posicin Inicio, una subcadena. Opcionalmente podemos utilizar el parmetro Longitud, para indicar el largo de la subcadena. En caso de no utilizar este ltimo parmetro, la subcadena se obtendr hasta el final. Ver Cdigo Dim MiCadena As String Dim SubCadena As String MiCadena = "El bosque encantado" SubCadena = Mid(MiCadena, 6)
54
MsgBox("Subcadena hasta el final: "& SubCadena) ' sque encantado SubCadena = Mid(MiCadena, 6, 3) MsgBox("Subcadena de 3 caracteres: "& SubCadena) ' squ
Replace(Cadena,CadOrigen,CadNueva [,Inicio] [,Sustituciones] [,TipoComparacin]).
Esta funcin toma la cadena situada en el primer parmetro y busca la cadena CadOrigen, sustituyendo las ocurrencias encontradas por la cadena CadNueva. Opcionalmente, el parmetro Inicio especifica la posicin en la que comenzar la sustitucin; el parmetro Sustituciones indica el nmero de sustituciones a realizar; y TipoComparacin indica como se realizarn las comparaciones (texto, binaria). Veamos unos ejemplos en el Cdigo Dim MiCadena As String : Dim CadSustituida As String MiCadena = "Este coche es especial" CadSustituida = Replace(MiCadena, "es", "xx") ' resultado: Este coche xx xxpecial MsgBox("Resultado del reemplazo en la cadena: "& CadSustituida) ' en el anterior ejemplo los dos primeros caracteres no se sustituyen porque ' no se ha especificado el tipo de comparacin, que a continuacin s indicaremos CadSustituida = Replace(MiCadena, "es", "xx", , , CompareMethod.Text) ' resultado: xxte coche xx xxpecial ' ahora s se han sustituido todas las ocurrencias de "es" MsgBox("Resultado del reemplazo en la cadena: "& CadSustituida) LTrim(Cadena), RTrim(Cadena), Trim(Cadena). Estas funciones eliminan de una cadena, los espacios en blanco a la izquierda en el caso de LTrim( ); los espacios en blanco a la derecha en el caso de RTrim(); o los espacios en blanco a ambos lados Trim( ). Ver el Cdigo Dim CadEspacios As String : Dim CadResultante As String CadEspacios = " Barco " CadResultante = LTrim(CadEspacios) ' "Barco " CadResultante = RTrim(CadEspacios) ' " Barco" CadResultante = Trim(CadEspacios) ' "Barco" UCase(Cadena), LCase(Cadena). Estas funciones, convierten la cadena pasada como parmetro a maysculas y minsculas respectivamente. Ver el Cdigo . Dim Cadena As String : Dim CadMay As String: Dim CadMin As String Cadena = "Vamos a Convertir En Maysculas Y MinscuLAS" CadMay = UCase(Cadena) CadMin = LCase(Cadena) ' "VAMOS A CONVERTIR EN MAYSCULAS Y MINSCULAS" MsgBox("Conversin a maysculas: " & CadMay)
55
' "vamos a convertir en maysculas y minsculas" MsgBox("Conversin a minsculas: " & CadMin) Format(Expresin[,CadenaFormato][,PrimerDaSemana[,PrimeraSemanaAo]). Formatea la expresin pasada en el primer parmetro, empleando de forma opcional una cadena para especificar el tipo de formateo a realizar. Si el valor a formatear es una fecha, podemos utilizar los dos ltimos parmetros para especificar el primer da de la semana y la primera semana del ao; estos dos ltimos parmetros son enumeraciones, cuyos valores aparecen automticamente al asignar su valor. Consulte el lector, la documentacin de ayuda para ms informacin. Como cadena de formato, podemos utilizar los nombres predefinidos de formato, o una serie de caracteres especiales, tanto para formateo de nmeros como de fechas. En lo que respecta a los nombres predefinidos, la Tabla 23 muestra algunos de los utilizados. Nombre de formato General Date Short Date Short Time Standard Currency Descripcin Muestra una fecha con el formato largo del sistema. Muestra una fecha empleando el formato corto del sistema. Muestra un valor horario con el formato corto del sistema. Muestra un nmero utilizando los caracteres de separador de miles y decimales. Muestra un nmero con los caracteres correspondientes a la moneda establecida en la configuracin regional del sistema. Muestra un nmero multiplicado por 100 y con el carcter de tanto por ciento. Nombres de formato para la funcin Format( ). El Cdigo fuente muestra algunos ejemplos de formateo con nombre Dim MiFecha As Date Dim MiNumero As Double Dim ValorFormato As String MiFecha = #7/19/2002 6:25:00 PM# MiNumero = 1804 ValorFormato = Format(MiFecha, "Long Date")' "Viernes, 19 de julio de 2004
Percent
56
ValorFormato = Format(MiFecha, "Short Date") ValorFormato = Format(MiFecha, "Short Time") ValorFormato = Format(MiNumero, "Standard") ValorFormato = Format(MiNumero, "Currency") ValorFormato = Format(MiNumero, "Percent")
' "19/07/2002" ' "18:25" ' "1.804,00" ' "1.804 pta" ' "180400,00%"
Para los caracteres especiales, la Tabla muestra un conjunto de los ms habituales. Carcter de formato : / d dd ddd dddd M MM MMM MMMM yy yyyy H HH m mm s ss 0 # Descripcin
Separador de hora. Separador de fecha. Visualiza el nmero de da sin cero a la izquierda. Visualiza el nmero de da con cero a la izquierda. Visualiza el nombre del da abreviado. Visualiza el nombre del da completo. Visualiza el nmero de mes sin cero a la izquierda. Visualiza el nmero de mes con cero a la izquierda. Visualiza el nombre del mes abreviado. Visualiza el nombre del mes completo. Visualiza dos dgitos para el ao. Visualiza cuatro dgitos para el ao. Visualiza la hora sin cero a la izquierda. Visualiza la hora con cero a la izquierda. Visualiza los minutos cero a la izquierda. Visualiza los minutos con cero a la izquierda. Visualiza los segundos cero a la izquierda. Visualiza los segundos con cero a la izquierda. En valores numricos, muestra un dgito o cero. En valores numricos, muestra un dgito o nada.
57
, .
El Cdigo muestra algunos ejemplos de formato con caracteres especiales. Dim MiFecha As Date Dim MiNumero As Double Dim ValorFormato As String MiFecha = #7/19/2002 6:25:00 PM# MiNumero = 16587.097 ValorFormato = Format(MiFecha, "dddd d/MMM/yyyy") ' "Viernes 19/jul/2002" ValorFormato = Format(MiFecha, "HH:mm") ' "18:25" ValorFormato = Format(MiNumero, "#,#.00") ' "16.587,10" StrConv(Cadena, TipoConversin [,IDLocal]). Realiza una conversin de la cadena pasada como parmetro, utilizando algunos de los valores de la enumeracin TipoConversin. Opcionalmente podemos pasar tambin un valor correspondiente al identificador local del sistema. Ver el Cdigo fuente Dim MiCadena As String Dim Conversion As String MiCadena = "el tren lleg puntual" ' convertir a mayscula Conversion = StrConv(MiCadena, VbStrConv.UpperCase) ' convertir a minscula Conversion = StrConv(MiCadena, VbStrConv.LowerCase) ' convertir a mayscula la primera letra de cada palabra Conversion = StrConv(MiCadena, VbStrConv.ProperCase)
Fecha y hora
Now( ). Devuelve un valor de tipo Date con la fecha y hora del sistema. DateAdd(TipoIntervalo, ValorIntervalo, Fecha). Suma o resta a una fecha, un intervalo determinado por el parmetro TipoIntervalo. El intervalo a utilizar pueden ser das, semanas, meses, etc. Para determinar si se realiza una suma o resta, ValorIntervalo deber ser positivo o negativo respectivamente. DateDiff(TipoIntervalo, FechaPrimera, FechaSegunda). Calcula la diferencia existente entre dos fechas. En funcin de TipoIntervalo, la diferencia calculada sern das, horas, meses, aos, etc. DatePart(TipoIntervalo, Fecha). Extrae la parte de una fecha indicada en TipoIntervalo. Podemos obtener, el da, mes, ao, da de la semana, etc. El Cdigo fuente muestra un conjunto de ejemplos que utilizan las funciones para
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
58
manipular fechas. Dim MiFecha As Date Dim FechaPosterior As Date Dim DiasDiferencia As Long Dim ParteFecha As Integer MiFecha = Now() ' #1/19/2002 12:27:08 PM# FechaPosterior = DateAdd(DateInterval.Month, 2, MiFecha) ' #3/19/2002 12:27:08 PM# DiasDiferencia = DateDiff(DateInterval.Day, MiFecha, FechaPosterior) ' 59 ParteFecha = DatePart(DateInterval.Year, MiFecha) ' 2002
59
EJERCICIOS DE PROGRAMACION DE FUNCIONES Construir tres programas que contengan los procedimientos abajo del sub buttonclick(). a) Convertir $800.00 Cordobas a dolares. b) Calcular el Area de un triangulo c) Deplegar una Boleta de calificaciones. PARAMETROS EN VISUAL BASIC Un parametro es una variable que puede pasar su valor a un procedimiento desde el principal o desde otro procedimiento. Existen ocasiones en que es necesario mandar al procedimiento ciertos valores para que los use en algun proceso.
60
Estos valores que se pasan del cuerpo principal del programa o de un procedimiento a otros procedimientos se llaman parametros. Entonces la declaracion completa de un procedimiento es : SUB NOMPROC(lista de parametros) cuerpo de instrucciones END SUB Donde lista de parametros es una o mas variables separadas por comas como lo muestra el pograma ejemplo. Programa Private Sub Button1_Click(ByVal sender As System.Object, ByVal System.EventArgs) Handles Button1.Click Dim nom As String nom = "pepe" 'Se puede mandar como parametro un dato, variable 'o expresion algebraica Call PROC1(3.75, nom, 4 + 8) End Sub Sub PROC1(ByVal deci As Single, ByVal nom As String, ByVal suma As Integer) ' pero siempre se recibe en una variable Label2.Text = EDAD.Text + deci + suma Label3.Text = nom End Sub Observar que en el procedimiento los parametros crean dos variables de manera local, es decir variables que solo se pueden usar dentro del procedimiento estas variables son quienes reciben los datos o valores. REGLAS PARA EL USO DE PARAMETROS: 1.- Cuando se usan variables como parametros la variable que se manda debe ser declarada dentro del principal o del procedimiento de donde se esta enviando. 2.- La variable que se manda tiene un nombre, la que se recibe puede tener otro nombre o el mismo nombre por claridad de programa, pero recordar que internamente en la memoria del computador existiran dos variables diferentes. 3.- La cantidad de variables que se envian deben ser igual en cantidad, orden y tipo a las variables que reciben. 4.- La variable que se recibe tiene un ambito local dentro del procedimiento, es decir solo la puede usar ese procedimiento. 5.- Se puede mandar a un procedimiento un dato, una variable (como lo muestran los ejemplos) o una expresion algebraica (no ecuacion o formula) pero siempre se deberan recibir en una variable. Corrida e As
61
EJERCICIOS DE PROGRAMACION DE FUNCIONES 1.- En una VENTANA recoger 3 calificaciones en el onclick, calcular promedio en procedimiento uno y desplegar nombre y promedio en un segundo procedimiento 2,- Construir una tabla de multiplicar que el usuario indique, captura y control de ciclo en button_click, calculo y despliegue en un procedimiento usar un solo listbox para la tabla resultado. 3.- Construir un procedimiento que reciba un numero entero y que mande llamar a un segundo procedimiento pasando el letrero PAR O IMPAR FUNCIONES EN VISUAL BASIC NET Una funcion es un modulo de un programa separado del cuerpo principal que realiza una tarea especifica y que puede regresar un valor a la parte principal del programa u otra funcion o procedimiento que la invoque. La forma general de una funcion es: Function NOMFUNCION(parametros) instrucciones NOMFUNCION = cargarlo porque es quien regresa el dato End Function La lista de parametros formales es una lista de variables separadas por comas (,) que almacenaran los valores que reciba la funcion estas variables actuan como locales dentro del cuerpo de la funcion. Aunque no se ocupen parametros los parentesis son requeridos. Dentro del cuerpo de la funcion deber haber una instruccion que cargue el NOMFUNCION para regresar el valor, de esta manera se regresan los datos.
62
Sin embargo es de considerar que NOMFUNCION puede regresar un dato, una variable o una expresion algebraica (no ecuacion o formula) como lo muestran los siguientes ejemplos: a) NOMFUNCION = 3.1416 b) NOMFUNCION = area c) NOMFUNCION = x + 15 / 2 Recordar ademas: a) Una funcion no se llama usando CALL b) Cuando se llame a una funcion debera haber una variable que reciba el valor que regresara la funcion, es decir generalmente se llama una funcion mediante una sentencia de asignacion, por ejemplo resultado = funcion(5, 3.1416) Programa Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'Creando variable que recibira el valor que regrese la funcion Dim alfa as integer 'llamando la funcion y mandandole datos o parmetros observar que se llama por 'igualdad alfa = FUNCION1(500) ' Aunque se puede llamarla directamente y cuantas veces sea necesario Label1.Text = FUNCION1(100) - alfa End Sub Function FUNCION1(ByVal varuno As Integer) ' cargando y regresando el nomfuncion FUNCION1 = 100 + varuno End Function Corrida
Nota: Es permitido cargar ms de un NOMFUNCION en el cuerpo de instrucciones sobre todo en condiciones, pero solo uno de ellos se ejecutara
63
' creando y cargando una lista local con 5 elementos Dim lista1() As Integer = {1, 2, 3, 4, 5} ' pasandola a un procedimiento observar que se pasa sin parentesis Call PROC1(lista1) ' desplegando lista original y observar el resultado Dim r As Integer For r = 0 To 4
64
LISTA.Items.Add(lista1(r)) Next r End Sub Sub PROC1(ByVal vector) ' recibiendola con otro nombre y ' sumando a vector + 100 Dim r As Integer For r = 0 To 4 vector(r) = vector(r) + 100 Next r End Sub Corrida Es de recordar que los cambios que le hagan al arreglo dentro del procedimiento se reflejaran en el arreglo original, es por esto que si se quiere modificar un arreglo en un procedimiento funcion no hay necesidad de regresar ningun valor y por tanto no se ocupan funciones. Solo para los casos que se quiera regresar algun dato especial del arreglo, por ejemplo regresar el primer dato par, o la suma de todos los elementos del arrreglo o el promedio de todos sus elementos, etc etc etc, solo en casos como estos se mandara una arreglo a una funcion.
EJERCICIOS DE PROGRAMACION DE FUNCIONES 1.- Capturar 3 calificaciones y nombre en un procedimiento, calcular promedio en una funcion, desplegar en otro procedimiento, BUTTONCLICK SOLO ACTIVA EL PRIMER PROCEDIMIENTO 2.- Crear una tabla de multiplicar, captura y control de ciclo en el principal (BUTTONCLICK), operaciones en una funcion, despliegue en el principal. 3.- Inicializar 10 edades en el principal(buttonclick) mandar la lista a un procedimiento que la convierte a meses, desplegar en principal.
65
4.- Capturar un arreglo de 7 ciudades en un primer procedimiento, sortear en un segundo y desplegar en un tercero, la lista original y la lista ordenada.
IsDate( ). Esta funcin devuelve un valor lgico indicando si la expresin que pasamos como parmetro contiene una fecha o una cadena que pueda ser convertida a fecha. Ver el Cdigo Private Sub Button1_Click(ByVal sender As System.Object, System.EventArgs) Handles Button1.Click Dim Valor As Object Dim UnaFecha As Date Valor = Inputbox( Introduzca un valor) If IsDate(Valor) Then UnaFecha = Valor MsgBox("La fecha es: "& UnaFecha) Else MsgBox("El valor introducido no es una fecha") End If End Sub ByVal e As
66
pasamos como parmetro contiene un array. Ver el Cdigo . Private Sub Button1_Click(ByVal sender As System.Object, System.EventArgs) Handles Button1.Click Dim Colores() As String = {"Verde", "Azul", "Rojo"} Verificar(Colores) Verificar("prueba") End Sub Public Sub Verificar(ByVal ValorPasado As Object) ' comprobar si el parmetro contiene un array If IsArray(ValorPasado) Then MsgBox("El parmetro pasado es un array") Else MsgBox("El parmetro pasado no es un array") End If End Sub
ByVal
As
67
68
Un control, al igual que un formulario, dispone a su alrededor de un conjunto de guas de redimensin, de modo que si despus de situarlo en el formulario, queremos modificar su tamao, slo tenemos que hacer clic sobre alguna de estas guas, y arrastrar modificando las dimensiones del control. Adems de utilizando el ratn, podemos desplazar un control, manteniendo pulsada la tecla[CONTROL], y pulsando adems, algunas de las teclas de direccin.
69
El otro modo consiste en asignar en el formulario, a la propiedad SnapToGrid, el valor False; esto deshabilita el ajuste a la cuadrcula automtico de los controles, con lo que perdemos en precisin de ajuste, pero ganamos en libertad de ubicacin para el control. Si no queremos que la cuadrcula se visualice, asignaremos False a la propiedad DrawGrid del formulario. Los anteriores ajustes los podemos realizar tambin de modo genrico para todos los formularios. Seleccionaremos para ello, la opcin de men del IDE Herramientas + Opciones, y en la ventana Opciones, haremos clic sobre el elemento Diseador de Windows Forms. En el panel derecho de esta ventana, podremos configurar estas propiedades de modo general para todo el IDE. Ver Figura
70
En primer lugar, para seleccionarlos todos, debemos hacer clic sobre el formulario y arrastrar, de modo que el rectngulo de seleccin que aparece, abarque a los controles, que quedarn con sus correspondientes marcas de redimensin visibles, seal de que estn seleccionados. En este punto, podemos hacer clic en uno de los controles y desplazarlos todos conjuntamente por el formulario, o bien, hacer clic en una de las guas de redimensin y cambiar su tamao, lo que afectar a todos los controles seleccionados. Si necesitamos de alguna accin especial, utilizaremos las opciones del men Formato del IDE. Por ejemplo, podemos ejecutar la opcin Formato + Alinear + Lados izquierdos, de modo que todos los controles se alinearn por la izquierda, tomando como referencia el control que tiene las marcas de redimensin negras. Ver Figura
Despus ejecutaremos la opcin de men Formato + Igualar tamao + Ambos, que ajustar tanto el ancho como el alto de todos los controles seleccionados. Ver Figura
71
Igualando tamao de controles. Para evitar que, una vez completado el diseo y ajuste de todos lo controles, accidentalmente podamos modificar alguno, seleccionaremos la opcin de men Formato + Bloquear controles, que bloquear los controles seleccionados, impidiendo que puedan ser movidos o modificado su tamao. Para desbloquear los controles del formulario, debemos seleccionar al menos uno y volver a utilizar esta opcin de men, que desbloquear todos los controles. Una caracterstica interesante del bloqueo de controles, consiste en que una vez que tengamos bloqueados los controles del formulario, si aadimos un nuevo control, este no estar inicialmente bloqueado, lo que facilita su diseo. Una vez que hayamos finalizado de disear el ltimo control, lo seleccionaremos en el formulario y seleccionaremos la opcin de bloqueo de controles, de modo que ya estarn bloqueados todos de nuevo. El men Formato de VS.NET consta de un numeroso conjunto de opciones. Acabamos de ver una muestra de sus posibilidades, por lo que recomendamos al lector, que realice pruebas con el resto de opciones, para ver todas las posibilidades en cuanto a la disposicin de los controles dentro del formulario.
72 TextBox ListBox Cuadro de texto Lista de valores Lista de valores desplegable, y cuadro de texto Casilla de verificacin Botn autoexcluyente Caja de agrupacin de controles
GroupBox
5.3.-Control Label
El control Label o Etiqueta, muestra un texto informativo al usuario. Podemos utilizar este control como complemento a otro control, por ejemplo, situndolo junto a un TextBox, de modo que indiquemos al usuario el tipo de dato que esperamos que introduzca en la caja de texto. Se trata de un control esttico; esto quiere decir que el usuario no puede interaccionar con l, a diferencia, por ejemplo, de un control Button, sobre el que s podemos actuar pulsndolo; o de un TextBox, en el que podemos escribir texto. Una de sus propiedades es BorderStyle, que permite definir un borde o recuadro alrededor del control, o que dicho borde tenga un efecto 3D; por defecto se muestra sin borde. Veamos unos ejemplos en la Figura
Controles Label.
5.4.-Control TextBox
Un control TextBox muestra un recuadro en el que podemos introducir texto. Para poder escribir texto en un control de este tipo, debemos darle primeramente el foco, lo que detectaremos cuando el control muestre el cursor de escritura en su interior.
73
Entre las propiedades disponibles por este control, destacaremos las siguientes. Text. Cadena con el texto del control. Multiline. Permite establecer si podemos escribir una o varias lneas. Por defecto contiene False, por lo que slo podemos escribir el texto en una lnea. WordWrap. En controles multilnea, cuando su valor es True, al llegar al final del control cuando estamos escribiendo, realiza un desplazamiento automtico del cursor de escritura a la siguiente lnea de texto. Enabled. Contiene un valor lgico mediante el que indicamos si el control est o no habilitado para poder escribir texto sobre l. ReadOnly. Permite indicar si el contenido del control ser de slo lectura o bien, podremos editarlo. CharacterCasing. Esta propiedad, permite que el control convierta automticamente el texto a maysculas o minsculas segn lo estamos escribiendo. MaxLength. Valor numrico que establece el nmero mximo de caracteres que podremos escribir en el control. PasswordChar. Carcter de tipo mscara, que ser visualizado por cada carcter que escriba el usuario en el control. De esta forma, podemos dar a un cuadro de texto el estilo de un campo de introduccin de contrasea. AutoSize. Cuando esta propiedad tenga el valor True, al modificar el tamao del tipo de letra del control, dicho control se redimensionar automticamente, ajustando su tamao al del tipo de letra establecido. La Figura muestra un formulario con varios controles TextBox, a los cuales se han aplicado diferentes efectos mediante sus propiedades.
Al comenzar a ejecutar el programa, observaremos que el foco de entrada no est situado en el primer TextBox del formulario. Para asignar por cdigo el foco a un determinado control, disponemos del mtodo Focus( ). En este caso, al pulsar el
74
botn Foco nombre, desviamos el foco al primer TextBox del formulario. Ver Cdigo fuente Private Sub btnFoco_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFoco.Click Me.txtNombre.Focus() End Sub Observe el lector, que en el botn Foco nombre, que acabamos de mencionar, la letra F se encuentra subrayada, actuando de acelerador o hotkey. De este modo, no es necesario pulsar con el ratn sobre ese botn para ejecutarlo, basta con pulsar la tecla [CONTROL] junto a la letra subrayada para conseguir el mismo efecto. Para definir una tecla aceleradora en un control, debemos anteponer el carcter & a la letra que vamos a definir como acelerador, en este ejemplo se ha logrado con &Foco nombre. Por otro lado, mediante el botn btnSoloLectura conseguimos activar/desactivar la propiedad ReadOnly del TextBox txtNombre, cambiando el estado de dicha propiedad en cada pulsacin del botn. Ver Cdigo fuente Private Sub btnSoloLectura_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSoloLectura.Click If (Me.txtNombre.ReadOnly) Then Me.txtNombre.ReadOnly = False Else Me.txtNombre.ReadOnly = True End If End SubSin embargo, hay otro modo mucho ms eficiente de cambiar el estado de una propiedad que contiene un tipo Boolean: utilizando el operador Not. Con el botn btnActivar, cambiamos el valor de la propiedad Enabled del cuadro de texto que contiene los apellidos. Para ello, aplicamos el operador Not a dicha propiedad, y el resultado lo asignamos a esa misma propiedad. Ver Cdigo fuente Private Sub btnActivar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnActivar.Click ' utilizando operador Not simplificamos Me.txtApellidos.Enabled = Not (Me.txtApellidos.Enabled) End Sub Finalizando con este ejemplo, y aunque no tiene relacin directa con el control TextBox, el formulario se muestra con un tipo de borde especial que no permite su redimensin. La propiedad del formulario con la que podemos establecer el tipo de
75
borde es FormBorderStyle, y en este caso, su valor es Fixed3D. Alterando los valores de esta propiedad, conseguiremos distintos bordes y tipos de redimensin para el formulario.
El control de este formulario, que vamos a emplear para las operaciones de seleccin
76
es txtOrigen. En primer lugar, y aunque no se trata de una seleccin de texto, veremos su evento TextChanged, el cual se produce cada vez que cambia el contenido del cuadro de texto; lo usaremos por tanto, para contar lacantidad de caracteres escritos y mostrarlos en un Label. Ver Cdigo fuente ' al cambiar el texto del control se produce este evento Private Sub txtOrigen_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtOrigen.TextChanged ' calculamos la longitud del texto escrito Me.lblContador.Text = Me.txtOrigen.TextLength End Sub Los eventos MouseMove y KeyDown del TextBox, se producen respectivamente, cuando movemos el ratn sobre el control, o cada vez que pulsamos una tecla para escribir texto. Detectaremos en este caso, si existen teclas o botones especiales presionados, que nos indiquen que se est realizando unaseleccin de texto, y mostraremos en el formulario el texto seleccionado, el nmero de caracteres y la posicin del carcter de inicio de la seleccin. Veamos los procedimientos manipuladores de estos eventos en el Cdigo fuente ' al mover el ratn por el TextBox se produce este evento Private Sub txtOrigen_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles txtOrigen.MouseMove ' comprobamos si al mover el ratn est pulsado su botn izquierdo ' en caso afirmativo es que se est seleccionando texto, por lo que obtenemos la ' informacin de seleccin con las ' propiedades de seleccin del TextBox If e.Button.Left Then Me.lblTextoSelec.Text = Me.txtOrigen.SelectedText Me.lblLongitud.Text = Me.txtOrigen.SelectionLength Me.lblPosicion.Text = Me.txtOrigen.SelectionStart End If End Sub ' este evento se produce cuando se pulsa una tecla en el TextBox Private Sub txtOrigen_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtOrigen.KeyDown ' comprobamos las teclas pulsadas si est pulsada la tecla maysculas, ' y adems se est pulsando la tecla flecha derecha, quiere decir que se est ' seleccionando texto; obtener la informacin de las propiedades de ' seleccin del control TextBox If e.Shift Then If e.KeyCode.Right Then Me.lblTextoSelec.Text = Me.txtOrigen.SelectedText Me.lblLongitud.Text = Me.txtOrigen.SelectionLength Me.lblPosicion.Text = Me.txtOrigen.SelectionStart
77
End If End If End Sub Finalmente, tras introducir un valor en los controles txtPosicion y txtLongitud, pulsaremos el botn btnSeleccionar. Con ello conseguiremos realizar una seleccin de texto en el TextBox txtOrigen, y pasar el texto seleccionado al control txtDestino. El efecto ser el mismo que si lo hubiera realizado el usuario, pero en este caso sin su intervencin. Veamos en el Cdigo fuente, el evento Click del botn btnSeleccionar. ' al pulsar este botn, seleccionar por cdigo texto del control txtOrigen y ' pasarlo al control txtDestino Private Sub btnSeleccionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSeleccionar.Click Me.txtOrigen.SelectionStart = Me.txtPosicion.Text Me.txtOrigen.SelectionLength = Me.txtLongitud.Text Me.txtDestino.Text = Me.txtOrigen.SelectedText End Sub La Figura muestra este ejemplo en ejecucin.
5.5.-Control Button
Este control representa un botn de pulsacin, conocido en versiones anteriores de VB como CommandButton. Entre el nutrido conjunto de propiedades de este control, destacaremos las siguientes. Text. Cadena con el ttulo del botn. TextAlign. Alineacin o disposicin del ttulo dentro del rea del botn; por defecto aparece centrado. BackColor. Color de fondo para el botn. Cursor. Permite modificar el cursor del ratn que por defecto tiene el botn.
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
78
Image. Imagen que podemos mostrar en el botn como complemento a su ttulo, o bien, en el caso de que no asignemos un texto al botn, nos permitir describir su funcionalidad. ImageAlign. Al igual que para el texto, esta propiedad nos permite situar la imagen en una zona del botn distinta de la central, que es en la que se ubica por defecto. BackgroundImage. Imagen de fondo para el botn. FlatStyle. Tipo de resaltado para el botn. Por defecto, el botn aparece con un cierto relieve, que al ser pulsado, proporciona el efecto de hundirse y recuperar nuevamente su estado, pero podemos, mediante esta propiedad, hacer que el botn se muestre en modo plano, con un ligero remarcado al pulsarse, etc. Font. Cambia el tipo de letra y todas las caractersticas del tipo elegido, para el texto del botn. La Figura muestra un ejemplo de control Button, sobre el que se han modificado algunos valores por defecto de sus propiedades.
5.6.-Foco de entrada
Para que las pulsaciones de teclado puedan ser recibidas por un determinado control, dicho control debe tener lo que se denomina el foco de entrada. El modo de dar a un control el foco de entrada, consiste en hacer clic sobre l, o bien, pulsar la tecla [TAB], pasando el foco hasta el control deseado. Cuando un control recibe el foco, el sistema operativo lo remarca visualmente o en el caso de controles de escritura, muestra el cursor de escritura en su interior. Otra forma es realizar la codificacin del foco de entrada, de la siguiente manera Private Sub btnActivar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnActivar.Click ' utilizando la propiedad focus para el control textbox1
79
5.8.-Funcin InputBox:
La funcin InputBox presenta un mensaje al usuario, permitindole ingresar un valor en una caja de texto:
Como se dijo la funcin InputBox presenta un cuadro de dilogo donde el usuario puede ingresar un texto y luego aceptar o cancelar dicho cuadro de dilogo. Los parmetros principales de esta funcin son: InputBox (Promt,Title, Default) El parmetro Prompt especfica la leyenda que mostrar la caja de mensajes. El parmetro Title especifica el ttulo que llevar el cuadro de dilogo. El parmetro Default es el texto que mostrar la caja de texto. El aspecto ms importante de InputBox es que nos devuelve una cadena con lo que haya ingresado el usuario en la caja de texto. Luego podemos realizar una tarea especfica dependiendo del valor devuelto. Ejemplo: Dim retorno As String retorno = InputBox("Ingrese algo en la caja de texto", "Ejemplo") MsgBox "Usted ingres:" & retorno En el ejemplo anterior, en la variable Retorno se almacenar el valor que haya ingresado el usuario cuando haga Click en el botn de Aceptar.
80
Cuando el usuario presiona Candelar, el InputBox devuelve una cadena vaca. Esto es importante tenerlo en cuenta para realizar una o tal accin Si quiseramos por ejemplo desplegar un InputBox, y que este no se cierre hasta que el usuario si o si haya ingresado un valor, podemos hacerlo de la siguiente forma, utilizando una condicin en un bucle Do Loop Cdigo fuente en el formulario
Private Sub Form_Load() Dim Dato As String 'Hasta que no se ingrese un dato, el InputBox no se cerrar Do Dato = InputBox("Ingresar algun dato", " Ejemplo ") Loop Until Dato <> "" 'Muestra el valor MsgBox Dato, vbInformation End Sub
5.9.-Funcin MsgBox:
La funcin MsgBox, es muy fcil de usar y se utiliza para mostrar distintos tipos de mensajes. La sintaxis completa de la funcin MsgBox es: MsgBox(mensaje[, botones][, ttulo][, archivoAyuda, contexto]) Ejemplos de mensajes o cajas de texto con la funcin MsgBox que podemos mostrar:
Como se ve en los grficos anteriores, con MsgBox podemos tener variedad a la hora de mostrar un determinado mensaje, utilizando para ello las diferentes constantes que incorpora la funcin. Los parmetros ms importantes son: Title : Es la leyenda que aparecer en el ttulo del mensaje.
81
Texto : Es el Texto que mostrar el mensaje. Botones: En este parmetro se colocan las constantes que determinarn si la caja tiene uno o varios botones y el tipo de mensaje: informativo, de exclamacin de alerta etc... Cuando escribimos la coma dentro de la funcin en el parmetro botones, Visual Basic despliega una lista con las opciones o constantes que podemos utilizar. Ejemplo de msgbox un poco ms elaborado para entender un poco mejor esto; este ejemplo enva un mensaje de alerta con dos botones como opciones: En vez de utilizarse las palabras mensaje, estilo, etc se podran utilizar otras, pero siempre hay que respetar el orden Private Sub Command1_Click() Dim Mensaje, Estilo, Ttulo, Respuesta, MiCadena as String Mensaje = "Estas totalmente seguro de lo que vas a hacer?" ' cuerpo del mensaje. Estilo = vbYesNo + vbCritical ' Define el estilo, los botones, lo que est despus del mas es el circulo rojo ' con la cruz. Ttulo = "error grave (mentira)" ' es el ttulo. Respuesta = MsgBox(Mensaje, Estilo, Ttulo) 'el parntesis se pone tambin If Respuesta = vbYes Then ' El usuario eligi el botn S. MiCadena = "S" ' Ejecuta una accin. Else ' El usuario eligi el botn No. MiCadena = "No" ' Ejecuta una accin. Form1.Visible = False 'Aca puse una accin que usted ya conoce End If End Sub En estilo podran ir por ejemplo las siguientes opciones:
VbOKOnly: Slo muestra el botn Aceptar. VbOKCancel: Muestra los botones Aceptar y Cancelar. VbAbortRetryIgnore: Muestra los botones Anular, Reintentar e Ignorar. VbYesNoCancel: Muestra los botones S, No y Cancelar. VbYesNo: Muestra los botones S y No. VbRetryCancel: Muestra los botones Reintentar y Cancelar. VbCritical: Muestra el icono Mensaje crtico. VbQuestion: Muestra el icono Consulta de advertencia. VbExclamation: Muestra el icono Mensaje de advertencia. VbInformation: Muestra el icono Mensaje de informacin.
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
82
83
btnMensaje_Click( ), con el evento Click del objeto btnMensaje, perteneciente a la clase Button.
Resultado de la ejecucin del evento Click de un control Button, al ser pulsado. Como ya sabemos, el enlace procedimiento-evento de objeto mediante la palabra Handles, se producede modo esttico. Esto requiere que en el cdigo, el identificador que contenga el objeto del control, deba ser declarado con mbito a nivel de clase, y utilizando adems la palabra clave WithEvents. Dicha tarea es realizada automticamente por el diseador del formulario cuando genera el cdigo del mismo. Veamos en el Cdigo fuente , el fragmento de cdigo generado por el diseador que realiza esta labor. ' esta declaracin es situada a nivel del cdigo de la clase del formulario, es decir, ' fuera de cualquier mtodo Friend WithEvents btnMensaje As System.Windows.Forms.Button
84
Lista de clases del editor de cdigo. A continuacin, abriremos la otra lista desplegable del editor de cdigo: Nombre de mtodo, situada en la parte superior derecha del editor. En ella aparecern los nombres de todos los eventos de que dispone el control. Localizaremos el evento MouseEnter, y lo seleccionaremos. Ver Figura
De igual modo que sucedi con el evento Click en el apartado anterior, el editor de cdigo crear el procedimiento manipulador de evento vaco, para el evento que acabamos de seleccionar. Lo que vamos a hacer a continuacin, es escribir el cdigo que permita cambiar el color del botn cuando el ratn entre al mismo. Veamos el Cdigo fuente Private Sub btnMensaje_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnMensaje.MouseEnter Me.btnMensaje.BackColor = Color.Cyan End Sub Cuando al ejecutar, situemos el ratn en el botn, este cambiar su color, mostrando el aspecto de la Figura
85
Diseador del formulario mostrando el orden de tabulacin de controles. Si por el contrario, no queremos dar el foco a un control pulsando [TAB], debemos asignar a la propiedad TabStop de dicho control el valor False. Por
86
defecto, TabStop vale True, permitiendo de esta el paso de foco entre controles mediante la tecla [TAB].
5.13.-Control ListBox
Un control ListBox contiene una lista de valores, de los cuales, el usuario puede seleccionar uno o varios simultneamente. Entre las principales propiedades de este control, podemos resaltar las siguientes. Items. Contiene la lista de valores que visualiza el control. Se trata de un tipo ListBox.ObjectCollection, de manera que el contenido de la lista puede ser tanto tipos carcter, como numricos y objetos de distintas clases. Al seleccionar esta propiedad en la ventana de propiedades del control, y pulsar el botn que contiene, podemos introducir en una ventana elementos para el control. Ver Figura
El control quedara por lo tanto con valores asignados en la etapa de diseo, como muestra la Figura
ListBox en diseo con valores en su lista. Sorted. Cuando esta propiedad contiene el valor True, ordena el contenido de la lista. Cuando contiene False, los elementos que hubiera previamente ordenados, permanecen con dicho orden, mientras que los nuevos no sern ordenados.
87
IntegralHeight. Los valores de la lista son mostrados al completo cuando esta propiedad contiene True. Sin embargo, al asignar el valor False, segn el tamao del control, puede que el ltimo valor de la lista se visualiza slo en parte. La Figura 253 muestra un ListBox con esta propiedad a False.
MultiColumn. Visualiza el contenido de la lista en una o varias columnas en funcin de si asignamos False o True respectivamente a esta propiedad. SelectionMode. Establece el modo en el que vamos a poder seleccionar los elementos de la lista. Si esta propiedad contiene None, no se realizar seleccin; One, permite seleccionar los valores uno a uno; MultiSimple permite seleccionar mltiples valores de la lista pero debemos seleccionarlos independientemente; por ltimo, MultiExtended nos posibilita la seleccin mltiple, con la ventaja de que podemos hacer clic en un valor, y arrastrar, seleccionando en la misma operacin varios elementos de la lista. SelectedItem. Devuelve el elemento de la lista actualmente seleccionado. Selecteditems. Devuelve una coleccin ListBox.SelectedObjectCollection, que contiene los elementos de la lista que han sido seleccionados. SelectedIndex. Informa del elemento de la lista seleccionado, a travs del ndice de la coleccin que contiene los elementos del ListBox. PROPIEDAD ACCION O SIGNIFICADO Items.Add(dato): Inserta un elemento al final del listbox. Items.Clear(): Elimina todos los elementos de la lista. Items.Count(): Regresa la cantidad de elementos en lista. Items.Sorted = true; Ordena los elementos de la lista usada solo al tiempo de diseno. Items.Contains(dato): Regresa true o false, si el dato se encuentra o no se encuentra en la lista. Items.IndexOf(dato): Regresa el indice del objeto dentro del listbox.
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
88
Items.Insert(indice,dato): Inserta el dato en la posicion indicada. Items.Remove(dato): Elimina el dato de el listbox. Items.RemoveAt(indice): Elimina el dato que esta en la posicion indicada. Items[indice]: get or set el dato en la posicion indicada (ver primera nota abajo). Observacion: Como ya se indico anteriormente GET y SET son propiedades asociadas a todos los objetos o controles y sus propiedades en microsoft net, por ejemplo para un textbox, si en un programa se dice alfa = text5.text; se esta usando get, si se dice text5.text=500; se esta usando set. Otro ejemplo alfa = listbox2.Items(2); se esta usando (get) listbox2.Items(4 )= mama Para mostrar algunas de las funcionalidades de este control, utilizaremos el proyecto de ejemplo ListBoxPru. La Figura muestra esta aplicacin en ejecucin.
El ejemplo, como puede comprobar el lector, consiste en un formulario que contiene un ListBox principal, con el nombre lstValores, que dispone de una serie de valores asignados en tiempo de diseo. Cada vez que hacemos clic en alguno de los valores, se produce el evento SelectedIndexChanged, que utilizamos para mostrar en este caso, el nombre del elemento en el ttulo del formulario, como muestra el Cdigo fuente, de la clase frmListas, correspondiente al formulario. ' declaramos esta constante a nivel de clase, para poner como ttulo
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
89
' del formulario junto al elemento seleccionado de la lista Public Const TITULO As String = "Elemento seleccionado: " ' este evento se produce cada vez que se cambia el ndice seleccionado del ListBox Private Sub lstValores_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstValores.SelectedIndexChanged ' mostrar en el ttulo del formulario el valor actualmente seleccionado de la lista Me.Text = TITULO & Me.lstValores.SelectedItem End Sub A travs de los RadioButton, cambiamos el tipo de seleccin que podemos efectuar en el control lstValores. Ver Cdigo fuente Private Sub rbtUno_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtUno.CheckedChanged ' establecer tipo de seleccin en el ListBox a un elemento Me.lstValores.SelectionMode = SelectionMode.One End Sub Private Sub rbtMultiple_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtMultiple.CheckedChanged ' establecer tipo de seleccin en el ListBox a un mltiples elementos Me.lstValores.SelectionMode = SelectionMode.MultiSimple End Sub Private Sub rbtExtendida_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtExtendida.CheckedChanged ' establecer tipo de seleccin en el ListBox a mltiples ' elementos de modo extendido Me.lstValores.SelectionMode = SelectionMode.MultiExtended End Sub Mediante los controles chkOrdenar y chkColumnas, ordenaremos y mostraremos en columnas respectivamente el ListBox. Ver Cdigo fuente. Private Sub chkOrdenar_CheckedChanged(ByVal sender As System.Object, ByVal e As, System.EventArgs) Handles chkOrdenar.CheckedChanged ' segn el valor del CheckBox, ordenamos o quitamos ' la opcin de ordenar del ListBox Me.lstValores.Sorted = Me.chkOrdenar.Checked End Sub Private Sub chkColumnas_CheckedChanged(ByVal sender As System.Object, ByVal e
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
90
As System.EventArgs) Handles chkColumnas.CheckedChanged ' segn el valor del CheckBox, mostramos el ListBox ' en varias columnas o en una Me.lstValores.MultiColumn = Me.chkColumnas.Checked End Sub El TextBox de este formulario lo usaremos para aadir nuevos elementos al ListBox lstValores, y buscar tambin elementos existentes, pulsando los botones btnAgregar y btnBuscar en cada caso. Observemos el miembro NoMatches del ListBox, mediante el que averiguamos si la bsqueda tuvo xito. Ver el Cdigo fuente Private Sub btnAgregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAgregar.Click ' aadimos el contenido del TextBox como un elemento a la lista Me.lstValores.Items.Add(Me.txtValor.Text) End Sub Private Sub btnBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscar.Click Dim iPosicion As Integer ' el mtodo FindString() de la lista busca un valor iPosicion = Me.lstValores.FindString(Me.txtValor.Text) ' el campo NoMatches indica si no existe el valor buscado If iPosicion = Me.lstValores.NoMatches Then MessageBox.Show("No existe el valor") Else ' si encontramos el valor en la lista,lo seleccionamos por cdigo Me.lstValores.SelectedIndex = iPosicion End If End Sub La seleccin de los elementos de un ListBox no es competencia exclusiva del usuario. El programador puede tambin, si lo necesita, seleccionar valores de la lista mediante el cdigo del programa. Al pulsar el botn btnSelecCod, utilizaremos el mtodo SetSelected( ) del ListBox para realizar esta tarea. En este mtodo pasamos como parmetro el ndice de la lista con el que vamos a operar, y el valor True para seleccionarlo, o False para quitarle la seleccin. Ver el Cdigo fuente Private Sub btnSelecCod_Click(ByVal sender As System.Object, ByVal e As
91
System.EventArgs) Handles btnSelecCod.Click ' para seleccionar elementos de un ListBox por cdigo ' podemos utilizar el mtodo SetSelected() Me.rbtMultiple.Checked = True Me.lstValores.SetSelected(1, True) Me.lstValores.SetSelected(3, True) Me.lstValores.SetSelected(5, True) End Sub El botn btnTraspasarSelec lo usaremos para tomar los elementos seleccionados de lstValores, y pasarlos al otro ListBox del formulario. La propiedad SelectedItems del control lstValores, devuelve una coleccin con sus elementos seleccionados. Por otra parte, podemos eliminar los elementos de un ListBox llamando al mtodo Clear( ) de la coleccin de valores del control, cosa que hacemos pulsando el botn btnLimpiar. Ver Cdigo fuente Private Sub btnTrapasarSelec_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTrapasarSelec.Click Dim oSeleccion As ListBox.SelectedObjectCollection ' obtenemos con SelectedItems los elementos seleccionados de un ListBox oSeleccion = Me.lstValores.SelectedItems ' si existen elementos seleccionados, los traspasamos a otro ListBox del ' formulario If oSeleccion.Count > 0 Then Dim oEnumerador As IEnumerator oEnumerador = oSeleccion.GetEnumerator() While oEnumerador.MoveNext() Me.lstTraspaso.Items.Add(oEnumerador.Current) End While End If End Sub Private Sub btnLimpiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLimpiar.Click ' con el mtodo Clear() de la coleccin de elementos ' de un ListBox, borramos los elementos del controls Me.lstTraspaso.Items.Clear() End Sub Ejemplo programa
92
Private Sub Button1_Click(ByVal sender System.EventArgs) Handles Button1.Click LISTA.Items.Add(DATO.Text) DATO.Text = "" End Sub Private Sub Button2_Click(ByVal sender System.EventArgs) Handles Button2.Click Dim r, cant, meses As Integer cant = LISTA.Items.Count For r = 0 To cant - 1 meses = LISTA.Items(r) meses = meses * 12 LISTA.Items(r) = meses Next r End Sub
As
System.Object,
ByVal
As
As
System.Object,
ByVal
As
Recordar que el primer indice en un ListBox es el cero por eso el ciclo va desde el cero hasta la cantidad de elementos menos uno. Corrida:
Actividades de reforzamiento de lo aprendido EJERCICIOS PROGRAMACION DE LISTBOX 1.- Capturar en una lista los sueldos de 6 empleados y desplegarlos en una segunda lista aumentados en un 30%
93
2.- Capturar en una lista los pesos en kilogramos de 6 personas desplegarlos en una segunda lista convertidos a libras y ademas solo los mayores de 100 libras. 3.- Capturar en sus 4 listas respectivas matricula, nombre y dos calificaciones de 5 alumnos, despues calcular una lista de promedios de calificaciones. 4.- Capturar en sus listas respectivas numempleado, nomempleado, dias trabajados y sueldo diario de 5 empleados, desplegar en otra pantalla o panel la nomina pero solo de aquellos empleados que ganan mas de $300.00 a la semana.
5.14.-Control ComboBox
El ComboBox es un control basado en la combinacin (de ah su nombre) de dos controles que ya hemos tratado: TextBox y ListBox. Un control ComboBox dispone de una zona de edicin de texto y una lista de valores, que podemos desplegar desde el cuadro de edicin. El estilo de visualizacin por defecto de este control, muestra el cuadro de texto y la lista oculta, aunque mediante la propiedad DropDownStyle podemos cambiar dicho estilo. La Figura muestra un formulario con diversos ComboBox, cada uno con diferente estilo.
Controles ComboBox de distintos estilos. La propiedad DropDownStyle tambin influye en una diferencia importante de comportamiento entre el estilo DropDownList y los dems, dado que cuando creamos un ComboBox con el mencionado estilo, el cuadro de texto slo podr mostrar informacin, no permitiendo que esta sea modificada. En el caso de que la lista desplegable sea muy grande, mediante la propiedad MaxDropDownItems, asignaremos el nmero de elementos mximo que mostrar la lista del control. El resto de propiedades y mtodos son comunes con los controles TextBox y ListBox. En el Cdigo fuente se muestra el cdigo del botn btnAgregar, mediante el que llenamos de valores los controles de este ejemplo.
94
Private Sub btnAgregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAgregar.Click Me.cboColores.Items.AddRange(New String() {"AZUL", "VERDE", "AMARILLO", "ROJO", "BLANCO", "MARRN", "GRANATE"}) Me.cboNombres.Items.AddRange(New String() {"ELENA", "JOSE", "ANA", "ALFREDO", "LUIS", "ANGEL", "RAQUEL"}) Me.cboCiudades.Items.AddRange(New String() {"SEVILLA", "VALENCIA", "ALICANTE", "TOLEDO", "SEGOVIA"}) End Sub
5.15.-Control CheckBox
Este control muestra una casilla de verificacin, que podemos marcar para establecer un estado. Generalmente el estado de un CheckBox es marcado (verdadero) o desmarcado (falso), sin embargo, podemos configurar el control para que sea detectado un tercer estado, que se denomina indeterminado, en el cual, el control se muestra con la marca en la casilla pero en un color de tono gris. Las propiedades remarcables de este control son las siguientes. Checked. Valor lgico que devuelve True cuando la casilla est marcada, y False cuando est desmarcada. CheckState. Valor del tipo enumerado CheckState, que indica el estado del control. Checked, marcado; Unchecked, desmarcado; e Indeterminate, indeterminado. ThreeState. Por defecto, un control de este tipo slo tiene dos estados, pero asignando True a esta propiedad, conseguimos que sea un control de tres estados. CheckAlign. Permite establecer de modo visual la ubicacin de la casilla de verificacin dentro del rea del control. Como detalle destacable de las propiedades Checked y CheckState, si modificamos desde cdigo sus valores, conseguiremos alterar el estado de la casilla del control. El ejemplo CheckBoxPru, muestra un formulario con dos controles CheckBox. El control chkPonColor asigna un color de fondo al formulario o restablece el color original. Esto lo conseguimos codificando el evento CheckedChanged del control. Ver Cdigo fuente. ' Este evento se produce cuando se hace clic en el CheckBox y cambia el contenido ' de la casilla Private Sub chkPonColor_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkPonColor.CheckedChanged If Me.chkPonColor.CheckState = CheckState.Checked Then
95
Me.BackColor = Color.LightBlue Else Me.ResetBackColor() End If End Sub Por su parte, el control chkMostrar, definido con tres estados, muestra, al estar marcado, una cadena en un control Label; elimina la cadena al desmarcarlo; y muestra la mitad al entrar en el estado indeterminado. El evento CheckStateChanged es el que debemos de utilizar para detectar el estado del CheckBox en cada ocasin. Para mantener el valor de la cadena a mostrar, utilizamos una variable a nivel de la clase que inicializamos en el constructor del formulario. Ver Cdigo fuente Public Class Form1 Inherits System.Windows.Forms.Form Private sCadenaOriginal As String Public Sub New() '.... ' inicializar la variable que contiene la cadena ' a mostrar en el label y asignarla sCadenaOriginal = "Estamos visualizando una cadena" Me.lblMuestra.Text = sCadenaOriginal End Sub '.... ' este evento se produce cuando cambia el estado de la casilla Private Sub chkMostrar_CheckStateChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkMostrar.CheckStateChanged Select Case Me.chkMostrar.CheckState Case CheckState.Checked Me.lblMuestra.Text = sCadenaOriginal Case CheckState.Unchecked Me.lblMuestra.Text = "" Case CheckState.Indeterminate Me.lblMuestra.Text = sCadenaOriginal.Substring(0,(sCadenaOriginal.Length / 2)) End Select End Sub La Figura muestra este ejemplo en ejecucin.
96
Al ejecutar el proyecto, sin embargo, no podemos conseguir establecer simultneamente un tipo de letra y color, puesto que al pulsar cualquiera de los botones de radio, se quita el que hubiera seleccionado previamente. Para solucionar este problema, disponemos del control GroupBox, que nos permite, como indica su nombre, agrupar controles en su interior, tanto RadioButton como de otro tipo, ya que se trata de un control contenedor. Una vez dibujado un GroupBox sobre un formulario, podemos arrastrar y soltar sobre l, controles ya existentes en el formulario, o crear nuevos controles dentro de dicho control. De esta forma, podremos ya, en este ejemplo, seleccionar ms de un RadioButton del formulario, como vemos en la Figura .
97
Seleccin de varios RadioButton en un formulario. El evento CheckedChanged, al igual que ocurra con los controles CheckBox, ser el que tendremos que escribir para ejecutar el cdigo en respuesta a la pulsacin sobre un control RadioButton. El Cdigo fuente muestra los eventos correspondientes a los controles de radio de este ejemplo. Para cambiar el tipo de fuente, instanciamos un objeto Font y lo asignamos a la propiedad Font del TextBox; mientras que para cambiar el color, utilizamos la estructura Color y la propiedad BackColor, tambin del TextBox. Private Sub rbtTahoma_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtTahoma.CheckedChanged Me.txtNombre.Font = New Font("Tahoma", 12) End Sub Private Sub rbtGaramond_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtGaramond.CheckedChanged Me.txtNombre.Font = New Font("Garamond", 8) End Sub Private Sub rbtComic_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtComic.CheckedChanged Me.txtNombre.Font = New Font("Comic Sans MS", 15) End Sub Private Sub rbtVerde_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtVerde.CheckedChanged Me.txtNombre.BackColor = Color.Green End Sub Private Sub rbtAzul_CheckedChanged(ByVal sender As System.Object, ByVal e As
98
System.EventArgs) Handles rbtAzul.CheckedChanged Me.txtNombre.BackColor = Color.Blue End Sub Private Sub rbtAmarillo_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtAmarillo.CheckedChanged Me.txtNombre.BackColor = Color.Yellow End Sub
99
La creacin de las diferentes opciones que compondrn el men es un proceso que se ha mejorado y simplificado al mximo respecto a versiones anteriores de VB. El proceso de edicin del men se realiza directamente en el formulario, en el mismo lugar en el que el men aparecer en tiempo de ejecucin. Al hacer clic en la primera opcin del men, podemos dar nombre y propiedades a esa opcin. Al mismo tiempo, de un modo muy intuitivo, veremos las prximas opciones disponibles, tanto las desplegables a partir de dicho men, como las de la barra principal. Slo hemos de movernos en la direccin que necesitemos y dar nombre a las opciones, y valores a sus propiedades. Ver Figura
Creacin de las opciones de un men principal de formulario. Cada una de las opciones que componen el men es a su vez un control MenuItem. Si durante su creacin slo proporcionamos el nombre, el IDE va asignando a dicho control valores por defecto en sus propiedades. Para modificar las propiedades de una opcin de men, slo hemos de seleccionarlo en la estructura de men que estamos creando en el diseador del formulario, y pasar a la ventana de propiedades. Entre las propiedades disponibles para un MenuItem, podemos destacar las siguientes. Text. Contiene una cadena con el literal o texto descriptivo de la opcin de men. Enabled. Permite habilitar/deshabilitar la opcin de men. Cuando se encuentra deshabilitada, se muestra su nombre en un tono gris, indicando que no puede ser seleccionada por el usuario. DefaultItem. Permite establecer opciones por defecto. En una opcin de men por defecto, su texto se resalta en negrita. Checked. Marca/desmarca la opcin. Cuando una opcin est marcada, muestra junto a su nombre un pequeo smbolo de verificacin o punteo. RadioCheck. En el caso de que la opcin de men se encuentre marcada, si asignamos True a esta propiedad, en lugar de mostrar el smbolo de verificacin estndar, se muestra uno con forma de punto.
100
ShortCut. Se trata de un atajo de teclado, o combinacin de teclas que nos van a permitir ejecutar la opcin de men sin tener que desplegarlo. Al elegir esta propiedad, aparecer una lista con todos los atajos disponibles para asignar. ShowShortCut. Permite mostrar u ocultar la combinacin de teclas del atajo de teclado que tenga asignado una opcin de men. Visible. Muestra u oculta la opcin de men. MdiList. Esta propiedad se utiliza habitualmente en opciones situadas en la barra de men, y permite establecer que dicha opcin al desplegarse, muestre, adems de las opciones de men que le hayamos asignado, la lista de ventanas secundarias MDI, en el caso de que el men principal est contenido en un formulario de tipo MDI. Los formularios MDI sern tratados posteriormente. Podemos adicionalmente, asignar una tecla de acceso rpido o hotkey a una opcin de men, anteponiendo el carcter & a la letra que deseemos, de las que se encuentran en la propiedad Text del control MenuItem. Al igual que sucede con los dems tipos de controles, en el texto de la opcin de men, aparecer subrayada la mencionada letra. De este modo, cuando despleguemos un men, no ser necesario posicionarnos en una de ellas para ejecutarla, sino que simplemente pulsando la tecla rpida, se ejecutar el cdigo de dicha opcin. Tambin podemos establecer separadores entre las opciones de men simplemente creando una opcin y asignando a su propiedad Text el carcter de guin ( - ). En nuestro formulario de ejemplo, vamos pues a disear un men con la estructura del esquema mostrado en la Figura Para todas las opciones se ha asignado una tecla de acceso rpido, y adicionalmente, para las opciones que se indican a continuacin, se han modificado algunas propiedades por defecto. Guardar. Deshabilitada. Salir. Atajo de teclado en Ctrl. + S. Copiar. Opcin por defecto. Pegar. Marcada con smbolo normal. Cortar. Marcada con smbolo de crculo. Elipse. Opcin no visible.
101
La Figura muestra el formulario en ejecucin con una parte del men abierta.
Una vez finalizada la fase de diseo del men, debemos proceder a escribir el cdigo para sus opciones. El evento Click es el que permite a un control MenuItem ejecutar cdigo cuando la opcin de men es seleccionada. Abriendo por tanto, el men desde el diseador del formulario, y haciendo doble clic en la opcin correspondiente, nos situaremos en el editor de cdigo, dentro del procedimiento manipulador del evento Click para esa opcin. El Cdigo fuente muestra el cdigo que se ejecutar cuando seleccionemos las opciones de men Abrir y Salir de nuestro ejemplo. Private Sub mnuAbrir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuAbrir.Click MessageBox.Show("Opcin Abrir del men") End Sub Private Sub mnuSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuSalir.Click Me.Close() End Sub
102
Puesto que muchas de las propiedades de un control MenuItem son manipulables en tiempo de ejecucin, aadiremos al formulario varios botones, mediante los cuales realizaremos operaciones sobre las opciones del men tales como habilitar y deshabilitar, mostrar y ocultar, cambiar el nombre, etc. La Figura muestra el formulario con estos nuevos botones.
Controles Button para manipular por cdigo las propiedades de las opciones del men. En el Cdigo fuente podemos ver los manipuladores de evento de estos botones. Private Sub btnHabilitar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHabilitar.Click Me.mnuGuardar.Enabled = Not Me.mnuGuardar.Enabled End Sub Private Sub btnMarcar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMarcar.Click Me.mnuPegar.Checked = Not Me.mnuPegar.Checked End Sub Private Sub btnMostrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMostrar.Click Me.mnuElipse.Visible = Not Me.mnuElipse.Visible End Sub Private Sub btnNombre_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNombre.Click If Me.mnuAbrir.Text = "A&brir" Then Me.mnuAbrir.Text = "HO&LA" Else Me.mnuAbrir.Text = "A&brir" End If End Sub
103
Private Sub btnDefecto_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDefecto.Click Me.mnuCopiar.DefaultItem = Not Me.mnuCopiar.DefaultItem End Sub
Como resultado, cuando ejecutemos la aplicacin, al hacer clic derecho sobre el TextBox, aparecer el men contextual que hemos asignado, mediante el que cambiaremos el tipo de fuente de la caja de texto, transformaremos el texto a maysculas y minsculas. El Cdigo fuente muestra el cdigo de los eventos Click correspondiente a las opciones del men contextual. Private Sub mnuFuente_Click(ByVal sender As System.Object, ByVal e As
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
104
System.EventArgs) Handles mnuFuente.Click Dim oFuente As New Font("Comic", 15) Me.txtValor.Font = oFuente End Sub Private Sub mnuMayusculas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuMayusculas.Click Me.txtValor.Text = Me.txtValor.Text.ToUpper() End Sub Private Sub mnuMinusculas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuMinusculas.Click Me.txtValor.Text = Me.txtValor.Text.ToLower() End Sub La Figura muestra el aspecto del men contextual, cuando es utilizado desde el control TextBox.
105
por cdigo, sin necesidad de utilizar el control Timer. En el ejemplo TimerPru que comentamos a continuacin, vamos a construir un formulario en el que utilizaremos ambos tipos de temporizadores, el propio control Timer y un objeto de la clase. El primer proceso a codificar, consistir en traspasar a intervalos de tiempo, el contenido de un TextBox del formulario, a otro control de este mismo tipo. El formulario del proyecto se muestra en la Figura
Tras incluir los controles de usuario en el formulario, aadiremos un control Timer, al que daremos el nombre tmrTemporizador. Esta accin abrir, bajo el diseador del formulario, un panel para controles especiales, como es el caso de Timer, en el que se mostrar dicho control. En este panel se depositan los controles del formulario que no tienen una interaccin directa con el usuario, o cuyo diseo es diferente al de los controles habituales. Para especificar el espacio de tiempo en el que este control ser ejecutado cuando lo activemos, utilizaremos la propiedad Interval, a la que tenemos que asignar un valor numrico, que establece dicho tiempo en milisegundos. En nuestro caso, asignaremos 500, con lo que el control se ejecutar cada medio segundo.
106
El control Timer lo activaremos llamando a su mtodo Start( ), cosa que hacemos al pulsar el botn btnTraspasar. Private Sub btnTraspasar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTraspasar.Click ' iniciar el temporizador Me.tmrTemporizador.Start() End Sub Una vez activado un temporizador, cada vez que transcurre el tiempo indicado en Interval, genera un evento Tick. Es precisamente en este evento en el que debemos escribir el cdigo que necesitamos que se ejecute a intervalos regulares de tiempo. Haremos, por consiguiente, doble clic en el control Timer del diseador, para acceder al procedimiento manipulador de este evento, cuyo contenido lo podemos ver ' Este evento se produce en el intervalo especificado en el control Timer Private Sub tmrTemporizador_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmrTemporizador.Tick ' quitamos una letra del TextBox de origen... Dim sLetra As String sLetra = Me.txtOrigen.Text.Substring(0, 1) Me.txtOrigen.Text = Me.txtOrigen.Text.Remove(0, 1) ' ...y lo pasamos al TextBox de destino Me.txtDestino.Text &= sLetra ' cuando se haya traspaso todo el texto detener el temporizador If Me.txtOrigen.Text.Length = 0 Then Me.tmrTemporizador.Stop() MessageBox.Show("Traspaso finalizado") End If End Sub
Control ImageList
Este control acta como repositorio de imgenes, del que se alimentarn otros controles del formulario que necesiten mostrar grficos en su interior. Una vez aadido este control en el formulario, se situar en el panel de controles especiales del diseador, y haciendo clic en su propiedad Images, se abrir la ventana de la Figura, en la que podremos aadir y quitar las imgenes que van a formar parte de la lista del control, as como ver en el panel complementario, la informacin sobre cada imagen asignada.
107
Ventana de administracin de imgenes del control ImageList. Las imgenes que insertamos en el control tienen un tamao por defecto, en el caso de que necesitemos modificarlo, expandiremos la propiedad ImageSize en la ventana de propiedades y asignaremos nuevos valores en Width y Height. Otra ventaja de este control es que nos permite manipular las imgenes por cdigo, por ejemplo, para aadir nuevas imgenes, debemos usar el mtodo Add( ) de su propiedad Images, como muestra el Cdigo fuente Me.imlImagenes.Images.Add(New Bitmap("tutorias.gif"))
Control ToolBar
Este control representa la barra de herramientas o botones de acceso rpido que facilitan al usuario la ejecucin de los procesos principales del programa, evitndole la navegacin por el men del formulario. Al ser dibujado, este control queda acoplado a la parte superior del formulario. Despus de ponerle tbrBarra como nombre, asignaremos a su propiedad ImageList, el control de ese mismo tipo que acabamos de crear; esto nos permitir asignar los grficos de la lista a los botones que vayamos creando en el ToolBar. Para establecer el tamao de los botones de la barra utilizaremos la propiedad ButtonSize de este control. Seguidamente haremos clic en la propiedad Buttons, que abrir una ventana con la coleccin de botones de la barra, en la que podremos crear y configurar dichos botones.
108
Editor de botones del control ToolBar. Cada botn en un ToolBar es un objeto de tipo ToolBarButton, del que podemos destacar las siguientes propiedades. Text. Cadena con el texto que muestra el botn. ImageIndex. En el caso de asociar el ToolBar con un control ImageList, en esta propiedad asignamos para un botn una de las imgenes del ImageList, indicando el nmero de orden de la imagen. Style. Permite establecer el estilo del botn: de pulsacin; separador; o de tipo desplegable, que abre un subconjunto de opciones. DropDownMenu. Si asociamos el botn con una opcin de la barra de men del formulario, y configuramos su estilo como DropDownButton, al pulsar el botn desplegable, se mostrarn las opciones de men; el efecto ser el mismo que si hubiramos desplegado directamente el men del formulario. La Figura muestra la ventana principal de la aplicacin con la barra de herramientas
109
Formulario con ToolBar. Una vez terminado el diseo del ToolBar, debemos codificar su evento ButtonClick, que ser provocado cada vez que se pulse un botn de la barra. Dentro del procedimiento de este evento, comprobaremos qu botn ha sido pulsado y ejecutaremos las acciones oportunas. Tanto el botn Abrir como la opcin de men del mismo nombre realizan la misma tarea, por lo que llaman al mtodo AbrirArchivo( ), que es quien realmente muestra el formulario necesario. Private Sub tbrBarra_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles tbrBarra.ButtonClick ' comprobar qu botn de la barra se ha pulsado If e.Button Is Me.btnAbrir Then ' llamamos al mtodo que abre el formulario para abrir un archivo Me.AbrirArchivo() End If If e.Button Is Me.btnSalir Then ' cerrar la aplicacin Me.Close() End If End Sub Private Sub mnuAbrir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuAbrir.Click ' al seleccionar esta opcin de men llamar al mtodo que ' abre el formulario que permite abrir un archivo Me.AbrirArchivo() End Sub Private Sub AbrirArchivo() Dim ofrmAbrirArchivo As New frmAbrirArchivo() ofrmAbrirArchivo.MdiParent = Me ofrmAbrirArchivo.Show() End Sub Al haber asignado al botn btnPersonal uno de los mens de la barra del formulario, no ser necesario escribir cdigo para detectar este botn en el evento ButtonClick, ya que se ejecutar directamente el cdigo del evento Click de las opciones de men. El Cdigo fuente 523 muestra el cdigo perteneciente a la opcin de men Personal + Datos.
110
Private Sub mnuDatos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuDatos.Click Dim ofrmPersonal As New frmDatosPersonal() ofrmPersonal.MdiParent = Me ofrmPersonal.Show() End Sub
Control StatusBar
Para mostrar una barra informativa de estado recurriremos a este control, que al dibujarse queda situado en la parte inferior del formulario; como nombre le daremos sbrEstado. De forma similar al ToolBar, un control StatusBar est compuesto de una coleccin de objetos Panel, que iremos aadiendo al control mediante la propiedad Panels, la cual mostrar una ventana para la creacin y configuracin de tales paneles.
Editor de paneles del control StatusBar. Entre las propiedades destacables de un objeto Panel podemos mencionar las siguientes. BorderStyle. Muestra el panel con efecto resaltado, hundido o normal. Icon. Permite asociar un icono al panel. AutoSize. Con esta propiedad podemos conseguir que el panel se redimensione ajustndose a su contenido o que tenga un tamao fijo. En este ejemplo, hemos aadido dos paneles a la barra de estado del formulario. En uno mostramos un texto fijo; mientras que en el otro, visualizamos la hora actual a travs de un objeto Timer que ponemos en marcha en el evento Load del formulario. Veamos los mtodos implicados, en el Cdigo fuente 524.
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
111
Private Sub frmPrincipal_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load ' al cargar el formulario, creamos un temporizador ' le asociamos un manejador para su evento Tick y lo iniciamos Dim oTiempo As New Timer() oTiempo.Interval = 1000 AddHandler oTiempo.Tick, AddressOf PonerHoraActual oTiempo.Start() End Sub Private Sub PonerHoraActual(ByVal sender As Object, ByVal e As EventArgs) ' actualizamos a cada segundo la hora de un panel de la barra de estado Me.sbrEstado.Panels(1).Text = DateTime.Now.ToString("HH:mm:ss") End Sub La Figura muestra el formulario con la barra de estado.
Formulario con StatusBar. Finalizada la creacin del StatusBar, aadiremos al proyecto un formulario con el nombre frmDatosPersonal, en el dibujaremos un conjunto de nuevos controles que iremos describiendo seguidamente.
Control DateTimePicker
Este control permite la seleccin e introduccin de fechas en una caja de texto con capacidades extendidas, o bien mediante un calendario desplegable que se mostrar al pulsar el botn de expansin que contiene. Ver Figura
112
Control DateTimePicker. Para modificar la fecha en el cuadro de texto, debemos situarnos en la parte a modificar de la fecha y teclear el nuevo valor, o bien, con las flechas de direccin arriba-abajo, cambiar esa parte de la fecha. Si expandimos el calendario, podremos realizar la seleccin de un modo ms grfico. Por defecto el control muestra la fecha actual, pero con la propiedad Text podemos cambiar la fecha por cdigo, cosa que hacemos al cargar el formulario, asignando una fecha distinta de la actual. Ver Cdigo. Private Sub frmDatosPersonal_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load ' modificar fecha del DateTimePicker Me.dtpFNacim.Text = "15/06/2002" '.... End Sub Podemos restringir el rango de fechas a mostrar por este control con las propiedades MinDate y MaxDate. Si queremos, por otra parte, que la fecha se muestre con un formato personalizado, aplicaremos dicho formato mediante la propiedad CustomFormat, teniendo en cuenta que no se har efectivo hasta que a la propiedad Format no le asignemos el valor Custom. El botn btnCambiosFecha del formulario realiza algunas modificaciones por cdigo sobre el control DateTimePicker dtpFNacim del formulario, que vemos en el Cdigo Private Sub btnCambiosFecha_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCambiosFecha.Click ' configurar por cdigo el control DateTimePicker Me.dtpFNacim.MinDate = "1/4/2002" Me.dtpFNacim.MaxDate = "1/10/2002" Me.dtpFNacim.CustomFormat = "d-MMM-yy" Me.dtpFNacim.Format = DateTimePickerFormat.Custom
113
End Sub
Control NumericUpDown
Control que muestra una caja de texto con un valor numrico que podremos ir aumentando- disminuyendo al pulsar los botones para esta labor de que dispone el control. La Figura muestra este control en nuestro formulario de pruebas.
Control NumericUpDown. Entre las propiedades de este control destacaremos las siguientes. Increment. Nmero en el que se incrementar el valor del control cuando pulsemos sus botones o teclas de direccin. InterceptArrowKeys. Permite que las flechas de direccin arriba-abajo tengan el mismo efecto que si pulsamos los botones para incrementar o disminuir, de este control. Maximum, Minimun. Contienen los lmites superior e inferior en cuanto al nmero que podr contener el control. TextAlign. Permite alinear el nmero dentro la caja de texto del control. UpDownAlign. Permite situar los botones del control a la izquierda o derecha de la caja de texto que contiene el valor. Entre los eventos de que dispone este control, ValueChanged se produce cada vez que cambia el valor del control, de modo que en este caso, vamos a cambiar el color de fondo en funcin del nmero que contenga. Private Sub nupEdad_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles nupEdad.ValueChanged Select Case Me.nupEdad.Value Case 20 To 30 Me.nupEdad.BackColor = Color.Gold Case 30 To 40 Me.nupEdad.BackColor = Color.LimeGreen Case Else Me.nupEdad.BackColor = Me.nupEdad.DefaultBackColor End Select End Sub
114
Control DomainUpDown
Este control nos permite desplazarnos por una lista de valores, al mismo estilo que el control anterior. Dicha lista de valores la crearemos mediante la propiedad Items, en tiempo de diseo o ejecucin. El Cdigo muestra como al cargar el formulario frmDatosPersonal, con la propiedad Items y su mtodo AddRange( ), aadimos los valores que seleccionaremos en el control en tiempo de ejecucin. Private Sub frmDatosPersonal_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load '.... ' crear la lista del DomainUpDown Me.dudCategoria.Items.AddRange(New String() {"Auxiliar", "Jefe departamento","Coordinador"}) End Sub La Figura muestra el control dudCategora, de este tipo al ser utilizado en el formulario. En el caso de que necesitemos los valores ordenados, asignaremos True a su propiedad Sorted.
Control DomainUpDown.
Control MonthCalendar
Este control muestra en modo grfico un calendario por el que podemos desplazarnos para seleccionar una fecha. El control DateTimePicker utiliza internamente un MonthCalendar para mostrar su calendario desplegable. Por defecto se visualiza un mes, pero si asignamos a su propiedad CalendarDimensions un objeto Size, podemos expandir el tamao del calendario para que muestre varios meses. El Cdigo muestra el cdigo de un botn del formulario mediante el que cambiamos el tamao del calendario. Private Sub btnTamCalendario_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTamCalendario.Click Me.mclCalendario.CalendarDimensions = New Size(2, 2) End Sub En la Figura vemos el resultado de expandir el tamao del control.
115
Control MonthCalendar con el tamao ampliado. Para detectar la seleccin de una fecha utilizaremos el evento DateChanged. Debido a que en un control MonthCalendar podemos seleccionar un rango de fechas, las propiedades que tenemos que manipular para averiguar la fechas seleccionadas son: SelectionStart, SelectionEnd y SelectionRange, aunque en muchas ocasiones slo ser necesario utilizar una de ellas. Private Sub mclCalendario_DateChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DateRangeEventArgs) Handles mclCalendario.DateChanged ' mostrar en un Label la fecha seleccionada en el control MonthCalendar Me.lblCalendario.Text = Me.mclCalendario.SelectionStart End Sub
Control LinkLabel
Este control permite tener en un formulario Windows un enlace hacia una pgina de Internet, con un comportamiento similar al que encontramos en un hiperenlace de una pgina web. Su propiedad Text muestra un literal, de modo que al hacer clic sobre el mismo, se provocar el evento LinkClicked en el que escribiremos el cdigo a ejecutar. En nuestro formulario de ejemplo, hemos creado un control de este tipo con el nombre lnkEidos, que tiene el aspecto de la Figura 322, ya que adems del enlace, le hemos asignado una imagen.
Control LinkLabel.
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
116
Para conseguir que al hacer clic en este enlace, se abra Internet Explorer y navegue hacia una determinada pgina, vamos a utilizar la clase Process, que como su nombre indica, nos permite la gestin de procesos del sistema, tales como su inicio y finalizacin. En este caso, el mtodo compartido Start( ), de Process, va a ejecutar el navegador al pasarle como parmetro una direccin web en forma de cadena. Veamos el Cdigo Private Sub lnkEidos_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles lnkEidos.LinkClicked ' inicia Internet Explorer y navega hacia una pgina Process.Start("http://www.eidos.es") End Sub
117
Private Sub tbrBarra_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles tbrBarra.ButtonClick '.... If e.Button.Text = "TUTORIAS" Then MessageBox.Show("Se ha pulsado el botn de tutoras") End If End Sub La Figura muestra este formulario en ejecucin tras aadir los nuevos elementos.
Control NotifyIcon
Este control permite aadir un icono asociado con nuestra aplicacin en el panel de iconos del sistema (Windows System Tray) situado en la parte derecha de la barra de tareas de Windows. Tales iconos suelen utilizarse por aplicaciones que permanecen ocultas, y al hacer clic derecho sobre su icono en este panel, aparece un men contextual que permite mostrar la aplicacin. En nuestro caso vamos a utilizar este control para ejecutar y parar la calculadora del sistema empleando la clase Process, comentada en un apartado anterior. Despus de agregar un control de este tipo al formulario, asignaremos un icono a su propiedad Icon y una cadena a su propiedad Text, que ser mostrada al situar el ratn encima de este control en tiempo de ejecucin. Crearemos despus un men contextual con las opciones Abrir y Cerrar, que asignaremos a la propiedad ContextMenu del control NotifyIcon. Para poder controlar la calculadora de Windows cuando est en ejecucin, declararemos una variable de tipo Process a nivel de la clase. Al ejecutar la calculadora mediante el mtodo Start( ) de la clase Process, obtendremos un objeto de dicho tipo, que pasaremos a esta variable, y nos permitir posteriormente,
118
cerrar el proceso en el que se est ejecutando la calculadora mediante el mtodo Kill( ). Veamos esta parte en el Cdigo Public Class frmPrincipal Inherits System.Windows.Forms.Form Private oCalculadora As Process '.... Private Sub mnuCalcAbrir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuCalcAbrir.Click ' iniciar la calculadora oCalculadora = Process.Start("calc.exe") End Sub Private Sub mnuCalcCerrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuCalcCerrar.Click ' cerrar la calculadora oCalculadora.Kill() End Sub End Class Al ejecutar el programa, se mostrar un nuevo icono en la lista del panel de iconos del sistema de la barra de tareas, como muestra la Figura 324.
Control NotifyIcon en el panel de iconos del sistema de la barra de tareas. Como se puede comprobar, la clase Process ampla enormemente nuestra capacidad de manipulacin de los procesos del sistema.
119
120
define un objeto tiene sus propias propiedades, mtodos y eventos (a veces llamados miembros) que se pasan a todas las instancias de esa clase. Por ejemplo, una clase que representa una cuenta bancaria podra tener propiedades como: NumeroCuenta BalanceCuenta CtaBancaria Mtodos como: CalculaInteres () Eventos : CambioBalance.
NumeroCuenta BalanceCuenta CambioBalance
CalculaInteres()
Hacer click
Una vez creada la instancia de un objeto de cuenta bancaria, puede tener acceso a sus propiedades, mtodos y eventos de igual manera que si se tratara de un objeto TextBox. Algunos miembros de una clase son privados; slo se tiene acceso a ellos mediante cdigo dentro de la clase. Por ejemplo, una clase de cuenta bancaria puede tener un mtodo para calcular un saldo. Lo lgico es permitir que un programa lea ese balance pero no que pueda cambiarlo directamente. Puede ocultar los miembros de una clase si los declara como Private o exponerlos si los declara como Public. Tambin puede permitir el acceso a una propiedad y a la vez impedir que el programa cambie su valor declarndolo como ReadOnly. El cdigo siguiente muestra cmo podra ser una clase CuentaBanco, por ejemplo:
'Declaramos la clase CuentaLimpia Class CuentaLimpia 'La hacemos privada Private NumeroCuenta As String Private BalanceCuenta As Decimal 'Y la ponemos publica para que calcule el balance Public Sub ActualizaBalance() End Sub ReadOnly Property Balance() As Decimal Get Return BalanceCuenta End Get End Property End Class
121
Crear clases
Al hacer doble clic en un formulario y abrir el Editor de cdigo se ve algo parecido a lo siguiente:
Public Class Form1 Private Sub Form1_Load... End Sub End Class
Podemos observar que el formulario realmente es una clase, marcada por instrucciones Class y End Class y cualquier cdigo que se haya escrito entre las dos instrucciones es parte de la clase. Aunque de manera predeterminada un mdulo de formulario contiene slo una clase nica, puede crear mdulos adicionales agregando cdigo debajo de la instruccin End Class, tal como se ilustra a continuacin:
Public Class Form1 ' El cdigo de vuestro Form AQUI End Class Public Class MyFirstClass ' El cdigo de vuestra clase AQUI End Class
La desventaja de crear clases de esta manera es que slo estn disponibles dentro del proyecto donde se crearon. Si deseamos compartir una clase con otros proyectos, puede colocarla en un mdulo de clase.
122
Mdulos de clase
Un mdulo de clase es un archivo de cdigo, separado del resto, que contiene una o ms clases. Como es un archivo independiente, se puede reutilizar en otros proyectos. Los mdulos de clase se pueden crear de dos maneras: Como un mdulo agregado a un proyecto de aplicacin para Windows. Como un proyecto de bibliotecas de clase independient Puede agregar un nuevo mdulo de clase a un proyecto existente seleccionando Clase en el cuadro de dilogo Agregar nuevo elemento, disponible en el men Proyecto. Para trabajar en durante el tutorial, crearemos un proyecto de bibliotecas de clases independientes. Vamos a ver cmo crear un proyecto de de biblioteca de clases: En el men Archivo, seleccionamos Nuevo proyecto. En el panel Plantillas, del cuadro de dilogo Nuevo proyecto, hacemos clic en Biblioteca de clases.
Se abrir un nuevo proyecto de bibliotecas de clase y el Editor de cdigo mostrar el mdulo de clase Class1.vb.
123
En el Explorador de soluciones, hacemos clic con el botn secundario del ratn en Class1.vb y seleccionamos Cambiar nombre y, a continuacin, cambiamos el nombre a "Persons.vb".
Observamos que el nombre en el Editor de cdigo tambin cambia a Persons.vb. En el men Archivo, elegimos Guardar todo. En el cuadro de dilogo Guardar proyecto, hacemos clic en Guardar. Nota: En lugar de guardar el proyecto en la ubicacin predeterminada, podramos crear un directorio en el cual podemos almacenar todas las clases para reutilizarlas mas tarde. se puede especificar esa carpeta en el campo Location del cuadro de dilogo Guardar proyecto antes de guardar. De momento, mantendremos el proyecto abierto, porque lo utilizaremos durante todo el tutorial, e iremos ampliando la informacin.
124
Como campo. Como procedimiento de propiedad. Tambin podemos determinar cmo funciona una propiedad utilizando los modificadores Public, ReadOnly o WriteOnly.
125
La primera lnea de cdigo declara una variable String privada, ValorNombre que almacenar el valor de la propiedad. El procedimiento de propiedad en s comienza con Public Property y termina con End Property. El procedimiento Get contiene el cdigo que se ejecutar cuando desee leer su valor; por ejemplo, si lee la propiedad Personas.Nombre, el cdigo devolver el valor almacenado en la variable ValorNombre El procedimiento Set contiene cdigo que se utiliza para asignar un nuevo valor a la variable ValorNombre usando un valor pasado como argumento Valor. Por ejemplo, si escribimos el cdigo Personas.Nombre = "Wyrm" El valor String Wyrm se pasar como argumento Valor; el cdigo del procedimiento Set lo asignar a la variable ValorNombre para su almacenamiento. Por qu complicarnos tanto, en lugar de utilizar un campo que represente la propiedad Nombre? En el mundo real, hay ciertas reglas para los nombres: por ejemplo, los nombres normalmente no contienen nmeros. Puede agregar cdigo al procedimiento Set para comprobar el argumento Valor y devolver un error si contiene nmeros. Siguiendo con la Clase Personas, ahora agregaremos un campo y tres propiedades: 1. Abrimos el proyecto Personas que hicimos en la seccin anterior. Si no lo guardaste, primero debers regresar a la seccin anterior, crear la primera clase, y realizar hasta el final los procedimientos de esa seccin. 2. En el Explorador de soluciones, seleccionamos Personas.vb y en el men Ver elegimos Cdigo.
126
Private ValorPrimerNombre As String Private ValorSegundoNombre As String Private ValorApellido As String Public Casado As Boolean 4. Agregamos los siguientes procedimientos de propiedad debajo del cdigo de declaracin anterior. Public Property PrimerNombre() As String Get PrimerNombre = ValorPrimerNombre End Get Set(ByVal valor As String) ValorPrimerNombre = Valor End Set End Property Public Property SegundoNombre() As String Get SegundoNombre = ValorSegundoNombre End Get Set(ByVal valor As String) ValorSegundoNombre = Valor End Set End Property Public Property Apellido() As String Get Apellido = ValorApellido End Get Set(ByVal valor As String) ValorApellido = Valor End Set End Property Quedar as: 5. En el men Archivo, elegimos Guardar todo para guardar el trabajo.
127
Nota: Si intentamos asignar un valor a una propiedad ReadOnly, aparecer un error en el Editor de cdigo. Para crear una propiedad de slo lectura, deberemos crear un procedimiento de propiedad con un procedimiento Get, pero sin procedimiento Set, como se muestra a continuacin. Private IDValue As Integer ReadOnly Property ID() As Integer Get ID = IDValue End Get End Property De igual forma, la palabra clave WriteOnly permite establecer un valor de propiedad pero no permite que se lea; por ejemplo, no permite que otros programas lean una propiedad de contrasea. Podemos utilizar ese valor para realizar acciones dentro de la clase, pero desear que sigan siendo privadas. Para crear una propiedad de slo escritura, se crear una propiedad con un procedimiento Set pero sin procedimiento Get, como a continuacin: Private passwordValue As String WriteOnly Property Password() As String Set(ByVal value As String) passwordValue = value End Set End Property Los procedimientos de propiedad ReadOnly y WriteOnly tambin son tiles cuando deseamos tomar un valor de propiedad y convertirlo en un valor diferente. Por ejemplo, pensemos en la edad de una persona. A diferencia del nombre, la edad cambia con el tiempo, si ha asignado la edad a una clase y la lee de nuevo un ao despus, sera incorrecta. En la clase Persons, podemos evitarlo agregando dos propiedades: una propiedad "WriteOnly BirthYear" que representa el ao de nacimiento, que nunca cambia, y una propiedad "ReadOnly Age" que devuelve un valor calculando la diferencia entre el ao en curso y el ao de nacimiento. Siguiendo con la Clase Persons, ahora agregaremos propiedades ReadOnly y WriteOnly a la clase: 1. Agregamos el siguiente cdigo de declaracin debajo de las otras declaraciones en la parte superior del mdulo de clase. Private birthYearValue As Integer
128
2. Introducimos los siguientes procedimientos de propiedad debajo del cdigo de declaracin. WriteOnly Property BirthYear() As Integer Set(ByVal value As Integer) birthYearValue = value End Set End Property ReadOnly Property Age() As String Get Age = My.Computer.Clock.LocalTime.Year birthYearValue End Get End Property 3. En el men Archivo, elegimos Guardar todo para guardar el trabajo.
129
Si bien la mayora de los mtodos de clase son pblicos, tambin se pueden agregar mtodos que slo la clase en s puede utilizar. Por ejemplo, la clase Personas puede tener su propia funcin para calcular la edad de una persona. Si declara la funcin como Private, no se puede ver o llamar desde fuera de la clase. El cdigo para una funcin privada puede ser similar a ste otro: Private Function CalcuEdad(ByVal year As Integer) As Integer CalcuAge = My.Computer.Clock.LocalTime.Year - year End Function Ms tarde podremos cambiar el cdigo que calcula el valor CalcAge y el mtodo seguir funcionando bien sin cambiar ningn cdigo que utilice el mtodo. Ocultar el cdigo que realiza el mtodo, se conoce como la "encapsulacin", ya explicada al comienzo. Ahora, para agregar un mtodo a la clase Persons, hacemos lo siguiente: Abrimos el proyecto Personas (si no lo tenemos abierto ya de antes) que hicimos en las secciones anteriores. Si no lo guardaste, o no lo creaste, primero debers volver a las secciones anteriores, agregar propiedades a la clase, y completar los procedimientos. En el Explorador de soluciones, seleccionamos Personas.vb y, en el men Ver, hacemos clic en Cdigo. Agregamos el siguiente cdigo bajo los procedimientos de propiedad. Public Function NombreComplet() As String If ValorSegundoNombre <> "" Then NombreCompleto = ValorPrimerNombre & " " & ValorSegundoNombre & " " & ValorApellido Else NombreCompleto = ValorPrimerNombre & " " & ValorApellido End If End Function Private Function CalcuEdad(ByVal year As Integer) As Integer CalcuEdad = My.Computer.Clock.LocalTime.Year - year End Function Modificamos el cdigo en el procedimiento de la propiedad Age para utilizar la funcin privada: ReadOnly Property Age() As String Get 'Age = My.Computer.Clock.LocalTime.Year birthDateValue
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
130
Age = CalcuEdad(birthYearValue) End Get End Property Antes, el cdigo era as: ReadOnly Property Age() As String Get Age = My.Computer.Clock.LocalTime.Year birthYearValue End Get End Property
131
Public Event AgeCalculated(ByVal Age As Single) En el mtodo CalcAge, reemplazamos el cdigo existente por el siguiente cdigo para provocar el evento. Private Function CalcAge(ByVal year As Integer) As Integer Dim Age = My.Computer.Clock.LocalTime.Year - year RaiseEvent AgeCalculated(Age) CalcAge = My.Computer.Clock.LocalTime.Year - year End Function En el men Archivo, hacemos clic en Guardar todo para guardar el trabajo.
Para utilizar y probar la clase Persons, debemos crear primero un proyecto de prueba y agregar una referencia al mdulo de clase. Para crear un proyecto de prueba para la clase Persons Abrimos el proyecto Persons que creamos en las secciones anteriores. En el men Archivo, elegimos Agregar y, a continuacin, hacemos clic en Nuevo proyecto.
132
En el panel Plantillas, en el cuadro de dilogo Nuevo proyecto, hacemos clic en Aplicacin de Windows Forms. En el cuadro Nombre, escribimos PersonsTest y hacemos clic en Aceptar.
Se agregar un nuevo proyecto de Windows Forms al Explorador de soluciones y aparecer un nuevo formulario.
133
En el Explorador de soluciones, seleccionamos el proyecto PersonsTest y, en el men Proyecto, hacemos clic en Establecer como proyecto de inicio.
En el Explorador de soluciones, seleccionamos el proyecto PersonsTest y, en el men Proyecto, hacemos clic en Agregar referencia. Aparecer el cuadro de dilogo Agregar referencia.
134
Hacemos doble clic en el formulario para abrir el editor de cdigo y escribimos la siguiente declaracin justo debajo de la lnea Public Class Form1.
Dim person1 As New Persons.Persons
Esto declara una nueva instancia de la clase Persons. Quizs os preguntis por qu tuvimos que escribir dos veces Persons, pues porque la primera instancia es el mdulo de clase Persons.vb y la segunda instancia es la clase Persons de ese mdulo. En el men Archivo, hacemos clic en Guardar todo. El siguiente paso es agregar una interfaz de usuario y un cdigo que utilice la clase Persons. Agregaremos cuadros de texto donde el usuario especificar los valores para cada una de las propiedades (excepto la propiedad de slo lectura "Age"), una casilla para el campo "Married" y botones para probar cada uno de los mtodos pblicos.
135
Seleccionamos el primer control Button y, a continuacin, en la ventana Propiedades establecemos la propiedad Text en Update. Seleccionamos el segundo control Button y en la ventana Propiedades establecemos la propiedad Text en Full Name. Hacemos doble clic en el primer botn (Update) para abrir el Editor de cdigo y en el controlador de eventos Button1_Click, agregamos el siguiente cdigo: With person1 .FirstName = Textbox1.Text .MiddleName = Textbox2.Text .LastName = Textbox3.Text .BirthYear = Textbox4.Text .Married = CheckBox1.Checked End With En el controlador de eventos Button2_Click, agregamos lo siguiente: MsgBox(person1.NombreCompleto) MsgBox(CStr(person1.Edad) & " aos") If person1.Casado = True Then MsgBox(person1.PrimerNombre & " es casado") Else MsgBox(person1.Primernombre & " es soltero") End If Presionamos F5 para ejecutar el proyecto y mostrar el formulario:
-En el primer cuadro de texto, escribimos nuestro nombre. -En el segundo cuadro de texto, escribimos nuestro segundo nombre. -En el tercer cuadro de texto, escribimos nuestro apellido. -En el cuarto cuadro de texto, escribimos el ao de nuestro nacimiento con cuatro dgitos (por ejemplo, 1983). -Activamos la casilla de si estamos casados/as.
136
Hacemos clic en el botn "Update" para establecer las propiedades de la clase y clic en el botn "Full Name". Se muestran tres cuadros de mensaje. Estos cuadros de mensaje muestran su nombre completo, edad y estado civil.
137
El constructor Sub New solo se ejecutar una vez, cuando se cree un objeto. Ejemplo de Sub New El siguiente ejemplo muestra cmo utilizar el constructor Sub New: Public Sub New( ) ' Perform simple inicializacin intValue = 1 End Sub La siguiente lnea de cdigo crea un objeto desde una clase denominada BankAccount, ya definida en la aplicacin. Dim myAccount As New BankAccount( ) Podemos sobrecargar New y crear tantos constructores de clases como sean necesarios. Esto resulta til si deseamos inicializar nuestro objeto cuando lo creemos. Sobrecarga de constructores Podemos sobrecargar constructores del mismo modo que se sobrecarga cualquier otro mtodo de una clase. No obstante, no podemos utilizar la palabra clave Overloads cuando sobrecargamos constructores. El siguiente ejemplo muestra cmo sobrecargar New y crear mltiples constructores de clase: Class BankAccount Private balance as Double Sub New( ) ' Initialize balance balance = 0.0 End Sub Sub New(ByVal amount As Double) balance = amount End Sub End Class Uno de los constructores del ejemplo anterior toma un parmetro. Si estamos creando un objeto desde tal clase, podemos incluir sus parmetros en la declaracin. El siguiente ejemplo muestra cmo invocar el mtodo New que toma un parmetro. Dim myAccount As New BankAccount(120.00) Para escribir nuestros propios constructores de clase, crearemos un mtodo con el nombre New( ), como vemos en el Cdigo. En dicho ejemplo, al instanciarse un objeto de la clase Empleado, se asignar a una de sus propiedades la fecha actual. Interfase grafica cliente Public class form1.. Private Sub Botton_Click Dim loEmp As Empleado loEmp = New Empleado()
138
MsgBox("El objeto se ha creado el da "& loEmp.FechaCrea) End Sub End class Public Class Empleado Private mdtFechaCrea As Date Public Property FechaCrea() As Date Get Return mdtFechaCrea End Get Set(ByVal Value As Date) mdtFechaCrea = Value End Set End Property ' mtodo constructor Public Sub New() ' asignamos un valor inicial a una variable de propiedad Me.FechaCrea = Now End Sub End Class Al igual que ocurre en un mtodo normal, New( ) admite parmetros; esto nos sirve para asignar valores de inicio al objeto en el momento de su instanciacin. La denominacin para este tipo de mtodos es constructor parametrizado. El Cdigo nos muestra una variacin del fuente anterior, utilizando un constructor de este tipo. Interfase grafica cliente Public class form1.. Private Sub Botton_Click Dim loEmp As Empleado loEmp = New Empleado("5/7/2002") MsgBox("El objeto se ha creado el da "& loEmp.FechaCrea) ' este es otro modo de instanciar ' un objeto con un constructor parametrizado Dim loEmp2 As New Empleado("08/4/2002") End Sub End Class Public Class Empleado Private mdtFechaCrea Public Property FechaCrea() As Date Get Return mdtFechaCrea End Get Set(ByVal Value As Date)
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
139
mdtFechaCrea = Value End Set End Property ' mtodo constructor con parmetro Public Sub New(ByVal ldtFecha As Date) ' asignamos el valor del parmetro a una variable de propiedad Me.FechaCrea = ldtFecha End Sub End Class Combinando las caractersticas de mtodos constructores junto a las de sobrecarga, podemos crear un conjunto de constructores sobrecargados para la clase. Public Class Empleado Public psNombre Public psApellidos Public psCiudad Private mdtFechaCre ' en este constructor sin parmetros, asignamos la fecha actual Public Sub New() mdtFechaCrea = Now() End Sub ' en este constructor, asignamos valores a todos los campos de la clase Public Sub New(ByVal lsNombre As String, ByVal lsApellidos As String, ByVal lsCiudad As String) psNombre = lsNombre psApellidos = lsApellidos psCiudad = lsCiudad End Sub End Class
140
recursos. Sin embargo, existe una demora entre el momento en que un objeto pierde su alcance y el momento en que se invoca al destructor Finalize. La ejecucin de Sub Finalize provoca una ligera prdida en el rendimiento, por ello nicamente debera definirse un mtodo Sub Finalize cuando sea necesario liberar objetos explcitamente. Visual Basic .NET permite un segundo tipo de destructor, denominado Dispose, que puede ser invocado explcitamente en cualquier momento para liberar recursos de forma inmediata. Dispose no se incluye en el mbito de este curso. Si desea ms informacin sobre Dispose, puede consultar Duracin de los objetos: cmo se crean y destruyen en la documentacin de Visual Studio .NET. Nota Ejemplo de Sub Finalize El siguiente ejemplo muestra cmo utilizar el destructor Finalize: Protected Overrides Sub Finalize( ) ' Can close connections or other resources conn.Close End Sub Protected es un modificador de acceso que establece el nivel de accesibilidad.
141
Class SavingsAccount Public Shared InterestRate As Double Public Function CalculateInterest( ) As Double ... End Function End Class El valor del miembro de datos InterestRate de la clase SavingsAccount puede establecerse globalmente con independencia del nmero de instancias de la clase que estn en uso. El valor se utiliza para calcular el inters del saldo actual. Invocar miembros de datos compartidos desde un cliente Despus de crear una clase que utilice miembros de datos compartidos pblicos, podemos invocar los miembros de datos de esa clase desde una aplicacin cliente. El siguiente cdigo muestra cmo invocar la clase SavingsAccount y sus miembros de datos desde una aplicacin cliente: Sub Test( ) SavingsAccount.InterestRate = 0.03 Dim myAccount As New SavingsAccount( ) Dim yourAccount As New SavingsAccount( ) MessageBox.Show(myAccount.CalculateInterest( )) MessageBox.Show(yourAccount.CalculateInterest( )) End Sub En el examen de este cdigo, se observa lo siguiente: InterestRate puede establecerse antes y despus de la creacin de cualquier instancia de la clase SavingsAccount. Cualquier modificacin a InterestRate se aplicar a todas las instancias de la clase SavingsAccount.
Propiedades compartidas Tambin pueden crearse propiedades compartidas en las clases. El siguiente ejemplo muestra cmo declarar una propiedad compartida denominada Rate en la clase SavingsAccount: Class SavingsAccount Private Shared interestRate As Double Shared Property Rate( ) As Double Get Return interestRate End Get Set(ByVal Value As Double) interestRate = Value End Set End Property End Class
142
Invocar propiedades compartidas desde un cliente Una vez declarada la propiedad compartida Rate, puede utilizarse en una aplicacin cliente en lugar de acceder directamente al miembro de datos compartido interestRate. Podemos invocar una propiedad compartida cualificndola con el nombre de clase o con el nombre de variable de una instancia especfica de la clase. El siguiente cdigo muestra cmo invocar una propiedad compartida cualificndola con el nombre de la clase: SavingsAccount.Rate = 0.03 El siguiente cdigo muestra cmo invocar una propiedad compartida utilizando el nombre de variable de una instancia especfica de la clase:
143
6.11.-Qu es el polimorfismo?
Introduccin La mayora de sistemas de programacin orientada a objetos proporcionan polimorfismo mediante herencia. El polimorfismo basado en herencia implica la definicin de mtodos en una clase base y sobrecargarlos con nuevas implementaciones en clases derivadas. Definicin Polimorfismo hace referencia a la capacidad de definir mltiples clases con diferentes funcionalidades pero con mtodos o propiedades de nombres idnticos que pueden utilizarse de forma intercambiable por el cdigo cliente en tiempo de ejecucin. El nombre del mtodo reside en la clase base. Las implementaciones de mtodos residen en las clases derivadas. Para gestionar esto, nicamente puede declararse en la clase base el nombre del mtodo (no el cdigo que proporciona la funcionalidad del mtodo). Ejemplo de polimorfismo Supongamos que definimos una clase denominada BaseTax que proporciona funcionalidad bsica para calcular el impuesto sobre las ventas de un estado. Las clases derivadas de BaseTax, como CountyTax o CityTax, podran implementar mtodos como CalculateTax. Polimorfismo hace referencia al hecho de que la implementacin del mtodo CalculateTax podra ser distinta en cada una de las clases derivadas. Por ejemplo, el tipo impositivo de un condado (county tax rate) podra ser distinto del tipo impositivo de una ciudad (city tax rate). Las clases que hereden de BaseTax tendrn un mtodo CalculateTax, pero el modo como se calcule realmente el impuesto podra variar en cada una de las clases derivadas.
144
'llamada al segundo mtodo sobrecargado MsgBox("El sueldo se transferir el da " & loEmpleado.Sueldo(29)) 'llamada al tercer mtodo sobrecargado ldbResultadoIncent = loEmpleado.Sueldo(50.75, "Extras") MsgBox(El incentivo a pagar ser " & ldbResultadoIncent) End Sub End Class Public Class Empleado Private mdbSalario As Double Public Property Salario() As Double Get Return mdbSalario End Get Set(ByVal Value As Double) mdbSalario = Value End Set End Property ' Mtodos sobrecargados Public Overloads Sub Sueldo() ' aqu mostramos en consola el importe del sueldo formateado MsgBox("El sueldo es " & Format(Me.Salario, "#,#.##")) End Sub Public Overloads Function Sueldo(ByVal liDia As Integer) As String ' Aqu mostramos la fecha del mes actual en la que se ' realizar la transferencia del sueldo al banco del empleado Dim ldtFechaActual As Date Dim lsFechaCobro As String ldtFechaActual = Now() lsFechaCobro = CStr(liDia) & "/" & _ CStr(Month(ldtFechaActual)) & "/" & _ CStr(Year(ldtFechaActual)) Return lsFechaCobro End Function Public Overloads Function Sueldo(ByVal ldbImporteIncentivo As Double,ByVal lsTipoIncentivo As String) As Double ' aqu calculamos la cantidad de incentivo que se aadir al ' sueldo del empleado,en funcin del tipo de incentivo Dim ldbIncentivo As Double
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
145
' segn el tipo de incentivo, se descuenta un importe de la cantidad del incentivo Select Case lsTipoIncentivo Case "Viajes" ldbIncentivo = ldbImporteIncentivo - 30 Case "Extras" ldbIncentivo = ldbImporteIncentivo - 15 End Select Return ldbIncentivo End Function End Class
Mtodos sobrecargados
Para crear un mtodo sobrecargado, agregamos dos o ms procedimientos Sub o Function a la clase, cada uno con el mismo nombre. En las declaraciones de procedimiento, el conjunto de argumentos para cada procedimiento debe ser distinto o se producir un error. El siguiente ejemplo muestra un mtodo con dos sobrecargas, una que acepta una String y la otra que acepta un Integer como argumentos. Public Sub TestFunction(ByVal input As String) MsgBox(input) End Sub Public Sub TestFunction(ByVal input As Integer) MsgBox(CStr(input)) End Sub Si se debe llamar a este mtodo desde el cdigo y pesarle una cadena, se ejecutara la primera sobrecarga y un cuadro de mensaje mostrara la cadena; si se le pas un nmero, se ejecutara la segunda sobrecarga y el nmero se convertira en una cadena y aparecera en el cuadro de mensaje. Podemos crear tantas sobrecargas como sean necesarias y cada una de ellas puede contener un nmero diferente de argumentos. En la clase Persons, agregaremos un mtodo con dos sobrecargas para devolver la inicial del segundo nombre de una persona; una slo con la inicial y la otra con la inicial seguida por un punto.
146
Agregamos el siguiente cdigo debajo de los mtodos existentes. Public Function MiddleInitial() As String MiddleInitial = Left$(middleNameValue, 1) End Function Public Function MiddleInitial(ByVal period As Boolean) As String MiddleInitial = Left$(middleNameValue, 1) & "." End Function En el Explorador de soluciones, seleccionamos Form1 y, en el men Ver, hacemos clic en Diseador. En el Cuadro de herramientas, arrastramos dos controles ms de Button al formulario. Seleccionamos el tercer control Button y en la ventana Propiedades establecemos su propiedad Text en With. Seleccionamos el cuarto control Button y en la ventana Propiedades establecemos su propiedad Text en Without. Hacemos doble clic en el primer botn (With) para abrir el Editor de cdigo y escribimos el siguiente cdigo en el controlador de eventos Button3_Click. En el controlador de eventos Button4_Click, agregamos el siguiente cdigo. MsgBox(person1.FirstName & " " & person1.MiddleInitial & _ " " & person1.LastName) Presionamos F5 para ejecutar el proyecto y mostrar el formulario.
-En el primer cuadro de texto, escribimos nuestro nombre. -En el segundo cuadro de texto, escribimos nuestro segundo apellido. -En el tercer cuadro de texto, escribimos nuestro tercer apellido. -En el cuarto cuadro de texto, escribimos el ao de nuestro nacimiento con cuatro dgitos (por ejemplo, 1983). -Activamos la casilla si est casado/a.
147
Hacemos clic en el botn Actualizar para establecer las propiedades de la clase y hacemos clic en el botn With. Se abrir un cuadro de mensaje. Muestra nuestro nombre con un punto tras la inicial del primer apellido.
Hacemos clic en el botn Without. Se abrir un cuadro de mensaje. Muestra nuestro nombre sin el punto tras la inicial del primer apellido.
148
149
Agregamos el procedimiento siguiente a Form1. Este cdigo comprueba la edad calculada y muestra un mensaje basado en el resultado. Private Sub person1_AgeCalculated(ByVal Age As Integer) _ Handles person1.AgeCalculated If Age > 18 Then MsgBox("You have been over 18 for " & Age - 18 _ & " years.") Else MsgBox("You will be 18 in " & 18 - Age & " years") End If End Sub Presionamos F5 para ejecutar el proyecto y mostrar el formulario. -En el primer cuadro de texto, escribimos nuestro nombre. -En el segundo cuadro de texto, escribimos nuestro segundo apellido. -En el tercer cuadro de texto, escribimos nuestro tercer apellido. -En el cuarto cuadro de texto, escribimos el ao de nuestro nacimiento con cuatro dgitos (por ejemplo, 1983). -Activamos la casilla si est casado/a. Hacemos clic en el botn Actualizar para establecer las propiedades de la clase y haga clic en el botn Full Name. Un cuadro de mensaje muestra su nombre completo. Si tiene ms de 18 aos, otro cuadro de mensaje muestra informacin sobre cunto tiempo hace que cumpli los 18 aos. Si tiene menos de 18 aos, aparece un cuadro de mensaje que muestra informacin sobre cunto tiempo queda hasta que cumpla los 18 aos. A continuacin, otro cuadro de mensaje muestra su edad.
150
Persona
Clase base
Cliente
Empleado
Clase Derivada
Introduccin En la programacin orientada a objetos, podemos compartir las caractersticas de una clase base en otras clases derivadas de la clase base. Esto se denomina herencia. Definicin Herencia es el concepto de reutilizar atributos y operaciones comunes de una clase base en una clase derivada.
151
En Visual Basic .NET, la herencia puede utilizarse para derivar una clase de una clase existente. La clase derivada puede heredar todas las propiedades, mtodos, miembros de datos, eventos y controladores de eventos de la clase base, facilitando la reutilizacin de la clase base por toda la aplicacin. La palabra clave Inherits La palabra clave Inherits se utiliza para definir una clase derivada que heredar de una clase base existente. Ejemplo: El siguiente ejemplo muestra cmo utilizar la palabra clave Inherits: Public Class CheckingAccount Inherits BankAccount Private Sub ProcessCheck( ) ' Add code to process a check drawn on this account End Sub End Class Observacion Podemos utilizar la palabra clave MyBase para invocar mtodos en una clase base cuando invalidan mtodos en una clase derivada. Tambin podemos utilizar la palabra clave MyBase para invocar el constructor y el destructor de la clase base en nuestra clase derivada. Observemos el siguiente ejemplo: 'Crear clase derivada en dos lneas Public Class Administrativo Inherits Empleado ' Crear clase derivada en la misma lnea Public Class Administrativo : Inherits Empleado La palabra clave NotInheritable La palabra clave NotInheritable se utiliza para definir una clase que no puede utilizarse como clase base para herencia. Si otra clase intenta heredar de esta clase, se generar un error de compilacin. Ejemplo: El siguiente ejemplo muestra cmo utilizar la palabra clave NotInheritable: Public NotInheritable Class TestClass ... End Class Public Class DerivedClass ' The following line generates a compiler error Inherits TestClass
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
152
... End Class La palabra clave MustInherit La palabra clave MustInherit se utiliza para definir clases que no estn pensados para ser utilizados directamente como objetos instanciados. La clase resultante debe ser heredada como una clase base para utilizarla en el objeto de una clase derivada instanciada. Ejemplo: El siguiente ejemplo muestra cmo utilizar la palabra clave MustInherit: Public MustInherit Class BaseClass ... End Class ... Si el cdigo cliente intenta crear una instancia de este tipo de clase, se generar un error de compilacin, como se muestra en el siguiente ejemplo: ' Client code ' The following line generates a compiler error Dim x As New BaseClass( ) La palabra clave Protected Utilizamos el acceso Protected para limitar el mbito de una propiedad, mtodo, miembro de datos, evento o controlador de eventos a la clase que los define y cualquier clase derivada basada en esa clase base. Ejemplo El siguiente ejemplo muestra cmo utilizar la palabra clave Protected: Public Class BaseClass ' Accessible anywhere Public counter As Integer ' Accessible only in this class or a derived class Protected name As String ... End Class
153
descapotable tiene una parte superior que se puede subir/bajar electrnica o manualmente. Si se cre un objeto para representar un automvil, se pueden incluir propiedades y mtodos para todos los atributos y comportamientos comunes, pero no se podran agregar atributos como la cubierta de un descapotable, puesto que dicho atributo no es generalizable a todos los automviles. Mediante el uso de la herencia, se puede crear una clase "descapotable" que deriva de la clase "automvil". sta hereda todos los atributos de la clase automvil y puede agregar los atributos y comportamientos que son nicos de un auto descapotable.
Se pueden crear instancias de la nueva clase DerivedClass, se puede tener acceso a sus propiedades y mtodos como BaseClass y se pueden agregar nuevas propiedades y mtodos que son especficos de la nueva clase. Para ver un ejemplo, nos fijaremos en la clase Persons que tenemos creada. Supongamos que deseamos tener una clase que represente jugadores de bisbol: los jugadores del bisbol tienen todos los atributos definidos en la clase Persons, pero tambin tienen atributos nicos, como su nmero y posicin. En lugar de agregar esas propiedades a la clase Persons, se crear una nueva clase derivada que se hereda de Persons, a la que se agregaran las nuevas propiedades. Para crear una clase derivada de la clase Persons: Abrimos el proyecto Persons que llevamos todo el tutorial usando. En el Explorador de soluciones, seleccionamos el nodo del proyecto Persons. En el men Proyecto, elegimos Agregar clase.
154
En el cuadro de dilogo Agregar nuevo elemento, escribimos Players en el cuadro Nombre, a continuacin, hacemos clic en Agregar.
En el Editor de cdigo, agregamos lo siguiente justo debajo de la lnea Public Class Players. Inherits Persons Agregamos tambin el siguiente cdigo para definir las dos nuevas propiedades. Private numberValue As Integer Private positionValue As String Public Property Number() As Integer Get Number = numberValue End Get Set(ByVal value As Integer)
155
numberValue = value End Set End Property Public Property Position() As String Get Position = positionValue End Get Set(ByVal value As String) positionValue = value End Set End Property En el men Archivo, hacemos clic en Guardar todo.
4. Se agregar un nuevo proyecto de Windows Forms al Explorador de soluciones y aparecer un nuevo formulario.
156
5. En el Explorador de soluciones, seleccionamos el proyecto PlayerTest y, en el men Proyecto, hacemos clic en Establecer como proyecto de inicio. 6. En el Explorador de soluciones, seleccionamos el proyecto PlayerTest y, en el men Proyecto, haga clic en Agregar referencia. 7. Se abrir el cuadro de dilogo Agregar referencia. 8. Hacemos clic en la ficha Proyectos, elegimos Persons y hacemos clic en Aceptar.
9. Hacemos doble clic en el formulario para abrir el Editor de cdigo y escribimos la siguiente declaracin justo debajo de la lnea Public Class Form1. Dim player1 As New Persons.Players Dim player2 As New Persons.Players Esto declara dos nuevas instancias de la clase Players. 10. En el men Archivo, hacemos clic en Guardar todo. Para probar la clase derivada: 1. En el Explorador de soluciones, seleccionamos Form1 en el proyecto PlayerTest y, a continuacin, en el men Ver, hacemos clic en Cdigo.
157
2. En el Editor de cdigo, agregamos el siguiente cdigo al procedimiento de evento Form1_Load. With player1 .FirstName = "Wyrm" .LastName = "Garcia" .Number = 13 .Position = "Shortstop" End With With player2 .FirstName = "Joe" .LastName = "Black" .Number = 51 .Position = "Catcher" End With 3. En el Explorador de soluciones, seleccionamos Form1 en el proyecto PlayerTest y, a continuacin, en el men Ver, hacemos clic en Diseador.
158
4. En el Cuadro de herramientas, arrastramos dos controles Button al formulario. 5. Seleccionamos el primer control Button y en la ventana Propiedades establecemos su propiedad Text en At Bat. 6. Seleccionamos el segundo control Button y en la ventana Propiedades establecemos su propiedad Text en On Deck. 7. Hacemos doble clic en el primer botn (At Bat) para abrir el Editor de cdigo y escribimos el siguiente cdigo en el controlador de eventos Button1_Click. MsgBox(player1.Position & " " & player1.FullName & ", #" & CStr(player1.Number) & " is now at bat.") Observamos que estamos utilizando el mtodo FullName que se hered de la clase base Persons. 8. En el controlador de eventos Button2_Click, agregamos el siguiente cdigo.
MsgBox(player2.Position & " " & player2.FullName & ", #" & CStr(player2.Number) & " is on deck.")
9. Presionamos F5 para ejecutar el programa. Hacemos clic en cada botn para ver los resultados. Clic al Boton1(At Bat):
159
10. En el men Archivo, elegimos Guardar todo. Hemos visto, qu son y cmo crear clases, agregarle propiedades, mtodos y eventos, las hemos heredado, etc. la mejor forma de aprender y de que las cosas se entiendan, es hacindolo uno mismo...
160
Los precedentes
Lo primero que debemos tener en cuenta es que todo lo que queramos hacer en .NET debemos hacerlo usando las clases que este entorno nos ofrece y el tema de imprimir no es una excepcin. En Visual Basic 6 solamente disponamos del objeto Printer, que era el que realmente nos permita imprimir, de la coleccin Printers, la cual podamos usar para saber las impresoras que tenamos disponibles, adems del control para dilogos comunes, el cual nos permita seleccionar y configurar la impresora que queramos usar, adems de permitirnos indicar el nmero de pginas a imprimir, etc., aunque no siempre funcionara como a nosotros nos hubiera gustado y en ocasiones tuvisemos que acudir a las funciones del API de Windows si realmente queramos hacer algo verdaderamente prctico. En .NET ha cambiado un poco la forma de hacer todo lo que hacamos en VB6, ya no existen "objetos" que nos permitan imprimir ni colecciones que nos permitan saber las impresoras disponibles, bueno, un poco s, pero como veremos de una forma ms ordenada y algo diferente. Esa diferencia es la que a muchos les ha causado desesperacin e incluso les ha llevado a un consumo excesivo de Aspirinas. En los siguientes puntos veremos que nuestra vida puede ser ms soportable e incluso ms fcil si aprendemos a manejar las clases de .NET que nos permiten imprimir y configurar las opciones de impresin.
161
queremos imprimir, y aqu es donde podra estar ese problema. El mtodo Print de la clase PrintDocument lo que realmente hace es "despertar a la bestia", es decir, dar las instrucciones pertinentes al motor de .NET para que se inicie el proceso de impresin, dicho proceso se lleva a cabo bsicamente utilizando el evento PrintPage de la clase PrintDocument, en este evento es donde tendremos que hacer todo lo necesario para que se imprima lo que queramos imprimir. Por tanto, para poder controlar lo que se va a imprimir, debemos escribir todo nuestro cdigo en ese evento, el cual se produce para cada pgina que deba imprimirse; posiblemente este sea el punto problemtico, al menos desde el punto de vista del programador de VB6, ya que antes para controlar lo que deba imprimirse simplemente usbamos el mtodo Print del objeto Printer, (o de cualquier objeto del tipo Printer que hubisemos obtenido de la coleccin Printers), al que le indicbamos qu es lo que deba imprimirse, aunque en VB6 ramos nosotros los que debamos comprobar cuando cambiar de pgina, cuando imprimir la cabecera, etc. En .NET todo esto se hace en un solo sitio: el evento PrintPage, por tanto podemos decir que en .NET es ms fcil imprimir y sobre todo controlar cmo y dnde se imprime cada cosa, ya que, si lo simplificamos al mximo, todo se hace en un solo sitio: el evento PrintPage de la clase PrintDocument.
162
' la posicin superior Dim yPos As Single = prFont.GetHeight(e.Graphics) ' imprimimos la cadena e.Graphics.DrawString("Hola, Mundo", prFont, Brushes.Black, xPos, yPos) ' indicamos que ya no hay nada ms que imprimir ' (el valor predeterminado de esta propiedad es False) e.HasMorePages = False End Sub
7.2.-Configurar la impresin
Pero para ser claros esta no ser la forma "habitual" de usar este evento, ya que en la mayora de los casos imprimiremos ms de una pgina y seguramente querremos asignar otros valores a la impresora, como los mrgenes, el nmero de copias, el tamao del papel, la orientacin de la impresin (vertical o apaisada) e incluso, lo ms importante, qu impresora usar.
163
Todos estos valores los podremos indicar usando un objeto del tipo PrinterSettings, el cual, entre otras cosas, nos permite saber cules son las impresoras que tenemos disponibles en el equipo actual. Por tanto, lo habitual ser que usemos un objeto de esta clase en conjunto con el de la clase principal para imprimir: PrintDocument.
164
La clase PrintDocument
Esta es la clase elemental o principal si queremos imprimir en .NET, como hemos comentado anteriormente, de los miembros que esta clase ofrece principalmente usaremos tres: El mtodo Print es el que iniciar el proceso de impresin, haciendo que se produzcan los eventos necesarios para controlar lo que queremos imprimir. El evento PrintPage, el cual se producir cada vez que tengamos que imprimir una pgina. Dentro de este evento es donde haremos todo lo que tengamos que hacer para imprimir cada una de las pginas, desde aqu podemos controlar si quedan ms pginas por imprimir, etc. La propiedad PrinterSettings a la que podemos asignarle un objeto del mismo nombre en el que indicamos la impresora a usar y otros valores como el rango de pgina, el nmero de copias, el tamao del papel, la orientacin, etc. Del resto de miembros de esta clase podemos destacar la propiedad DocumentName a la que podemos asignar el nombre del documento que estamos imprimiendo y que ser el que se muestre en el estado de la impresin. Tambin tenemos el evento QueryPageSettings el cual se produce justo antes del evento PrintPage y que nos permite asignar valores "particulares" a cada una de las pginas a imprimir antes de que se produzca el evento PrintPage.
La clase PrinterSettings
Tal y como hemos estado indicando en los prrafos anteriores, esta clase nos permite especificar caractersticas de impresin como la impresora a usar, el nmero de copias a imprimir, el rango de pginas, etc. Realmente no necesitamos indicar nada, al menos de forma explcita para usar un objeto de esta clase, ya que al crear una nueva instancia los valores predeterminados sern los que tengamos asignado en la impresora, valga la redundancia, predeterminada de nuestro sistema. Pero si queremos modificar esos valores, tendremos que asignarlos a las propiedades de esta clase, entre las que podemos destacar las siguientes: Copies indica el nmero de copias a imprimir. FromPage indica la pgina a partir de la que queremos imprimir. MaximunPage indica el nmero mximo de copias que se pueden indicar. MinimunPage es el nmero mnimo de copias que podemos indicar. ToPage indica la pgina hasta la que queremos imprimir. Tanto MaximunPage como MinimunPage se utilizarn para indicar los valores mximo y mnimo de las pginas disponibles y se usarn con una clase del tipo PrintDialog. Del resto de propiedades tambin podemos destacar las colecciones: InstalledPrinters es una propiedad compartida y por tanto podemos usarla sin necesidad de crear una instancia de la clase PrinterSettings, esta coleccin
165
devuelve un array de tipo String con el nombre de cada una de las impresoras instaladas en el sistema. PaperSizes es una coleccin con elementos del tipo PaperSize que nos permite saber los tamaos de papel que la impresora soporta. Cada elemento del tipo PaperSize nos proporciona informacin sobre el tamao (ancho y alto), el nombre y la "clase" de papel, que no es ni ms que una enumeracin del tipo PaperKind. PrinterResolutions es una coleccin con elementos del tipo PrinterResolution, de forma que podamos averiguar las resoluciones (y calidades) permitidas por la impresora. Cada uno de estos elementos nos indicar tanto la resolucin horizontal como la vertical, adems de la calidad de impresin, especificada con uno de los valores de la enumeracin PrinterResolutionKind, cuyos valores pueden ser: Custom, Draft, High, Low y Medium. De los mtodos, posiblemente el que ms nos puede interesar es: CreateMeasurementGraphics el cual nos permite conseguir un objeto del tipo Graphics con el cual podemos averiguar ciertas caractersticas de la impresora sin necesidad de tener que imprimir, ya que el objeto devuelto por este mtodo es igual al que se incluye en la clase PrintPageEventArgs, usada como segundo parmetro en los eventos producidos por la clase PrintDocument. Como regla general deberamos tener una variable del tipo PrinterSettings para usarla como almacenamiento de las preferencias de impresin de nuestros usuarios, ya que esta clase se utiliza tanto con PrintDocument como con PrintDialog.
La clase PrintDialog
Esta clase nos servir para que nuestros usuarios seleccionen la impresora a usar as como para que indiquen ciertas caractersticas relacionadas con la impresin, como la calidad del papel, el nmero de copias, etc., con la ventaja de que todo esto lo haremos usando el mismo cuadro de dilogo comn incluido en Windows y que es el que la prctica totalidad de aplicaciones de este sistema operativo utilizarn, tal como podemos comprobar en la figura 1.
166
Figura 1. El cuadro de dilogo para seleccionar la impresora En la figura 1 podemos comprobar que hay ciertos elementos que puede que no nos interese mostrar o dejar habilitados, por ejemplo, si nuestra aplicacin no permite imprimir el cdigo seleccionado no tiene mucho significado ofrecerle la opcin "Seleccin", (la figura est capturada de un Windows XP en ingls, por eso se muestran las opciones en ingls), lo mismo ocurre con el botn de ayuda o con las cajas de texto que permiten indicar el rango de pginas a imprimir. Todas estas caractersticas las podemos habilitar o deshabilitar mediante algunas de las propiedades de la clase PrintDialog, tales como: AllowPrintToFile, AllowSelection, AllowSomePages, PrintToFile, ShowHelp y ShowNetwork.
167
con las preferencias del usuario, por tanto antes de llamar al mtodo ShowDialog deberamos asignar a esta propiedad la variable que tengamos con las preferencias del usuario y si no se ha cancelado, debemos asignar nuevamente el resultado de dichas preferencias, tal como mostramos en el listado 2. Private Function seleccionarImpresora() As Boolean Dim prtDialog As New PrintDialog If prtSettings Is Nothing Then prtSettings = New PrinterSettings End If With prtDialog .AllowPrintToFile = False .AllowSelection = False .AllowSomePages = False .PrintToFile = False .ShowHelp = False .ShowNetwork = True .PrinterSettings = prtSettings If .ShowDialog() = DialogResult.OK Then prtSettings = .PrinterSettings Else Return False End If End With Return True End Function
La clase PrintPreviewDialog
Esta clase nos permitir mostrar una ventana con la vista preliminar del documento que queremos imprimir, de forma que los usuarios de nuestra aplicacin pueden ver lo que se imprimir. Debido a que esta clase al estar derivada de Form tiene todas las propiedades, mtodos y eventos de cualquier formulario adems de los relacionados con la previsualizacin del documento a imprimir, veamos solamente los dos miembros que nos interesarn ms: El mtodo ShowDialog ser el que se encargue de mostrar el formulario con la vista preliminar. A la propiedad Document le asignaremos un objeto del tipo PrintDocument que ser el que utilicemos para saber qu es lo que queremos imprimir.
168
NOTA: Por regla general deberamos asignar a la propiedad Document de la clase PrintPreviewDialog el mismo objeto PrintDocument usado para imprimir, ya que la clase PrintPreviewDialog se encargar de que se produzcan los mismos eventos que si hubisemos llamado al mtodo Print del objeto PrintDocument asignado, de forma que lo que se muestre mediante este dilogo sea lo mismo que se imprima, que es al fin y al cabo lo que queremos conseguir. Tal como hemos resaltado en la nota, tanto el mtodo Print de la clase PrintDocument como la clase PrintPreviewDialog utilizan los mismos eventos del objeto PrintDocument, por tanto podramos usar un mtodo genrico que sea el encargado de mostrar una vista preliminar de lo que queremos imprimir o de mandarlo a la impresora, de esta forma podemos usar de forma comn las opciones ofrecidas al usuario, como por ejemplo permitir la seleccin de la impresora antes de imprimir, etc. En el listado podemos ver cmo podra ser ese mtodo genrico para elegir entre imprimir o previsualizar lo que deseamos imprimir. Private Sub imprimir(ByVal esPreview As Boolean) ' imprimir o mostrar el PrintPreview If prtSettings Is Nothing Then prtSettings = New PrinterSettings End If If chkSelAntes.Checked Then If seleccionarImpresora() = False Then Return End If If prtDoc Is Nothing Then prtDoc = New System.Drawing.Printing.PrintDocument AddHandler prtDoc.PrintPage, AddressOf prt_PrintPage End If ' la lnea actual lineaActual = 0 ' la configuracin a usar en la impresin prtDoc.PrinterSettings = prtSettings If esPreview Then Dim prtPrev As New PrintPreviewDialog prtPrev.Document = prtDoc prtPrev.Text = "Previsualizar documento" prtPrev.ShowDialog()
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
169
Else prtDoc.Print() End If End Sub Tal como podemos ver en la figura, el formulario (o cuadro de dilogo) de previsualizacin nos permite seleccionar el nmero de pgina a mostrar, si queremos ver una o ms pginas a un mismo tiempo, el porcentaje de ampliacin e incluso imprimir lo que estamos viendo, todos estas caractersticas ya estn incluidas en ese formulario.
El formulario de previsualizacin
La clase PrintPreviewControl
Si nuestra intencin es crear nuestro propio formulario de previsualizacin, tambin podemos hacerlo si usamos el control PrintPreviewControl que es el que la clase PrintPreviewDialog utiliza, si bien todos los botones y opciones tendremos que crearlos nosotros, para ello podemos usar los miembros especficos de este control, tales como: AutoZoom lo usaremos para que al cambiar el tamao del control se cambie tambin la pgina mostrada. Columns indica el nmero de pginas a mostrar cuando se elija la orientacin horizontal (apaisada). Document es donde asignaremos el objeto PrintDocument a imprimir. Rows indica el nmero de pginas a mostrar cuando elijamos la orientacin vertical. Zoom para indicar la ampliacin con la que queremos mostrar los documentos. StartPageChanged en un evento que se producir cada vez que cambiemos la pgina de inicio (este evento nos servir para crear un equivalente al NumericDropDown usado en la clase PrintPreviewDialog).
170
Si tambin quisiramos implementar un botn para imprimir, tendremos que manejar nosotros mismos la impresin, pero realmente resultara fcil, ya que lo nico que tendramos que hacer es llamar al mtodo Print del objeto PrintDocument asignado a la propiedad Document. Como siempre la ltima palabra la tendremos nosotros y dependiendo de lo que queramos hacer usaremos una clase u otra.
171
informacin que tenemos que mostrar, con total seguridad preferiremos "truncar" los datos de cadena antes que los numricos. En este tipo de situaciones si dejamos que el cdigo de la clase sea el que decida estos truncamientos, (realmente el cdigo de la clase no va a decidir nada, ya que tendremos que ser nosotros los que hagamos esa decisin), siempre ser preferible que tener que hacerlo en el propio evento de impresin, sobre todo si ese mismo evento es el que usaremos para imprimir datos de diferentes tipos, que pueden proceder de diferentes clases, pero si las clases usadas para contener los datos estn "preparadas" para imprimir el contenido de cada lnea, entonces resultar tan sencillo como llamar a un mtodo de cada una de esas clases... En el listado podemos ver cmo quedara el evento PrintPage si hiciramos algo de lo que acabamos de comentar. ' El evento usado mientras se imprime el documento Private Sub prt_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) ' Este evento se produce cada vez que se va a imprimir una pgina Dim lineHeight As Single Dim yPos As Single = e.MarginBounds.Top Dim leftMargin As Single = e.MarginBounds.Left Dim printFont As System.Drawing.Font ' Asignar el tipo de letra printFont = prtFont lineHeight = printFont.GetHeight(e.Graphics) Dim fontTitulo As New Font("Arial", 20, FontStyle.Bold) e.Graphics.DrawString("Listado de " & Ttulo, fontTitulo, _ Brushes.Black, leftMargin, yPos) yPos += fontTitulo.GetHeight(e.Graphics) ' imprimir la cabecera de la pgina yPos = Datos(0).CabeceraImpresin(e, printFont, yPos) ' imprimir cada una de las lneas de esta pgina Do yPos += lineHeight e.Graphics.DrawString(Datos(lineaActual).LineaImpresin, _ printFont, Brushes.Black, leftMargin, yPos) lineaActual += 1 Loop Until yPos >= e.MarginBounds.Bottom _ OrElse lineaActual >= Datos.Count If lineaActual < Datos.Count Then e.HasMorePages = True Else e.HasMorePages = False End If End Sub
172
2.- Despus lo que hacemos es insertar un DataSet de nuestra base de datos, si no sabes como hacerlo da clic aqu.
173
3.- Luego de eso agregamos un nuevo elemento, para esto damos clic derecho en nuestro proyecto > Agregar > Nuevo
Elemento. 4.- Tendremos un formulario como el siguiente en donde escogeremos la opcin de la izquierda, seleccionamos Reporting > Seleccionamos ahora Crystal Report > Le ponemos un nombre > y damos clic en Adjuntar.
174
5.- Ahora lo que veremos ser un wizard o ayudante que nos permitir crear un reporte de manera sencilla, debern entonces de ver una imagen como la siguiente y darle clic en ok. Dejen las opciones tal como las tengo en mi imagen.
6.- Lo siguiente es escoger de donde sacaremos los datos que mostraremos, para esto en la siguiente pantalla que se les mostrar que deber ser como la imagen que coloco abajo, ustedes debern escoger Datos del Proyecto > ADO.NET DataSets > EjemploReporteCrystal.BD_EjemploProcedimientosDataSet (Este es mi dataset que puse enante, entonces aqu colocan el de ustedes) > y escogen las tablas que utilizarn en su reporte, en mi caso escog 2, ya que utilizar datos de las 2 tablas > Presionamos el boton > para cada tabla que queramos utilizar en el reporte y una vez hecho esto damos en siguiente.
175
7.- En la siguiente pantalla veremos como estn relacionadas las tablas, no hay practicamente nada que explicar asi que damos clic en siguiente.
8.- Ahora en esta pantalla siguiente si hay que poner asunto, porque es aqu en donde diremos que campos de que tablas y en qu lugar los queremos en nuestro reporte, entonces vemos como tengo mis 2 tablas y escojo los datos que necesito de las 2, sin preocuparme de como estn relacionadas ni nada por el estilo, como ven en esta parte lo que hago es darle sentido a la forma de presentar mis datos.
176
9.- Luego de esto vendrn ciertas opciones como la que utilizar a continuacin que es de agrupar los datos en un cierto orden, y la forma que escogi de agruparlos es por gneros iguales, esto lo hago especificando en la parte de agrupamiento qu campo es el que quiero agrupar.
10.- Lo que sigue son ms opciones como les dije, pero en este momento yo ya le di en finalizar, ya que no necesito hacerle ms cosas a mi reporte, por ahora. Luego de dar clic en finalizar tendr una imagen como la que est abajo, la parte que tengo tachada es una parte que no quiero mostrar en ejecucin por tanto para ocultarlas les damos clic derecho en la parte gris y al desplegarse un men de opciones seleccionamos ocultar.
177
11.- Bien ahora regresamos y abrimos nuestro form, y buscamos nuestro origen de datos, si no lo vemos por ahi, damos clic en el men de Visual Studio en la opcin de Datos > Seleccionamos ver Origenes de Datos y listo, tendrn que poder ver su dataset con las tablas al lado como en la imagen. Pero bueno lo que debemos hacer con esto es arrastrar esas 2 tablas a mi formulario, y esto para qu es? pues es para colocar esos controles que ven abajo junto con el dataset que estn encerrados en el rectngulo verde, son controles que ya vienen cargados con datos necesarios y que no tendremos que ponerlos nosotros, por ejemplo ruta de la base de datos o metodos de conexin y desconexin, etc.
12.- Despus de poner esas tablas las sacamos junto con la barra que se pone en la parte superior, y deber quedarnos tener algo como lo que sigue.
178
13.- Luego de lo que hicimos vamos a la caja de herramientas y buscamos un control llamado CrystalReportViewer, lo arrastramos y colocamos en el formulario, este control ser el que nos permita vizualizar nuestro reporte hecho anteriormente.
14.- Entonces una vez hecho esto damos doble clic en el borde del form para entrar al metodo load del mismo y poner el codigo que sigue a continuacin. Aclarando un poco sobre ese cdigo, lo que hacen las 2 primeras lneas es filtrar los datos de las tablas indistintamente si estn relacionadas, las otras 3 lneas sirven para cargar nuestro reporte en el reportviewer que pusimos en el form, para esto cree un objeto llamado rpt del reporte(), que fue mi reporte que creamos hace rato, y en su propiedad SetDataSource le envie el dataset del proyecto que obviamente ya tiene los datos filtrado gracias a las 2 lneas primeras, por ltimo mande a cargar este reporte al control del form con su propiedad ReportSource.
179
16.- Ahora abramos el DataSet para crear algo extra, a continuacin lo que haremos es crear un mtodo que nos filtree solo los datos de las personas de gnero masculino. Para esto demos doble clic sobre el dataset o clic derecho y Open.
17.- Damos clic derecho sobre la tabla en la que crearemos el filtro > Adjuntar > Query.
180
18.- Lo que haremos a las siguientes 2 pantallas es simplemente darles clic en siguiente.
181
19.- Luego tendremos esto y lo que haremos es agregar otra tabla para relacionarla con la actual, para esto damos clic derecho en la parte blanca al lado de la tabla y en las opciones que se despliegan seleccionamos Adjuntar Tabla.
20.- Ya que nuestra Base de Datos solo posee 2 tablas solo podremos escoger 1, que es la tabla TGenero que es la que no tenemos puesta, la seleccionamos y damos clic en Adjuntar y luego en Cerrar.
21.- Como vemos a continuacin ya nos aparece la tabla que agregamos relacionada con la primera que teniamos, esto es debido a que ya desde que las creamos hicimos esta relacin; lo que sigue el como se ve en la imagen poner en la parte del medio o directamente en el query que necesitamos de la tabla TGenero el campo nombre_genero y que este nos servir como filtro, por eso colocamos en la parte de filtro la palabra =@nombre_genero adems debemos de sacar este campo de rea Select, ya que si lo dejamos ah no nos mostrar datos en nuestro reporte, o por lo menos eso es lo que me ha sucedido en la prctica, porque si lo ejecutamos en ese instante con el botn Execue Query si funciona normalmente pero con el Crystal Report encontre esa falla.
182
22.- Ya al haberle dado clic en OK debe de presentarnos la siguiente imagen en la cual veremos ya hecha nuestra sentencia query de consulta, damos clic en siguiente para continuar.
23.- Ahora le pondremos un nombre tanto en la parte donde dice Fill a DataTable como en Return a DataTable, damos clic en siguiente.
183
24.- Lo que viene es que ejecutar lo que hicimos en el DataSet y guardar los cambios, solo le damos clic en Finalizar.
25.- Ahora en el cdigo modificaremos la lnea que hacia el filtro en la tabla TPersona, en mi caso la puse como comentario, y coloqu la que cree recin, pueden ver que despus del DataSet le pongo una coma y le envio un parmetro, esto es debido a que en mi query le puse el @nombre_genero, entonces por cada parmetro as que pongamos en el query que hicimos debemos enviarlo aqu es esa lnea despus del DataSet en el orden que nos lo pide la instruccin; en ese cdigo yo puse la opcin masculino directamente, si nosotros la colocaramos o escogieramos desde un textbox o un combobox este sera el que pondramos ah con su propiedad text.
26.- Ya lo que queda es ejecutar la aplicacin y podremos ver que solo nos filtrar los datos de las personas de gnero masculino.
184
Qu es ADO.NET?
ADO.NET es la tecnologa principal para conectarse aun gestor de bases de datos, con un alto nivel de abstraccin, lo que nos permite olvidarnos de los detalles de bajo nivel de las bases de datos. Adems ADO.NET es una tecnologa inter operativa. Aparte del almacenamiento y recuperacin de datos, ADO.NET introduce la posibilidad de integrarse con el estndar XML, los datos pueden 'Serializarse' directamente a y desde XML lo que favorece el intercambio de informacin. ADO.NET proporciona diferentes clases del nombre de espacio System.Data dentro de las cules, destacaremos por encima de todas, la clase DataView, la clase DataSet y la clase DataTable. Este conjunto de clases de carcter armnico, funcionan de igual forma con la capa inferior que es la que corresponde a los proveedores de acceso a datos con los que podemos trabajar. Esto facilita el trabajo en n-capas y la posible migracin de aplicaciones que utilicen una determinada fuente de datos y deseemos en un momento dado, hacer uso de otra fuente de datos.
185
Dentro de ADO.NET tenemos dos partes importantes. La primera de ellas es la que corresponde con el nombre de espacio System.Data y que constituye los objetos y clases globales de ADO.NET. La otra parte es la que corresponde con los objetos que permiten el acceso a datos a una determinada fuente de datos desde ADO.NET y que utilizan as mismo, las clases del nombre de espacio System.Data. Esta ltima parte, queda constituida por las clases y objetos de los diferentes proveedores de acceso a datos como se muestra en la figura 1.
8.2. System.Data
Las clases del nombre de espacio System.Data son bastantes extensas y variadas. Quizs las clases ms importantes son la clase DataView, la clase DataSet y la clase DataTable.
La clase DataSet
El DataSet es una representacin de datos residente en memoria que proporciona una modelo de programacin relacional coherente independientemente del origen de datos que contiene. El DataSet contiene en s, un conjunto de datos que han sido volcados desde el proveedor de datos. Debemos tener en cuenta que cuando trabajamos con DataSets, el origen de datos no es lo ms importante, ya que ste, puede ser cualquier tipo de origen de datos. No tiene porqu ser una base de datos. Un DataSet contiene colecciones de DataTables y DataRelations. El DataTable contiene una tabla o tablas, mientras que la DataRelation contiene las relaciones entre las DataTables. Sin embargo, no es necesario especificar todo esto hasta el ltimo detalle como veremos ms adelante.
La clase DataView
Este objeto nos permite crear mltiples vistas de nuestros datos, adems de permitirnos presentar los datos. Es la clase que nos permite representar los datos de la clase DataTable, permitindonos editar, ordenar y filtrar, buscar y navegar por un conjunto de datos determinado.
La clase DataTable
Este objeto nos permite representar una determinada tabla en memoria, de modo que podamos interactuar con ella. A la hora de trabajar con este objeto, debemos tener en cuenta el nombre con el cul definamos una determinada tabla, ya que los objetos declarados en el DataTable es sensitivo a maysculas y minsculas.
187
Imports System.Data Imports System.Data.SqlClient Imports System.Xml Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim Conexion As String = "server=.;uid=sa;password=VisualBasic;database=MSDNVideo" Dim MiTabla As DataTable Dim MiColumna As DataColumn Dim MiDataSet As New DataSet() Dim Comando As New SqlDataAdapter("SELECT * FROM ALQUILERES", Conexion) Comando.Fill(MiDataSet, "ALQUILERES") ' Recorremos las tablas For Each MiTabla In MiDataSet.Tables TextBox1.Text += "Tabla: " & MiTabla.TableName & vbCrLf ' Recorremos las Columnas de cada Tabla For Each MiColumna In MiTabla.Columns TextBox1.Text += MiColumna.ColumnName & vbTab & "(" & MiColumna.DataType.Name & ")" & & vbCrLf Next Next Comando = Nothing End Sub End Class
Nuestro ejemplo en ejecucin es el que se muestra en la figura 1.
188 acceso de datos y es la responsable de establecer la comunicacin con las fuentes de datos. En este conjunto de nombres de espacio, encontraremos casi siempre las clases Connection, Command, DataAdapter y DataReader como las clases ms generales, las cuales nos permiten establecer la conexin con la fuente de datos.
Nota: Siempre que pueda, utilice para acceder a fuentes de datos, un proveedor de acceso a datos nativo. Esto le permitir aumentar considerablemente el rendimiento a la hora de establecer la conexin con una determinada fuente de datos
Los proveedores de acceso a datos que distribuye Microsoft en ADO.NET y algunos desarrollados por otras empresas o terceros, contienen los mismos objetos, aunque los
189 nombres de stos, sus propiedades y mtodos, pueden ser diferentes. Ms adelante veremos algn ejemplo, y observar en la prctica cules son estas diferencias ms destacables.
El objeto Connection
Este objeto es el encargado de establecer una conexin fsica con una base de datos determinada. Para establecer la conexin con una determinada fuente de datos, no slo debemos establecer la cadena de conexin correctamente, sino que adems deberemos usar los parmetros de conexin y el proveedor de acceso a datos adecuado. Con este objeto, podremos adems abrir y cerrar una conexin.
El objeto Command
Este objeto es el que representa una determinada sentencia SQL o un Stored Procedure. Aunque no es obligatorio su uso, en caso de necesitarlo, lo utilizaremos conjuntamente con el objeto DataAdapter que es el encargado de ejecutar la instruccin indicada.
El objeto DataAdapter
Este objeto es quizs el objeto ms complejo y a la vez complicado de todos los que forman parte de un proveedor de acceso a datos en .NET. Cuando deseamos establecer una comunicacin entre una fuente de datos y un DataSet, utilizamos como intermediario a un objeto DataAdapter. A su vez, un DataAdapter contiene 4 objetos que debemos conocer: SelectCommand es el objeto encargado de realizar los trabajos de seleccin de datos con una fuente de datos dada. En s, es el que se encarga de devolver y rellenar los datos de una fuente deb datos a un DataSet. DeleteCommand es el objeto encargado de realizar las acciones de borrado de datos. InsertCommand es el objeto encargado de realizar las acciones de insercin de datos. UpdateCommand es el objeto encargado de realizar las acciones de actualizacin de datos. Los objetos DeleteCommand, InsertCommand y UpdateCommand son los objetos que se
190 utilizan para manipular y transmitir datos de una fuente de datos determinada, al contrario del objeto SelectCommand que tan slo interacta con la fuente de datos para recuperar una porcin o todos los datos indicados en el objeto Command anteriormente comentado.
El objeto DataReader
Este objeto es el utilizado en una sola direccin de datos. Se trata de un objeto de acceso a datos muy rpido. Este objeto puede usar a su vez el objeto Command o el mtodo ExecuteReader.
El uso de DataBind
El mtodo DataBind se utiliza para rellenar de datos un determinado control o clase. Muchos controles y clases, posee este mtodo al que le asignaremos un conjunto de datos para que se rellene con ellos, pudiendo despus interactuar con los datos de forma directa. En s, un DataBinding es un enlace a datos que se encarga de rellenar de datos a un determinado control o clase. Como ejemplo de esto, veremos como rellenar un control TextBox con un dato utilizando este mtodo. Iniciaremos una nueva aplicacin Windows y escribiremos el siguiente cdigo fuente:
Imports System.Data Imports System.Data.SqlClient Imports System.Xml Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim Conexion As String = "server=.;uid=sa;password=VisualBasic;database=MSDNVideo" Dim MiDataSet As New DataSet() Dim Comando As New SqlDataAdapter("SELECT TITULO FROM ALQUILERES, PELICULAS WHERE PELICULACODBARRAS = CODBARRAS AND SOCIONIF = '111111'", Conexion) ' Rellenamos el DataSet con el contenido de la sentencia SELECT Comando.Fill(MiDataSet, "PELIS") ' Rellenamos el control TextBox1 con el dato correspondiente a la primera fila ' de la sentencia SELECT ejecutada TextBox1.DataBindings.Add("Text", MiDataSet,"PELIS.TITULO") Comando = Nothing End Sub End Class
Nuestro ejemplo en ejecucin es el que se muestra en la figura.
191
192 dado. Lo que s est claro es que el modelo de datos de ADO.NET que hemos visto, quedara resumido en cuanto a la conectividad de la manera en la que se representa en la figura
DataReader es rpido
Debido a su naturaleza y caractersticas, este objeto es bastante rpido a la hora de trabajar con datos. Como es lgico, consume adems menos memoria y recursos que un objeto DataSet por ejemplo. Sin embargo, dependiendo de las necesidades con las que nos encontremos, puede que este mtodo de acceso y trabajo no sea el ms idneo.
Imports System.Data
194
Imports System.Data.SqlClient Imports System.Xml Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim Conexion As String = "server=.;uid=sa;password=VisualBasic;database=MSDNVideo" Dim MiConexion As New SqlConnection(Conexion) Dim MiDataReader As SqlDataReader Dim Comando As New SqlCommand("SELECT TITULO FROM ALQUILERES, PELICULAS WHERE PELICULACODBARRAS = CODBARRAS AND SOCIONIF = '111111'", MiConexion) MiConexion.Open() MiDataReader = Comando.ExecuteReader() While MiDataReader.Read() TextBox1.Text += MiDataReader("TITULO") & vbCrLf End While Comando = Nothing MiConexion.Close() End Sub End Class
El cdigo de ejemplo en ejecucin es el que se muestra en la figura 1.
Sin embargo, el objeto DataReader contiene un conjunto de propiedades y mtodos que nos proporcionan acciones determinadas. Por ejemplo, en el ejemplo anterior, hemos dado por hecho que la ejecucin de la instruccin Select nos devolver uno o ms valores, pero podramos tambin saber antes de manipular y trabajar con los posibles datos, si hay o no informacin. Esto lo conseguimos con el mtodo HasRows.
195
Imports System.Data Imports System.Data.SqlClient Imports System.Xml Public Class Form1 Private Conexion As String = "server=.;uid=sa;password=VisualBasic;database=MSDNVideo" Private strSQL As String = "SELECT TITULO FROM ALQUILERES, PELICULAS WHERE PELICULACODBARRAS = CODBARRAS AND SOCIONIF = '111111'" Private MiConexion As New SqlConnection(Conexion) Private MiDataReader As SqlDataReader Private Contador As Long = 0 Private Posicion As Long = 0 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Establecemos la Conexin con la base de datos Establecer_Conexion(True) ' Si hay datos los mostramos, sino deshabilitamos la opcin (botn) para recorrerlos If Not MiDataReader.HasRows Then Button1.Enabled = False Else Button1_Click(sender, e) End If End Sub Private Sub Establecer_Conexion(ByVal bolAccion As Boolean) Dim Comando As SqlCommand If bolAccion Then ' True => Establecemos la conexin Comando = New SqlCommand(strSQL, MiConexion) ' Abrimos la Conexin MiConexion.Open() ' Ejecutamos la sentencia SQL MiDataReader = Comando.ExecuteReader() ' Obtenemos la cantidad de registros obtenidos Contador = MiDataReader.VisibleFieldCount() + 1
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
196
Else ' False => Finalizamos la conexin Button1.Enabled = False ' Cerramos la Conexin Comando = Nothing MiConexion.Close() End If End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' Recorremos los registros y los mostramos Posicion += 1 MiDataReader.Read() TextBox1.Text = MiDataReader("TITULO") ' Si hemos recorrido el objeto por completo, finalizamos la Conexin y ' deshabilitamos el control Button que nos permite recuperar los registros If Posicion = Contador Then Establecer_Conexion(False) End If End Sub End Class
Suponiendo que tenemos en nuestra base de datos varios registros, ejecute la aplicacin. Si todo ha ido como se esperaba, observaremos que nuestra aplicacin tiene un aspecto como el que se muestra en la figura
. Ejemplo en ejecucin del uso de DataReader en un ambiente conectado, forzando la desconexin de la fuente de datos
En este punto, detenga el servicio de SQL Server y pulse el botn Siguiente >>. Observar que la aplicacin sigue funcionando. En este punto se har la pregunta que todos nos hemos hecho, no es el objeto DataReader un objeto conectado?, cmo es posible que funcione si hemos detenido el servicio de SQL Server?. La respuesta es sencilla. El objeto DataReader recupera un nutrido conjunto de valores llenando un pequeo buffer de datos e informacin.
197 Si el nmero de registros que hay en el buffer se acaban, el objeto DataReader regresar a la fuente de datos para recuperar ms registros. Si el servicio de SQL Server est detenido en ese momento o en su caso, la fuente de datos est parada, la aplicacin generar un error a la hora de leer el siguiente registro. En s, DataReader es un objeto conectado, pero trabaja en background con un conjunto de datos, por lo que a veces nos puede resultar chocante su comportamiento como el ejemplo que comento.
Imports System.Data Imports System.Data.SqlClient Imports System.Xml Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Declaramos las variables a utilizar Dim Conexion As String = "server=.;uid=sa;password=VisualBasic;database=MSDNVideo" Dim strSQL As String = "SELECT TITULO FROM ALQUILERES, PELICULAS WHERE PELICULACODBARRAS = CODBARRAS AND SOCIONIF = '111111'" Dim MiConexion As New SqlConnection(Conexion) Dim MiDataReader As SqlDataReader Dim MiDataTable As New DataTable Dim Comando As SqlCommand ' Establecemos la Conexin con la base de datos Comando = New SqlCommand(strSQL, MiConexion) ' Abrimos la Conexin MiConexion.Open() ' Ejecutamos la sentencia SQL MiDataReader = Comando.ExecuteReader()
198
' Cargamos los resultados en el objeto DataTable MiDataTable.Load(MiDataReader, LoadOption.OverwriteChanges) ' Volcamos los datos en el control DataGridView DataGridView1.DataSource = MiDataTable ' Cerramos la Conexin Comando = Nothing MiConexion.Close() End Sub End Class
Nuestro ejemplo en ejecucin es el que podemos ver en la figura
Imports System.Data Imports System.Data.SqlClient Imports System.Xml Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Declaramos las variables a utilizar Dim Conexion As String =
199
"server=.;uid=sa;password=VisualBasic;database=MSDNVideo" Dim strSQL As String = "SELECT TITULO FROM ALQUILERES, PELICULAS WHERE PELICULACODBARRAS = CODBARRAS AND SOCIONIF = '111111'" Dim MiConexion As New SqlConnection(Conexion) Dim MiDataReader As SqlDataReader Dim MiDataTable As New DataTable Dim Comando As SqlCommand ' Establecemos la Conexin con la base de datos Comando = New SqlCommand(strSQL, MiConexion) ' Abrimos la Conexin MiConexion.Open() ' Ejecutamos la sentencia SQL MiDataReader = Comando.ExecuteReader() ' Leemos el primer registro y as nos posicionamos a partir del segundo de ellos MiDataReader.Read() ' Cargamos los resultados en el objeto DataTable MiDataTable.Load(MiDataReader, LoadOption.OverwriteChanges) ' Volcamos los datos en el control DataGridView DataGridView1.DataSource = MiDataTable ' Cerramos la Conexin Comando = Nothing MiConexion.Close() End Sub End Class
En este caso, lo que ocurre como ya hemos comentado, es que los datos que se cargan son los que an no han sido ledos en el objeto DataReader, por lo que se mostrarn todos los datos desde el ltimo ledo hasta llegar al final del objeto.
200
Imports System.Data Imports System.Data.SqlClient Imports System.Xml Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal eAs System.EventArgs) Handles MyBase.Load ' Declaramos las variables a utilizar Dim Conexion As String = "server=.;uid=sa;password=VisualBasic;database=MSDNVideo" Dim strSQL As String = "SELECT TITULO FROM ALQUILERES, PELICULAS WHERE PELICULACODBARRAS = CODBARRAS AND SOCIONIF = '111111'" Dim MiConexion As New SqlConnection(Conexion) Dim MiDataReader As SqlDataReader Dim MiDataTable As New DataTable Dim Comando As SqlCommand ' Establecemos la Conexin con la base de datos Comando = New SqlCommand(strSQL, MiConexion) ' Abrimos la Conexin MiConexion.Open() ' Ejecutamos la sentencia SQL MiDataReader = Comando.ExecuteReader() ' Cargamos los resultados en el objeto DataTable MiDataTable.Load(MiDataReader, LoadOption.OverwriteChanges) ' Volcamos los datos en el control TextBox BindingSource1.DataSource = MiDataTable BindingNavigator1.BindingSource = BindingSource1
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
201
TextBox1.DataBindings.Add(New Binding("Text", BindingSource1, "TITULO", True)) ' Cerramos la Conexin Comando = Nothing MiConexion.Close() End Sub End Class
202 El objeto DataAdapter forma parte del proveedor de acceso a datos, tal y como se muestra en la figura
203
Imports System.Data Imports System.Data.SqlClient Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Establecemos la cadena de conexin con la BBDD Dim Conexion As String = "server=.;uid=sa;password=VisualBasic;database=MSDNVideo" ' Declaramos el DataSet dnde volcaremos los datos Dim MiDataSet As New DataSet() ' Declaramos el DataAdapter estableciendo ' la conexin con la fuente de datos SQL Dim Comando As New SqlDataAdapter("SELECT SocioNIF, FechaAlquiler FROM ALQUILERES", Conexion) ' Rellenamos el DataSet con el contenido de la instruccin Comando.Fill(MiDataSet) ' Cerramos la conexin con la BBDD Comando = Nothing ' Declaramos la propiedad Row para recorrer ' las filas contenidas en el DataSet Dim Row ' Recorremos todas las filas y las tratamos For Each Row In MiDataSet.Tables(0).Rows TextBox1.Text += Row("SocioNIF").ToString & vbTab &
204
Row("FechaAlquiler") & vbCrLf Next ' Vaciamos el DataSet para liberar memoria MiDataSet = Nothing End Sub End Class
El ejemplo en ejecucin del uso de DataAdapter junto con las clases de .NET es el que se muestra en la figura
Ejemplo del acceso a datos con DataAdapter a travs de las clases de .NET
205
206
server=.;uid=sa;password=VisualBasic;database=MSDNVideo
Entendiendo que sta, es la cadena de conexin vlida con nuestra base de datos. A continuacin aadiremos el componente SqlDataAdapter a nuestro formulario. Si se abre alguna ventana, cirrela. Vamos a configurar el control con la ventana Propiedades. Podramos haberlo hecho desde el asistente que se nos ha abierto, pero lo vamos a hacer de otra forma menos sencilla. Sitese sobre la propiedad SelectCommand, y dentro de sta, en la propiedad Connection. Lo que vamos a hacer, es asignar al componente SqlDataAdapter el componente de conexin que vamos a usar para establecer la comunicacin entre la fuente de datos y nuestra aplicacin. Despliegue la propiedad Connection indicada, y seleccione el componente de conexin SqlConnection1 anteriormente configurado, tal y como se muestra en la figura.
207
Componente SqlDataAdapter con la conexin establecida para ser usada en la ejecucin de nuestra aplicacin
Por ltimo, inserte un componente DataSet al formulario. Todos los componentes quedarn por lo tanto insertados, tal y como se indica en la figura
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Establecemos la cadena SQL a utilizar SqlDataAdapter1.SelectCommand.CommandText = "SELECT
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
208
SocioNIF, FechaAlquiler FROM ALQUILERES" ' Abrimos la Conexin SqlConnection1.Open() ' Rellenamos el DataSet con el contenido de la instruccin SQL SqlDataAdapter1.Fill(DataSet1) ' Cerramos la Conexin SqlConnection1.Close() ' Declaramos la propiedad Row para recorrer las filas contenidas en el DataSet Dim Row ' Recorremos todas las filas y las tratamos For Each Row In DataSet1.Tables(0).Rows TextBox1.Text += Row("SocioNIF").ToString & vbTab & Row("FechaAlquiler") & vbCrLf Next End Sub End Class
Ahora nos queda nicamente ejecutar nuestra aplicacin para estudiar el resultado final. Este es el que se puede ver en la figura
209
Nota: El DataSet permanece desconectado de la fuente de datos y si realizamos una modificacin o alteracin de los datos de un DataSet, estos no son propagados a la fuente de datos. Para ello, el DataAdapter debe recibir la orden que queramos ejecutar.
El objeto DataAdapter se encargar de llamar al comando apropiado para cada una de las filas
210 que han sido modificadas en un determinado DataSet. Esto lo realizar siempre a travs del mtodo Update.
server=.;uid=sa;password=VisualBasic;database=MSDNVideo
A continuacin seleccionaremos el componente SqlDataAdapter y modificaremos la propiedad SelectCommand > Connection como vimos en el captulo anterior. De la lista de posibles conexiones que le aparezca, seleccione la conexin SqlConnection1. Finalmente, inserte un control Button y un control DataGridView en el formulario. ste quedar como se indica en la figura.
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Establecemos la cadena SQL a utilizar SqlDataAdapter1.SelectCommand.CommandText = "SELECT NIF, Nombre, Apellido1,
211
Apellido2, Telefono, Email, Direccion, Ciudad, Provincia, CP FROM SOCIOS" ' Abrimos la Conexin SqlConnection1.Open() ' Rellenamos el DataSet con el contenido de la instruccin sql SqlDataAdapter1.Fill(DataSet1, "Ejemplo") ' Cerramos la Conexin SqlConnection1.Close() ' Asociamos el control DataGridView al DataSet DataGridView1.DataSource = DataSet1.Tables("Ejemplo") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' Declaramos un objeto DataRow para insertar en l los nuevos datos Dim MiDataRow As Data.DataRow ' Creamos una nueva fila en el DataSet MiDataRow = DataSet1.Tables("Ejemplo").NewRow() ' Insertamos los datos en el DataSet MiDataRow("NIF") = "222222" MiDataRow("Nombre") = "Mara" MiDataRow("Apellido1") = "Jurez" MiDataRow("Apellido2") = "Fernndez" MiDataRow("Telefono") = "1112233" MiDataRow("Email") = "mara@cuentademail.com" MiDataRow("Direccion") = "C\ Fernndez de los Ros, 77" MiDataRow("Ciudad") = "Valladolid" MiDataRow("Provincia") = "Valladolid" MiDataRow("CP") = "11111" DataSet1.Tables("Ejemplo").Rows.Add(MiDataRow) ' Si el DataSet tiene cambios ? If DataSet1.HasChanges Then ' Indicamos la instruccin SQL correspondiente SqlCommand1.CommandText = "INSERT INTO SOCIOS(NIF, Nombre, Apellido1, Apellido2, Telefono, Email, Direccion, Ciudad, Provincia, CP) VALUES(@NIF, @Nombre, @Apellido1, @Apellido2, @Telefono, @Email, @Direccion, @Ciudad, @Provincia, @CP)" ' Establecemos para el comando, la (conexin) que utilizaremos SqlCommand1.Connection = SqlConnection1 ' Le indicamos al DataAdapter, cul es el comando de insercin que usaremos SqlDataAdapter1.InsertCommand = SqlCommand1 ' Aadimos los parmetros y comandos correspondientes ' para cada campo a aadir en la base de datos
212
SqlCommand1.Parameters.Add("@NIF", Data.SqlDbType.NChar, 10, "NIF") SqlCommand1.Parameters.Add("@Nombre", Data.SqlDbType.NVarChar, 50, "Nombre") SqlCommand1.Parameters.Add("@Apellido1", Data.SqlDbType.NVarChar, 50, "Apellido1") SqlCommand1.Parameters.Add("@Apellido2", Data.SqlDbType.NVarChar, 50, "Apellido2") SqlCommand1.Parameters.Add("@Telefono", Data.SqlDbType.NVarChar, 13, "Telefono") SqlCommand1.Parameters.Add("@Email", Data.SqlDbType.NVarChar, 50, "Email") sqlCommand1.Parameters.Add("@Direccion", Data.SqlDbType.NVarChar, 100, "Direccion") SqlCommand1.Parameters.Add("@Ciudad", Data.SqlDbType.NVarChar, 50, "Ciudad") SqlCommand1.Parameters.Add("@Provincia", Data.SqlDbType.NVarChar, 50, "Provincia") SqlCommand1.Parameters.Add("@CP", Data.SqlDbType.NChar, 5,"CP") ' Abrimos la conexin SqlConnection1.Open() ' Realizamos la insercin de datos desde el DataSet a travs del DataAdapter SqlDataAdapter1.Update(DataSet1, "Ejemplo") ' Cerramos la conexin SqlConnection1.Close() ' Indicamos con un mensaje que la insercin de datos se ha realizado con xito MessageBox.Show("Datos insertados correctamente") End If End Sub End Class
Por ltimo, ejecute la aplicacin. Si todo ha ido correctamente, los datos habrn quedado correctamente insertados en la base de datos. Un ejemplo de nuestra aplicacin en ejecucin es la que puede verse en la figura
213
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Establecemos la cadena SQL a utilizar SqlDataAdapter1.SelectCommand.CommandText = "SELECT NIF, Nombre, Apellido1, Apellido2, Telefono, Email, Direccion, Ciudad, Provincia, CP FROM SOCIOS" ' Abrimos la Conexin SQL SqlConnection1.Open() SqlDataAdapter1.Fill(DataSet1, "Ejemplo") ' Cerramos la Conexin SqlConnection1.Close() ' Asociamos el control DataGridView al DataSet DataGridView1.DataSource = DataSet1.Tables("Ejemplo") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' En nuestro ejemplo, sabemos que queremos modificar ' la fila 2, columna 4 (todos los elementos empiezan por 0) DataSet1.Tables("Ejemplo").Rows(1)(4) = "1112234" ' Si el DataSet tiene cambios ?
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
214
If DataSet1.HasChanges Then ' Indicamos la instruccin SQL correspondiente SqlCommand1.CommandText = "UPDATE SOCIOS SET Telefono=@Telefono WHERE NIF=@NIF" ' Establecemos para el comando, la (conexin) que utilizaremos SqlCommand1.Connection = SqlConnection1 ' Le indicamos al DataAdapter, cul es el comando de actualizacin que usaremos SqlDataAdapter1.UpdateCommand = SqlCommand1 ' Aadimos los parmetros y comandos orrespondientes ' para cada campo a actualizar en la base de datos SqlCommand1.Parameters.Add("@NIF", Data.SqlDbType.NChar,10, "NIF") SqlCommand1.Parameters.Add("@Nombre", Data.SqlDbType.NVarChar, 50, "Nombre") SqlCommand1.Parameters.Add("@Apellido1", Data.SqlDbType.NVarChar, 50, "Apellido1") SqlCommand1.Parameters.Add("@Apellido2", Data.SqlDbType.NVarChar, 50, "Apellido2") SqlCommand1.Parameters.Add("@Telefono", Data.SqlDbType.NVarChar, 13, "Telefono") SqlCommand1.Parameters.Add("@Email", Data.SqlDbType.NVarChar, 50, "Email") SqlCommand1.Parameters.Add("@Direccion", Data.SqlDbType.NVarChar, 100, "Direccion") SqlCommand1.Parameters.Add("@Ciudad", Data.SqlDbType.NVarChar, 50, "Ciudad") SqlCommand1.Parameters.Add("@Provincia", Data.SqlDbType.NVarChar, 50, "Provincia") SqlCommand1.Parameters.Add("@CP", Data.SqlDbType.NChar, 5, "CP") ' Abrimos la conexin SqlConnection1.Open() ' Realizamos la actualizacin de datos desde el DataSet a travs del DataAdapter SqlDataAdapter1.Update(DataSet1, "Ejemplo") ' Cerramos la conexin SqlConnection1.Close() ' Indicamos con un mensaje que la actualizacin de datos se ha realizado con xito MessageBox.Show("Datos actualizados correctamente") End If End Sub End Class
Nuestro ejemplo en ejecucin es el que se puede ver en la figura 1.
215
De igual forma sucede con la eliminacin de datos utilizando para ello el objeto DataAdapter junto al objeto DataSet. Utilizaremos nuevamente en este caso, la base del ejemplo anterior (componentes y controles), y escribiremos el siguiente cdigo:
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Establecemos la cadena SQL a utilizar SqlDataAdapter1.SelectCommand.CommandText = "SELECT NIF,Nombre, Apellido1, Apellido2, Telefono, Email, Direccion, Ciudad,Provincia, CP FROM SOCIOS" ' Abrimos la Conexin SqlConnection1.Open() ' Rellenamos el DataSet con el contenido de la instruccin SQL SqlDataAdapter1.Fill(DataSet1, "Ejemplo") ' Cerramos la Conexin SqlConnection1.Close() ' Asociamos el control DataGridView al DataSet DataGridView1.DataSource = DataSet1.Tables("Ejemplo") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' En nuestro ejemplo, sabemos que queremos eliminar ' la fila 2 (todos los elementos empiezan por 0) por lo que la fila 2 es aqu la 1 DataSet1.Tables("Ejemplo").Rows(1).Delete()
216
' Si el DataSet tiene cambios ? If DataSet1.HasChanges Then ' Indicamos la instruccin SQL correspondiente SqlCommand1.CommandText = "DELETE SOCIOS WHERE NIF=@NIF" ' Establecemos para el comando, la (conexin) que utilizaremos SqlCommand1.Connection = SqlConnection1 ' Le indicamos al DataAdapter, cul es el comando de eliminacin que usaremos SqlDataAdapter1.DeleteCommand = SqlCommand1 ' Aadimos los parmetros y comandos correspondientes ' para cada campo a actualizar en la base de datos SqlCommand1.Parameters.Add("@NIF", Data.SqlDbType.NChar,10, "NIF") SqlCommand1.Parameters.Add("@Nombre", Data.SqlDbType.NVarChar, 50, "Nombre") SqlCommand1.Parameters.Add("@Apellido1", Data.SqlDbType.NVarChar, 50, "Apellido1") SqlCommand1.Parameters.Add("@Apellido2", Data.SqlDbType.NVarChar, 50, "Apellido2") SqlCommand1.Parameters.Add("@Telefono", Data.SqlDbType.NVarChar, 13, "Telefono") SqlCommand1.Parameters.Add("@Email", Data.SqlDbType.NVarChar, 50, "Email") SqlCommand1.Parameters.Add("@Direccion", Data.SqlDbType.NVarChar, 100, "Direccion") SqlCommand1.Parameters.Add("@Ciudad", Data.SqlDbType.NVarChar, 50, "Ciudad") SqlCommand1.Parameters.Add("@Provincia", Data.SqlDbType.NVarChar, 50, "Provincia") SqlCommand1.Parameters.Add("@CP", Data.SqlDbType.NChar, 5,"CP") ' Abrimos la conexin SqlConnection1.Open() ' Realizamos la eliminacin de datos desde el DataSet a travs del DataAdapter SqlDataAdapter1.Update(DataSet1, "Ejemplo") ' Cerramos la conexin SqlConnection1.Close() ' Indicamos con un mensaje que la eliminacin de datos se ha realizado con xito MessageBox.Show("Datos eliminados correctamente") End If End Sub End Class
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
217
218 origen de fuentes de datos vlido. Para esta tarea, deberemos configurar la fuente de datos que vamos a utilizar, algo que vamos a aprender a hacer a continuacin.
219
La ventana orgenes de datos podemos situarla dnde deseemos dentro de Visual Studio
En este punto, la ventana de orgenes de datos, quedar anclada en el entorno de desarrollo, como se muestra en la figura
220
221
222
223
224 En la ventana de Orgenes de datos y en concreto con la tabla Socios desplegada, centraremos nuestra atencin en el campo NIF como se indica en la figura
Lista desplegable con la opcin Label seleccionada como campo de la tabla desplegada
En este caso, la ventana de Orgenes de datos quedar informada tal y como se indica en la figura
225
Tabla Socios seleccionada en la ventana de Orgenes de datos Si hacemos clic sobre la lista desplegable, aparecer una lista de opciones o posibilidades, para indicar cmo queremos que sean los campos de la tabla seleccionada con respecto a que tipo de controles queremos que sean. Esto es lo que se indica en la figura
Representa los datos volcados dentro de un control DataGridView Representa los datos volcados dentro de controles estndar como TextBox u otros controles para reflejarla como Detalle de la informacin
No representa ningn control como tipo de control de volcado de datos En el caso de la tabla Socios que usaremos como tabla padre, cambiaremos la representacin por defecto de DataGridView para indicarle que nos represente la informacin en controles, tal y como se indica en la figura
226
Tabla Socios seleccionada en la ventana de Orgenes de datos como Detalle Ahora que tenemos la tabla maestra ya preparada, pasaremos a preparar la tabla hija.
Campos AlquilerID y SocioNIF de la tabla Alquileres Sobre el campo AlquilerID y SocioNIF, haremos una pequea modificacin. Pulse sobre la lista desplegable que aparece a la derecha del campo AlquilerID y SocioNIF y seleccione la opcin Label como se indica en la figura
227
Lista desplegable de opciones de un campo de la tabla desplegada De esta manera, el campo AlquilerID y SocioNIF quedarn modificados en la ventana Orgenes de datos como se indica en la figura
Campo AlquilerID y SocioNIF modificados en la ventana de Orgenes de datos A continuacin, haremos clic sobre la tabla Alquileres como se indica en la figura, y posteriormente presionaremos sobre la lista desplegable que aparece a la derecha de la tabla.
228
Para presentar la informacin como detalle, arrastraremos la tabla Socios de la ventana Orgenes de datos sobre el formulario Windows
Observaremos que Visual Studio, generar por nosotros un conjunto de componentes y controles, que por defecto tendr una apariencia similar a la que se presenta en la figura
229
230
Para presentar la informacin de la tabla Alquileres, arrastraremos la tabla de la ventana Orgenes de datos sobre el formulario Windows
Como podemos observar, el entorno de trabajo ha hecho por nosotros el trabajo ms complejo para representar los datos de forma rpida y sencilla. El esquema de datos tipados, apareca ya en nuestro proyecto cuando asignamos el correspondiente origen de datos. Ahora lo que ha ocurrido, es que al arrastrar y soltar la tabla padre Socios de la ventana de Orgenes de datos, en el entorno se ha aadido un componente de nombre MSDNVideoDataSet que es el que permitir relacionar el DataSet tipado con nuestros datos. Este componente ser usado por la relacin maestro detalle de las dos tablas aadidas al formulario. En la figura, podemos ver el esquema aadido a nuestro proyecto, y el componente del que estamos hablando.
231
Observar por lo tanto, que los datos entre detalle y maestra, no estn relacionados. Si navegamos a travs de los datos de detalle a travs del objeto SociosBindingNavigator, el control DataGridView no representa la relacin de los datos seleccionados. Esto es lo que se muestra en la figura.
232 los datos de la tabla maestra, y acceda a la ventana de Propiedades. Dentro de la ventana de Propiedades, acceda a la propiedad DataSource como se indica en la figura.
233
234 ventana de Orgenes de datos, podemos seleccionar diferentes campos de las tablas y cambiar el tipo de control en el que queremos representar sus datos. A continuacin veremos un breve ejemplo de como manipular datos para que nos sirva de aprendizaje de cmo hacer esto posible.
Modificando datos
Ejecute la aplicacin de ejemplo que hemos diseado hasta ahora y sitese en alguno de sus campos. Centrndonos en la informacin de la tabla Socios, cambiaremos un campo determinado, como el que se muestra en la figura
235
236
237
238
239
DataView con filtro. Como hemos comentado anteriormente, a partir de un DataTable podemos obtener varios filtros mediante distintos objetos DataView, sin que ello
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
240
suponga una penalizacin en el consumo de recursos. Para demostrar este punto, la opcin Vistas + Combinada, crea una vista basada en un filtro combinado, y una vista normal, ambas empleando la misma tabla base. Veamos el Cdigo fuente Private Sub mnuCombinada_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuCombinada.Click ' tomar la tabla Customers del dataset y aplicar... ' ...filtro combinado por dos campos y depositar en un datagrid Dim oDataView As New DataView() oDataView.Table = oDataSet.Tables("Customers") oDataView.RowFilter = "ContactTitle LIKE '%Manager%' AND Country IN ('Spain','USA')" Me.grdDatos.CaptionText = "Filtro combinado por campos ContactTitle y Country" Me.grdDatos.DataSource = oDataView ' ...filtro por un campo y depositar en otro datagrid Dim oDV As New DataView() oDV.Table = oDataSet.Tables("Customers") oDV.RowFilter = "ContactName LIKE '%an%'" Me.grdDatosBIS.CaptionText = "Filtro por campo ContactName" Me.grdDatosBIS.DataSource = oDV End Sub La Figura muestra el formulario con los diversos filtros establecidos
241
242
243
DataView ordenando las filas por la columna Country. oDataView.Sort = "Country, PostalCode" Tambin es factible asignar a un DataView una combinacin de filtro y ordenacin, utilizando en la misma operacin las propiedades RowFilter y Sort. El men del formulario Ordenacin + Con filtro realiza este trabajo, que vemos en el Cdigo fuente . Private Sub mnuOrdenFiltro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuOrdenFiltro.Click Dim oDataView As New DataView() oDataView.Table = oDataSet.Tables("Customers") ' establecer un filtro al dataview oDataView.RowFilter = "Country='USA'" ' ordenar las filas del filtro oDataView.Sort = "City" Me.grdDatos.CaptionText = "Filtrar por USA. Ordenar por campo City" Me.grdDatos.DataSource = oDataView End Sub Los datos con el filtro y orden podemos verlos en el DataGrid del formulario, que muestra la Figura .
244
245
oDataAdapter = New SqlDataAdapter("SELECT * FROM Orders", oConexion) oDataAdapter.Fill(oDataSet, "Orders") oDataAdapter = Nothing oDataAdapter = New SqlDataAdapter("SELECT * FROM Products", oConexion) oDataAdapter.Fill(oDataSet, "Products") oDataAdapter = Nothing oDataAdapter = New SqlDataAdapter("SELECT * FROM Territories", oConexion) oDataAdapter.Fill(oDataSet, "Territories") oDataAdapter = Nothing ' crear un objeto tabla y columna para mostrar ' la informacin del esquema que el dataset contiene Dim oDataTable As DataTable Dim oDataColumn As DataColumn Me.lstEsquema.Items.Add("Estructura del DataSet") ' recorrer la coleccin de tablas del DataSet For Each oDataTable In oDataSet.Tables Me.lstEsquema.Items.Add("Tabla: " & oDataTable.TableName) Next ' recorrer la coleccin de columnas de la tabla For Each oDataColumn In oDataTable.Columns Me.lstEsquema.Items.Add("Campo: " & _ oDataColumn.ColumnName & " --- " & _ "Tipo: " & oDataColumn.DataType.Name) Next End Sub La Figura muestra el ListBox relleno con el esquema del DataSet tras haber pulsado el botn del formulario.
246
247
Algoritmo Calcular Salario de un empleado Clase Empleado 1.- Declaraciones :Datos NombreEmpleado: Cadena HorasTrabajadas: Entero PagoHora: Real Salario: Real 2.- Metodo EstablecerNombre( nom: cadena) NombreEmpleado = nom Fin Metodo EstablecerNombre 3.- Metodo Establecerhoras(horas: Entero) HorasTrabajadas = horas Fin Metodo EstablecerHoras 4.- Metodo EstablecerPago( pago: Real) PagoHora = pago Fin Metodo EstablecerPago 5.-Metodo CalcularSalario( ) If HorasTrabajadas<= 40 Then Salario = HorasTrabajadas * PagoHora Else Salario= (40*PagoHora)+ (( HorasTrabajadas -40) *( PagoHora * 2)) Endif Fin Metodo EstablecerNombre 6.- Metodo ObtenerNombre() : Cadena Return NombreEmpleado Fin Metodo ObtenerNombre 7.- Metodo ObtenerSalario( ) : Real Return Salario Fin Metodo ObtenerSalario
Public Class Empleado 'Declaraciones de Datos Private NombreEmpleado As String Private HorasTrabajadas As Integer Private PagoHora As Double Private Salario As Double Public ReadOnly Property obtenerNombre() As String ' bloque Get obtener para devolver el valor de la propiedad Get Return NombreEmpleado End Get End Property Public WriteOnly Property establecerNombre() As String ' bloque Set (Establecer) para asignar valor a la propiedad Set(ByVal Value As String) NombreEmpleado = Value End Set End Property Public ReadOnly Property obtenerHoras() As Integer ' bloque Get para devolver el valor de la propiedad Get Return HorasTrabajadas End Get End Property
248
Public WriteOnly Property EstablecerHoras() As Integer ' bloque Set para establecer valor a la propiedad Set(ByVal hora As Integer) HorasTrabajadas = hora End Set End Property Public WriteOnly Property EstablecerPago() As Double ' bloque Get para devolver el valor de la propiedad Set(ByVal value As Double) PagoHora = value End Set End Property
Public ReadOnly Property ObtenerPagoHora() As Double ' bloque Set para estsblecer el valor a la propiedad Get Return PagoHora End Get End Property Public Sub CalcularSalario() ' en este mtodo calculamos el salario del empleado If HorasTrabajadas <= 40 Then Salario = HorasTrabajadas * PagoHora Else Salario = (40 * PagoHora) + ((HorasTrabajadas - 40) * (PagoHora * 2)) End If End Sub Public ReadOnly Property ObtenerSalario() As Double Get Return Salario End Get End Property End Class
249
Clase EjecutaEmpleado
Rem Clase Ejecuta Empleado (Esta se encuentra en el Form) Public Class Form1 Public NEmple As String Dim HT As Double Dim PagoH As Double Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'Declarar e iniciar objeto Dim objEmpleado As Empleado objEmpleado = New Empleado() 'Trasladar datos a las variables NEmple = TextBox1.Text HT = Val(TextBox2.Text) PagoH = Val(TextBox3.Text) 'Metodos establecer objEmpleado.establecerNombre = NEmple objEmpleado.EstablecerPago = PagoH objEmpleado.EstablecerHoras = HT 'Metodo Calcular objEmpleado.CalcularSalario() 'Metodos obtener datos Label4.Text = "Empleado " & UCase(objEmpleado.obtenerNombre) Label5.Text = "Pago por hora " & objEmpleado.ObtenerPagoHora Label6.Text = "Salario " & objEmpleado.ObtenerSalario End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click End End Sub End Class
PagoH: Real Declarar, crear e iniciar objeto Empleado Empleado() Solicitar nombre, nmero de horas, pago por hora Leer NEmple, HT, PagoH Establecer objempleado.EstablecerNombre(NEmple) objEmpleado.EstablecerHoras(HT) objEmpleado = new
objEmpleado.EstablecerPago(PagoH)
Calcular ObjEmpleado.CalcularSalario() Imprimir objEmpleado.ObtenerNombre() objEmpleado.ObtenerSalario() Fin Metodo principal Fin clase EjecutaEmpleado
250
Algoritmo PresentaDia de la semana Clase PresentaDia Declaraciones Datos NumDia : Entero NombreDia : Cadena Metodo EstablecerNDia( num: Entero) NumDia = Num Fin de mtodo EstablecerDia Metodo CalcularNombredia() Swith NumDia 1: Nombredia = Domingo 2: Nombredia = Lunes 3: Nombredia = Martes 4: Nombredia = Mircoles 5: Nombredia = Jueves 6: Nombredia = Viernes 7: Nombredia = Sbado DEFAULT NombreDia = No est en el rango de 1 a 7 ENDSWITCH Fin Metodo CalcularNombreDia Metodo ObtenerNombreDia() : Cadena Return NombreDia Fin Metodo ObtenerDia Fin clase PresentaDia
Public Class PresentaDia REM Declaraciones de Datos Private INumDia As Integer Public SNombreDia As String ' Metodo obtener nombreDia de solo escritura ReadOnly Property Nombre() As String Get Nombre = SNombreDia End Get End Property 'Metodo establecer Numero del Dia solo lectura WriteOnly Property Dia() As Integer Set(ByVal value As Integer) INumDia = value End Set End Property ' Metodo CalcularNombredia() Public Sub CalcularDia() Select Case (INumDia) Case 1 SNombreDia = "Domingo" Case 2 SNombreDia = "Lunes" Case 3 SNombreDia = "Martes" Case 4 SNombreDia = "Miercoles" Case 5 SNombreDia = "Jueves" Case 6 SNombreDia = "Viernes" Case 7 SNombreDia = "Sabado" Case Else SNombreDia = "No existe ese dia" End Select End Sub End Class
251
Clase EjecutaPresentaDia Metodo Principal Declaraciones Variables Ndia : Entero Declarar, crear e iniciar objeto PresentaDia Objdia = new PresentaDia Solicitar numero de dia Leer Ndia Establecer Objdia.EstablecerNDia(Ndia) Calcular ObjDia.CalcularNombreDia() Obtener ObjDia.ObtenerNombreDia() Fin Metodo Principal Fin Clase EjecutaPresentaDia
Public Class Form1 REM programa con clases utilizando seleccion multiple REM Elaborar un algoritmo que dado un numero del 1 al 7, el programa imprima por pantalla Domingo ,si es 1, Lunes, si es 2 Sbado, si es 7. Dim INdia As Integer ' Declara la instancia de la clase Dim objDia As PresentaDia Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click End End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click objDia = New PresentaDia objDia.Dia = Val(TextBox1.Text) objDia.CalcularDia() ' presentar el nombre del dia Label2.Text = "El dia de la semana es " & objDia.Nombre End Sub End Class
252
Clase Empleado Declaraciones Datos NombreE : Cadena HorasT : Entero PagoH : Real Sueldo : Real Metodo EstablecerNombreE(nom Cadena) NombreE = nom Fin mtodo EstablecerNombreE :
Metodo EstablecerHorasT (Horas : Enterol) HorasT = Horas Fin de mtodo EstablecerHorasT. Metodo EstablecerPagoH( Pago : Real) PagoH = Pago Fin Metodo EstablecerPagoH Metodo CacularSueldo() Sueldo = HorasT * PagoH Fin mtodo CalcularSueldo Metodo ObtenerNombreE(): Cadena Return NombreE Fin Metoddo ObtenerNombreE
253
Public Class Form1 Dim ObjEmpleado As Empleado Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click ObjEmpleado = New Empleado ' Recibir datos ObjEmpleado.Nombre = TextBox1.Text ObjEmpleado.Horas = Val(TextBox2.Text) ObjEmpleado.Pago = Val(TextBox3.Text) ' Procesar salario ObjEmpleado.CalcularSueldo() Label4.Text = "El empleado " & Clase EjecutaEmpleado Metodo Principal Declaraciones Variables NomEmple : Cadena HTraba : Entero PagoHora : Real Desea : Carcter Do Declarar, crear e iniciar objeto Empleado objEmpleado = new Empleado() Solicitar Nombre, horas trabajadas, cuota por hora Leer nomEmple, HTraba,PagoHora Establecer ObjEmpleado.EstablecerNombreE(NomEmple) ObjEmpleado.EstablecerHorasT(HTraba) ObjEmpleado.EstablecerPagoH(PagoHora) Calcular ObjEmpleado.CalcularSueldo() Imprimir ObjEmpleado.ObtenerNombreE() ObjEmpleado.Obtenersueldo() Preguntar Desea procesar otro empleado (S/N) ? Leer Desea WHILE Desea = S Fin Metodo principal Fin clase EjecutaEmpleado ObjEmpleado.Nombre & " tiene un salario de " & ObjEmpleado.Salario Dim otros As String otros = InputBox("Otro proceso S/N") If UCase(otros) = "S" Then TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" Label4.Text = "" TextBox1.Focus() End If End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click End End Sub End Class
254
Clase Obrero 1.- Declaraciones Datos Produccin: Arreglo[30] : Entero 2.- Mtodo establecerProduccion(pro[]: Entero) Produccin = pro Fin mtodo establecerProduccion 3.- Metodo obtenerProduccion(): Arreglo[] Entero Return produccin Fin mtodo obtenerProduccion Fin Clase Obrero
Clase Ejecutaobrero 1.- Metodo principal Declaraciones Variables Prod, prod2:arreglo[30] Entero I : Entero Declarar, crear e iniciar objeto Obrero objObrero = new Obrero() For i = 0; i<=29; i++ Solicitar produccin del dia i +1 Leer prod[i ] EndFor Establecer objObrero.establecerProduccion(prod) Obtener Prod2 = objObrero.obtenerProduccion() For i = 0 ; i <= 29: i++ Imprimir prod[i] EndFor Fin Metodo principal Fin Clase EjecutaObrero
255
Clase empleado Declaraciones: Datos # nombreEmpleado : cadena # deptoEmple : cadena # puestoTrabajo: cadena Mtodo establecerNombre(nom : cadena) nombreEmpleado = nom Fin mtodo establecerNombre Mtodo establecerDepto(dep: cadena) depatoEmple = dep Fin de mtodo establecerDepto Mtodo establecerPuesto(pues : cadena) puestoTrabajo = pue fin mtodo establecerPuesto Metodo obtenerNombre() : cadena Return nombreEmpleado Fin mtodo obtenerNombre Mtodo obtenerPuesto() : cadena Return puestoTrabajo Fin mtodo obtenerPuesto Mtodo obtenerDpto() : cadena Return deptoEmple Fin mtodo obtenerDpto Fin clase empleado
256
Clase EmpleadoPor Hora Declaraciones Datos horasTrabajadas : Entero cuotaHora : Real SueldoQnal : Real Metodo establecerHoras(horasT : Entero) horasTrabajadas = horasT Fin mtodo establecerHoras Metodo establecerCuota(cuotaH : Real) cuotaHora = cuotaH Fin mtodo establecerCuota Metodo calcularSueldoQnal() SueldoQnal = horasTrabajadas * cuotaHora Fin mtodo CalcularSueldoQnal Metodo obtenerSueldoQnal() : Real Return sueldoQnal Fin mtodo obtenerSueldoQnal Fin Clase EmpleadoPorHoras
Clase EmpleadoAsalariado Declaraciones Datos SueldoQnalAsal : Real SueldoMensual : Real Mtodo calcularrSueldoQnalAsal() SueldoQnalAsal = SueldoMensual/2 Fin mtodo calcularSueldoQnalAsal Mtodo establecerSueldoMensual(sdo : Real) SueldoMensual = sdo Fin mtodo establecersueldoMensual Metodo obtenerSueldoQnalAsal() : Real Return SueldoQnalAsal Fin mtodo obtenerSueldoQnalAsal Fin clase EmpleadoAsalariado
257
Clase EjecutaEmpleado Metodo principal Declaraciones Variables nomEmple, depto, puesto : cadena hrsTra,TipoEmp : Entero cuoH, SdoMen : Real desea : carcter Do Imprimir men y solicitar tipo de empleado Tipos de empleados 1.- Empleado por Horas 2.- Empleado asalariado Teclee tipo Leer tipoEmp Solicitar Nombre, departamento y puesto Leer nomEmple, depto, puesto If tipoEmple = 1 then Crear objeto EmpleadoPorHora objEmpleado = new EmpleadoPorHora() Solicitar nmero de horas trabajadas y cuota por hora Leer hrsTra, cuoH Establecer objEmpleado. establecerNombre(nomEmple) objEmpleado.establecerDepto(depto) objEmpleado.establecerPuesto(puesto) objEmpleado. establecerHoras(hrsTra) objEmpleado.establecerCuota(cuoH ) objEmpleado. establecerHoras(hrsTra) objEmpleado.establecerCuota(cuoH) Calcular objEmpleado. calcularSueldoQnal() Visualizar objEmpleado. obtenerNombre() objempleado.obtenerPuesto() objEmpleado.obtenerDpto() objEmpleado. obtenerSueldoQnal() Else Crear objeto EmpleadoAsalariado objEmpleado = new empleadoAsalariado() Solicitar sueldo mensual Leer SdoMen
258
Establecer objEmpleado. establecerNombre(nomEmple) objEmpleado.establecerDepto(depto) objEmpleado.establecerPuesto(puesto) objEmpleado. establecerSueldoMensual(SdoMen) Calcular objEmpleado. calcularSueldoQnalAsal() Visualizar objEmpleado. obtenerNombre() objempleado.obtenerPuesto() objEmpleado.obtenerDpto() objEmpleado. obtenerSueldoQnalAsal() Endif Preguntar Desea procesar otro empleado S/N)? Leer Desea WHILE Desea = S Fin metodo principal Fin clase EjecutaEmpleado
259
Clase abstracta Empleado2 Declaraciones Datos # nombreEmpleado: Cadena # deptoEmple : Cadena # puestoTrabajo : Cadena # SueldoQna: Real Metodo establecerNombre(nom: Cadena) nombreEmpleado = nom Fin mtodo establecerNombre Mtodo establecerDepto(dep: cadena) deptoEmple = dep Fin de mtodo establecerDepto Mtodo establecerPuesto(pues : cadena) puestoTrabajo = pue fin mtodo establecerPuesto Metodo abstracto calcularSueldoQna() Metodo obtenerNombre() : cadena Return nombreEmpleado Fin mtodo obtenerNombre Mtodo obtenerPuesto() : cadena Return puestoTrabajo Fin mtodo obtenerPuesto Mtodo obtenerDpto() : cadena Return deptoEmple Fin mtodo obtenerDpto Mtodo obtenerSueldoQna() : Real Return SueldoQna Fin mtodo obtenerDpto Fin clase Empleado2
260
Clase EmpleadoPor Hora2 Empleado2 Declaraciones Datos horasTra : Entero cuotaHora : Real
hereda
de
Metodo establecerHoras(horasT : Entero) horasTrab = horasT Fin mtodo establecerHoras Metodo establecerCuota(cuotaH : Real) cuotaHora = cuotaH Fin mtodo establecerCuota Metodo calcularSueldoQna() SueldoQnal = horasTrabajadas * cuotaHora Fin mtodo CalcularSueldoQna Fin Clase EmpleadoPorHora2
Clase EmpleadoAsalariado2 Declaraciones Datos SueldoMensual : Real Mtodo calcularrSueldoQnalAsal() SueldoQnalAsal = SueldoMensual/2 Fin mtodo calcularSueldoQnalAsal Metodo obtenerSueldoQnalAsal() : Real Return SueldoQnalAsal Fin mtodo obtenerSueldoQnalAsal Fin clase EmpleadoAsalariado2
261
Clase EjecutaEmpleado2 Metodo principal Declaraciones Variables nomEmple, depto, puesto : cadena hrsTra,TipoEmp : Entero cuoH, SdoMen : Real desea : carcter Do Imprimir men y solicitar tipo de empleado Tipos de empleados 1.- Empleado por Horas 2.- Empleado asalariado Teclee tipo Leer tipoEmp Solicitar Nombre, departamento y puesto Leer nomEmple, depto, puesto If tipoEmple = 1 then Crear objeto EmpleadoPorHora2 objEmpleado = new empleadoPorHora2() Solicitar nmero de horas trabajadas y cuota por hora Leer hrsTra, cuoH Establecer objEmpleado. establecerNombre(nomEmple) objEmpleado.establecerDepto(depto) objEmpleado.establecerPuesto(puesto) objEmpleado.establecerSueldoMensual(SdoMen) Calcular objEmpleado.calcularSueldoQnalAsal() Visualizar objEmpleado.obtenerNombre() objempleado.obtenerPuesto() objEmpleado.obtenerDpto() objEmpleado.obtenerSueldoQnalAsal Endif Preguntar Desea procesar otro empleado (S/N)? Leer Desea WHILE Desea = S Fin mtodo principal Fin clase EjecutaEmpleado2