Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manual POO III Unidad Visual Basic Ver 2011 02
Manual POO III Unidad Visual Basic Ver 2011 02
pagina 4
pagina 10
pagina 17
pagina 27
pagina 67
pagina 119
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
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.
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.
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)
Simbolo
%
&
!
#
Caracter
S
I
L
F
R
11
Decimal
UShort
UInteger
Ulong
String
D
US
UI
UL
$
As
System.Object,
ByVal
As
End Enum
Observemos el siguiente ejemplo:
Private Enum valores As Integer
Valor1 = 3
Valor2 = 5
Valor3 = 7
End Enum
12
As
System.Object,
ByVal
As
As
System.Object,
ByVal
As
13
As
System.Object,
ByVal
As
Lugar de Declaracin
Alcance o mbito
Public
Mdulo o Clase
Protected
Clase
Friend
Clase
En el Assemblie.
Private
Mdulo
Solo en el mdulo.
Dim
Procedimiento
Solo en el Procedimiento.
Static
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
15
OPERACIN
Suma
Resta
Multiplicacion
Division flotante
Division Entera
Potencia
Modulo
= 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
16
Otro ejemplo;
alfa = 108 MOD 10;
Ejercicios de programacion
Resolver algebraicamente en papel las siguientes ecuaciones expresndolas en
formato de Visual Basic NET
1.2.3.-
(correcto)
Ordenes de operacion
17
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
20
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.
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
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.
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(){}.
25
26
27
As
System.Object,
ByVal
As
As
System.Object,
ByVal
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
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
Significado
Igual
<
Menor que
>
Mayor que
<>
Diferente que
<=
>=
Descripcion
Es verdadero si las expresiones comparadas son
iguales
Es verdadero si la expresin de la izquierda es
menor que la expresin de la derecha
Es verdadero si la expresin de la izquierda es
mayor que la expresin de la derecha
Es verdadero si la expresin de la izquierda es
diferente de la expresin de la derecha
Es verdadero si la expresin de la izquierda es
menoro igual que la expresin de la derecha
Es verdadero si la expresin de la izquierda es
mayor o igual que la expresin de la derecha
If condicion Then
Instrucciones cuando la condicion sea cierta
Else
Instrucciones cuando la condicion sea falsa
End If
As
32
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
OrElse
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
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
34
PRIMERA
SIMPLE
C
C
F
F
CONDICION SEGUNDA
SIMPLE
C
F
C
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
SEGUNDA
CONDICION
SIMPLE
C
C
C
C
F
F
F
F
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
As
System.Object,
ByVal
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
Programa ejemplo :
Private Sub Button1_Click(ByVal sender
System.EventArgs) Handles Button1.Click
As
System.Object,
ByVal
As
37
As
System.Object,
ByVal
As
Notas:
Se esta usando un objeto listbox con
NAME = LISTA para procesar el conjunto
de datos. O se usan muchos webcontrols
label o textbox para desplegar todo lo que
despliega el ciclo for o se esta usando
mejor un objeto listbox para procesar el
conjunto de datos. Se esta usando la
propiedad add de la coleccion items del
control listbox (lista). Observar que para
encadenar strings en visual basic se usa el
signo &
El metodo items.clear, es porque cuando
el usuario usa el click ms de una vez, el
control listbox los va agregando de nuevo
abajo, por eso en cuanto se activa el
onclick lo primero que se realiza es limpiar
el listbox.
Docente: Univ. Nac. De Ingenieria, Managua
38
As
System.Object,
ByVal
As
39
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
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.
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.
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
FEBRERO
20
MARZO
30
ABRIL
40
60
70
80
90
100
110
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
As
Next
' DESPLEGANDO
Dim SValores As String =
For I = 0 To 10
SValores += MiArreglo(I)
Next
MessageBox.Show(SValores.trim)
End Sub
0 2 4 6 8 10 12 14 16 18 20
PROCESO
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
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
As
System.Object,
ByVal
As
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.
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
As
System.Object,
ByVal
As
48
Corrida:
49
50
51
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.
52
53
54
55
Descripcin
General Date
Short Date
Short Time
Standard
Currency
Percent
56
' "19/07/2002"
' "18:25"
' "1.804,00"
' "1.804 pta"
' "180400,00%"
Descripcin
Separador de hora.
Separador de fecha.
ddd
dddd
dd
MM
MMM
MMMM
yy
yyyy
HH
mm
ss
57
Separador de millar.
Separador decimal.
Caracteres de formato para la funcin Format( ).
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.
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
As
System.Object,
ByVal
As
59
End Sub
Sub PROC1()
Label2.Text = EDAD.Text * 12
End Sub
Corrida
Actividades de reforzamiento de lo
aprendido
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
As
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
61
Actividad de reforzamiento de lo
aprendido
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
Ejemplo;
if suma >= 10 then
funcion50 = 300
else
funcion50 = 20
end if
As
System.Object,
ByVal
As
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.
65
System.Object,
ByVal
As
ByVal
As
66
ByVal
As
67
68
69
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
71
Descripcin
Button
Botn de pulsacin
Label
Etiqueta de literal
72
TextBox
Cuadro de texto
ListBox
Lista de valores
ComboBox
Lista de valores
desplegable, y cuadro
CheckBox
de texto
Casilla de verificacin
RadioButton
Botn autoexcluyente
GroupBox
Caja de agrupacin de
controles
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.
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
El control de este formulario, que vamos a emplear para las operaciones de seleccin
76
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.
78
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
Textbox1.focus
End Sub
5.8.-Funcin InputBox:
La funcin InputBox presenta un mensaje al usuario, permitindole ingresar un valor
en una caja de texto:
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
82
83
84
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
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
87
88
89
90
91
92
As
System.Object,
ByVal
As
As
System.Object,
ByVal
As
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.
94
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
97
98
99
100
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
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
104
105
106
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
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
109
110
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.
111
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 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.
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
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
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
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.
123
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
127
128
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.
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
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
133
134
135
136
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
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
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
145
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
147
148
149
150
Persona
Cliente
Empleado
Clase base
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.
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
End Class
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
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.
156
157
158
159
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
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
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.
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
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
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
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
186
preocupemos de lo que hay al otro lado.
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
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.
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
193
modificar la conexin con el comando establecido.
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.
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
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.
201
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
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
208
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.
211
212
213
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:
216
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
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
225
226
227
228
229
230
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.
el
componente
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
240
241
242
243
244
245
246
247
Return NombreEmpleado
Fin Metodo ObtenerNombre
7.- Metodo ObtenerSalario( ) : Real
Return Salario
Fin Metodo ObtenerSalario
248
249
Clase EjecutaEmpleado
Metodo Principal
Declaraciones
Variables
NEmple : Cadena
HT:
Entero
PagoH: Real
Declarar, crear e iniciar objeto
Empleado
objEmpleado
new
Empleado()
Solicitar nombre, nmero de horas,
pago por hora
Leer NEmple, HT, PagoH
Establecer
objempleado.EstablecerNombre(NEmple)
objEmpleado.EstablecerHoras(HT)
objEmpleado.EstablecerPago(PagoH)
Calcular ObjEmpleado.CalcularSalario()
Imprimir objEmpleado.ObtenerNombre()
objEmpleado.ObtenerSalario()
Fin Metodo principal
Fin clase EjecutaEmpleado
250
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
252
Solucin:
Clase Empleado
Declaraciones
Datos
NombreE : Cadena
HorasT : Entero
PagoH : Real
Sueldo : Real
Metodo
EstablecerNombreE(nom
Cadena)
NombreE = nom
Fin mtodo EstablecerNombreE
Get
Salario = Sueldo
End Get
End Property
Public Sub CalcularSueldo()
Sueldo = HorasT * PagoH
End Sub
End Class
253
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
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 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
260
hereda
de
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