Está en la página 1de 261

1

LENGUAJE VISUAL BASIC NET


Indice:
1.- Elementos bsicos de Visual Basic NET
1.1.-Introduccion a Visual Basic NET
1.2.- Plataforma .NET
1.3.- Entorno de ejecucin CLR
1.4.- El Lenguaje Intermedio y el CLS
1.5.- La biblioteca de clases de .NET
1.6.-Los espacios de nombres
1.7.- Acceso a datos con ADO.NET
1.8.- Aplicaciones Windows Forms

pagina 4

2.- Elementos del Lenguaje Visual Basic


2.1.- Variables Visual Basic NET
2.2.- Constantes en Visual Basic NET
2.3.- Listas enumeradas
2.4.- Estructuras
2.5.- Ambito de variables
2.6.- Operadores aritmticos
2.7.- Jerarqua de las operaciones
2.8.- Orden de las operaciones
2.9.- Comentarios en Visual Basic NET

pagina 10

3.- Programas, formas y componentes de Visual Basic NET


3.1.- Programa ejemplo de Visual Basic NET
3.2.- Otros componentes
3.3.- Dos o ms forms en Visual Basic NET

pagina 17

4.- Estructuras, ciclos, decisiones en visual Basic NET


4.1.-Instrucciones condicionales en Visual Basic
4.2.- Operadores relacionales en Visual Basic
4.3.- Instrucciones If Then Else en Visual Basic
4.4.- Condiciones compuestas en Visual Basic
4.5.- Instrucciones de control
4.6.- Ciclos For To Next
4.7.- Ciclo Do Loop While
4.8.- Arreglos en Visual Basic
4.9.- Funciones del lenguaje integradas
4.10.- Procedimientos o sub rutinas en Visual Basic

pagina 27

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

5.- Programando con controles en Visual Basic


5.1- El cuadro de herramienta
5.2.-Controles Window Basicos
5.3.- Control Label
5.4.- Control TextBox
5.5. Control Button
5.6.- Foco de entrada
5.7.- Funciones para presentar mensajes
5.8.- Funcion InputBox()
5.9- Funcion MsgBox()
5.10.- Codificando con los eventos de controles
5.11.- Codificando otros eventos de control
5.12.- Orden de tabulacin de los controles
5.13.- Control ListBox
5.14.- Control Combobox
5.15.- Control CheckBox
5.16.- Controles RadioButton y GroupBox
5.17.- Controles tipo men
5.18.- Controles avanzados de Visual Basic
Control temporizadores (Timer)
Control ImageList
Control ToolBar
Control StatusBar
Control DateTimePiker
Control NumericUpDown
Control DomainUpDown
Control MonthCalender
Control LinkLabel
Control NotifyIcon

pagina 67

6.- Programacion Orientada a Objeto (POO) en Visual Basic


6.1.- Que es una clase
6.2.- Crear la primea clase
6.3.- Propiedades de solo lectura y escritura
6.4.- Agregar mtodos a una clase
6.5.- Agregar evento a una clase
6.6.- Crear una instancia de clase
6.7.- Como utilizar los constructores
6.8.- Como utilizar los destructores
6.9.- Como utilizar los miembros datos compartidos
6.10.- Como utilizar los mtodos compartidos

pagina 119

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

6.11.- Polimorfismo en Visual Basic NET


6.12.- Probar controladores de eventos
6.13.- Herencia de clases en Visual Basic NET

7.- Impresin en Visual Basic


pagina 172
7.1.- La solucion: Como imprimier en .NET
7.2.- Las clases para imprimir en .NET
Clase PrintDocument
Clase PrintSetting
Clase PrintDialog
Clase PrintPreviewDialog
Calse PrintPreviewControl
7.4.- Conclusion Imprimir en .NET es fcil
7.5.-Hacer Crystal Report con DataSet en Visual Basic.NET
8.- Acceso a Datos con ADO.NET en Visual Basic
pagina 184
8.1.- Acercandonos a ADO.NET
8.2.- SystemData
8.3.- Los proveedores de acceso a datos
8.4.- El concepto DataBinding
8.5.- Otras consideraciones
8.6.- El paradigama de conexin
8.7.- Conociendo el objeto DataReader
8.8.- Un primer contacto con el objeto DataReader
8.9.- Trabaja DatReader en un ambiente conectado realmente?
8.10.- Usando DataSource con DataReader
8.11.- Usando componentes de acceso a datos de .NET
8.12.- Esquema general de la estrucutra desconectada de acceso a datos
8.13.- Conociendo el objeto DataAdapter
8.14.- Insertando datos a travs del Objeto DataAdapter
8.15.- Actualizando datos a travs del objeto DataAdapter
8.16.- Eliminando datos a travs del objeto DataAdapter
8.17.- Qu son los datos Maestro Detalle?
8.18.- Configurando la fuente de datos
8.19.- Preparando el origen de datos
8.20.- Inscrustando los datos Maestro Detalle
8.21.- Manipulando los datos.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

1.- ELEMENTOS BASICOS DE VISUAL BASIC NET


1.1.- Introduccion a Visual Basic NET
Informacin y Conocimiento son los dos elementos claves del nuevo milenio ninguna
sociedad podr alcanzar ni puede ignorar este nuevo esquema ya las naciones no se
miden por su riqueza industrial, ni sus activos fsicos, ni por su poder militar, sino por la
cantidad de informacin que produce y consume, as como por la recombinacin de
informacin nueva en un conocimiento de grado superior.
Nuevos sistemas de informacin, tienden a ser cada vez de mayor alcance y
complejidad sobre todo cuando se toman en cuenta las nuevas necesidades de
informacin y conocimiento que demandan las nuevas organizaciones.
VISUAL BASIC NET es un lenguaje de programacion desarrollado por Microsoft muy
apropiado para construir sistemas de informacion basados en red o mejor aun en
internet.

1.2.- Plataforma .NET


Es un amplio conjunto de bibliotecas o libreras de desarrollo que pueden ser utilizadas
por otras aplicaciones para acelerar enormemente el desarrollo y obtener de manera
automtica caractersticas avanzadas de seguridad, rendimiento, etc... .NET permite
compilar, depurar,y ejecutar aplicaciones .NET.
Desde que apareci la primera versin de Microsoft.NET Framework 1.0 en Visual
Studio 2002, hasta la ultima versin del 2010 se vienen realizando mejoras continuas
que permiten realizar una mejor integracin de todos los componentes en aplicaciones
mas robustas y completas del mercado para la tecnologa de desarrollo de Microsoft.
Microsoft.Net Framework es una apliacion que se iintegra en el entorno de desarrollo
de forma fcil y transparente al programador, el cualse utiliza para ayudarnos a
desarrollar de forma rpida, correcta, segura y en el menor tiempo posible nuestras
aplicaciones.

1.3.- Entorno de ejecucin CLR


.NET ofrece un entorno de ejecucin para sus aplicaciones conocido como Common
Language Runtime o CLR. La CLR es la implementacin de Microsoft de un estndar
llamado Common Language Infrastructure o CLI. ste fue creado y promovido por la
propia Microsoft pero desde hace aos es un estndar reconocido mundialmente por el
ECMA.
El CLR/CLI esencialmente define un entorno de ejecucin virtual independiente en el

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

1.4.- El Lenguaje Intermedio y el CLS


Al contrario que otros entornos, la plataforma .NET no est atada a un
determinado lenguaje de programacin ni favorece a uno determinado frente a
otros. En la actualidad existen implementaciones para varias decenas de
lenguajes que permiten escribir aplicaciones para la plataforma .NET. Los ms
conocidos son Visual Basic .NET, C# o J#, pero existen implementaciones de todo
tipo, incluso de COBOL!.

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

1.5.- La biblioteca de clases de .NET


Todo lo que se ha estado comentando hasta ahora en el curso constituye la base de la
plataforma .NET. Si bien es muy interesante y fundamental, por s mismo no nos servira
de mucho para crear programas si debisemos crear toda la funcionalidad desde cero.
Obviamente esto no es as, y la plataforma .NET nos ofrece infinidad de funcionalidades
"de fbrica" que se utilizan como punto de partida para crear las aplicaciones. Existen
funcionalidades bsicas (por ejemplo todo lo relacionado con la E/S de datos o la
seguridad) y funcionalidades avanzadas en las que se fundamentan categoras enteras
de aplicaciones (acceso a datos, creacin de aplicaciones Web...).
Toda esta funcionalidad est implementada en forma de bibliotecas de funciones que
fsicamente se encuentran en diversas DLL (bibliotecas de enlazado dinmico).
A su conjunto se le denomina Base Classes Library (Biblioteca de clases base o BCL) y
forman parte integral de la plataforma .NET, es decir, no se trata de aadidos que se
deban obtener o adquirir aparte.

La siguiente figura ilustra a vista de pjaro la arquitectura conceptual de la plataforma


.NET. En ella se pueden observar los elementos que se han mencionado en apartados
anteriores (lenguajes, CLR, CLS...) y en qu lugar de se ubican las bibliotecas de clases
base:

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

1.6.- Los espacios de nombres


Dada la ingente cantidad de clases que existen debe existir algn modo de organizarlas
de un modo coherente. Adems hay que tener en cuenta que podemos adquirir ms
funcionalidades (que se traducen en clases) a otros fabricantes, por no mencionar que
crearemos continuamente nuevas clases propias. Para solucionar este problema
existen en todos los lenguajes .NET los espacios de nombres o namespaces. Un
espacio de nombres no es ms que un identificador que permite organizar de modo
estanco las clases que estn contenidas en l as como otros espacios de nombres.

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

1.7.- Acceso a datos con ADO.NET


El acceso a fuentes de datos es algo indispensable en cualquier lenguaje o lataforma de
desarrollo. La parte de la BCL que se especializa en el acceso a datos se denomina de
forma genrica como ADO.NET.

Si usted ha programado con Visual Basic 6.0 o con ASP, ha empleado en su cdigo con
total seguridad la interfaz de acceso a datos conocida como ADO (ActiveX Data
Objects), puede que combinado con ODBC (Open Database Connectivity). Si adems es
usted de los programadores con solera y lleva unos cuantos aos en esto es probable
que haya usado RDO o incluso DAO, todos ellos mtodos mucho ms antiguos.

ADO.NET ofrece una funcionalidad completamente nueva, que tiene poco que ver con
lo existente hasta la fecha en el mercado. Sin embargo, con el nimo de retirar barreras
a su aprendizaje, Microsoft denomin a su nuevo modelo de acceso a datos con un
nombre similar y algunas de sus clases recuerdan a objetos de propsito anlogo en el
vetusto ADO.

ADO.NET es un modelo de acceso mucho ms orientado al trabajo desconectado de las


fuentes de datos de lo que nunca fue ADO. Si bien este ltimo ofreca la posibilidad de
desconectar los Recordsets y ofreca una forma de serializacin de estos a travs de las
diferentes capas de una aplicacin, el mecanismo no es ni de lejos tan potente como el
que nos ofrece ADO.NET.

El objeto ms importante a la hora de trabajar con el nuevo modelo de acceso a datos


es el DataSet. Sin exagerar demasiado podramos calificarlo casi como un motor de
datos relacionales en memoria. Aunque hay quien lo asimila a los clsicos Recordsets su
funcionalidad va mucho ms all como se ver en el correspondiente mdulo.

1.8.- Aplicaciones Windows Forms


Las aplicaciones de escritorio son aquellas basadas en ventanas y controles comunes de
Windows que se ejecutan en local. Son el mismo tipo de aplicaciones que antes
construiramos con Visual Basic 6 u otros entornos similares.

En la plataforma .NET el espacio de nombres que ofrece las clases necesarias para
construir aplicaciones de escritorio bajo Windows se denomina Windows Forms. Este
es tambin el nombre genrico que se le otorga ahora a este tipo de programas
basados en ventanas.
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

Windows Forms est constituido por multitud de clases especializadas que ofrecen
funcionalidades para el trabajo con ventanas, botones, rejillas, campos de texto y todo
este tipo de controles habituales en las aplicaciones de escritorio. Visual Studio ofrece
todo lo necesario para crear visualmente este tipo de programas, de un modo similar
aunque ms rico al que ofreca el entorno de desarrollo integrado de Visual Basic.

Diseador de interfaces de aplicaciones de escritorio con Windows Forms en Visual Studio

Este es el aspecto que presenta parte del cdigo que genera la interfaz mostrada en
la anterior figura:

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

2.- Elementos del Lenguaje Visual Basic


2.1.- VARIABLES VISUAL BASIC NET
Identificadores son conjuntos de letras y/o numeros que se utilizan para simbolizar
todos los elementos que en un programa, son definibles por el usuario (programador o
ingeniero de software) del mismo, como son las variables donde se almacenan datos,
funciones (pequenos modulos con codigo), etiquetas, clases, objetos, etc.
En VISUAL BASIC NET un identificador es una palabra compuesta de letras y/o numeros
de hasta 32 caracteres significativos, empezando siempre con una letra.
Una variable se define como un identificador que se utiliza para almacenar todos los
datos generados durante la ejecucion de un programa.
Existen ciertas reglas en cuanto a variables:
Claras y con referencia directa al problema.
No espacios en blanco, ni simbolos extranos en ellas.
Se pueden usar abreviaturas, pero solo de caracter general.
No deben ser palabras reservadas del lenguaje.
Ejemplos de buenas variables:
Nombre, Edad, SdoDiario, IngMensual, Perimetro, Calif1, etc.

2.1.1.- Declaracion y tipos de datos


En Visual Basic NET a toda variable que se use en un programa, se le debe asociar
(generalmente al principio del programa) un tipo de dato especifico.
Un tipo de dato define todo el posible rango de valores que una variable puede tomar
al momento de ejecucion del programa y a lo largo de toda la vida util del propio
programa. Los tipos de datos ms comunes en Visual Basic NET son:
Tipo
Rango
BYTE
0-255
INTEGER(%) +-2,147,483,698
SINGLE(!) 3.4E+-38(7 DECIMALES)
DOUBLE(#) 1.8E+308(16 DECIMALES)
CURRENCY 15 DIG IZQ 4 DIG DEECHA
STRING($) 2 BILLONES CHARS
BOOLEAN TRUE, FALSE
DATE
FECHA

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

10

VARIANT

TODOS LOS TIPOS y mas usado en este curso

Recordar Tambien que en Visual Basic NET toda variable usada en un programa se
debera declarar al principio del programa el formato de declaracion mas sencillo es:
DIM VARIABLE AS TIPO
Ejemplos
DIM ALFA AS INTEGER
DIM ALFA AS LONG, BETA AS LONG
DIM ALFA AS INTEGER, NOMBRE AS STRING
DIM CIUDAD AS STRING * 20, ALFA AS DOUBLE
Observar ltimo caso de ciudad asi de esta manera se consigue una string de tamano
definido.
En Visual Basic NET un problema comun a lo largo de este curso, es la necesidad de
convertir variables numericas a strings y tambien el problema inverso es decir
convertir strings a su representacion numerica.
Para este ltimo problema por ejemplo se tiene:
DIM ALFA AS STRING
ALFA = 3.1416
Como se observa del ejemplo anterior, se puede dar en algun momento la necesidad
de convertir la string ALFA a su valor numerico, para resolver este problema se
deberan usar las siguientes funciones de conversion numerica que proporciona Visual
Basic NET.
En Visual Basic NET para el ejemplo anterior se tendria:
DIM ALFA AS STRING
DIM BETA AS SINGLE
ALFA = 3.1416
BETA= CINT (ALFA)

Nota: Estamos usando una funcin de


Visual Basic para tomar solo el valor
entero de ALFA

Tambien podemos declarar variables utilizando unos smbolos o caracteres detrs de


las variables que indiquen el tipo de variable utilizada, la tabla muestra estos smbolos:
Tipo de dato
Short
Integer
Long
Single
Double

MSc. Ing. Jorge J. Prado D.

Simbolo
%
&
!
#

Caracter
S
I
L
F
R

Docente: Univ. Nac. De Ingenieria, Managua

11

Decimal
UShort
UInteger
Ulong
String

D
US
UI
UL
$

Tipos de datos Objetos


Object es un tipo de datos de forma implicitay del cual heredan el resto de tipos de
datos

2.2.- Constantes en Visual Basic NET


Formato:
Const variables As tipo = valor
Ejemplos
Private Sub Button1_Click(ByVal sender
System.EventArgs) Handles Button1.Click

As

System.Object,

ByVal

As

Const PI as double = 3.1416


Dim valor As decimal
Valor = (2 * PI) ^2
MessageBox.show(Valor)
End sub

2.3.- Listas enumeradas


Son listas de variables o datos que hacen referencia a ndices y estos empiezan desde
0 en adelante. El formato que se utiliza es el siguiente:
Private Enum <Nombre_Variable> As <Tipo_Dato>
<Variable> = Valor_asignado

End Enum
Observemos el siguiente ejemplo:
Private Enum valores As Integer
Valor1 = 3
Valor2 = 5
Valor3 = 7
End Enum

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

12

Private Sub Button1_Click(ByVal sender


System.EventArgs) Handles Button1.Click

As

System.Object,

ByVal

As

Dim valor As valores


Valor = valores.valor2
MessageBox.show(Valor)
End sub
Nota: Si deseamos conocer el nombre de la variable seleccionada de la lista
enumerada, podemos utilizar:
Dim valor As valores
Valor = valores.valor2
MessageBox.show(Valor.ToString() & : & Valor)
Se presentara: valor2: 5

2.4.- Estructuras en Visual Basic


Las estructuras estn formadas por uno o mas miembros y cada miembro puede ser de
un tipo de datos determinado. El formato a utilizar es:
Structure <nombre>
Public <nombre> As <tipo>
End Structure
Ejemplo de uso de estructura:
Private Structure Alumno
Public nombre As String
Public Edad As Integer
Public Id As String
End Structure
Private Sub Button1_Click(ByVal sender
System.EventArgs) Handles Button1.Click

As

System.Object,

ByVal

As

Dim MiAlumno As Alumno


MiAlumno.nombre = Carlos
MiAlumno.edad = 23
Mialumno.Id = 2011-23056
MessageBox.show(MiAlumno.nombre & tiene & MiAlumno.edad & aos)
End sub

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

13

Se presentara en pantalla: Carlos tiene 23 aos


Tambien podemos utilizar la palabra reservada With para realizar acciones que se
repiten, evitando escribir una parte del cdigo, analicemos el siguiente ejemplo:
Private Structure Alumno
Public nombre As String
Public Edad As Integer
Public Id As String
End Structure
Private Sub Button1_Click(ByVal sender
System.EventArgs) Handles Button1.Click

As

System.Object,

ByVal

As

Dim MiAlumno As Alumno


With MiAlumno
.nombre = Carlos
.edad = 23
.Id = 2011-23056
MessageBox.show(MiAlumno.nombre & tiene & MiAlumno.edad & aos)
End sub

2.5.- Ambito de variables en Visual Basic


El lugar donde sea declarada una variable afectara el uso que el programa quiera hacer
de esa variable. Las reglas basicas que determinan como una variable puede ser usada
depende del lugar donde se puede declarar una variable. Veamos la siguiente tabla:
Declaracin

Lugar de Declaracin

Alcance o mbito

Public

Mdulo o Clase

Global, en todo el proyecto.

Protected

Clase

En la clase declarada o en una derivada.

Friend

Clase

En el Assemblie.

Private

Mdulo

Solo en el mdulo.

Dim

Procedimiento

Solo en el Procedimiento.

Static

Procedimiento

Solo en el Procedimiento.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

14

En escencia una variable local solo es conocida por el codigo de esa funcion o
procedimiento y es desconocida por otras funciones o procedimientos.
En la programacion formal no es acostumbrado usar muchas variables globales por
varias razones, una de ellas es que variables globales estan vivas todo el tiempo de
ejecucion del programa.
Si una variable global solo la ocupa unos cuantos procedimientos no tiene caso que
este viva para todo el resto, otra razon es que es peligroso tener variables globales
porque todo el conjunto de procedimiento y funciones que componen un programa
tienen acceso o comparten su valor y se corre el riesgo de que inadvertidamente
alguno de ellos modifique su valor.
Programa
' Creando y cargando una variable global
Dim varglobaluno as integer = 50 Fuera de todo procedimiento
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Este es un
' creando, cargando y mandando una var local
procedimiento en
Dim varlocaldos = 20
Call PROC1(varlocaldos)
Visual Basic NET
End Sub

Sub PROC1(ByVal varlocaltres As Single)


'aqui se puede usar varglobaluno por ser global
'y varlocaltres por ser local pero no se puede usar varlocaldos
' porque es local en otro procedimiento
Label1.Text = varglobaluno + varlocaltres
End Sub

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

15

2.6.-- Operadores aritmeticos


En Visual Basic NET un operador es un simbolo especial que indica al compilador que
debe efectuar una operacion matematica o logica.
Visual Basic reconoce los siguientes operadores aritmeticos:
OPERADOR
+
*
/
\
^
MOD

OPERACIN
Suma
Resta
Multiplicacion
Division flotante
Division Entera
Potencia
Modulo

El Operador (/) Division Flotante es el operador de division normal.


El Operador (\) tambien es division pero los datos:
a) Primero son redondeados al entero ms cercano (byte, integer, long)
b) Al final visual basic trunca la parte residual.
El Operador (^), resuelve dos problemas:
a) Ejemplo 5 2 se resuelve enVisual Basic NET:
dim alfa as integer
alfa = 5 ^ 2

Desplegar alfa, sale 9 en pantalla


b) Ejemplo para Raices solo recordar la ley de exponentes que dice:
Para estos casos:

= 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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

16

Otro ejemplo;
alfa = 108 MOD 10;

Visualizar alfa; El resultado en pantalla es 8

Actividades de reforzamiento de lo aprendido

Ejercicios de programacion
Resolver algebraicamente en papel las siguientes ecuaciones expresndolas en
formato de Visual Basic NET
1.2.3.-

2.7.- Jerarquia de operaciones


En Visual Basic NET el problema de no tomar en cuenta la jerarquia de los operadores
al plantear y resolver una operacion casi siempre conduce a resultados muchas veces
equivocados como estos:
Ejemplos:
a) 2 + 3 * 4 = 20 (incorrecto)
2 + 3 * 4 = 14

(correcto)

b) si calif1 = 60 y calif2 = 80 ; Entonces si en programa se usa


promedio = calif1 + calif2/2 ; Da como resultado promedio = 100
En Visual Basic NET recordar siempre, que antes de plantear una formula en un
programa se debera evaluar respecto al orden siguiente:

2.8.- Orden de operaciones:


1.- Parentesis

Ordenes de operacion

2.- Potencias y raices

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

17

3.- Multiplicaciones y divisiones


4.- Sumas y restas
5.- Dos o ms de la misma jerarquia u orden, entonces resolver de izquierda a derecha
Nota: Si se quiere alterar el orden normal de operaciones, entonces usar
parentesis.
Nota: Tampoco es bueno usar parentesis cuando no es necesario en una
operacion, esto solo indica que no se evaluo bien la formula

Ejemplo:
area = ( base * altura ) / 2
Aqui los parentesis estan de mas porque por orden de operaciones, multiplicacion y
division tienen la misma jerarquia y entonces se resuelven de izquierda a derecha en
otras palabras en visual basic NET ni que falten parentesis ni que sobren parentesis

2.9.- Comentarios en Visual Basic NET


Para agregar comentarios a nuestro cdigo de programa podemos hacerlo de variasm
maneras:
1.- Utilizando el carcter
area = base * altura / 2 Encontramos el rea del cuadrado
2.- Utilizando la palabra reservada REM, se utiliza al comienzo de una lnea:
Rem Encontramos el rea del cuadrado
area = base * altura / 2
3.- Cuando queremos utilizar pequeas porciones de regiones de comentarios y cdigo
que se puede contraer y expandir, el formato a utilizar es:
#Region < texto >
Aqu se escribe lo que quermos poner como comentario en varia lneas
Se puede escribir lneas de codigo
#End Region
Ejemplo:
#Region Problema 1
El problema permite encontrar el Mayor de los nmeros de una lista
Proporcionada por el usuario
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

18

Dim IValor As Integer = 0


#En Region

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

19

3.- PROGRAMAS, FORMAS y COMPONENTES VISUAL BASIC NET


Recordar que programas visuales, se construyen usando los siguientes elementos:
1.- Un objeto ventana o form1
2.- Objetos que permitan capturar y desplegar datos, de momento se usaran los dos
objetos de entrada / salida ms comunes:
2.1 Objeto label Permite desplegar textos o mensajes estaticos
2.2 Objeto textbox Permite tanto capturar datos, asi como desplegar el resultado de
operaciones (recordar que textbox's) solo capturan o despliegan un dato a la vez,
recordar tambien que todos los datos que entren y salgan de un textbox o un label son
de tipo string.
2.3.- Objetos InputBox() Para obtener datos directos y sencillos del usuario
2.4.- Objetos MessageBox() Para presentar informacion relevante al usuario
3.- Objeto Button Es el componente principal de la forma, contiene el cdigo principal
del programa y su activacin por el usuario provoca que se realicen los principales
procesos del problema planteado (aqu es donde se capturan datos, se realizan
operaciones, etc.).
De este componente se maneja su propiedad Text para etiquetarlo con la palabra
OK o ACEPTAR o EXE y su evento Click para activarlo, es en dicho evento donde
se construir muchas veces el cdigo del programa.

Nota importante: Recordar que aunque no es un componente necesario en los


programas ya que el cdigo se puede asociar o pegar a cualquier evento de
cualquier forma o componente del programa, Microsoft ya acostumbro a todos
los usuarios al boton OK, de acuerdo, OK.
RECORDAR que todos los componentes vistos incluyendo el propio form y ventana
estos tienen muchas propiedades que se pueden asignar o modificar y tambien tienen
muchos eventos a los cuales les podemos asociar o cargar el codigo del programa,
todos estas propiedades y eventos las podemos accesar dentro de la ventana de
propiedades.
No olvidar que las palabras reservadas del lenguaje NO se deben utilizar como
variables, esto producir un error en al aplicacion
Regresando a Form1, es sobre esta forma donde se construira el programa y esta
forma se convierte en ventana al momento de ejecutarse el programa.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

20

Es decir sera la primera ventana que el usuario ve al momento de ejecutarse el


programa, su nombre es Form1.
Esta forma o ventana es un objeto de VISUAL BASIC NET y como todos
los objetos de Visual Basic y del universo, la forma o ventana tiene
asociados propiedades y eventos.

Propiedades: Son todas las caracteristicas particulares que diferencian un objeto de


otro objeto, las propiedades o caracteristicas mas comunes son forma, tamano, color,
etc., para objetos en visual basic, estas propiedades se modifican o individualizan
usando la PAGINA DE PROPIEDADES, que es la parte del programa que las contiene.
Recordar que se pueden modificar las propiedades dentro de un programa, usando
instrucciones apropiadas, mismas que llevan el siguiente formato:

NomObjeto.Propiedad = nvovalor;
Ejemplo: Form2.BackColor = Yellow

Eventos: son todos aquellos sucesos de caracter externo que afectan o llaman la
atencion del objeto, para estos casos la forma o ventana u objeto:
1. Debe tener capacidad de detectar el evento
2. Aun ms importante debe tener capacidad de reaccionar y emitir una
respuesta, mensaje o conducta apropiada al evento detectado.
Evento es por ejemplo que otro objeto llamado humano pulse el objeto tecla ESC, o
haga click derecho con el objeto raton en alguna parte de la ventana, etc. es en estos
casos, cuando la ventana u objeto detecte un evento de estos la propia forma u objeto
debera responder de manera apropiada.
Nota: Esta respuesta no es automatica, sino son la serie de instrucciones del
lenguaje (o programa) que los ingenieros de software disean (o programan) en
otras palabras son los eventos quienes contendran los programas.

Es tambien la VENTANA DE PROPIEDADES, quien contiene todos los posibles eventos


asociados a la forma.
Para los primeros programas en VISUAL BASIC solo se usaran propiedades sencillas
como color, font, etc. de Form1 y los objetos ya mencionados (LABEL, TEXTBOX,
BUTTON, INPUTBOX, MESSAGEBOX, LISTBOX, COMBOBOX) y no se usan de momento
los eventos que puede detectar Form1.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

21

3.1.- Programa ejemplo Visual Basic NET


Resolvemos el problema de calcular el rea de un triangulo con la formula rea = base
* altura /2
Para resolver este problema se ocuparan los siguientes objetos. (para realizar el diso)
1.- Una ventana de windows (form1) para contener a todo el resto de componentes.
2.- Tres label's o etiquetas para desplegar mensajes apropiados al problema.
3.- Tres componentes TEXTBOX dos para capturar datos (base y altura) y el tercero
para desplegar el resultado (area).
4.- Un componente BUTTON para que active y contenga el codigo del problema y/o
programa.

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:

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

22

5.- Queda ahora la pantalla de trabajo o diseno o construccion del programa

Recordar que pueden agregar TOOLBOX, (VENTANA DE PROPIEDADES Y


EXPLORADOR DE SOLUCIONES) usando la opcin VIEW de la barra del men.
6.- Observar que en grafica de arriba esta seleccionada la propia forma o ventana.
Dentro del programa se estarn cargando todos los objetos que usa el programa y por
ejemplo Visual Basic NET a los dos textbox's que se estarn usando los nombra por
DEFAULT como TextBox1 y TextBox2, con esas maysculas y minsculas as que estar
dificil estar recordando su nombre por defecto
Es conveniente estar usando la propiedad NAME de todos los objetos sobre
todo textbox y label que se coloquen en una forma o ventana.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

23

Es decir es mas fcil construir una formula que diga num1.Text = num2.Text + 5 a el
original que seria TextBox1.Text = TextBox2.Text + 5 por esta razn es conveniente
asignarle un nombre relevante a cada TextBox usando la propiedad NAME de la pagina
de propiedades, en este curso se les asigna NAME a todos los textbox's y muchos de
los otros componentes que se usan.
7.- Arrastrar y acomodar desde la CAJA DE HERRAMIENTAS a FORM1 3 (tres)
compontes LABEL y cargarles su PROPIEDAD TEXT con las palabras BASE, ALTURA y
AREA respectivamente para escribir esto solo hacerlo usando la cajita que esta a un
lado de la propiedad dentro dela pagina de propiedades.

NOTA: si de alguna manera el editor los manda al cdigo del programa,


observar que arriba de FORM1 hay tres pestaas:
FORM1.VB la que contiener el codigo del programa en los procedimientos y
eventos
FORM1 DESIGN que contiene el diseo
START PAGE contiene las caracteristicas de la pagina de inicio
De solo click en form1 design para regresar al ambiente visual.

8.- Arrastrar y acomodar ahora tres componentes textBox de los cuales en su


propiedad TEXT, limpiarla y dejarla en blanco y en su propiedad (NAME) cargarlos con
las palabras BASE, ALTURA y AREA respectivamente.
9.- Arrastrar y acomodar ahora un componente o control BUTTON, poner su propiedad
text=OK.
La pantalla diseada es:

10.-Colocaremos el siguiente codigo


dentro del evento click de BUTTON
Private Sub Button1_Click(ByVal sender
As
System.Object, ByVal
e As
System.EventArgs) Handles Button1.Click
AREA.Text=(BASE.Text*ALTURA.Text / 2)
End Sub

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

24

Para escribir este cdigo solo haga CLIK dentro de BUTTON1 y VISUAL BASIC los
mandara a la pantalla de cdigo, donde ya estar cargado el evento button1_clik(){}.

Atencin solo se escribe el cdigo en rojo, el evento button1.click(){} ya lo


escribe visual basic por default y respetar todas las mayusculas y minusculas
dentro del codigo.
Los dos parmetros que van dentro de button_click (OBJETO, variable e)> son para
indicarle al compilador que se estarn enviando OBJETOS entre la forma o ventana y el
usuario del programa ( LOS TEXTBOXS son los objetos y primero se mandan vacios al
usuario y luego el sistema los recoge con datos desde el usuario).
La VARIABLE e (environment) es donde el sistema o compilador los va almacenando
temporalmente, si ya vieron algo de msdos y conocen el comando set ah observaran
los textbox's con sus datos.
Regresando al cdigo:
a.- Son las propiedades TEXT de los TEXTBOX'S quienes contienen los datos tanto
capturados como los de salida.
b.- Recordar adems que cualquier propiedad TEXT de cualquier CONTROL o
COMPONENTE solo maneja datos de tipo TEXTO o STRING y por tanto para poder
realizar operaciones con los TEXTBOX.TEXT visual basic NET internamente los convierte
a los tipos apropiados.
c.- [VARNUMERICA COMPONENTE EXPRESION] .ToString() > se uso para convertir el
valor numrico a tipo string Y PODERLO FORMATEAR para que salga el resultado con
dos decimales ( este tema de formateo se ve en el tema siguiente), para poderlo
almacenar en la propiedad TEXT del TEXTBOX.
11.- Ya cargada la forma con sus componente y el evento click con su cdigo
respectivo, grabar el programa con la opcin FILESAVE o usar el icono de grabacin
(el disquito o disquitos que esta en la barra de iconos arriba) y luego ejecutar el
programa usando el icono de RUN
que tambin se encuentra en la barra de
herramientas arriba o DEBUG START o F5.
12.- El programa en ejecucion:

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

25

Nota: Si buscan muy bien dentro del


folder project1 se encontraran con
muchos archivos que creo VISUAL BASIC,
dos de ellos son los interesantes:
FORM1.VB que contiene todo el cdigo
fuente, es decir el programa original y
WINDOWSAPPLICATION1.EXE (dentro del
folder bin\debug) que es el archivo
ejecutable, basta darle un click desde el
explorer de windows y se ejecutara solo
sin necesidad de que este cargado el
compilador de visual basic.

3.2.- Otros componentes Visual Basic


En este tema analizamos algunas instrucciones de VISUAL BASIC que nos permitirn
facilitar algunas tareas que estn pendientes y tambin algunos controles y
componentes que tambin nos darn buena ayuda.

Formateo de datos numericos


Como se observa en los aplicaciones ya construidas los formatos numricos de salida
dejan mucho que desear, para corregir esta situacin, solo basta agregar una string de
control dentro del parntesis de ToString(strcontrol) que son una serie de caracteres
especiales que proporciona la plataforma NET.
Ejemplo;
Double alfa = 3456.678 * 21.456 / 73.78902
Es claro que cuando esta variable alfa se mande a un textbox o un label el valor
numrico desplegado contendr un montn de valores decimales, para mandar solo la
cantidad de decimales apropiados, solo usar la string de control con los caracteres
apropiados ej;
Label1.Text = alfa.ToString(#.##)
Esta instruccin desplegara el resultado con solo dos decimales como resultado, si
buscamos la documentacin de Visual Basic, esta nos muestra todos los posibles
caracteres que se pueden incluir en la string de control.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

26

User-Defined Numeric Formats (Format Function)

3.3.-Dos o ms forms en Visual Basic NET


El siguiente problema comn, con el manejo de programas en VISUAL BASIC, es el de
poder crear, controlar y administrar mas de dos forms a la vez.
En este ejemplo o tema se crea un segundo form en diseo.

IMPORTANTE: TODOS LOS COMPONENTES LABEL'S TEXTBOX'S BUTTON'S, etc. que


se coloquen dentro de una forma o ventana deberan de asignarles su propiedad
(NAME), es decir VISUAL BASIC por default si se pone un label en la primera ventana
(Form1) le asigna el nombre de label1, si tambin se coloca otra label en la segunda
ventana (Form2) tambin le asignara el nombre de label1 y cuando se este ejecutando
el programa y se codifique una referencia a label1 visual basic tendr problemas para
conocer de cual label se est tratando.
Para resolver este problema la referencia deber realizarse usando el formato
NOMBREFORMA.NOMBRECOMPONENTE.NOMBREPROPIEDAD
Tambin es recomendable usar la propiedad NAME para todos los componentes
que se usen dentro de una forma.
a) Crear un proyecto normal con su FORM1 normal.
b) Ahora se crea un segundo FORM2 o ventana, para lograr esto solo usar la opcin
PROJECTADD NEWWINDOWSFORM y seleccionar windowsform y observar y
tratar de usar algunos de los otros tipos de forma que ya trae incorporado visual
basic .
Esta opcin solo se muestra cuando ya se cre un proyecto, observar tambin que en
el ADMINISTRADOR DE PROYECTOS aparece registradas los dos forms FORM1.vb y
FORM2.vb.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

27

c) Solo hacer click en form2.vb en el administrador de proyectos (o usar la pestaa


arriba en el compilador que ya debe mostrar las dos formas o ventanas) para tener en
la pantalla de diseno la segunda ventana, cargarle con sus propios label's, textbox's y
buttons, es decir contruirle su programa, recordar tambien asignarles sus propios
NAME'S.
d) El codigo del BUTTON1 de la primera ventana Form1 es:
Private Sub Button1_Click(ByVal sender
System.EventArgs) Handles Button1.Click
Form2.Show()
End Sub

As

System.Object,

ByVal

As

Solo usar propiedad SHOW() con la ventana2 o FORM2


Recordar que si se quiere que FORM1 haga otro proceso u operacin solo agregarle
componentes y mas BUTTON's
El Cdigo del botn OK de la segunda ventana Form2, es:
Private Sub Button1_Click(ByVal sender
System.EventArgs) Handles Button1.Click
Me.Close()
End Sub

As

System.Object,

ByVal

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

29

4.- Estructuras, ciclos, decisiones, en Visual Basic


4.1.-Instrucciones condicionales Visual Basic
Instrucciones de control de programa que permiten alterar la secuencia normal de
ejecucin de un programa. Estas instrucciones se dividen en tres grandes categoras:
1.- Instrucciones Condicionales que en VISUAL BASIC NET se implementan con las
instrucciones if y select case.
Instrucciones de ciclos con
for
do while loop
do loop while
Muchas de ellas con sus correspondientes componentes visuales, tanto en html
como en activex, htmlcontrols y webcontrols, pero para propsito del curso
solo se usaran los Controls ASP NET
Una de las ms poderosas caracteristicas de cualquier computador es la capacidad que
tiene de tomar decisiones.
Es decir al comparar dos alternativas diferentes el computador puede tomar una
decision basandose en la evaluacion que hace de alguna condicion. Ejemplo de
instrucciones condicionales:
si sueldo > 3000
desplegar rico
si no
desplegar pobre
Fin-si
si sexo = 'm'
imprime mujer
si no
imprime hombre
Fin-si
De los ejemplos observar que los caminos a seguir por el computador dependeran de
la evaluacion que el computador hace con la condicion. Todo lenguaje de
programacion debe tener instrucciones que permitan formar condiciones e
instrucciones que pueden evaluar esas condiciones.
Pero recordar que lenguajes modernos y orientados a clientes-servidores de igual
forma tienen componentes que permiten del mismo modo al usuario tomar decisiones
incluso directamente en pantalla, es decir tambien existen los objetos, controles o
componentes de seleccion y decision en html, htmlcontontrols, activex, webcontrols.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

30

El formato general de una instruccion condicional es:

Como se observa, son cuatro partes bien diferenciadas entre si;


La propia instruccion condicional en si
La condicion
El grupo cierto de instrucciones
El grupo falso de instrucciones
Cuando el computador evalua una condicion el resultado de esa evaluacion solo es
evaluado de dos maneras o la condicion es CIERTA o la condicion es FALSA.
Esto depender del valor que tenga asignado o que se haya capturado para la variable
que est en la condici
Por ejemplo si se capturo 8000 en sueldo en el ejemplo a) entonces el computador
indicara que la condicion es CIERTA pero en otro caso si a la variable sueldo primero
se le asigno un valor de 250 entonces el computador indicara que la condicion es
FALSA. Dependiendo del resultado de la evaluacion, el programa realiza las
instrucciones contenidas en el grupo de cierto o falso respectivamente.
Empezaremos el anlisis por la CONDICION presentada.
CONDICIONES SIMPLES VISUAL BASIC En general todas las condiciones se forman con
tres elementos los cuales son:
Variables
sexo
sueldo
Carrera

Operadores relacionales
=
>
=

Constantes o variables
m
30000
informatica

Una condicion simple en visual basic NET se define como el conjunto de variables y/o
constantes unidas por los llamados operadores relacionales.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

31

4.2- OPERADORES RELACIONALES EN VISUAL BASIC


Los operadores relacionales que reconoce Visual Basic NET se presentan en la
siguiente tabla:
Operador
=

Significado
Igual

<

Menor que

>

Mayor que

<>

Diferente que

<=

Menor o igual que

>=

Mayor o igual 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

4.3.- INSTRUCCION IF Then Else en VISUAL BASIC


Es la instruccin condicional ms usada en los diversos lenguajes de programacin, su
formato completo y de trabajo en VISUAL BASIC es:

If condicion Then
Instrucciones cuando la condicion sea cierta
Else
Instrucciones cuando la condicion sea falsa
End If

Si un if no ocupa un grupo falso de instrucciones entonces no usar la clausula else


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e
System.EventArgs) Handles Button1.Click
If SUELDO.Text > 3000 Then
MessageBox.Show("RICO")
Else
MessageBox.Show("POBRE")
End If
End Sub
Si lo corremos veremos algo asi:

MSc. Ing. Jorge J. Prado D.

As

Docente: Univ. Nac. De Ingenieria, Managua

32

En Visual Basic NET es valido usar mas de


una instruccion dentro del grupo cierto o
falso del if.

Actividades de reforzamiento de lo aprendido

EJERCICIOS DE PROGRAMACION EN VISUAL BASIC NET


1.- Capturar un nmero cualesquiera e informar si es o no es mayor de 100
2.- Capturar un nmero entero cualesquiera e informar si es o no es multiplo de 4
(recordar el operador mod analizado en el tema de operadores aritmeticos).
3.- Capturar los cinco datos ms importantes de un Empleado, incluyendo el sueldo
diario y los dias trabajados desplegarle su cheque semanal solo si gano mas de $500.00
en la semana, en caso contrario desplegarle un bono de despensa semanal de $150.00,
PUEDEN USAR PANELS PARA SEPARAR O MEJOR AUN OTRAS VENTANAS O FORMAS.
4.- Capturar los datos mas importantes de un estudiante incluyendo tres calificaciones
construir una boleta de calificaciones en un PANEL O VENTANA de respuesta bien
bonita si el estudiante es de la carrera de medicina, en caso contrario construir un
PANEL O VENTANA mas bonita todavia que despliega un oficio citando a los padres del
estudiante a una platica amistosa con los maestros de la escuela.
5.- Capturar los datos ms importantes de un producto cualesquiera, incluyendo
cantidad, precio, etc. desplegar una orden de compra, solo si el producto es de origen
nacional, en caso contrario no hacer nada.
Nota: Es muy importante realizar siempre un diseo visual de lo que queremos realizar
en el grograma y como esto se vera en la aplicacin, Visual Basic NET facilita mucho esta
situacion

4.4.- CONDICIONES COMPUESTAS EN VISUAL BASIC


En muchas ocasiones es necesario presentar ms de una condicion para su evaluacion
al computador. Por ejemplo se necesita un programa que el computador muestre la
boleta de un alumno si este estudia la carrera de medicina y su promedio de
calificaciones es mayor de 70.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

La evaluacion final, se obtiene usando la regla anteriormente descrita para una


condicion compuesta, que contiene el operador AND.
Esta tabla significa lo siguiente:
1.- Cualquiera que sean la cantidad de datos procesados, siempre caera en uno de
estos cuatro casos generales. La tabla de verdad para una condicion compuesta con
OR es la siguiente:

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

If EDAD.Text < 30 And SEXO.Text = "H" Then


Label3.Text = "Muchacho Joven"
Else
Label3.Text = "Anciano"
End If
End Sub

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

35

Salida del programa

Actividades de reforzamiento de lo aprendido

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.

4.5.-Instrucciones de control en visual basic.


INSTRUCCION SELECT CASE VISUAL BASIC
Tambin existen ocasiones o programas donde se exige evaluar muchas condiciones a
la vez, en estos casos o se usa una condicion compuesta muy grande o se debe

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

36

intentar convertir el problema a uno que se pueda resolver usando la instruccin


SELECT CASE.

Select Case variableopcion


case const1
instruccion(es)
case const2
instruccion(es)
case const3
Instruccion(es)

case Else instruccion(es)


End Select

Esta instruccin es una instruccin de


decisin mltiple donde el compilador
prueba o busca el valor contenido en
una
variable
ENTERA,
CHARACTER, STRING contra una
lista de constantes apropiadas, cuando
el computador encuentra el valor de
igualdad entre variable y constante
entonces ejecuta el grupo de
instrucciones asociados a dicha
constante, si no encuentra el valor de
igualdad entre variable y constante,
entonces ejecuta un grupo de
instrucciones asociados a un default,
aunque este ultimo es opcional. El
formato de esta instruccin es el
siguiente:

Programa ejemplo :
Private Sub Button1_Click(ByVal sender
System.EventArgs) Handles Button1.Click

As

System.Object,

ByVal

As

Select Case LETRA.TEXT


Case "A"
ANIMALITO.TEXT = "AGUILA"
Case "B", "b"
ANIMALITO.TEXT = "BESTIA"
Case "C"
Dim ALFA As Integer
ALFA = 100 + 5
' observar como se encadenan strings usando simbolo &
ANIMALITO.TEXT = ALFA & " CABALLOS"
Case Else
ANIMALITO.TEXT = "NO HAY"
End Select
End Sub

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

37

Observar el caso b, se pueden usar ms


de dos constantes.
En el caso C recordar que cada CASE
puede llevar un conjunto de instrucciones
que se ejecutaran hasta que el compilador
encuentre el siguiente case.
Observar y recordar en caso C como se
unen dos o mas strings, usando el signo &.

4.6.-Ciclo FOR TO NEXT


Instrucciones para ciclos resuelven el problema de repetir todo el programa o cierta
parte del programa ms de una vez. Este ciclo es uno de los ms usados para repetir
una secuencia de instrucciones sobre todo cuando se conoce la cantidad exacta de
veces que se quiere que se ejecute una instruccion simple o compuesta. El formato es
el siguiente:
FOR VARCICLO = VALINICIAL TO VALFINAL [STEP INCR O DECR]
INSTRUCCION(ES)
NEXT
Ejemplo:
Private Sub Button1_Click(ByVal sender
System.EventArgs) Handles Button1.Click
Dim X As Integer
LISTA.Items.Clear()
For X = 1 To 10
LISTA.Items.Add(X & "= MAMA")
Next X
End Sub

MSc. Ing. Jorge J. Prado D.

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

El ciclo for es muy sencillo y no ocupa mucha explicacion, solo


empieza en UNO y se va incrementando de UNO en UNO

Casos Particulares del ciclo for:


1.- El ciclo comienza en uno y se incrementa de uno en uno, este es el caso ms
general.
2.- Pero el valor inicial puede se diferente de uno, ejemplo;
FOR X=5 TO 28
Desplegar X
NEXT
3.- Incluso el valor inicial puede ser negativo, ejemplo;
FOR X= -5 TO 18
Desplegar X
NEXT
4.- Los incrementos tambien pueden ser diferentes al de uno en uno, ej.;
FOR X=1 TO 50 STEP 4
Desplegar X
NEXT
5.- Incluso pueden ser decrementos, solo que en este caso, recordar;
5.1.- el valor inicial de la variable debe ser mayor que el valor final y usar un step
negativo.
FOR X=100 TO 20 STEP - 5
Desplegar X
NEXT
El uso, gestin y manipulacin de matrices (Que estudiaremos adelante) utilizan el
bucle :
For Each
Instrucciones
Next
Veamos este ejemplo:
Private Sub Button2_Click(ByVal sender
System.EventArgs) Handles Button2.Click

MSc. Ing. Jorge J. Prado D.

As

System.Object,

ByVal

As

Docente: Univ. Nac. De Ingenieria, Managua

39

Dim MiArreglo() As String = {Uno,Dos,Tres}


Dim SCadena As String
Dim Smensaje As String =
For Each SCadena In MiArreglo
Smensaje += SCadena &

Next
MessageBox.Show(Smensaje.trim)
End Sub

Actividades de reforzamiento de lo aprendido

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)

4.5.-Ciclo DO WHILE LOOP


En este ciclo el cuerpo de instrucciones se ejecuta mientras una condicion permanezca
como verdadera en el momento en que la condicion se convierte en falsa el ciclo
termina. Su formato general es :
DO WHILE CONDICION(ES)
INSTRUCCION(ES) CIERTAS
INSTRUCCION(ES) DE SALIDA DE CICLO
LOOP

Programa
Private Sub Button1_Click(ByVal sender
System.EventArgs) Handles Button1.Click

MSc. Ing. Jorge J. Prado D.

As

System.Object,

ByVal

As

Docente: Univ. Nac. De Ingenieria, Managua

40

Dim X As Integer
X=1
LISTA.Items.Clear()
Do While X <= 10
LISTA.Items.Add(X & "= GATO")
X=X+1
Loop
End Sub

Corrida
Nota:
While puede llevar dos condiciones; en este caso
inicializar 2 variables de condicion y cuidar que
existan 2 de rompimiento o terminacion de ciclo.
El grupo cierto de instrucciones puede ser una sola
instruccion o todo un grupo de instrucciones. La
condicion puede ser simple o compuesta.

A este ciclo tambien se le conoce tambien como ciclo de condicion de entrada o


prueba por arriba porque este ciclo evalua primero la condicion y posteriormente
ejecuta las instrucciones.

Actividades de reforzamiento de lo aprendido


EJERCICIOS DE PROGRAMACION
1.- Desplegar enteros entre 50 y 80
2.- Desplegar multiplos de 4 entre 60 y 20 acompanados de su logaritmos de base 10 y
base e respectivos (revisar tema operadores atitmeticos)
3.- Construir la tabla de dividir que el usuario indique
4.- Evaluar una funcin cualesquiera para el rango de valores de x de -3 a +5

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

41

4.7.-Ciclo DO LOOP WHILE


Su diferencia bsica con el ciclo do while loop es que la prueba de condicin es hecha
al finalizar el ciclo, es decir las instrucciones se ejecutan cuando menos una vez porque
primero ejecuta las instrucciones y al final evala la condicin.
Tambin se le conoce por esta razn como ciclo de condicin de salida.
Su formato general es:
DO
INSTRUCCION (ES) CIERTAS
INSTRUCCION (ES) DE SALIDA DE CICLO
LOOP WHILE CONDICION (ES)
Programa
Private Sub EVENTO1(ByVal sender As Object, ByVal e As System.EventArgs)
Dim X As Integer
X=1
LISTA.Items.Clear()
Do
LISTA.Items.Add(X & " perico")
X=X+1
Loop While X <= 10
End Sub
Otra diferencia bsica con el ciclo do while loop es que aunque la condicin sea falsa
desde un principio el cuerpo de instrucciones se ejecutara por lo menos una vez.
CONCLUSIONES CICLOS VISUAL BASIC
En Visual Basic NET dado un problema o programa cualesquiera que sea el tipo de ciclo
que se utilice, se resuelve con:
1. Si se conoce la cantidad exacta de veces que se quiere que se ejecute el ciclo o
si el programa de alguna manera puede calcularla usar for..net.
2. Si se desconoce la cantidad de veces a repetir el ciclo o se quiere mayor control
sobre la salida o terminacion del mismo entonces usar do while loop.
3. Si se quiere que al menos una vez se ejecute el ciclo entonces usar do loop
while.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

42

4.7.-Arreglos en Visual Basic NET


Uno de los problemas ms comunes en los diversos sistemas de informacin es el
tratamiento o procesamiento de una gran volumen de datos o de informacin.
Las variables usadas hasta ahora reciben propiamente el nombre de variables
escalares porque solo permiten almacenar o procesar un dato a la vez.
Por ejemplo si se quiere almacenar nombre y edad de 15 personas con el mtodo
tradicional se ocuparan 30 variables y solo es nombre y edad de 15 personas, agreguen
ms datos y ms personas y ya es tiempo de empezar a analizar otro tipo de variables.
Es decir, en problemas que exigen manejar mucha informacin o datos a la vez,
variables escalares no son suficientes ya que su principal problema es que solo
permiten almacenar y procesar un dato a la vez.
Se ocupan entonces variables que sean capaces de almacenar y manipular conjuntos
de datos a la vez.
Variables de tipo arreglo si permiten almacenar y procesar conjuntos de datos del
mismo tipo a la vez.
Cada dato dentro del arreglo se le conoce como elemento del arreglo y se simboliza y
procesa (captura, operacin, visualizar) usando el nombre del arreglo respectivo y un
subndice indicando la posicin relativa del elemento con respecto a los dems
elementos del arreglo, solo recordar que en VISUAL BASIC NET la primera posicin,
elemento o rengln es el 0 (cero), ej.
NOMBRES
Juan >nombres(0)
Pedro nombres(1)
Rosa > nombres(2)
Jose > nombres(3)

Cada sub ndice nos da la posicin


de la variable en los arreglos y las
listas de dTOS

Sin embargo sus problemas son similares a los de variables normales es decir hay que
declararlos, capturarlos, hacer operaciones con ellos, desplegarlos, compararlos, etc.
En programacion tradicional siempre se manejan dos tipos de arreglos los arreglos tipo
listas, vectores o unidimensionales y los arreglos tipo tablas, cuadros, concentrados,
matrices o bidimensionales en ambos casos son variables que permiten almacenar un
conjunto de datos del mismo tipo a la vez, su diferencia es en la cantidad de columnas
que cada uno de estos tipos contiene, como en los siguientes ejemplos:
a) LISTAS
EDAD
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

43

18
34
22
15
22
45

B) TABLAS
CIA ACME S.A.
INGRESOS MENSUALES DE VENTAS
(MILES DE $)
SUCURSAL
SUCURSAL
A
SUCURSAL
B
SUCURSAL
D

ENERO
10

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.

ARREGLOS TIPO LISTA


Un arreglo tipo lista se define como una variable que permite almacenar un conjunto
de datos del mismo tipo organizados en una sola columna y uno o mas renglones.
Tambien reciben el nombre de vectores en algebra o arreglos unidimensionales en
programacion. Los procesos normales con una lista o con sus elementos incluyen
declarar toda la lista, capturar sus elementos, desplegarlos, realizar operaciones con
ellos, desplegarlos, etc.
Para declarar una lista se usa el siguiente formato;
SHARED DIM NOMLISTA(CANT ELEMENTOS -1) AS <TIPODATO>
Shared (compartido), se usa cuando la lista se tenga que compartir entre varias
subutinas, observar que cada boton de comando en un programa empieza con sub-end
sub, si un programa tiene varias subrutinas que compartan la misma lista, dicha lista
debera ser SHARED.
La cantidad de elementos-1, significa que si se quiere una lista de 5 ciudades por
ejemplo su declaracion sera shared dim ciudad(4) as string, la razon de esto es que
visual basic empieza una lista por el elemento o renglon cero(0), por tanto cuando se
pide crear una lista de 4 ciudades, visual basic net le agrega el renglon o elemento 0,
que en total darian 5 ciudade.
Es tambien importante recordar que un arreglo en visual basic net es realmente un
objeto derivado de la clase SYSTEM.ARRAY.
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

Dim MiArreglo(10) As Integer


Dim I As Integer
LISTA2.Items.Clear()
' CARGANDO EL ARREGLO LISTA ORIGINAL CON DATOS
For I = 0 To 10
MiArreglo(I) = I * 2

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

45

If RENG >= 5 Then


EDAD.Visible = False
RENG = 0
End If
End Sub
Private Sub Button2_Click(ByVal sender
System.EventArgs) Handles Button2.Click

As

System.Object,

ByVal

As

' LIMPIANDO LISTAS


LISTA1.Items.Clear()
LISTA2.Items.Clear()
' CARGANDO LISTA ORIGINAL CON EDAD CAPTURADA
For RENG = 0 To 4
LISTA1.Items.Add(EDADARR(RENG))

Next
' A MESES Y Y DESPLEGANDO
For RENG = 0 To 4
EDADARR(RENG) = EDADARR(RENG) * 12
LISTA2.Items.Add(EDADARR(RENG))
Next
End Sub
Corrida
Observar que en el programa el arreglo edad y
la variable renglon se declararon de tipo
GLOBAL porque los dos metodos el de captura
y el de operacion-despliegue, las estan
compartiendo.

Ademas observar que se declararon antes


de los eventos clickButton, para
crearlos como objetos globales.

Para el caso de operaciones y comparaciones con todos los elementos de la lista a la


vez se debera usar un ciclo for con una variable entera llamada renglon, misma que
tambien se usa como indice de la lista.
Recordar que todos los datos internos de la lista estaran almacenados en la memoria
ram del computador, para despliegues se usa un componente visual que permite
manipular un conjunto de datos a la vez, el ListBox con sus metodos apropiados pero

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

Arreglos tipo tabla


Un arreglo tipo tabla se define como un conjunto de datos del mismo tipo organizados
en dos o ms columnas y uno o ms renglones.
Para procesar (recordar solo operaciones y comparaciones) internamente todos los
elementos de la tabla se ocupan dos ciclos for uno externo para controlar renglon y
uno interno para controlar columna.
Los elementos de la tabla se deberan simbolizar con el nombre de la tabla y 2
subindices, el primer subindice referencia al renglon y el siguiente subindice referencia
la columna los dos dentro del mismo corchete.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

47

La declaracion de una tabla sera de acuerdo al siguiente formato:


SHARED DIM NOMTABLA(RENG-1,COL-1) AS <TIPODATO>
Ejemplo:
SHARED DIM SUELDO(3,4) AS DOUBLE
Recordar que va a generar una matriz que tendra cuatro renglones y cinco columnas
empieza en sueldo(0,0)
Para capturar sus elementos, usaremos un textbox y un boton de captura, solo tener
cuidado o mucho control sobre los indices rEN y col como lo muestra el ejemplo.
Para efectuar otros procesos tales como operaciones, despliegues con todos los
elementos de la tabla se deberan usar 2 ciclos un for externo para controlar renglon y
un for interno para controlar columna.
Programa
' DECLARANDO LISTA GLOBAL
' RECORDAR QUE SON 3 RENG Y 4 COLUMNAS
Shared CALIFICACION(2, 3) As Integer
' DECLARANDO RENG Y COL COMO GLOBAL
Dim R, C As Integer
Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
' EN ESTE MODULO SOLO SE TRABAJA CON EL ARREGLO
' EN MEMORIA
CALIFICACION(R, C) = CALIF.Text
C=C+1
CALIF.Text = ""
If C = 4 Then
R=R+1
C=0
End If
If R = 3 Then
CALIF.Visible = False
End If
End Sub
Private Sub Button2_Click(ByVal sender
System.EventArgs) Handles Button2.Click

MSc. Ing. Jorge J. Prado D.

As

System.Object,

ByVal

As

Docente: Univ. Nac. De Ingenieria, Managua

48

Dim TEMP As String


' PROCESANDO Y REGALANDO 50 PUNTOS A TODOS
For R = 0 To 2
For C = 0 To 3
CALIFICACION(R, C) = CALIFICACION(R, C) + 50
Next C
Next R
' desplegando
For R = 0 To 2
TEMP = CALIFICACION(R, 0) & " " & CALIFICACION(R, 1) & " " & CALIFICACION(R, 2) &
" " & CALIFICACION(R, 3)
LISTA1.Items.Add(TEMP)
' limpiando temporal antes de otro renglon
TEMP = " "
Next
End Sub
Notas: Observar el formato de declaracion y como se controlan los indices de captura
r, c Para procesar los elementos se usan dos ciclos for y el formato tabla (reng,col).
En este problema se usa el objeto LISTBOX para presentar el resultado mas adelante se
usara un objeto mas apropiado.
Diseo:

Corrida:

Las matrices en Visual Basic tienen la capacidad de cambiar o modificar su tamao, es


decir su dimensin en memoria, utilizando las palabras reservadas:
ReDim
ReDim Preserve
Ejemplo:

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

49

Dim MiArreglo() As String Declaro mi arreglo


ReDim MiArreglo(2)
Declaro nuevamente mi arreglo de dimension 3
MiArreglo(0) = Uno : MiArreglo(1) = Dos : MiArreglo(2) = Tres
ReDim Preserve MiArreglo(3) Declaro nueva dimensin preservando los valores
MiArreglo(3) = Cuatro
MessageBox.Show(MiArreglo(0)) Muestro el valor del primer dato

Nota : Podemos concatenar varias lneas de cdigo separadas por :


Importante: Si deseamos conocer el tamao o dimensin, podemos utilizar unmetodo
de los arreglos :
MiArreglo.Length
Ejemplo, utilizando el anterior podemos escribir
MessageBox.Show(MiArreglo.Length)
Nos visualizara 4, que es la dimensin del arreglo
Importante: Si deseamos eliminar los elementos de un arreglo de forma rpida
utilizamos la palabra rservada Nothing, ejemplo:
MiArreglo = Nothing
If MiArreglo IsNothing then
MessageBox.Show( Nada)
Else
MessageBox.Show(MiArreglo.Length) presenta la dimension
Endif
Importante: Si deseamos copiar una matriz en otra podemos hacerlo de esta forma:
MiArreglo.CopyTo(OtroArreglo,0)
Ejemplo:
Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim MiArreglo() As String = {Mercurio,Venus,Tierra}
Dim OtroArreglo() As String
ReDim OtroArreglo(MiArreglo.Lenght 1)
MiArreglo.CopyTo(OtroArreglo,0)
MessageBox.Show(OtroArreglo(0))
End Sub

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

50

Actividades de reforzamiento de lo a aprendido

TAREAS PROGRAMACION DE TABLAS


1.- Construir un cuadro que contenga los costos fijos de cuatro productos cualesquiera,
que se producen en tres plantas diferentes de una empresa maquiladora (2 prog uno
capturado y otro inicializado).
2.- Construir un cuadro que contenga los ingresos mensuales por ventas durante los
tres primeros meses del ano de cuatro sucursales de una cadena de auto refacciones,
agregar al final una lista que muestre los ingresos mensuales totales por meses y una
segunda lista que muestre los ingresos mensuales totales por sucursal(2 progs uno
capturado y otro inicializado).
3.-Construir un cuadro que contenga las comisiones ganadas por tres vendedores, de
los 5 tipos de linea blanca de conocida muebleria, ademas listas de comisiones totales
y promedios ganadas por los vendedores, asi como listas de comisiones totales y
promedios por tipo de linea blanca
Analizar este codigo:
' PARA TOTALES Y PROMEDIOS POR RENGLON (FILAS)
FOR R = 0 TO 3
FOR C = 0 TO 2
TOTRENG(R) = TOTRENG(R) + TABLA(R,C)
NEXT C
PROMRENG(R) = TOTRENG(R)/3
NEXT R
'PARA TOTALES Y PROMEDIOS POR COLUMNA
FOR C = 0 TO 2
FOR R = 0 TO 3
TOTCOL(C)=TOTCOL(C) + TABLA(R,C)
NEXT R
PROMCOL(C) = TOTCOL(C) / 4
NEXT C

4.9--Funciones del lenguaje integradas


Cada lenguaje dispone de un grupo de funciones de apoyo, para ayudar al
programador en su trabajo cotidiano. Las versiones anteriores de Visual Basic

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

51

contenan un gran nmero de funciones para realizar operaciones aritmticas,


manipular cadenas, fechas, etc.
VB.NET tambin tiene funciones para las operaciones antes comentadas. No
obstante, debido a la orientacin a objetos sobre la que est construida la
plataforma .NET, la gran potencia a la hora de resolver cualquier situacin la
encontraremos en el gran nmero de clases proporcionadas por el entorno para
resolver las ms variadas situaciones, lo que veremos en el tema dedicado a OOP.
En este apartado y organizadas por categoras, vemos una pequea muestra
de las funciones disponibles en VB.NET. Consulte el lector la documentacin
de la plataforma, para obtener informacin ms detallada de todas las funciones
disponibles.

Funciones Numricas
Int(Nmero), Fix(Nmero). Estas funciones devuelven la parte entera del
parmetro Nmero. La diferencia entre ambas reside en que cuando el parmetro
pasado es negativo, Int() devuelve el entero negativo menor o igual que Nmero,
mientras que Fix( ) devuelve el entero negativo mayor o igual que Nmero. Ver el
Cdigo
Dim Resultado As Integer
Resultado = Int(66.87)
' 66
Resultado = Fix(66.87)
' 66
Resultado = Int(-66.87) ' -67
Resultado = Fix(-66.87) ' 66
Randomize([Nmero]). Inicializa el generador de nmeros aleatorios, que
utilizaremos posteriormente en la funcin Rnd( ). Opcionalmente recibe un
nmero como parmetro que sirve al generador como valor inicial o semilla para
la creacin de estos nmeros.
Rnd([Nmero]). Devuelve un nmero aleatorio de tipo Single, que ser menor
que 1, pero mayor o igual a cero.
Podemos, opcionalmente, variar el modo de generacin del nmero pasando un
valor al parmetro de esta funcin. En funcin de si el parmetro es mayor, menor
de cero, o cero, el comportamiento de Rnd( ) a la hora de generar el nmero ser
diferente. Ver el Cdigo
Dim Contador As Integer
Dim Aleatorio As Single
Randomize()
For Contador = 1 To 5
Aleatorio = Rnd()
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

52

MsgBox("Nmero generado: es "&, Aleatorio)


Next

El anterior cdigo produce una salida similar a la mostrada en la Figura

Numero generado: 0,706402


Numero generado: 0,4058605
Numero generado: 0,337209
Numero generado: 0,8914912
Numero generado: 0,8711619

Generacin de nmeros aleatorios con Rnd( ).


Si necesitamos que el nmero aleatorio est comprendido en un intervalo de
nmeros enteros, utilizaremos la frmula del Cdigo para generarlo.
Int((LmiteSuperior - LmiteInferior + 1) * Rnd() + LmiteInferior)
El ejemplo del Cdigo crea nmeros aleatorios comprendidos entre el intervalo de
los nmeros 7 y 12.
Dim Contador As Integer
Dim Aleatorio As Single
Randomize()
For Contador = 1 To 10
Aleatorio = Int((12 - 7 + 1) * Rnd() + 7)
MsgBox("Nmero generado: "& Aleatorio)
Next

Funciones Cadena de caracteres


Len(Cadena). Devuelve un nmero con la longitud de la cadena pasada como
parmetro. Ver el Cdigo
Dim Longitud As Integer
Longitud = Len("comprobar cuantos caracteres hay")
MsgBox("La cadena tiene caracteres " & Longitud) ' 32
Space(Nmero). Devuelve una cadena de espacios en blanco, de una longitud igual al
nmero pasado como parmetro. Ver el Cdigo.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

53

Dim ConEspacios As String


ConEspacios = "Hola" & Space(7) & "a todos"
MsgBox("La cadena con espacios tiene el valor:" & ControlChars.CrLf & ConEspacios)
' Hola
a todos
InStr([Comienzo, ]CadenaBuscar, CadenaBuscada [, TipoComparacin]). Busca dentro
de CadenaBuscar la cadena contenida en el parmetro CadenaBuscada.
Opcionalmente podemos establecer en Comienzo, la posicin en la que comienza la
bsqueda y el tipo de comparacin (texto, binaria) en el parmetro TipoComparacin.
Ver el Cdigo
Dim CadBuscar As String
Dim CadBuscada As String
Dim PosComienzo As Integer
CadBuscar = "El castillo del bosque"
PosComienzo = InStr(CadBuscar, "tillo")
MsgBox("La posicin de comienzo de la cadena encontrada es: " & ,PosComienzo)
'7
Left(Cadena, Longitud). Esta funcin extrae, comenzando por la parte izquierda de
Cadena, una subcadena de Longitud de caracteres.
Right(Cadena, Longitud). Esta funcin extrae, comenzando por la parte derecha
de Cadena, una subcadena de Longitud de caracteres.
El Cdigo muestra ejemplos de Left( ) y Right( ).
Dim CadIzquierda As String
Dim CadDerecha As String
CadIzquierda = Left("Especial", 3)
MsgBox("Resultado de la funcin Left(): "& CadIzquierda) ' Esp
CadDerecha = Right("Especial", 3)
MsgBox("Resultado de la funcin Right(): "& CadDerecha) ' ial
Mid(Cadena, Inicio [, Longitud]). Extrae de Cadena, comenzando en la posicin Inicio,
una subcadena. Opcionalmente podemos utilizar el parmetro Longitud, para indicar el
largo de la subcadena. En caso de no utilizar este ltimo parmetro, la subcadena se
obtendr hasta el final. Ver Cdigo
Dim MiCadena As String
Dim SubCadena As String
MiCadena = "El bosque encantado"
SubCadena = Mid(MiCadena, 6)

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

54

MsgBox("Subcadena hasta el final: "& SubCadena) ' sque encantado


SubCadena = Mid(MiCadena, 6, 3)
MsgBox("Subcadena de 3 caracteres: "& SubCadena) ' squ
Replace(Cadena,CadOrigen,CadNueva [,Inicio] [,Sustituciones] [,TipoComparacin]).

Esta funcin toma la cadena situada en el primer parmetro y busca la cadena


CadOrigen, sustituyendo las ocurrencias encontradas por la cadena CadNueva.
Opcionalmente, el parmetro Inicio especifica la posicin en la que comenzar la
sustitucin; el parmetro Sustituciones indica el nmero de sustituciones a realizar; y
TipoComparacin indica como se realizarn las comparaciones (texto, binaria).
Veamos unos ejemplos en el Cdigo
Dim MiCadena As String : Dim CadSustituida As String
MiCadena = "Este coche es especial"
CadSustituida = Replace(MiCadena, "es", "xx")
' resultado: Este coche xx xxpecial
MsgBox("Resultado del reemplazo en la cadena: "& CadSustituida)
' en el anterior ejemplo los dos primeros caracteres no se sustituyen porque
' no se ha especificado el tipo de comparacin, que a continuacin s indicaremos
CadSustituida = Replace(MiCadena, "es", "xx", , , CompareMethod.Text)
' resultado: xxte coche xx xxpecial
' ahora s se han sustituido todas las ocurrencias de "es"
MsgBox("Resultado del reemplazo en la cadena: "& CadSustituida)
LTrim(Cadena), RTrim(Cadena), Trim(Cadena). Estas funciones eliminan de una cadena,
los espacios en blanco a la izquierda en el caso de LTrim( ); los espacios en blanco
a la derecha en el caso de RTrim(); o los espacios en blanco a ambos lados Trim( ). Ver el
Cdigo
Dim CadEspacios As String : Dim CadResultante As String
CadEspacios = "
Barco
"
CadResultante = LTrim(CadEspacios) ' "Barco "
CadResultante = RTrim(CadEspacios) ' "
Barco"
CadResultante = Trim(CadEspacios)
' "Barco"
UCase(Cadena), LCase(Cadena). Estas funciones, convierten la cadena pasada
como parmetro a maysculas y minsculas respectivamente. Ver el Cdigo .
Dim Cadena As String : Dim CadMay As String: Dim CadMin As String
Cadena = "Vamos a Convertir En Maysculas Y MinscuLAS"
CadMay = UCase(Cadena)
CadMin = LCase(Cadena)
' "VAMOS A CONVERTIR EN MAYSCULAS Y MINSCULAS"
MsgBox("Conversin a maysculas: " & CadMay)

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

55

' "vamos a convertir en maysculas y minsculas"


MsgBox("Conversin a minsculas: " & CadMin)
Format(Expresin[,CadenaFormato][,PrimerDaSemana[,PrimeraSemanaAo]).
Formatea la expresin pasada en el primer parmetro, empleando de forma
opcional una cadena para especificar el tipo de formateo a realizar. Si el valor a
formatear es una fecha, podemos utilizar los dos ltimos parmetros para
especificar el primer da de la semana y la primera semana del ao; estos dos
ltimos parmetros son enumeraciones, cuyos valores aparecen automticamente
al asignar su valor. Consulte el lector, la documentacin de ayuda para ms
informacin.
Como cadena de formato, podemos utilizar los nombres predefinidos de formato, o
una serie de caracteres especiales, tanto para formateo de nmeros como de fechas. En
lo que respecta a los nombres predefinidos, la Tabla 23 muestra algunos de los
utilizados.
Nombre de formato

Descripcin

General Date

Muestra una fecha con el formato largo del


sistema.

Short Date

Muestra una fecha empleando el formato corto del


sistema.

Short Time

Muestra un valor horario con el formato corto del


sistema.

Standard

Muestra un nmero utilizando los caracteres de


separador de miles y decimales.

Currency

Muestra un nmero con los caracteres


correspondientes a la moneda establecida en la
configuracin regional del sistema.

Percent

Muestra un nmero multiplicado por 100 y con el


carcter de tanto por ciento.
Nombres de formato para la funcin Format( ).

El Cdigo fuente muestra algunos ejemplos de formateo con nombre


Dim MiFecha As Date
Dim MiNumero As Double
Dim ValorFormato As String
MiFecha = #7/19/2002 6:25:00 PM#
MiNumero = 1804
ValorFormato = Format(MiFecha, "Long Date")' "Viernes, 19 de julio de 2004

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

56

ValorFormato = Format(MiFecha, "Short Date")


ValorFormato = Format(MiFecha, "Short Time")
ValorFormato = Format(MiNumero, "Standard")
ValorFormato = Format(MiNumero, "Currency")
ValorFormato = Format(MiNumero, "Percent")

' "19/07/2002"
' "18:25"
' "1.804,00"
' "1.804 pta"
' "180400,00%"

Para los caracteres especiales, la Tabla muestra un conjunto de los ms habituales.


Carcter de
formato

Descripcin

Separador de hora.

Separador de fecha.

ddd

Visualiza el nmero de da sin cero a la


izquierda.
Visualiza el nmero de da con cero a la
izquierda.
Visualiza el nombre del da abreviado.

dddd

Visualiza el nombre del da completo.

Visualiza el nmero de mes sin cero a la


izquierda.
Visualiza el nmero de mes con cero a
la izquierda.

dd

MM
MMM

Visualiza el nombre del mes abreviado.

MMMM

Visualiza el nombre del mes completo.

yy

Visualiza dos dgitos para el ao.

yyyy

Visualiza cuatro dgitos para el ao.

Visualiza la hora sin cero a la izquierda.

HH

Visualiza la hora con cero a la izquierda.

Visualiza los minutos cero a la izquierda.

mm

Visualiza los minutos con cero a la izquierda.

Visualiza los segundos cero a la izquierda.

ss

Visualiza los segundos con cero a la izquierda.

En valores numricos, muestra un dgito o


cero.
En valores numricos, muestra un dgito o
nada.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

57

Separador de millar.

Separador decimal.
Caracteres de formato para la funcin Format( ).

El Cdigo muestra algunos ejemplos de formato con caracteres especiales.


Dim MiFecha As Date
Dim MiNumero As Double
Dim ValorFormato As String
MiFecha = #7/19/2002 6:25:00 PM#
MiNumero = 16587.097
ValorFormato = Format(MiFecha, "dddd d/MMM/yyyy") ' "Viernes 19/jul/2002"
ValorFormato = Format(MiFecha, "HH:mm")
' "18:25"
ValorFormato = Format(MiNumero, "#,#.00")
' "16.587,10"
StrConv(Cadena, TipoConversin [,IDLocal]). Realiza una conversin de la cadena
pasada como parmetro, utilizando algunos de los valores de la enumeracin
TipoConversin. Opcionalmente podemos pasar tambin un valor correspondiente
al identificador local del sistema. Ver el Cdigo fuente
Dim MiCadena As String
Dim Conversion As String
MiCadena = "el tren lleg puntual"
' convertir a mayscula
Conversion = StrConv(MiCadena, VbStrConv.UpperCase)
' convertir a minscula
Conversion = StrConv(MiCadena, VbStrConv.LowerCase)
' convertir a mayscula la primera letra de cada palabra
Conversion = StrConv(MiCadena, VbStrConv.ProperCase)

Fecha y hora
Now( ). Devuelve un valor de tipo Date con la fecha y hora del sistema.
DateAdd(TipoIntervalo, ValorIntervalo, Fecha). Suma o resta a una fecha, un
intervalo determinado por el parmetro TipoIntervalo. El intervalo a utilizar pueden
ser das, semanas, meses, etc. Para determinar si se realiza una suma o resta,
ValorIntervalo deber ser positivo o negativo respectivamente.
DateDiff(TipoIntervalo, FechaPrimera, FechaSegunda). Calcula la diferencia
existente entre dos fechas. En funcin de TipoIntervalo, la diferencia calculada sern
das, horas, meses, aos, etc.
DatePart(TipoIntervalo, Fecha). Extrae la parte de una fecha indicada en
TipoIntervalo. Podemos obtener, el da, mes, ao, da de la semana, etc.
El Cdigo fuente muestra un conjunto de ejemplos que utilizan las funciones para
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

58

manipular fechas.
Dim MiFecha As Date
Dim FechaPosterior As Date
Dim DiasDiferencia As Long
Dim ParteFecha As Integer
MiFecha = Now() ' #1/19/2002 12:27:08 PM#
FechaPosterior = DateAdd(DateInterval.Month, 2, MiFecha) ' #3/19/2002 12:27:08
PM#
DiasDiferencia = DateDiff(DateInterval.Day, MiFecha, FechaPosterior) ' 59
ParteFecha = DatePart(DateInterval.Year, MiFecha)
' 2002

4.10.-PROCEDIMIENTOS O SUBRUTINAS EN VISUAL BASIC NET


Recordar que un objeto presenta tres aspectos, propiedades, metodos y eventos, en
esta unidad se analizan algunos elementos que intervienen en la definicion de un
metodo.
Estamos hablando de los llamados procedimientos y funciones, que quede claro que
procedimientos y funciones son solo algunos aspectos (importantes) de la definicion
de un metodo, pero que existen elementos tan o mas importantes que los analizados
en esta unidad. Un procedimiento es un grupo de instrucciones, variables, constantes,
etc, que estan disenados con un proposito particular y tiene su nombre propio.
Es decir un procedimiento es un modulo de un programa que realiza tareas especificas
y que no puede regresar valores al programa principal u a otro procedimiento que lo
este invocando. Despues de escribir un procedimiento se usara su propio nombre
como una sola instruccion o llamada al procedimiento usando el formato:
CALL NOMPROC()
El formato para construir un procedimiento o subrutina en VISUAL BASIC NET es:
Sub NomProc()
Instrucciones
End Sub
Un programa puede tener tantos procedimientos o subrutinas como se deseen, para
hacer una llamada o invocacion al procedimiento durante la ejecucion de un programa
solo se debera escribir el nombre del procedimiento y los parentesis en blanco.
Programa
Private Sub Button1_Click(ByVal sender
System.EventArgs) Handles Button1.Click

As

System.Object,

ByVal

As

' llamando, invocando o activando procedimiento uno


Call PROC1()

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

59

End Sub
Sub PROC1()
Label2.Text = EDAD.Text * 12
End Sub
Corrida

Como se observa un procedimiento puede ser un programa completo.

Actividades de reforzamiento de lo
aprendido

EJERCICIOS DE PROGRAMACION DE FUNCIONES


Construir tres programas que contengan los procedimientos abajo del sub
buttonclick().
a) Convertir $800.00 Cordobas a dolares.
b) Calcular el Area de un triangulo
c) Deplegar una Boleta de calificaciones.
PARAMETROS EN VISUAL BASIC
Un parametro es una variable que puede pasar su valor a un procedimiento desde el
principal o desde otro procedimiento.
Existen ocasiones en que es necesario mandar al procedimiento ciertos valores para
que los use en algun proceso.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

61

Actividad de reforzamiento de lo
aprendido

EJERCICIOS DE PROGRAMACION DE FUNCIONES


1.- En una VENTANA recoger 3 calificaciones en el onclick, calcular promedio en
procedimiento uno y desplegar nombre y promedio en un segundo procedimiento
2,- Construir una tabla de multiplicar que el usuario indique, captura y control de ciclo
en button_click, calculo y despliegue en un procedimiento usar un solo listbox para la
tabla resultado.
3.- Construir un procedimiento que reciba un numero entero y que mande llamar a un
segundo procedimiento pasando el letrero PAR O IMPAR
FUNCIONES EN VISUAL BASIC NET
Una funcion es un modulo de un programa separado del cuerpo principal que realiza
una tarea especifica y que puede regresar un valor a la parte principal del programa u
otra funcion o procedimiento que la invoque.
La forma general de una funcion es:
Function NOMFUNCION(parametros)
instrucciones
NOMFUNCION = cargarlo porque es quien regresa el dato
End Function
La lista de parametros formales es una lista de variables separadas por comas (,) que
almacenaran los valores que reciba la funcion estas variables actuan como locales
dentro del cuerpo de la funcion. Aunque no se ocupen parametros los parentesis son
requeridos.
Dentro del cuerpo de la funcion deber haber una instruccion que cargue el
NOMFUNCION para regresar el valor, de esta manera se regresan los datos.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

63

Ejemplo;
if suma >= 10 then
funcion50 = 300
else
funcion50 = 20
end if

TIPOS USUALES DE FUNCIONES.


Las primeras son de tipo computacional que son diseadas para realizar operaciones
con los argumentos y regresa un valor basado en el resultado de esa operacion.
Las segundas funciones son aquellas que manipulan informacion y regresan un valor
que indican la terminacion o la falla de esa manipulacion.
Las terceras son aquellas que no regresan ningun valor, es decir son estrictamenta
procedurales. Esto quiere decir que en general toda operacion o calculo en un
programa debera convertirse a una o muchas funciones y el resto deberan ser
procedimientos.

ARREGLOS COMO PARAMETROS


Para pasar un arreglo completo como parametro a un procedimiento o a una funcion
solo se manda el nombre del arreglo sin corchetes e indices, en el procedimiento o
funcion que recibe solo se declara un arreglo del mismo tipo y se puede usar el mismo
o diferente nombre del arreglo sin corchetes e indices.
Sin embargo es conveniente aclarar, que a diferencia de variables escalares normales
visual basic no genera una nueva variable en memoria ni tampoco copia los datos al
arreglo que recibe, en su lugar visual basic sigue usando los datos que estan en el
arreglo original, es por esta razon que cambios que se le hagan a los datos del arreglo
que recibe realmente se esta haciendo al arreglo original como lo muestra el siguiente
ejemplo:
Programa
Private Sub Button1_Click(ByVal sender
System.EventArgs) Handles Button1.Click

As

System.Object,

ByVal

As

' creando y cargando una lista local con 5 elementos


Dim lista1() As Integer = {1, 2, 3, 4, 5}
' pasandola a un procedimiento observar que se pasa sin parentesis
Call PROC1(lista1)
' desplegando lista original y observar el resultado
Dim r As Integer
For r = 0 To 4

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

Actividades de reforzamiento de lo aprendido

EJERCICIOS DE PROGRAMACION DE FUNCIONES


1.- Capturar 3 calificaciones y nombre en un procedimiento, calcular promedio en una
funcion, desplegar en otro procedimiento, BUTTONCLICK SOLO ACTIVA EL PRIMER
PROCEDIMIENTO
2.- Crear una tabla de multiplicar, captura y control de ciclo en el principal
(BUTTONCLICK), operaciones en una funcion, despliegue en el principal.
3.- Inicializar 10 edades en el principal(buttonclick) mandar la lista a un procedimiento
que la convierte a meses, desplegar en principal.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

65

4.- Capturar un arreglo de 7 ciudades en un primer procedimiento, sortear en un


segundo y desplegar en un tercero, la lista original y la lista ordenada.

Funciones de comprobacin de tipos de datos


Si tenemos desactivada la comprobacin de tipos con Option Strict, pero en
ciertas situaciones necesitamos comprobar si determinada variable o expresin
contienen un valor numrico, fecha, etc., el lenguaje nos proporciona para ello, algunas
funciones con las que podremos comprobar el tipo de dato, para evitar posibles
errores.
IsNumeric( ). Esta funcin devuelve un valor lgico indicando si la expresin que
pasamos como parmetro contiene un nmero o una cadena que pueda ser
convertida a nmero. Ver el Cdigo
Private Sub Button1_Click(ByVal sender As
System.EventArgs) Handles Button1.Click
Dim Valor As Object
Dim Total As Integer
Valor = Inputbox( Introduzca un valor)
If IsNumeric(Valor) Then
Total = Valor + 100
MsgBox("Resultado: "& Total)
Else
MsgBox("El valor introducido no es numrico")
End If
End Sub

System.Object,

ByVal

As

IsDate( ). Esta funcin devuelve un valor lgico indicando si la expresin que


pasamos como parmetro contiene una fecha o una cadena que pueda ser
convertida a fecha. Ver el Cdigo
Private Sub Button1_Click(ByVal sender As System.Object,
System.EventArgs) Handles Button1.Click
Dim Valor As Object
Dim UnaFecha As Date
Valor = Inputbox( Introduzca un valor)
If IsDate(Valor) Then
UnaFecha = Valor
MsgBox("La fecha es: "& UnaFecha)
Else
MsgBox("El valor introducido no es una fecha")
End If
End Sub

ByVal

As

IsArray( ). Esta funcin devuelve un valor lgico indicando si la expresin que

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

66

pasamos como parmetro contiene un array. Ver el Cdigo


.
Private Sub Button1_Click(ByVal sender As System.Object,
System.EventArgs) Handles Button1.Click
Dim Colores() As String = {"Verde", "Azul", "Rojo"}
Verificar(Colores)
Verificar("prueba")
End Sub

ByVal

As

Public Sub Verificar(ByVal ValorPasado As Object)


' comprobar si el parmetro contiene un array
If IsArray(ValorPasado) Then
MsgBox("El parmetro pasado es un array")
Else
MsgBox("El parmetro pasado no es un array")
End If
End Sub

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

67

5.- Programando con controles en Visual Basic


Los controles proporcionan al usuario el medio para comunicarse con nuestro
formulario, y en definitiva, con la aplicacin. Por ello, en los siguientes
apartados, mostraremos los principales aspectos que debemos tener en cuenta a
la hora de su creacin, manipulacin y codificacin.
Tambin realizaremos una revisin de los principales controles, mostrando
algunas de sus caractersticas ms destacadas.

5.1.-El Cuadro de herramientas


Una vez creado un proyecto, o despus de aadir un nuevo formulario, para
utilizar controles en el mismo, tendremos que tomarlos de la ventana Cuadro de
herramientas disponible en el IDE de VS.NET, y aadirlos al formulario. Ver Figura

Insertar un control en el formulario


Para aadir un control en el formulario, proceso que tambin se conoce como
dibujar un control, debemos seleccionar primeramente el control a utilizar de la
lista que aparece en el cuadro de herramientas.
Una vez localizado el control, haremos doble clic sobre l, o pulsaremos [INTRO], lo
que aadir una copia del mismo en el formulario, que despus, mediante el ratn o
teclado, situaremos en la posicin adecuada.
Otra tcnica, esta ms habitual, consiste en hacer clic sobre el control, situar el
cursor del ratn en la superficie del formulario y hacer clic en l, arrastrando hasta
dar la forma deseada; de esta manera, proporcionamos al control en un solo paso
la ubicacin y tamao iniciales.
Dibujemos, a modo de prctica, un control Button sobre el formulario, con un
aspecto similar al mostrado en la

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

68

Un control, al igual que un formulario, dispone a su alrededor de un conjunto de guas


de redimensin, de modo que si despus de situarlo en el formulario, queremos
modificar su tamao, slo tenemos que hacer clic sobre alguna de estas guas, y
arrastrar modificando las dimensiones del control.
Adems de utilizando el ratn, podemos desplazar un control, manteniendo
pulsada la tecla[CONTROL], y pulsando adems, algunas de las teclas de direccin.

Ajuste de la cuadrcula de diseo del formulario


La cuadrcula de diseo del formulario, consiste en el conjunto de lneas de
puntos que surcan la superficie del formulario, y nos sirven como ayuda, a la
hora de realizar un ajuste preciso de un control en una posicin determinada.
Si el lector ya ha realizado algunas prcticas situando controles en el formulario, se
percatar de que cuando movemos un control con el ratn, dicho control se ajusta a la
cuadrcula obligatoriamente, por lo que no podemos ubicarlo entre dos lneas de
puntos de la cuadrcula. Para solventar este problema tenemos algunas soluciones que
proponemos a continuacin:
La ms simple y directa, consiste en acceder a la ventana de propiedades del
formulario, y en la propiedad GridSize, cambiar los valores de espaciado de puntos
que tiene la rejilla. Cuanto menor sea ese valor, ms junta estar la trama de puntos
de la rejilla, con lo que podremos ajustar de forma ms exacta el control. Este ajuste
es vlido slo para el formulario sobre el que lo aplicamos. Probemos por ejemplo, a
introducir 5 en cada valor, como muestra la Figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

69

Cambiando el tamao de la cuadrcula de diseo del formulario.

El otro modo consiste en asignar en el formulario, a la propiedad SnapToGrid, el


valor False; esto deshabilita el ajuste a la cuadrcula automtico de los controles,
con lo que perdemos en precisin de ajuste, pero ganamos en libertad de
ubicacin para el control. Si no queremos que la cuadrcula se visualice,
asignaremos False a la propiedad DrawGrid del formulario.
Los anteriores ajustes los podemos realizar tambin de modo genrico para
todos los formularios. Seleccionaremos para ello, la opcin de men del IDE
Herramientas + Opciones, y en la ventana Opciones, haremos clic sobre el
elemento Diseador de Windows Forms. En el panel derecho de esta ventana,
podremos configurar estas propiedades de modo general para todo el IDE. Ver
Figura

Ajuste general de las propiedades para la cuadrcula de diseo de formularios.

Organizacin-formato mltiple de controles


Cuando tenemos un grupo numeroso de controles en el formulario, que
necesitamos mover de posicin, o cambiar su tamao, para redistribuir el espacio;
podemos optar por cambiar uno a uno los controles, tarea pesada y nada
aconsejable; o bien, podemos seleccionar todos los controles a modificar, y
realizar esta tarea en un nico paso, mediante las opciones del men Formato del
IDE. Supongamos que en el formulario tenemos dos controles Button y un
ListBox distribuidos como muestra la Figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

70

En primer lugar, para seleccionarlos todos, debemos hacer clic sobre el formulario
y arrastrar, de modo que el rectngulo de seleccin que aparece, abarque a los
controles, que quedarn con sus correspondientes marcas de redimensin visibles,
seal de que estn seleccionados.
En este punto, podemos hacer clic en uno de los controles y desplazarlos todos
conjuntamente por el formulario, o bien, hacer clic en una de las guas de redimensin
y cambiar su tamao, lo que afectar a todos los controles seleccionados. Si
necesitamos de alguna accin especial, utilizaremos las opciones del men Formato
del IDE.
Por ejemplo, podemos ejecutar la opcin Formato + Alinear + Lados izquierdos, de
modo que todos los controles se alinearn por la izquierda, tomando como referencia
el control que tiene las marcas de redimensin negras. Ver Figura

Despus ejecutaremos la opcin de men Formato + Igualar tamao + Ambos, que


ajustar tanto el ancho como el alto de todos los controles seleccionados. Ver Figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

71

Igualando tamao de controles.


Para evitar que, una vez completado el diseo y ajuste de todos lo controles,
accidentalmente podamos modificar alguno, seleccionaremos la opcin de men
Formato + Bloquear controles, que bloquear
los controles seleccionados, impidiendo que puedan ser movidos o modificado
su tamao. Para desbloquear los controles del formulario, debemos seleccionar al
menos uno y volver a utilizar esta opcin de men, que desbloquear todos los
controles.
Una caracterstica interesante del bloqueo de controles, consiste en que una
vez que tengamos bloqueados los controles del formulario, si aadimos un nuevo
control, este no estar inicialmente bloqueado, lo que facilita su diseo. Una vez
que hayamos finalizado de disear el ltimo control, lo seleccionaremos en el
formulario y seleccionaremos la opcin de bloqueo de controles, de modo que ya
estarn bloqueados todos de nuevo.
El men Formato de VS.NET consta de un numeroso conjunto de opciones.
Acabamos de ver una muestra de sus posibilidades, por lo que recomendamos al
lector, que realice pruebas con el resto de opciones, para ver todas las
posibilidades en cuanto a la disposicin de los controles dentro del formulario.

5-2-Controles Windows Basicos


Como habr comprobado el lector, el nmero de controles del cuadro de
herramientas es muy numeroso, por lo que en los prximos apartados, vamos a
trabajar con los que se consideran controles bsicos o estndar, dada su gran
frecuencia de uso. La Tabla relaciona este conjunto de controles bsico, junto a una
breve descripcin.
Control

MSc. Ing. Jorge J. Prado D.

Descripcin

Button

Botn de pulsacin

Label

Etiqueta de literal

Docente: Univ. Nac. De Ingenieria, Managua

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

Controles bsicos de formularios Windows.

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.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

Pruebas con controles TextBox.

Al comenzar a ejecutar el programa, observaremos que el foco de entrada no est


situado en el primer TextBox del formulario. Para asignar por cdigo el foco a un
determinado control, disponemos del mtodo Focus( ). En este caso, al pulsar el

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

75

borde es FormBorderStyle, y en este caso, su valor es Fixed3D. Alterando los


valores de esta propiedad, conseguiremos distintos bordes y tipos de
redimensin para el formulario.

Seleccin de texto en un TextBox


La seleccin de texto en un control TextBox es un proceso que funciona de
modo transparente al programador, en el sentido en que este no necesita aadir
cdigo adicional para las operaciones de seleccin, cortar, copiar, etc., al ser tareas
integradas en el sistema operativo. Sin embargo, podemos necesitar en un
determinado momento, tener informacin acerca de las operaciones de
seleccin que est realizando el usuario en nuestros controles de texto. Para ello,
el control TextBox dispone de las siguientes propiedades.
SelectionStart. Posicin del texto del control, en la que comienza la
seleccin que hemos realizado.
SelectionLength. Nmero de caracteres seleccionados en el control.
SelectedText. Cadena con el texto que hemos seleccionado en el control.
Mediante estas propiedades, no slo averiguamos la seleccin que pueda tener
un control TextBox, sino que tambin podemos utilizarlas para establecer por
cdigo una seleccin; teniendo el mismo efecto que si la hubiera efectuado el
usuario con el ratn o teclado.
Para comprobar el funcionamiento de las propiedades de seleccin del
TextBox, crearemos un proyecto Windows, y en su formulario aadiremos varios
controles para manipular la seleccin de texto que hagamos en un TextBox. La
Figura muestra el formulario del ejemplo.

. Formulario para realizar seleccin en el control TextBox

El control de este formulario, que vamos a emplear para las operaciones de seleccin

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

76

es txtOrigen. En primer lugar, y aunque no se trata de una seleccin de texto, veremos


su evento TextChanged, el cual se produce cada vez que cambia el contenido del
cuadro de texto; lo usaremos por tanto, para contar lacantidad de caracteres escritos y
mostrarlos en un Label. Ver Cdigo fuente
' al cambiar el texto del control se produce este evento
Private Sub txtOrigen_TextChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles txtOrigen.TextChanged
' calculamos la longitud del texto escrito
Me.lblContador.Text = Me.txtOrigen.TextLength
End Sub
Los eventos MouseMove y KeyDown del TextBox, se producen respectivamente,
cuando movemos el ratn sobre el control, o cada vez que pulsamos una tecla para
escribir texto. Detectaremos en este caso, si existen teclas o botones especiales
presionados, que nos indiquen que se est realizando unaseleccin de texto, y
mostraremos en el formulario el texto seleccionado, el nmero de caracteres y la
posicin del carcter de inicio de la seleccin. Veamos los procedimientos
manipuladores de estos eventos en el Cdigo fuente
' al mover el ratn por el TextBox se produce este evento
Private Sub txtOrigen_MouseMove(ByVal sender As Object, ByVal e As
System.Windows.Forms.MouseEventArgs) Handles txtOrigen.MouseMove
' comprobamos si al mover el ratn est pulsado su botn izquierdo
' en caso afirmativo es que se est seleccionando texto, por lo que obtenemos la
' informacin de seleccin con las ' propiedades de seleccin del TextBox
If e.Button.Left Then
Me.lblTextoSelec.Text = Me.txtOrigen.SelectedText
Me.lblLongitud.Text = Me.txtOrigen.SelectionLength
Me.lblPosicion.Text = Me.txtOrigen.SelectionStart
End If
End Sub
' este evento se produce cuando se pulsa una tecla en el TextBox
Private Sub txtOrigen_KeyDown(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyEventArgs) Handles txtOrigen.KeyDown
' comprobamos las teclas pulsadas si est pulsada la tecla maysculas,
' y adems se est pulsando la tecla flecha derecha, quiere decir que se est
' seleccionando texto; obtener la informacin de las propiedades de
' seleccin del control TextBox
If e.Shift Then
If e.KeyCode.Right Then
Me.lblTextoSelec.Text = Me.txtOrigen.SelectedText
Me.lblLongitud.Text = Me.txtOrigen.SelectionLength
Me.lblPosicion.Text = Me.txtOrigen.SelectionStart

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

Pruebas de seleccin de texto con el control TextBox

5.5.-Control Button
Este control representa un botn de pulsacin, conocido en versiones
anteriores de VB como CommandButton. Entre el nutrido conjunto de
propiedades de este control, destacaremos las siguientes.
Text. Cadena con el ttulo del botn.
TextAlign. Alineacin o disposicin del ttulo dentro del rea del botn; por
defecto aparece centrado.
BackColor. Color de fondo para el botn.
Cursor. Permite modificar el cursor del ratn que por defecto tiene el botn.
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

78

Image. Imagen que podemos mostrar en el botn como complemento a su


ttulo, o bien, en el caso de que no asignemos un texto al botn, nos permitir
describir su funcionalidad.
ImageAlign. Al igual que para el texto, esta propiedad nos permite situar la
imagen en una zona del botn distinta de la central, que es en la que se ubica
por defecto.
BackgroundImage. Imagen de fondo para el botn.
FlatStyle. Tipo de resaltado para el botn. Por defecto, el botn aparece con
un cierto relieve, que al ser pulsado, proporciona el efecto de hundirse y
recuperar nuevamente su estado, pero podemos, mediante esta propiedad,
hacer que el botn se muestre en modo plano, con un ligero remarcado al
pulsarse, etc.
Font. Cambia el tipo de letra y todas las caractersticas del tipo elegido, para
el texto del botn.
La Figura muestra un ejemplo de control Button, sobre el que se han modificado
algunos valores por defecto de sus propiedades.

5.6.-Foco de entrada
Para que las pulsaciones de teclado puedan ser recibidas por un determinado
control, dicho control debe tener lo que se denomina el foco de entrada.
El modo de dar a un control el foco de entrada, consiste en hacer clic sobre l, o bien,
pulsar la tecla [TAB], pasando el foco hasta el control deseado. Cuando un control
recibe el foco, el sistema operativo lo remarca visualmente o en el caso de controles
de escritura, muestra el cursor de escritura en su interior.
Otra forma es realizar la codificacin del foco de entrada, de la siguiente manera
Private Sub btnActivar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnActivar.Click
' utilizando la propiedad focus para el control textbox1

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

79

Textbox1.focus
End Sub

5.7.-Funciones para presentar mensajes


Visual Basic posee 2 tipos de funciones para presentar mensajes, ellas son MsgBox e
InputBox.

5.8.-Funcin InputBox:
La funcin InputBox presenta un mensaje al usuario, permitindole ingresar un valor
en una caja de texto:

Como se dijo la funcin InputBox presenta un cuadro de dilogo donde el usuario


puede ingresar un texto y luego aceptar o cancelar dicho cuadro de dilogo.
Los parmetros principales de esta funcin son:
InputBox (Promt,Title, Default)
El parmetro Prompt especfica la leyenda que mostrar la caja de mensajes.
El parmetro Title especifica el ttulo que llevar el cuadro de dilogo.
El parmetro Default es el texto que mostrar la caja de texto.
El aspecto ms importante de InputBox es que nos devuelve una cadena con lo que
haya ingresado el usuario en la caja de texto. Luego podemos realizar una tarea
especfica dependiendo del valor devuelto.
Ejemplo:
Dim retorno As String
retorno = InputBox("Ingrese algo en la caja de texto", "Ejemplo")
MsgBox "Usted ingres:" & retorno
En el ejemplo anterior, en la variable Retorno se almacenar el valor que haya
ingresado el usuario cuando haga Click en el botn de Aceptar.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

81

Texto : Es el Texto que mostrar el mensaje.


Botones: En este parmetro se colocan las constantes que determinarn si la
caja tiene uno o varios botones y el tipo de mensaje: informativo, de
exclamacin de alerta etc... Cuando escribimos la coma dentro de la funcin en
el parmetro botones, Visual Basic despliega una lista con las opciones o
constantes que podemos utilizar.
Ejemplo de msgbox un poco ms elaborado para entender un poco mejor esto; este
ejemplo enva un mensaje de alerta con dos botones como opciones: En vez de
utilizarse las palabras mensaje, estilo, etc se podran utilizar otras, pero siempre hay
que respetar el orden
Private Sub Command1_Click()
Dim Mensaje, Estilo, Ttulo, Respuesta, MiCadena as String
Mensaje = "Estas totalmente seguro de lo que vas a hacer?"
' cuerpo del mensaje.
Estilo = vbYesNo + vbCritical
' Define el estilo, los botones, lo que est despus del mas es el circulo rojo '
con la cruz.
Ttulo = "error grave (mentira)" ' es el ttulo.
Respuesta = MsgBox(Mensaje, Estilo, Ttulo)
'el parntesis se pone tambin
If Respuesta = vbYes Then ' El usuario eligi el botn S.
MiCadena = "S" ' Ejecuta una accin.
Else ' El usuario eligi el botn No.
MiCadena = "No" ' Ejecuta una accin.
Form1.Visible = False 'Aca puse una accin que usted ya conoce
End If
End Sub
En estilo podran ir por ejemplo las siguientes opciones:

VbOKOnly: Slo muestra el botn Aceptar.


VbOKCancel: Muestra los botones Aceptar y Cancelar.
VbAbortRetryIgnore: Muestra los botones Anular, Reintentar e
Ignorar.
VbYesNoCancel: Muestra los botones S, No y Cancelar.
VbYesNo: Muestra los botones S y No.
VbRetryCancel: Muestra los botones Reintentar y Cancelar.
VbCritical: Muestra el icono Mensaje crtico.
VbQuestion: Muestra el icono Consulta de advertencia.
VbExclamation: Muestra el icono Mensaje de advertencia.
VbInformation: Muestra el icono Mensaje de informacin.
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

82

5.10.-Codificacin de los eventos de controles


Windows es un sistema operativo orientado a eventos, por lo que cualquier
mnima interaccin que realicemos sobre un formulario o control, generar el
oportuno evento, para el que si estamos interesados, deberemos responder.
Prosiguiendo con el control Button, cuando pulsamos sobre el mismo, se origina el
evento Click de dicho control. Si dibujamos un Button en un formulario y pulsamos
en l, no ocurrir nada, ya que aunque el evento se produce, no existe cdigo que
le proporcione respuesta.
Para dar oportuna respuesta a un evento emitido por un control, debemos escribir
un procedimiento manipulador del correspondiente evento. La creacin de
manipuladores de evento es un aspecto que ya hemos visto en detalle en el tema
Delegacin de cdigo y eventos. De igual modo, los aspectos bsicos de la escritura
de cdigo para un evento se comentaron en el tema Una aplicacin con
funcionalidad bsica; sugerimos por lo tanto al lector, la consulta de estos temas
para cualquier referencia bsica que necesite al respecto.
No obstante, en el presente apartado, y para reforzar conceptos, realizaremos un
repaso del proceso de creacin del manipulador de evento para un control.
Como ejemplo, insertaremos en un formulario un control Button, al que
daremos el nombre btnMensaje, y en su propiedad Text asignaremos la cadena
Mostrar mensaje.
Seguidamente haremos doble clic sobre el Button; esta accin abrir la ventana del
editor de cdigo, creando al mismo tiempo, la declaracin o esqueleto del
procedimiento manipulador de evento Click del botn, listo para ser codificado.
Ya que necesitamos que se muestre un mensaje al ser pulsado este control,
utilizaremos el objeto MessageBox de la plataforma, llamando a su mtodo
compartido Show( ), para visualizar el mensaje. En definitiva, el manipulador de este
evento quedara como muestra el Cdigo fuente
Private Sub btnMensaje_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnMensaje.Click
MessageBox.Show("Se acaba de pulsar el botn del formulario")
End Sub
El resultado en ejecucin, sera el que muestra la Figura
Observando con ms detalle el procedimiento del evento, vemos que al final
de su declaracin, aparece la palabra clave Handles, que como vimos en el tema
sobre eventos, nos sirve para asociar esta rutina de cdigo con un evento de un
objeto. En el ejemplo que nos ocupa, asociamos el procedimiento

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

83

btnMensaje_Click( ), con el evento Click del objeto btnMensaje, perteneciente a


la clase Button.

Resultado de la ejecucin del evento Click de un control Button, al ser pulsado.


Como ya sabemos, el enlace procedimiento-evento de objeto mediante la palabra
Handles, se producede modo esttico. Esto requiere que en el cdigo, el identificador
que contenga el objeto del control, deba ser declarado con mbito a nivel de clase,
y utilizando adems la palabra clave WithEvents.
Dicha tarea es realizada automticamente por el diseador del formulario cuando
genera el cdigo del mismo. Veamos en el Cdigo fuente , el fragmento de cdigo
generado por el diseador que realiza esta labor.
' esta declaracin es situada a nivel del cdigo de la clase del formulario, es decir,
' fuera de cualquier mtodo
Friend WithEvents btnMensaje As System.Windows.Forms.Button

5.11.-Codificando otros eventos de un control


En un control Button, el evento por defecto es Click; esto supone, como acabamos
de ver, que al hacer doble clic sobre el control en el formulario, el procedimiento
de evento sobre el que nos situar el editor ser precisamente este. Sin embargo,
un control Button, al igual que el resto de controles de los formularios Windows,
disponen de un gran nmero de eventos que podemos codificar para adaptar a
nuestras necesidades.
Por ejemplo, el evento MouseEnter, se produce cuando se detecta que el ratn
entra en el rea de un control, en este caso Button. Como este no es el evento por
defecto, debemos buscar su declaracin vaca manualmente en el editor. Para ello,
abriremos la lista desplegable Nombre de clase, situada en la parte superior
izquierda del editor de cdigo, y seleccionaremos el nombre de nuestro control:
btnMensaje. Ver Figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

84

Lista de clases del editor de cdigo.


A continuacin, abriremos la otra lista desplegable del editor de cdigo: Nombre de
mtodo, situada en la parte superior derecha del editor. En ella aparecern los
nombres de todos los eventos de que dispone el control. Localizaremos el evento
MouseEnter, y lo seleccionaremos. Ver Figura

Lista de eventos de una clase-control en el editor de cdigo.

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

85

Resultado de la ejecucin del evento MouseEnter sobre un Button.

5.12.-Orden de tabulacin de controles


Los controles disponen de la propiedad TabIndex, que contiene un nmero que
ser utilizado para pasar el foco entre ellos al pulsar la tecla [TAB] durante la ejecucin
del programa. Segn vamos aadiendo nuevos controles, el IDE va asignando
automticamente nuevos nmeros a esta propiedad; de forma que, cuando
comencemos la ejecucin, el primer control que tomar el foco ser el que tiene el
menor nmero en su TabIndex.
En el ejemplo anterior, el primer control que tomaba el foco era el TextBox de la
contrasea, lo cual no era nada lgico, ya que dicho control era el ltimo en el
formulario para el que debamos introducir datos.
Para solucionar este problema, simplemente tenemos que cambiar los valores
de la propiedad TabIndex de los controles, de modo que el orden de tabulacin
sea el que mejor se adapte a nuestras necesidades.
Podemos obtener un mapa del orden de tabulacin de los controles del formulario
seleccionando el men del IDE Ver + Orden de tabulacin; esto mostrar los controles
con el nmero de TabIndex que les hemos asignado. Como ventaja adicional, en esa
situacin, podemos hacer clic en los controles y cambiar tambin el nmero de
tabulacin. Ver Figura

Diseador del formulario mostrando el orden de tabulacin de controles.


Si por el contrario, no queremos dar el foco a un control pulsando [TAB],
debemos asignar a la propiedad TabStop de dicho control el valor False. Por

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

Introduccin de valores para un ListBox en tiempo de diseo.

El control quedara por lo tanto con valores asignados en la etapa de diseo,


como muestra la Figura

ListBox en diseo con valores en su lista.


Sorted. Cuando esta propiedad contiene el valor True, ordena el contenido de la
lista. Cuando contiene False, los elementos que hubiera previamente ordenados,
permanecen con dicho orden, mientras que los nuevos no sern ordenados.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

87

IntegralHeight. Los valores de la lista son mostrados al completo cuando esta


propiedad contiene True. Sin embargo, al asignar el valor False, segn el tamao del
control, puede que el ltimo valor de la lista se visualiza slo en parte. La Figura 253
muestra un ListBox con esta propiedad a False.

ListBox mostrando parte del ltimo elemento debido a la propiedad IntegralHeight.

MultiColumn. Visualiza el contenido de la lista en una o varias columnas en


funcin de si asignamos False o True respectivamente a esta propiedad.
SelectionMode. Establece el modo en el que vamos a poder seleccionar los
elementos de la lista. Si esta propiedad contiene None, no se realizar seleccin;
One, permite seleccionar los valores uno a uno; MultiSimple permite seleccionar
mltiples valores de la lista pero debemos seleccionarlos independientemente; por
ltimo, MultiExtended nos posibilita la seleccin mltiple, con la ventaja de que
podemos hacer clic en un valor, y arrastrar, seleccionando en la misma operacin
varios elementos de la lista.
SelectedItem. Devuelve el elemento de la lista actualmente seleccionado.
Selecteditems. Devuelve una coleccin ListBox.SelectedObjectCollection, que
contiene los elementos de la lista que han sido seleccionados.
SelectedIndex. Informa del elemento de la lista seleccionado, a travs del
ndice de la coleccin que contiene los elementos del ListBox.
PROPIEDAD ACCION O SIGNIFICADO
Items.Add(dato): Inserta un elemento al final del listbox.
Items.Clear(): Elimina todos los elementos de la lista.
Items.Count(): Regresa la cantidad de elementos en lista.
Items.Sorted = true; Ordena los elementos de la lista usada solo al tiempo de diseno.
Items.Contains(dato): Regresa true o false, si el dato se encuentra o no se encuentra
en la lista.
Items.IndexOf(dato): Regresa el indice del objeto dentro del listbox.
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

88

Items.Insert(indice,dato): Inserta el dato en la posicion indicada.


Items.Remove(dato): Elimina el dato de el listbox.
Items.RemoveAt(indice): Elimina el dato que esta en la posicion indicada.
Items[indice]: get or set el dato en la posicion indicada (ver primera nota abajo).
Observacion:
Como ya se indico anteriormente GET y SET son propiedades asociadas a todos los
objetos o controles y sus propiedades en microsoft net, por ejemplo para un textbox,
si en un programa se dice alfa = text5.text; se esta usando get, si se dice
text5.text=500; se esta usando set.
Otro ejemplo alfa = listbox2.Items(2); se esta usando (get)
listbox2.Items(4 )= mama
Para mostrar algunas de las funcionalidades de este control, utilizaremos el
proyecto de ejemplo ListBoxPru. La Figura muestra esta aplicacin en ejecucin.

Ejemplo de uso del control ListBox.

El ejemplo, como puede comprobar el lector, consiste en un formulario que


contiene un ListBox principal, con el nombre lstValores, que dispone de una
serie de valores asignados en tiempo de diseo.
Cada vez que hacemos clic en alguno de los valores, se produce el evento
SelectedIndexChanged, que utilizamos para mostrar en este caso, el nombre del
elemento en el ttulo del formulario, como muestra el Cdigo fuente, de la clase
frmListas, correspondiente al formulario.
' declaramos esta constante a nivel de clase, para poner como ttulo
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

89

' del formulario junto al elemento seleccionado de la lista


Public Const TITULO As String = "Elemento seleccionado: "
' este evento se produce cada vez que se cambia el ndice seleccionado del ListBox
Private Sub lstValores_SelectedIndexChanged(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles lstValores.SelectedIndexChanged
' mostrar en el ttulo del formulario el valor actualmente seleccionado de la lista
Me.Text = TITULO & Me.lstValores.SelectedItem
End Sub
A travs de los RadioButton, cambiamos el tipo de seleccin que podemos
efectuar en el control lstValores. Ver Cdigo fuente
Private Sub rbtUno_CheckedChanged(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles rbtUno.CheckedChanged
' establecer tipo de seleccin en el ListBox a un elemento
Me.lstValores.SelectionMode = SelectionMode.One
End Sub
Private Sub rbtMultiple_CheckedChanged(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles rbtMultiple.CheckedChanged
' establecer tipo de seleccin en el ListBox a un mltiples elementos
Me.lstValores.SelectionMode = SelectionMode.MultiSimple
End Sub
Private Sub rbtExtendida_CheckedChanged(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles rbtExtendida.CheckedChanged
' establecer tipo de seleccin en el ListBox a mltiples
' elementos de modo extendido
Me.lstValores.SelectionMode = SelectionMode.MultiExtended
End Sub
Mediante los controles chkOrdenar y chkColumnas, ordenaremos y mostraremos
en columnas respectivamente el ListBox. Ver Cdigo fuente.
Private Sub chkOrdenar_CheckedChanged(ByVal sender As System.Object, ByVal e
As, System.EventArgs) Handles chkOrdenar.CheckedChanged
' segn el valor del CheckBox, ordenamos o quitamos
' la opcin de ordenar del ListBox
Me.lstValores.Sorted = Me.chkOrdenar.Checked
End Sub
Private Sub chkColumnas_CheckedChanged(ByVal sender As System.Object, ByVal e
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

90

As System.EventArgs) Handles chkColumnas.CheckedChanged


' segn el valor del CheckBox, mostramos el ListBox
' en varias columnas o en una
Me.lstValores.MultiColumn = Me.chkColumnas.Checked
End Sub
El TextBox de este formulario lo usaremos para aadir nuevos elementos al
ListBox lstValores, y buscar tambin elementos existentes, pulsando los botones
btnAgregar y btnBuscar en cada caso. Observemos el miembro NoMatches del
ListBox, mediante el que averiguamos si la bsqueda tuvo xito. Ver el Cdigo
fuente
Private Sub btnAgregar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnAgregar.Click
' aadimos el contenido del TextBox como un elemento a la lista
Me.lstValores.Items.Add(Me.txtValor.Text)
End Sub
Private Sub btnBuscar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnBuscar.Click
Dim iPosicion As Integer
' el mtodo FindString() de la lista busca un valor
iPosicion = Me.lstValores.FindString(Me.txtValor.Text)
' el campo NoMatches indica si no existe el valor buscado
If iPosicion = Me.lstValores.NoMatches Then
MessageBox.Show("No existe el valor")
Else
' si encontramos el valor en la lista,lo seleccionamos por cdigo
Me.lstValores.SelectedIndex = iPosicion
End If
End Sub
La seleccin de los elementos de un ListBox no es competencia exclusiva del usuario.
El programador puede tambin, si lo necesita, seleccionar valores de la lista
mediante el cdigo del programa. Al pulsar el botn btnSelecCod, utilizaremos el
mtodo SetSelected( ) del ListBox para realizar esta tarea.
En este mtodo pasamos como parmetro el ndice de la lista con el que vamos a
operar, y el valor True para seleccionarlo, o False para quitarle la seleccin. Ver el
Cdigo fuente
Private Sub btnSelecCod_Click(ByVal sender As System.Object, ByVal e As

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

91

System.EventArgs) Handles btnSelecCod.Click


' para seleccionar elementos de un ListBox por cdigo
' podemos utilizar el mtodo SetSelected()
Me.rbtMultiple.Checked = True
Me.lstValores.SetSelected(1, True)
Me.lstValores.SetSelected(3, True)
Me.lstValores.SetSelected(5, True)
End Sub
El botn btnTraspasarSelec lo usaremos para tomar los elementos seleccionados
de lstValores, y pasarlos al otro ListBox del formulario. La propiedad SelectedItems
del control lstValores, devuelve una coleccin con sus elementos seleccionados. Por
otra parte, podemos eliminar los elementos de un ListBox llamando al mtodo
Clear( ) de la coleccin de valores del control, cosa que hacemos pulsando el
botn btnLimpiar. Ver Cdigo fuente
Private Sub btnTrapasarSelec_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnTrapasarSelec.Click
Dim oSeleccion As ListBox.SelectedObjectCollection
' obtenemos con SelectedItems los elementos seleccionados de un ListBox
oSeleccion = Me.lstValores.SelectedItems
' si existen elementos seleccionados, los traspasamos a otro ListBox del
' formulario
If oSeleccion.Count > 0 Then
Dim oEnumerador As IEnumerator
oEnumerador = oSeleccion.GetEnumerator()
While oEnumerador.MoveNext()
Me.lstTraspaso.Items.Add(oEnumerador.Current)
End While
End If
End Sub
Private Sub btnLimpiar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnLimpiar.Click
' con el mtodo Clear() de la coleccin de elementos
' de un ListBox, borramos los elementos del controls
Me.lstTraspaso.Items.Clear()
End Sub
Ejemplo programa

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

92

Private Sub Button1_Click(ByVal sender


System.EventArgs) Handles Button1.Click
LISTA.Items.Add(DATO.Text)
DATO.Text = ""
End Sub

As

System.Object,

ByVal

As

Private Sub Button2_Click(ByVal sender


System.EventArgs) Handles Button2.Click

As

System.Object,

ByVal

As

Dim r, cant, meses As Integer


cant = LISTA.Items.Count
For r = 0 To cant - 1
meses = LISTA.Items(r)
meses = meses * 12
LISTA.Items(r) = meses
Next r
End Sub
Recordar que el primer indice en un ListBox es el cero por eso el ciclo va desde el cero
hasta la cantidad de elementos menos uno.
Corrida:

Actividades de reforzamiento de lo aprendido


EJERCICIOS PROGRAMACION DE LISTBOX
1.- Capturar en una lista los sueldos de 6 empleados y desplegarlos en una segunda
lista aumentados en un 30%

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

93

2.- Capturar en una lista los pesos en kilogramos de 6 personas desplegarlos en una
segunda lista convertidos a libras y ademas solo los mayores de 100 libras.
3.- Capturar en sus 4 listas respectivas matricula, nombre y dos calificaciones de 5
alumnos, despues calcular una lista de promedios de calificaciones.
4.- Capturar en sus listas respectivas numempleado, nomempleado, dias trabajados y
sueldo diario de 5 empleados, desplegar en otra pantalla o panel la nomina pero solo
de aquellos empleados que ganan mas de $300.00 a la semana.

5.14.-Control ComboBox
El ComboBox es un control basado en la combinacin (de ah su nombre) de dos
controles que ya hemos tratado: TextBox y ListBox.
Un control ComboBox dispone de una zona de edicin de texto y una lista de valores,
que podemos desplegar desde el cuadro de edicin.
El estilo de visualizacin por defecto de este control, muestra el cuadro de texto y
la lista oculta, aunque mediante la propiedad DropDownStyle podemos cambiar dicho
estilo. La Figura muestra un formulario con diversos ComboBox, cada uno con
diferente estilo.

Controles ComboBox de distintos estilos.


La propiedad DropDownStyle tambin influye en una diferencia importante de
comportamiento entre el estilo DropDownList y los dems, dado que cuando
creamos un ComboBox con el mencionado estilo, el cuadro de texto slo podr
mostrar informacin, no permitiendo que esta sea modificada.
En el caso de que la lista desplegable sea muy grande, mediante la propiedad
MaxDropDownItems, asignaremos el nmero de elementos mximo que mostrar la
lista del control.
El resto de propiedades y mtodos son comunes con los controles TextBox y
ListBox. En el Cdigo fuente se muestra el cdigo del botn btnAgregar,
mediante el que llenamos de valores los controles de este ejemplo.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

94

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


System.EventArgs) Handles btnAgregar.Click
Me.cboColores.Items.AddRange(New String() {"AZUL", "VERDE", "AMARILLO",
"ROJO", "BLANCO", "MARRN", "GRANATE"})
Me.cboNombres.Items.AddRange(New String() {"ELENA", "JOSE", "ANA",
"ALFREDO", "LUIS", "ANGEL", "RAQUEL"})
Me.cboCiudades.Items.AddRange(New String() {"SEVILLA", "VALENCIA",
"ALICANTE", "TOLEDO", "SEGOVIA"})
End Sub

5.15.-Control CheckBox
Este control muestra una casilla de verificacin, que podemos marcar para establecer
un estado. Generalmente el estado de un CheckBox es marcado (verdadero) o
desmarcado (falso), sin embargo, podemos configurar el control para que sea
detectado un tercer estado, que se denomina indeterminado, en el cual, el
control se muestra con la marca en la casilla pero en un color de tono gris.
Las propiedades remarcables de este control son las siguientes.
Checked. Valor lgico que devuelve True cuando la casilla est marcada, y False
cuando est desmarcada.
CheckState. Valor del tipo enumerado CheckState, que indica el estado del
control. Checked, marcado; Unchecked, desmarcado; e Indeterminate,
indeterminado.
ThreeState. Por defecto, un control de este tipo slo tiene dos estados, pero
asignando True a esta propiedad, conseguimos que sea un control de tres
estados.
CheckAlign. Permite establecer de modo visual la ubicacin de la casilla de
verificacin dentro del rea del control.
Como detalle destacable de las propiedades Checked y CheckState, si modificamos
desde cdigo sus valores, conseguiremos alterar el estado de la casilla del control.
El ejemplo CheckBoxPru, muestra un formulario con dos controles
CheckBox. El control chkPonColor asigna un color de fondo al formulario o
restablece el color original. Esto lo conseguimos codificando el evento
CheckedChanged del control. Ver Cdigo fuente.
' Este evento se produce cuando se hace clic en el CheckBox y cambia el contenido
' de la casilla
Private Sub chkPonColor_CheckedChanged(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles chkPonColor.CheckedChanged
If Me.chkPonColor.CheckState = CheckState.Checked Then

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

96

Controles CheckBox en ejecucin.

5.16.-Controles RadioButton y GroupBox


Los controles RadioButton nos permiten definir conjuntos de opciones
autoexcluyentes, de modo que situando varios controles de este tipo en un
formulario, slo podremos tener seleccionado uno en cada ocasin.
Vamos a crear un proyecto de ejemplo con el nombre RadioButtonPru, en el que
situaremos dentro de un formulario, una serie de controles RadioButton y un
TextBox, de modo que mediante los RadioButton cambiaremos el tipo de fuente y
color del cuadro de texto. La Figura 249 muestra un diseo inicial del formulario.

Pruebas con el control RadioButton.

Al ejecutar el proyecto, sin embargo, no podemos conseguir establecer


simultneamente un tipo de letra y color, puesto que al pulsar cualquiera de
los botones de radio, se quita el que hubiera seleccionado previamente.
Para solucionar este problema, disponemos del control GroupBox, que nos permite,
como indica su nombre, agrupar controles en su interior, tanto RadioButton como de
otro tipo, ya que se trata de un control contenedor.
Una vez dibujado un GroupBox sobre un formulario, podemos arrastrar y soltar sobre
l, controles ya existentes en el formulario, o crear nuevos controles dentro de dicho
control. De esta forma, podremos ya, en este ejemplo, seleccionar ms de un
RadioButton del formulario, como vemos en la Figura .

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

97

Seleccin de varios RadioButton en un formulario.


El evento CheckedChanged, al igual que ocurra con los controles CheckBox, ser el
que tendremos que escribir para ejecutar el cdigo en respuesta a la pulsacin
sobre un control RadioButton. El Cdigo fuente muestra los eventos
correspondientes a los controles de radio de este ejemplo. Para cambiar el tipo de
fuente, instanciamos un objeto Font y lo asignamos a la propiedad Font del
TextBox; mientras que para cambiar el color, utilizamos la estructura Color y la
propiedad BackColor, tambin del TextBox.
Private Sub rbtTahoma_CheckedChanged(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles rbtTahoma.CheckedChanged
Me.txtNombre.Font = New Font("Tahoma", 12)
End Sub
Private Sub rbtGaramond_CheckedChanged(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles rbtGaramond.CheckedChanged
Me.txtNombre.Font = New Font("Garamond", 8)
End Sub
Private Sub rbtComic_CheckedChanged(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles rbtComic.CheckedChanged
Me.txtNombre.Font = New Font("Comic Sans MS", 15)
End Sub
Private Sub rbtVerde_CheckedChanged(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles rbtVerde.CheckedChanged
Me.txtNombre.BackColor = Color.Green
End Sub
Private Sub rbtAzul_CheckedChanged(ByVal sender As System.Object, ByVal e As

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

98

System.EventArgs) Handles rbtAzul.CheckedChanged


Me.txtNombre.BackColor = Color.Blue
End Sub
Private Sub rbtAmarillo_CheckedChanged(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles rbtAmarillo.CheckedChanged
Me.txtNombre.BackColor = Color.Yellow
End Sub

5.17.-Controles de tipo men


El men es uno de los tipos de control ms frecuentemente utilizados en los
formularios Windows. Consiste en un conjunto de opciones, a travs de las cuales, el
usuario ejecutar algunos procesos de la aplicacin. Disponemos de tres tipos de
control men: MainMenu, ContextMenu y MenuItem.
MainMenu y ContextMenu actan como contenedores de grupos de
controles MenuItem, representando este ltimo control, la opcin de men sobre la
que el usuario pulsa o hace clic.
El proyecto MenuPru que se acompaa como ejemplo, muestra los diferentes tipos de
men . A continuacin, describiremos los principales pasos a dar en el proceso de su
construccin.

Men Principal. MainMenu


Un control MainMenu, consiste en un conjunto de opciones que se sitan
horizontalmente debajo del ttulo del formulario. A partir de cada opcin, podemos
asociar a su vez, grupos de opciones que se mostraran verticalmente al hacer clic
en la opcin principal o situada en la barra horizontal.
Para crear un men principal, seleccionaremos del cuadro de herramientas el control
MainMenu, y tras dibujarlo en el formulario, se aadir una referencia del
control al panel de controles especiales situado bajo el diseador. La Figura
muestra un control de este tipo al que le hemos dado el nombre mnuPrincipal.

Men de tipo MainMenu aadido al diseador del formulario.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

99

La creacin de las diferentes opciones que compondrn el men es un proceso que


se ha mejorado y simplificado al mximo respecto a versiones anteriores de VB. El
proceso de edicin del men se realiza directamente en el formulario, en el
mismo lugar en el que el men aparecer en tiempo de ejecucin.
Al hacer clic en la primera opcin del men, podemos dar nombre y propiedades
a esa opcin. Al mismo tiempo, de un modo muy intuitivo, veremos las
prximas opciones disponibles, tanto las desplegables a partir de dicho men,
como las de la barra principal. Slo hemos de movernos en la direccin que
necesitemos y dar nombre a las opciones, y valores a sus propiedades. Ver Figura

Creacin de las opciones de un men principal de formulario.


Cada una de las opciones que componen el men es a su vez un control
MenuItem. Si durante su creacin slo proporcionamos el nombre, el IDE va
asignando a dicho control valores por defecto en sus propiedades.
Para modificar las propiedades de una opcin de men, slo hemos de seleccionarlo en
la estructura de men que estamos creando en el diseador del formulario, y pasar a
la ventana de propiedades. Entre las propiedades disponibles para un MenuItem,
podemos destacar las siguientes.
Text. Contiene una cadena con el literal o texto descriptivo de la opcin de
men.
Enabled. Permite habilitar/deshabilitar la opcin de men. Cuando se encuentra
deshabilitada, se muestra su nombre en un tono gris, indicando que no puede ser
seleccionada por el usuario.
DefaultItem. Permite establecer opciones por defecto. En una opcin de men
por defecto, su texto se resalta en negrita.
Checked. Marca/desmarca la opcin. Cuando una opcin est marcada,
muestra junto a su nombre un pequeo smbolo de verificacin o punteo.
RadioCheck. En el caso de que la opcin de men se encuentre marcada, si
asignamos True a esta propiedad, en lugar de mostrar el smbolo de
verificacin estndar, se muestra uno con forma de punto.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

100

ShortCut. Se trata de un atajo de teclado, o combinacin de teclas que


nos van a permitir ejecutar la opcin de men sin tener que desplegarlo. Al
elegir esta propiedad, aparecer una lista con todos los atajos disponibles
para asignar.
ShowShortCut. Permite mostrar u ocultar la combinacin de teclas del atajo
de teclado que tenga asignado una opcin de men.
Visible. Muestra u oculta la opcin de men.
MdiList. Esta propiedad se utiliza habitualmente en opciones situadas en la
barra de men, y permite establecer que dicha opcin al desplegarse,
muestre, adems de las opciones de men que le hayamos asignado, la lista
de ventanas secundarias MDI, en el caso de que el men principal est
contenido en un formulario de tipo MDI. Los formularios MDI sern
tratados posteriormente.
Podemos adicionalmente, asignar una tecla de acceso rpido o hotkey a una
opcin de men, anteponiendo el carcter & a la letra que deseemos, de las que
se encuentran en la propiedad Text del control MenuItem. Al igual que sucede con
los dems tipos de controles, en el texto de la opcin de men, aparecer
subrayada la mencionada letra. De este modo, cuando despleguemos un men,
no ser necesario posicionarnos en una de ellas para ejecutarla, sino que
simplemente pulsando la tecla rpida, se ejecutar el cdigo de dicha opcin.
Tambin podemos establecer separadores entre las opciones de men simplemente
creando una opcin y asignando a su propiedad Text el carcter de guin ( - ).
En nuestro formulario de ejemplo, vamos pues a disear un men con la
estructura del esquema mostrado en la Figura
Para todas las opciones se ha asignado una tecla de acceso rpido, y adicionalmente,
para las opciones que se indican a continuacin, se han modificado algunas
propiedades por defecto.
Guardar. Deshabilitada.
Salir. Atajo de teclado en Ctrl. + S.
Copiar. Opcin por defecto.
Pegar. Marcada con smbolo normal.
Cortar. Marcada con smbolo de crculo.
Elipse. Opcin no visible.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

101

Esquema del men de ejemplo.

La Figura muestra el formulario en ejecucin con una parte del men abierta.

Men desplegado a varios niveles, mostrando opciones.

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

102

Puesto que muchas de las propiedades de un control MenuItem son


manipulables en tiempo de ejecucin, aadiremos al formulario varios botones,
mediante los cuales realizaremos operaciones sobre las opciones del men tales
como habilitar y deshabilitar, mostrar y ocultar, cambiar el nombre, etc. La Figura
muestra el formulario con estos nuevos botones.

Controles Button para manipular por cdigo las propiedades de las opciones del men.
En el Cdigo fuente podemos ver los manipuladores de evento de estos botones.
Private Sub btnHabilitar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnHabilitar.Click
Me.mnuGuardar.Enabled = Not Me.mnuGuardar.Enabled
End Sub
Private Sub btnMarcar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnMarcar.Click
Me.mnuPegar.Checked = Not Me.mnuPegar.Checked
End Sub
Private Sub btnMostrar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnMostrar.Click
Me.mnuElipse.Visible = Not Me.mnuElipse.Visible
End Sub
Private Sub btnNombre_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnNombre.Click
If Me.mnuAbrir.Text = "A&brir" Then
Me.mnuAbrir.Text = "HO&LA"
Else
Me.mnuAbrir.Text = "A&brir"
End If
End Sub

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

103

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


System.EventArgs) Handles btnDefecto.Click
Me.mnuCopiar.DefaultItem = Not Me.mnuCopiar.DefaultItem
End Sub

Men Contextual. ContextMenu


El control ContextMenu representa un men contextual o flotante. Este tipo de
men se asocia al formulario o a uno de sus controles, de modo que al hacer clic
derecho, se mostrar sobre el elemento al que se haya asociado.
El modo de aadir un control ContextMenu y sus correspondientes opciones al
formulario, es el mismo que para un MainMenu; situndose tambin una
referencia del men contextual en el panel de controles especiales del diseador.
Antes de poder disear las opciones de un ContextMenu, debemos pulsar la
referencia de dicho men que existe en el panel de controles especiales, ya que por
defecto, el formulario muestra el men principal en caso de que tenga uno definido.
La Figura muestra el men contextual mnuContexto, que hemos aadido al
formulario. Para asociar este men con un control o formulario, utilizaremos la
propiedad ContextMenu de que disponen la mayora de los controles Windows.
En este ejemplo, insertaremos el control txtValor, de tipo TextBox, y le asociaremos
el men de contexto que acabamos de crear.

Como resultado, cuando ejecutemos la aplicacin, al hacer clic derecho sobre el


TextBox, aparecer el men contextual que hemos asignado, mediante el que
cambiaremos el tipo de fuente de la caja de texto, transformaremos el texto a
maysculas y minsculas. El Cdigo fuente muestra el cdigo de los eventos Click
correspondiente a las opciones del men contextual.
Private Sub mnuFuente_Click(ByVal sender As System.Object, ByVal e As
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

104

System.EventArgs) Handles mnuFuente.Click


Dim oFuente As New Font("Comic", 15)
Me.txtValor.Font = oFuente
End Sub
Private Sub mnuMayusculas_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuMayusculas.Click
Me.txtValor.Text = Me.txtValor.Text.ToUpper()
End Sub
Private Sub mnuMinusculas_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuMinusculas.Click
Me.txtValor.Text = Me.txtValor.Text.ToLower()
End Sub
La Figura muestra el aspecto del men contextual, cuando es utilizado desde el
control TextBox.

Control ContextMenu asociado a un TextBox.

5.18.- Controles avanzados de Visual Basic


Control Temporizadores (Timer)
En VB.NET disponemos al igual que en anteriores versiones, del control Timer, que
nos permite la ejecucin de cdigo a intervalos de tiempo predeterminados.
Este control ha sufrido una importante reestructuracin, ya que internamente
hace uso de la clase Timer, perteneciente al conjunto de clases del sistema. El
hecho de poder acceder a esta clase, nos proporciona una gran flexibilidad en
nuestros desarrollos, ya que, a partir de ahora tambin crearemos temporizadores

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

105

por cdigo, sin necesidad de utilizar el control Timer.


En el ejemplo TimerPru que comentamos a continuacin, vamos a construir un
formulario en el que utilizaremos ambos tipos de temporizadores, el propio control
Timer y un objeto de la clase. El primer proceso a codificar, consistir en
traspasar a intervalos de tiempo, el contenido de un TextBox del formulario, a
otro control de este mismo tipo. El formulario del proyecto se muestra en la Figura

Figura Formulario para ejemplo con temporizadores.

Tras incluir los controles de usuario en el formulario, aadiremos un control Timer,


al que daremos el nombre tmrTemporizador. Esta accin abrir, bajo el diseador
del formulario, un panel para controles especiales, como es el caso de Timer, en el
que se mostrar dicho control.
En este panel se depositan los controles del formulario que no tienen una
interaccin directa con el usuario, o cuyo diseo es diferente al de los controles
habituales.
Para especificar el espacio de tiempo en el que este control ser ejecutado
cuando lo activemos, utilizaremos la propiedad Interval, a la que tenemos que
asignar un valor numrico, que establece dicho tiempo en milisegundos. En
nuestro caso, asignaremos 500, con lo que el control se ejecutar cada medio
segundo.

Panel para controles especiales del diseador de formularios.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

106

El control Timer lo activaremos llamando a su mtodo Start( ), cosa que hacemos al


pulsar el botn btnTraspasar.
Private Sub btnTraspasar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnTraspasar.Click
' iniciar el temporizador
Me.tmrTemporizador.Start()
End Sub
Una vez activado un temporizador, cada vez que transcurre el tiempo indicado en
Interval, genera un evento Tick. Es precisamente en este evento en el que debemos
escribir el cdigo que necesitamos que se ejecute a intervalos regulares de tiempo.
Haremos, por consiguiente, doble clic en el control Timer del diseador, para acceder
al procedimiento manipulador de este evento, cuyo contenido lo podemos ver
' Este evento se produce en el intervalo especificado en el control Timer
Private Sub tmrTemporizador_Tick(ByVal sender As Object, ByVal e As
System.EventArgs) Handles tmrTemporizador.Tick
' quitamos una letra del TextBox de origen...
Dim sLetra As String
sLetra = Me.txtOrigen.Text.Substring(0, 1)
Me.txtOrigen.Text = Me.txtOrigen.Text.Remove(0, 1)
' ...y lo pasamos al TextBox de destino
Me.txtDestino.Text &= sLetra
' cuando se haya traspaso todo el texto detener el temporizador
If Me.txtOrigen.Text.Length = 0 Then
Me.tmrTemporizador.Stop()
MessageBox.Show("Traspaso finalizado")
End If
End Sub

Control ImageList
Este control acta como repositorio de imgenes, del que se alimentarn otros
controles del formulario que necesiten mostrar grficos en su interior.
Una vez aadido este control en el formulario, se situar en el panel de
controles especiales del diseador, y haciendo clic en su propiedad Images, se
abrir la ventana de la Figura, en la que podremos aadir y quitar las imgenes que
van a formar parte de la lista del control, as como ver en el panel complementario,
la informacin sobre cada imagen asignada.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

107

Ventana de administracin de imgenes del control ImageList.


Las imgenes que insertamos en el control tienen un tamao por defecto, en
el caso de que necesitemos modificarlo, expandiremos la propiedad ImageSize
en la ventana de propiedades y asignaremos nuevos valores en Width y Height.
Otra ventaja de este control es que nos permite manipular las imgenes por cdigo,
por ejemplo, para aadir nuevas imgenes, debemos usar el mtodo Add( ) de su
propiedad Images, como muestra el Cdigo fuente
Me.imlImagenes.Images.Add(New Bitmap("tutorias.gif"))

Control ToolBar
Este control representa la barra de herramientas o botones de acceso rpido que
facilitan al usuario la ejecucin de los procesos principales del programa,
evitndole la navegacin por el men del formulario.
Al ser dibujado, este control queda acoplado a la parte superior del formulario.
Despus de ponerle tbrBarra como nombre, asignaremos a su propiedad
ImageList, el control de ese mismo tipo que acabamos de crear; esto nos
permitir asignar los grficos de la lista a los botones que vayamos creando en
el ToolBar. Para establecer el tamao de los botones de la barra utilizaremos la
propiedad ButtonSize de este control.
Seguidamente haremos clic en la propiedad Buttons, que abrir una ventana con
la coleccin de botones de la barra, en la que podremos crear y configurar dichos
botones.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

108

Editor de botones del control ToolBar.


Cada botn en un ToolBar es un objeto de tipo ToolBarButton, del que
podemos destacar las siguientes propiedades.
Text. Cadena con el texto que muestra el botn.
ImageIndex. En el caso de asociar el ToolBar con un control ImageList, en
esta propiedad asignamos para un botn una de las imgenes del ImageList,
indicando el nmero de orden de la imagen.
Style. Permite establecer el estilo del botn: de pulsacin; separador; o de
tipo desplegable, que abre un subconjunto de opciones.
DropDownMenu. Si asociamos el botn con una opcin de la barra de men
del formulario, y configuramos su estilo como DropDownButton, al pulsar el botn
desplegable, se mostrarn las opciones de men; el efecto ser el mismo que si
hubiramos desplegado directamente el men del formulario.
La Figura muestra la ventana principal de la aplicacin con la barra de herramientas

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

109

Formulario con ToolBar.


Una vez terminado el diseo del ToolBar, debemos codificar su evento
ButtonClick, que ser provocado cada vez que se pulse un botn de la barra.
Dentro del procedimiento de este evento, comprobaremos qu botn ha sido
pulsado y ejecutaremos las acciones oportunas.
Tanto el botn Abrir como la opcin de men del mismo nombre realizan la misma
tarea, por lo que llaman al mtodo AbrirArchivo( ), que es quien realmente
muestra el formulario necesario.
Private Sub tbrBarra_ButtonClick(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.ToolBarButtonClickEventArgs) Handles
tbrBarra.ButtonClick
' comprobar qu botn de la barra se ha pulsado
If e.Button Is Me.btnAbrir Then
' llamamos al mtodo que abre el formulario para abrir un archivo
Me.AbrirArchivo()
End If
If e.Button Is Me.btnSalir Then
' cerrar la aplicacin
Me.Close()
End If
End Sub
Private Sub mnuAbrir_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuAbrir.Click
' al seleccionar esta opcin de men llamar al mtodo que
' abre el formulario que permite abrir un archivo
Me.AbrirArchivo()
End Sub
Private Sub AbrirArchivo()
Dim ofrmAbrirArchivo As New frmAbrirArchivo()
ofrmAbrirArchivo.MdiParent = Me
ofrmAbrirArchivo.Show()
End Sub
Al haber asignado al botn btnPersonal uno de los mens de la barra del formulario,
no ser necesario escribir cdigo para detectar este botn en el evento ButtonClick,
ya que se ejecutar directamente el cdigo del evento Click de las opciones de
men. El Cdigo fuente 523 muestra el cdigo perteneciente a la opcin de
men Personal + Datos.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

110

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


System.EventArgs) Handles mnuDatos.Click
Dim ofrmPersonal As New frmDatosPersonal()
ofrmPersonal.MdiParent = Me
ofrmPersonal.Show()
End Sub

Control StatusBar
Para mostrar una barra informativa de estado recurriremos a este control, que
al dibujarse queda situado en la parte inferior del formulario; como nombre le
daremos sbrEstado. De forma similar al ToolBar, un control StatusBar est
compuesto de una coleccin de objetos Panel, que iremos aadiendo al control
mediante la propiedad Panels, la cual mostrar una ventana para la creacin y
configuracin de tales paneles.

Editor de paneles del control StatusBar.


Entre las propiedades destacables de un objeto Panel podemos mencionar las
siguientes.
BorderStyle. Muestra el panel con efecto resaltado, hundido o normal.
Icon. Permite asociar un icono al panel.
AutoSize. Con esta propiedad podemos conseguir que el panel se redimensione
ajustndose a su contenido o que tenga un tamao fijo.
En este ejemplo, hemos aadido dos paneles a la barra de estado del formulario. En
uno mostramos un texto fijo; mientras que en el otro, visualizamos la hora
actual a travs de un objeto Timer que ponemos en marcha en el evento Load
del formulario. Veamos los mtodos implicados, en el Cdigo fuente 524.
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

111

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


System.EventArgs) Handles MyBase.Load
' al cargar el formulario, creamos un temporizador
' le asociamos un manejador para su evento Tick y lo iniciamos
Dim oTiempo As New Timer()
oTiempo.Interval = 1000
AddHandler oTiempo.Tick, AddressOf PonerHoraActual
oTiempo.Start()
End Sub
Private Sub PonerHoraActual(ByVal sender As Object, ByVal e As EventArgs)
' actualizamos a cada segundo la hora de un panel de la barra de estado
Me.sbrEstado.Panels(1).Text = DateTime.Now.ToString("HH:mm:ss")
End Sub
La Figura muestra el formulario con la barra de estado.

Formulario con StatusBar.


Finalizada la creacin del StatusBar, aadiremos al proyecto un formulario
con el nombre frmDatosPersonal, en el dibujaremos un conjunto de nuevos
controles que iremos describiendo seguidamente.

Control DateTimePicker
Este control permite la seleccin e introduccin de fechas en una caja de texto
con capacidades extendidas, o bien mediante un calendario desplegable que se
mostrar al pulsar el botn de expansin que contiene. Ver Figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

115

Control MonthCalendar con el tamao ampliado.


Para detectar la seleccin de una fecha utilizaremos el evento DateChanged.
Debido a que en un control MonthCalendar podemos seleccionar un rango de
fechas, las propiedades que tenemos que manipular para averiguar
la
fechas seleccionadas son: SelectionStart, SelectionEnd y SelectionRange, aunque
en muchas ocasiones slo ser necesario utilizar una de ellas.
Private Sub mclCalendario_DateChanged(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.DateRangeEventArgs) Handles mclCalendario.DateChanged
' mostrar en un Label la fecha seleccionada en el control MonthCalendar
Me.lblCalendario.Text = Me.mclCalendario.SelectionStart
End Sub

Control LinkLabel
Este control permite tener en un formulario Windows un enlace hacia una pgina de
Internet, con un comportamiento similar al que encontramos en un hiperenlace de una
pgina web.
Su propiedad Text muestra un literal, de modo que al hacer clic sobre el mismo, se
provocar el evento LinkClicked en el que escribiremos el cdigo a ejecutar.
En nuestro formulario de ejemplo, hemos creado un control de este tipo con el
nombre lnkEidos, que tiene el aspecto de la Figura 322, ya que adems del enlace, le
hemos asignado una imagen.

Control LinkLabel.
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

116

Para conseguir que al hacer clic en este enlace, se abra Internet Explorer y
navegue hacia una determinada pgina, vamos a utilizar la clase Process, que
como su nombre indica, nos permite la gestin de procesos del sistema, tales como
su inicio y finalizacin.
En este caso, el mtodo compartido Start( ), de Process, va a ejecutar el navegador
al pasarle como parmetro una direccin web en forma de cadena. Veamos el Cdigo
Private Sub lnkEidos_LinkClicked(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles
lnkEidos.LinkClicked
' inicia Internet Explorer y navega hacia una pgina
Process.Start("http://www.eidos.es")
End Sub

Creacin y manipulacin de elementos en ejecucin


El conjunto de controles que acabamos de ver, al igual que los bsicos permiten
ser creados no slo mediante el diseador de formularios, sino tambin desde
cdigo. Como muestra de ello, la opcin de men Varios + Aadir botn y panel,
aade dos imgenes al control ImageList del formulario frmPrincipal, creando un
nuevo botn para el ToolBar y un panel para el StatusBar Ver el Cdigo
Private Sub mnuAgregaElementos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuAgregar.Click
' aadir por cdigo imgenes a la lista
Me.imlImagenes.Images.Add(New Bitmap("tutorias.gif"))
Me.imlImagenes.Images.Add(New Bitmap("camera1.gif"))
Dim oBoton As New ToolBarButton()
oBoton.Text = "TUTORIAS"
oBoton.ImageIndex = 4
Me.tbrBarra.Buttons.Add(oBoton)
Dim oPanel As New StatusBarPanel()
oPanel.Text = "BUSCAR"
oPanel.BorderStyle = StatusBarPanelBorderStyle.Raised
oPanel.ToolTipText = "Informacin sobre bsquedas"
oPanel.Icon = New Icon("magnify.ico")
Me.sbrEstado.Panels.Add(oPanel)
End Sub
Para detectar la pulsacin del nuevo botn de la barra de herramientas, aadimos el
siguiente cdigo en su evento ButtonClick, que vemos en el Cdigo

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

117

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


System.Windows.Forms.ToolBarButtonClickEventArgs) Handles
tbrBarra.ButtonClick
'....
If e.Button.Text = "TUTORIAS" Then
MessageBox.Show("Se ha pulsado el botn de tutoras")
End If
End Sub
La Figura muestra este formulario en ejecucin tras aadir los nuevos elementos.

Nuevos controles aadidos al formulario en tiempo de ejecucin.

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,

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

118

cerrar el proceso en el que se est ejecutando la calculadora mediante el mtodo Kill(


). Veamos esta parte en el Cdigo
Public Class frmPrincipal
Inherits System.Windows.Forms.Form
Private oCalculadora As Process
'....
Private Sub mnuCalcAbrir_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuCalcAbrir.Click
' iniciar la calculadora
oCalculadora = Process.Start("calc.exe")
End Sub
Private Sub mnuCalcCerrar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuCalcCerrar.Click
' cerrar la calculadora
oCalculadora.Kill()
End Sub
End Class
Al ejecutar el programa, se mostrar un nuevo icono en la lista del panel de iconos
del sistema de la barra de tareas, como muestra la Figura 324.

Control NotifyIcon en el panel de iconos del sistema de la barra de tareas.


Como se puede comprobar, la clase Process ampla enormemente nuestra
capacidad de manipulacin de los procesos del sistema.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

119

6.- PROGRAMACIN ORIENTADA A OBJETOS (POO) DE VISUAL BASIC.NET


Introduccin:
Todo .NET Framework est basado en clases (u objetos). A diferencia de las versiones
anteriores de Visual Basic, la versin .NET de este lenguaje basa su funcionamiento casi
exclusivamente en las clases contenidas en .NET Framework, adems casi sin ningn
tipo de limitacin.
La POO es una evolucin de la programacin por procedimientos llamada tambin
estructurada. Se basaba en funciones y procedimientos y el cdigo que controlaba el
flujo de las llamadas a estos. En Visual Basic, sobre todo en versiones anteriores se
sigue programando mucho as. A veces por desconocimiento y otras por "miedo" no se
da el salto a la POO, aunque un programador con experiencia en VB puede hacer
magnficas aplicaciones sin utilizar la POO (y sin aprovecharse de sus ventajas), y sobre
todo, en un tiempo relativamente reducido.

6.1.-Qu es una clase?


Los programas de Visual Basic se generan con objetos como formularios y controles.
Los objetos tambin se pueden utilizar para representar cosas reales como personas,
equipos informticos o incluso algo ms abstracto, como una cuenta bancaria.
Una clase es simplemente una representacin de un tipo de objeto. Se puede pensar
en ella como un plano que describe el objeto. As como un plano puede utilizarse para
construir varios edificios, una clase podemos usarla para crear varias copias de un
objeto.
Por ejemplo, el control TextBox lo define una clase TextBox, que define su aspecto y
sus funciones. Cada vez que arrastramos un control TextBox a un formulario,
realmente est creando una nueva instancia de la clase TextBox.
Cada control TextBox es una copia exacta, aunque distinta, de la clase que lo define, la
clase TextBox. Puesto que cada objeto es una "instancia" independiente de una clase,
la accin de crear una clase se denomina creacin de instancias.
Hasta ahora hemos agregado los controles TextBox a su formulario arrastrndolos
desde el Cuadro de herramientas, pero tambin puede crear instancias de un objeto
TextBox en su cdigo si utiliza la palabra clave New.
Dim Textbox1 As New TextBox

Qu hay dentro de una clase?


Todos los objetos tienen propiedades que describen sus atributos, mtodos que
definen sus acciones y eventos que definen sus respuestas. Igualmente, la clase que

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

121

6.2.- Crear la primera clase


Una de las mejores razones para utilizar clases es que una vez que ha creado una clase
para cierto tipo de objeto, se puede reutilizar esa clase en cualquier proyecto.
Por ejemplo, muchos de los programas que escribimos pueden involucrar personas: Un
programa de administrador de contactos para los contactos comerciales o un
programa para realizar un seguimiento de empleados. Aunque los programas pueden
ser considerablemente diferentes, los atributos que se aplican a cada persona seran
los mismos. Todas tienen nombre, edad, direccin, nmero de telfono, etc.
Para empezar a ver mejor crear clases,y usarlas crearemos una clase que represente a
una persona; Podemos guardar esta clase y utilizarla en otros programas que
escribamos en el futuro.
Las clases se pueden crear de tres maneras: como parte del cdigo en un mdulo de
formulario en un proyecto de aplicacin para Windows, como un mdulo de clase
separado agregado a un proyecto de aplicacin para Windows o como un proyecto de
bibliotecas de clase independiente.

Crear clases
Al hacer doble clic en un formulario y abrir el Editor de cdigo se ve algo parecido a lo
siguiente:
Public Class Form1
Private Sub Form1_Load...

End Sub
End Class

Podemos observar que el formulario realmente es una clase, marcada por


instrucciones Class y End Class y cualquier cdigo que se haya escrito entre las dos
instrucciones es parte de la clase. Aunque de manera predeterminada un mdulo de
formulario contiene slo una clase nica, puede crear mdulos adicionales agregando
cdigo debajo de la instruccin End Class, tal como se ilustra a continuacin:
Public Class Form1
' El cdigo de vuestro Form AQUI
End Class
Public Class MyFirstClass
' El cdigo de vuestra clase AQUI
End Class

La desventaja de crear clases de esta manera es que slo estn disponibles dentro del
proyecto donde se crearon. Si deseamos compartir una clase con otros proyectos,
puede colocarla en un mdulo de clase.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

En el cuadro Nombre, escribimos Persons y hacemos clic en Aceptar.

Se abrir un nuevo proyecto de bibliotecas de clase y el Editor de cdigo


mostrar el mdulo de clase Class1.vb.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

123

En el Explorador de soluciones, hacemos clic con el botn secundario del ratn


en Class1.vb y seleccionamos Cambiar nombre y, a continuacin, cambiamos el
nombre a "Persons.vb".

Observamos que el nombre en el Editor de cdigo tambin cambia a


Persons.vb.
En el men Archivo, elegimos Guardar todo.
En el cuadro de dilogo Guardar proyecto, hacemos clic en Guardar.
Nota: En lugar de guardar el proyecto en la ubicacin predeterminada, podramos
crear un directorio en el cual podemos almacenar todas las clases para reutilizarlas
mas tarde. se puede especificar esa carpeta en el campo Location del cuadro de
dilogo Guardar proyecto antes de guardar.
De momento, mantendremos el proyecto abierto, porque lo utilizaremos durante todo
el tutorial, e iremos ampliando la informacin.

Agregar propiedades a una clase


Ahora, aprenderemos a agregar propiedades a la clase que creamos en la seccin
anterior.
Todos los objetos tienen atributos y las propiedades representan atributos. Antes,
hicimos la clase "Persons", que representa a una persona; las personas tienen
atributos como el nombre y la edad, por lo que la clase Persons necesita propiedades
que representen dichos atributos.
Se pueden agregar propiedades a una clase de dos maneras:

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

124

Como campo.
Como procedimiento de propiedad.
Tambin podemos determinar cmo funciona una propiedad utilizando los
modificadores Public, ReadOnly o WriteOnly.

Campos y procedimientos de propiedad


Los campos son variables pblicas dentro de una clase que se pueden establecer o leer
desde fuera de la clase. Resultan de utilidad para propiedades que no se tienen que
validar, por ejemplo, un valor "Boolean" (True o False).
En el caso de la clase Personas, se puede tener una propiedad Boolean denominada
Casado, que especifica si una persona est soltera o casada, puesto que hay slo dos
valores posibles.
Para agregar un campo a una clase, el cdigo podra ser como el que sigue.
Public Casado As Boolean
La mayora de las propiedades, sin embargo, son ms complejas; en la mayor parte de
los casos utilizaremos procedimientos de propiedad para agregar una propiedad a una
clase.
Los procedimientos de propiedad tienen tres partes:
Una declaracin de una variable privada para almacenar el valor de la
propiedad.
Un procedimiento Get que expone el valor.
Un procedimiento Set que, como indica su nombre, establece el valor en la
clase.
Por ejemplo, un procedimiento de propiedad para una propiedad Name, de la clase
Personas, podra ser como el que sigue:
Private ValorNombre As String
Public Property Nombre() As String
Get
Nombre = ValorNombre
End Get
Set(ByVal valor As String)
ValorNombre = valor
End Set
End Property

Recibe el dato en la variable ValorNombre de


La clase

Devuelve el contenido de la variable ValorNombre

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

3. Agregamos el siguiente cdigo de declaracin debajo de la lnea Public Class


Personas.
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

126

Private ValorPrimerNombre As String


Private ValorSegundoNombre As String
Private ValorApellido As String
Public Casado As Boolean
4. Agregamos los siguientes procedimientos de propiedad debajo del cdigo de
declaracin anterior.
Public Property PrimerNombre() As String
Get
PrimerNombre = ValorPrimerNombre
End Get
Set(ByVal valor As String)
ValorPrimerNombre = Valor
End Set
End Property
Public Property SegundoNombre() As String
Get
SegundoNombre = ValorSegundoNombre
End Get
Set(ByVal valor As String)
ValorSegundoNombre = Valor
End Set
End Property
Public Property Apellido() As String
Get
Apellido = ValorApellido
End Get
Set(ByVal valor As String)
ValorApellido = Valor
End Set
End Property
Quedar as:
5. En el men Archivo, elegimos Guardar todo para guardar el trabajo.

Propiedades de slo lectura y escritura


A veces una propiedad se establece una vez y no cambia nunca mas durante la
ejecucin del programa. Por ejemplo, una propiedad que representa un nmero de
empleado nunca debe cambiar, de modo que otro programa si lo pueda leer, pero no
se permitir que ese programa cambie su valor.
La palabra clave ReadOnly se utiliza para especificar que un valor de propiedad se
pueda leer pero no modificar.
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

127

Nota: Si intentamos asignar un valor a una propiedad ReadOnly, aparecer un error en


el Editor de cdigo.
Para crear una propiedad de slo lectura, deberemos crear un procedimiento de
propiedad con un procedimiento Get, pero sin procedimiento Set, como se muestra a
continuacin.
Private IDValue As Integer
ReadOnly Property ID() As Integer
Get
ID = IDValue
End Get
End Property
De igual forma, la palabra clave WriteOnly permite establecer un valor de propiedad
pero no permite que se lea; por ejemplo, no permite que otros programas lean una
propiedad de contrasea. Podemos utilizar ese valor para realizar acciones dentro de
la clase, pero desear que sigan siendo privadas.
Para crear una propiedad de slo escritura, se crear una propiedad con un
procedimiento Set pero sin procedimiento Get, como a continuacin:
Private passwordValue As String
WriteOnly Property Password() As String
Set(ByVal value As String)
passwordValue = value
End Set
End Property
Los procedimientos de propiedad ReadOnly y WriteOnly tambin son tiles cuando
deseamos tomar un valor de propiedad y convertirlo en un valor diferente. Por
ejemplo, pensemos en la edad de una persona. A diferencia del nombre, la edad
cambia con el tiempo, si ha asignado la edad a una clase y la lee de nuevo un ao
despus, sera incorrecta.
En la clase Persons, podemos evitarlo agregando dos propiedades: una propiedad
"WriteOnly BirthYear" que representa el ao de nacimiento, que nunca cambia, y una
propiedad "ReadOnly Age" que devuelve un valor calculando la diferencia entre el ao
en curso y el ao de nacimiento.
Siguiendo con la Clase Persons, ahora agregaremos propiedades ReadOnly y
WriteOnly a la clase:
1. Agregamos el siguiente cdigo de declaracin debajo de las otras declaraciones
en la parte superior del mdulo de clase.
Private birthYearValue As Integer

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

128

2. Introducimos los siguientes procedimientos de propiedad debajo del cdigo de


declaracin.
WriteOnly Property BirthYear() As Integer
Set(ByVal value As Integer)
birthYearValue = value
End Set
End Property
ReadOnly Property Age() As String
Get
Age = My.Computer.Clock.LocalTime.Year birthYearValue
End Get
End Property
3. En el men Archivo, elegimos Guardar todo para guardar el trabajo.

6.4.- Agregar mtodos a una clase


Agregaremos mtodos a una clase, para que puedan realizar acciones. Vimos que la
mayora de los objetos tienen acciones que pueden realizar; estas acciones se conocen
como mtodos.
La clase Persons que creamos en la seccin anterior,tiene muchas acciones que
pueden realizar las personas y, estas acciones se pueden expresar como mtodos de
clase.

Mtodos de una clase


Los mtodos de una clase son simplemente procedimientos Sub o Function, declarados
en la clase.
Por ejemplo, una clase Cuenta puede tener un procedimiento Sub denominado
Recalcular, que actualizar el balance o un procedimiento Function denominado
CurrentBalance para devolver el ltimo balance.
El cdigo para declarar esos mtodos puede ser similar al siguiente:
Public Sub Recalcular()
'Aqui el codigo para recalcular Cuenta.
End Sub
Ejemplo:
Public Function BalanceCuenta(ByVal AccountNumber As Integer) As Double
'Codigo para volver a Balance
End Function

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

129

Si bien la mayora de los mtodos de clase son pblicos, tambin se pueden agregar
mtodos que slo la clase en s puede utilizar. Por ejemplo, la clase Personas puede
tener su propia funcin para calcular la edad de una persona. Si declara la funcin
como Private, no se puede ver o llamar desde fuera de la clase.
El cdigo para una funcin privada puede ser similar a ste otro:
Private Function CalcuEdad(ByVal year As Integer) As Integer
CalcuAge = My.Computer.Clock.LocalTime.Year - year
End Function
Ms tarde podremos cambiar el cdigo que calcula el valor CalcAge y el mtodo
seguir funcionando bien sin cambiar ningn cdigo que utilice el mtodo. Ocultar el
cdigo que realiza el mtodo, se conoce como la "encapsulacin", ya explicada al
comienzo.
Ahora, para agregar un mtodo a la clase Persons, hacemos lo siguiente:
Abrimos el proyecto Personas (si no lo tenemos abierto ya de antes) que
hicimos en las secciones anteriores. Si no lo guardaste, o no lo creaste, primero
debers volver a las secciones anteriores, agregar propiedades a la clase, y
completar los procedimientos.
En el Explorador de soluciones, seleccionamos Personas.vb y, en el men Ver,
hacemos clic en Cdigo. Agregamos el siguiente cdigo bajo los procedimientos
de propiedad.
Public Function NombreComplet() As String
If ValorSegundoNombre <> "" Then
NombreCompleto = ValorPrimerNombre & " " &
ValorSegundoNombre & " " & ValorApellido
Else
NombreCompleto = ValorPrimerNombre & " " &
ValorApellido
End If
End Function
Private Function CalcuEdad(ByVal year As Integer) As Integer
CalcuEdad = My.Computer.Clock.LocalTime.Year - year
End Function
Modificamos el cdigo en el procedimiento de la propiedad Age para utilizar la
funcin privada:
ReadOnly Property Age() As String
Get
'Age = My.Computer.Clock.LocalTime.Year
birthDateValue
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

130

Age = CalcuEdad(birthYearValue)
End Get
End Property
Antes, el cdigo era as:
ReadOnly Property Age() As String
Get
Age = My.Computer.Clock.LocalTime.Year
birthYearValue
End Get
End Property

En el men Archivo, hacemos clic en Guardar todo para guardar el trabajo.

6.5.- Agregar eventos a una clase


Un programa puede responder a eventos externos, como por ejemplo, un usuario que
hace clic en un botn. En esta seccin, obtendremos informacin sobre cmo agregar
eventos a una clase.
Primero, debemos declarar el evento.
A continuacin, debemos provocarlo.
Provocar un evento significa que estamos sealizando la aparicin del evento. Para
agregar un evento a una clase, lo declaramos con la instruccin Event. sto indica que
el objeto puede provocar el evento que especificamos.
Por ejemplo, quizs deseemos agregar un evento AgeCalculated a la clase Persons que
hicimos. Podemos provocar a continuacin el evento en el mtodo CalcAge. Despus
de hacer esto, cuando se llama al mtodo, podemos ejecutar algn cdigo adicional en
cuanto se haya calculado la edad de la persona.

Para agregar un evento a la clase Persons


Abrimos el proyecto Persons.
En el Explorador de soluciones, seleccione Persons.vb y, en el men Ver,
hacemos clic en Cdigo.
Agregamos el siguiente cdigo encima de los procedimientos de propiedad.
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

131

Public Event AgeCalculated(ByVal Age As Single)


En el mtodo CalcAge, reemplazamos el cdigo existente por el siguiente
cdigo para provocar el evento.
Private Function CalcAge(ByVal year As Integer) As Integer
Dim Age = My.Computer.Clock.LocalTime.Year - year
RaiseEvent AgeCalculated(Age)
CalcAge = My.Computer.Clock.LocalTime.Year - year
End Function
En el men Archivo, hacemos clic en Guardar todo para guardar el trabajo.

Probar una clase


Creamos una clase llamada "Persons" y le proporcionamos propiedades, mtodos y
eventos. Lo que hemos hecho hasta ahora es agregar cdigo, ahora es el momento de
utilizar la clase Persons y asegurarse de que funciona segn lo esperado.

6.6.- Crear una instancia de una clase


Los formularios y controles son en realidad clases; cuando arrastramos un control
Button a un formulario, estamos creando realmente una instancia de la clase Button.
Tambin podemos crear instancias de cualquier clase en el cdigo utilizando una
declaracin con la palabra clave New. Por ejemplo, para crear una nueva instancia de
la clase Button, agregaremos el cdigo siguiente.
Dim aButton As New Button

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.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

132

En el panel Plantillas, en el cuadro de dilogo Nuevo proyecto, hacemos clic en


Aplicacin de Windows Forms.
En el cuadro Nombre, escribimos PersonsTest y hacemos clic en Aceptar.

Se agregar un nuevo proyecto de Windows Forms al Explorador de soluciones


y aparecer un nuevo formulario.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

133

En el Explorador de soluciones, seleccionamos el proyecto PersonsTest y, en el


men Proyecto, hacemos clic en Establecer como proyecto de inicio.

En el Explorador de soluciones, seleccionamos el proyecto PersonsTest y, en el


men Proyecto, hacemos clic en Agregar referencia.
Aparecer el cuadro de dilogo Agregar referencia.

Hacemos clic en la ficha Proyectos, seleccionamos Personas y hacemos clic en


Aceptar.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

134

Hacemos doble clic en el formulario para abrir el editor de cdigo y escribimos


la siguiente declaracin justo debajo de la lnea Public Class Form1.
Dim person1 As New Persons.Persons

Esto declara una nueva instancia de la clase Persons.


Quizs os preguntis por qu tuvimos que escribir dos veces Persons, pues
porque la primera instancia es el mdulo de clase Persons.vb y la segunda
instancia es la clase Persons de ese mdulo.
En el men Archivo, hacemos clic en Guardar todo.
El siguiente paso es agregar una interfaz de usuario y un cdigo que utilice la clase
Persons.
Agregaremos cuadros de texto donde el usuario especificar los valores para cada una
de las propiedades (excepto la propiedad de slo lectura "Age"), una casilla para el
campo "Married" y botones para probar cada uno de los mtodos pblicos.

Para probar la clase Persons:


En el Explorador de soluciones, seleccionamos Form1 y, en el men Ver,
hacemos clic en Diseador.
En el Cuadro de herramientas, arrastramos cuatro controles TextBox, un
control CheckBox y dos controles Button al formulario.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

135

Seleccionamos el primer control Button y, a continuacin, en la ventana


Propiedades establecemos la propiedad Text en Update.
Seleccionamos el segundo control Button y en la ventana Propiedades
establecemos la propiedad Text en Full Name.
Hacemos doble clic en el primer botn (Update) para abrir el Editor de cdigo y
en el controlador de eventos Button1_Click, agregamos el siguiente cdigo:
With person1
.FirstName = Textbox1.Text
.MiddleName = Textbox2.Text
.LastName = Textbox3.Text
.BirthYear = Textbox4.Text
.Married = CheckBox1.Checked
End With
En el controlador de eventos Button2_Click, agregamos lo siguiente:
MsgBox(person1.NombreCompleto)
MsgBox(CStr(person1.Edad) & " aos")
If person1.Casado = True Then
MsgBox(person1.PrimerNombre & " es casado")
Else
MsgBox(person1.Primernombre & " es soltero")
End If
Presionamos F5 para ejecutar el proyecto y mostrar el formulario:

-En el primer cuadro de texto, escribimos nuestro nombre.


-En el segundo cuadro de texto, escribimos nuestro segundo nombre.
-En el tercer cuadro de texto, escribimos nuestro apellido.
-En el cuarto cuadro de texto, escribimos el ao de nuestro nacimiento con
cuatro dgitos (por ejemplo, 1983).
-Activamos la casilla de si estamos casados/as.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

136

Hacemos clic en el botn "Update" para establecer las propiedades de la clase y


clic en el botn "Full Name".
Se muestran tres cuadros de mensaje. Estos cuadros de mensaje muestran su
nombre completo, edad y estado civil.

En el men Archivo, hacemos clic en Guardar todo.

6.7.-Cmo utilizar los constructores


Introduccin
En Visual Basic .NET, la inicializacin de nuevos objetos se controla utilizando
constructores. Para crear un constructor para una clase, se crea un procedimiento
denominado Sub New en cualquier lugar de la definicin de la clase.
Caractersticas de Sub New
El constructor Sub New tiene las siguientes caractersticas:
El cdigo del bloque Sub New siempre se ejecutar antes de cualquier otro cdigo de
una clase.
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

138

MsgBox("El objeto se ha creado el da "& loEmp.FechaCrea)


End Sub
End class
Public Class Empleado
Private mdtFechaCrea As Date
Public Property FechaCrea() As Date
Get
Return mdtFechaCrea
End Get
Set(ByVal Value As Date)
mdtFechaCrea = Value
End Set
End Property
' mtodo constructor
Public Sub New()
' asignamos un valor inicial a una variable de propiedad
Me.FechaCrea = Now
End Sub
End Class
Al igual que ocurre en un mtodo normal, New( ) admite parmetros; esto nos
sirve para asignar valores de inicio al objeto en el momento de su instanciacin.
La denominacin para este tipo de mtodos es constructor parametrizado. El
Cdigo nos muestra una variacin del fuente anterior, utilizando un constructor de
este tipo.
Interfase grafica cliente
Public class form1..
Private Sub Botton_Click
Dim loEmp As Empleado
loEmp = New Empleado("5/7/2002")
MsgBox("El objeto se ha creado el da "& loEmp.FechaCrea)
' este es otro modo de instanciar
' un objeto con un constructor parametrizado
Dim loEmp2 As New Empleado("08/4/2002")
End Sub
End Class
Public Class Empleado
Private mdtFechaCrea
Public Property FechaCrea() As Date
Get
Return mdtFechaCrea
End Get
Set(ByVal Value As Date)
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

139

mdtFechaCrea = Value
End Set
End Property
' mtodo constructor con parmetro
Public Sub New(ByVal ldtFecha As Date)
' asignamos el valor del parmetro a una variable de propiedad
Me.FechaCrea = ldtFecha
End Sub
End Class
Combinando las caractersticas de mtodos constructores junto a las de sobrecarga,
podemos crear un conjunto de constructores sobrecargados para la clase.
Public Class Empleado
Public psNombre
Public psApellidos
Public psCiudad
Private mdtFechaCre
' en este constructor sin parmetros, asignamos la fecha actual
Public Sub New()
mdtFechaCrea = Now()
End Sub
' en este constructor, asignamos valores a todos los campos de la clase
Public Sub New(ByVal lsNombre As String, ByVal lsApellidos As String, ByVal
lsCiudad As String)
psNombre = lsNombre
psApellidos = lsApellidos
psCiudad = lsCiudad
End Sub
End Class

6.8.-Cmo utilizar los destructores


Introduccin
En Visual Basic .NET, podemos controlar qu ocurre durante la destruccin de objetos
utilizando procedimientos denominados destructores.
Finalize y Dispose
El sistema invoca al destructor Finalize antes de liberar el objeto. Puede utilizarse para
limpiar recursos abiertos, como conexiones a bases de datos, o para liberar otros

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

6.9.-Cmo utilizar miembros de datos compartidos


Introduccin
En Visual Basic .NET, los miembros de datos compartidos pueden utilizarse para
permitir que mltiples instancias de una clase hagan referencia a una nica variable a
nivel de clase.
Sintaxis
Utilizaremos la siguiente sintaxis para declarar miembros de datos compartidos:
NiveldeAcceso Shared MiembrodeDatos As TipodeDatos
Niveles de acceso
Los miembros de datos compartidos estn directamente enlazados a la clase, y podemos
declararlos como pblicos o privados. Si declaramos los miembros de datos como
pblicos, estarn accesibles para cualquier cdigo que pueda acceder a la clase. Si
declaramos los miembros de datos como privados, proporcionaremos propiedades
compartidas pblicas para acceder a la propiedad compartida privada.
Ejemplo
El siguiente ejemplo muestra cmo crear una clase de cuenta de ahorro
(SavingsAccount) que utilice un miembro de datos compartido pblico para mantener
los tipos de inters para una cuenta de ahorro:

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

142

Invocar propiedades compartidas desde un cliente


Una vez declarada la propiedad compartida Rate, puede utilizarse en una aplicacin
cliente en lugar de acceder directamente al miembro de datos compartido interestRate.
Podemos invocar una propiedad compartida cualificndola con el nombre de clase o con
el nombre de variable de una instancia especfica de la clase.
El siguiente cdigo muestra cmo invocar una propiedad compartida cualificndola con
el nombre de la clase:
SavingsAccount.Rate = 0.03
El siguiente cdigo muestra cmo invocar una propiedad compartida utilizando el
nombre de variable de una instancia especfica de la clase:

6.10.-Cmo utilizar los mtodos compartidos


Introduccin
Podemos utilizar los miembros de procedimiento compartidos para disear funciones
que pueden ser invocadas sin crear una instancia de la clase. Los procedimientos
compartidos son mtodos de una clase que no estn asociados a una instancia especfica
de una clase. Los miembros de procedimiento compartidos nicamente pueden acceder
a datos marcados con la palabra clave Shared. Por ejemplo, un mtodo compartido no
puede hacer referencia a un miembro de la instancia de una clase.
Ejemplo del uso de un miembro de procedimiento compartido
El siguiente ejemplo muestra cmo una funcin utilizada habitualmente, como
GetComputerName, puede crearse como un miembro de procedimiento compartido de
forma que una aplicacin cliente puede utilizarla fcilmente. El cliente nicamente
necesita hacer referencia al mtodo prefijado por el nombre de la clase, ya que no se
requiere ninguna instancia de la clase.
' TestClass code
Public Shared Function GetComputerName( ) As String
...
End Function
' Client code
MessageBox.Show(TestClass.GetComputerName( ))
Observaremos tambin que, en el cdigo anterior, Show es un mtodo compartido de la
clase MessageBox.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

Sobrecarga de mtodos o polimorfismo, en una misma clase


La sobrecarga de mtodos, es una tcnica que consiste en crear varios mtodos con
idntico nombre dentro de la misma clase, distinguindose entre s por su lista de
parmetros. Analicemos el siguiente ejemplo:
Interfase grafica cliente
Public class form1..
Private Sub Botton_Click
Dim loEmpleado As New Empleado()
Dim ldbResultadoIncent As Double
loEmpleado.Salario = 1020.82
'llamada al primer mtodo sobrecargado
loEmpleado.Sueldo()

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

144

'llamada al segundo mtodo sobrecargado


MsgBox("El sueldo se transferir el da " & loEmpleado.Sueldo(29))
'llamada al tercer mtodo sobrecargado
ldbResultadoIncent = loEmpleado.Sueldo(50.75, "Extras")
MsgBox(El incentivo a pagar ser " & ldbResultadoIncent)
End Sub
End Class
Public Class Empleado
Private mdbSalario As Double
Public Property Salario() As Double
Get
Return mdbSalario
End Get
Set(ByVal Value As Double)
mdbSalario = Value
End Set
End Property
' Mtodos sobrecargados
Public Overloads Sub Sueldo()
' aqu mostramos en consola el importe del sueldo formateado
MsgBox("El sueldo es " & Format(Me.Salario, "#,#.##"))
End Sub
Public Overloads Function Sueldo(ByVal liDia As Integer) As String
' Aqu mostramos la fecha del mes actual en la que se
' realizar la transferencia del sueldo al banco del empleado
Dim ldtFechaActual As Date
Dim lsFechaCobro As String
ldtFechaActual = Now()
lsFechaCobro = CStr(liDia) & "/" & _
CStr(Month(ldtFechaActual)) & "/" & _
CStr(Year(ldtFechaActual))
Return lsFechaCobro
End Function
Public Overloads Function Sueldo(ByVal ldbImporteIncentivo As Double,ByVal
lsTipoIncentivo As String) As Double
' aqu calculamos la cantidad de incentivo que se aadir al
' sueldo del empleado,en funcin del tipo de incentivo
Dim ldbIncentivo As Double
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

145

' segn el tipo de incentivo, se descuenta un importe de la cantidad del


incentivo
Select Case lsTipoIncentivo
Case "Viajes"
ldbIncentivo = ldbImporteIncentivo - 30
Case "Extras"
ldbIncentivo = ldbImporteIncentivo - 15
End Select
Return ldbIncentivo
End Function
End Class

Mtodos sobrecargados
Para crear un mtodo sobrecargado, agregamos dos o ms procedimientos Sub o
Function a la clase, cada uno con el mismo nombre.
En las declaraciones de procedimiento, el conjunto de argumentos para cada
procedimiento debe ser distinto o se producir un error.
El siguiente ejemplo muestra un mtodo con dos sobrecargas, una que acepta una
String y la otra que acepta un Integer como argumentos.
Public Sub TestFunction(ByVal input As String)
MsgBox(input)
End Sub
Public Sub TestFunction(ByVal input As Integer)
MsgBox(CStr(input))
End Sub
Si se debe llamar a este mtodo desde el cdigo y pesarle una cadena, se ejecutara la
primera sobrecarga y un cuadro de mensaje mostrara la cadena; si se le pas un
nmero, se ejecutara la segunda sobrecarga y el nmero se convertira en una cadena
y aparecera en el cuadro de mensaje.
Podemos crear tantas sobrecargas como sean necesarias y cada una de ellas puede
contener un nmero diferente de argumentos.
En la clase Persons, agregaremos un mtodo con dos sobrecargas para devolver la
inicial del segundo nombre de una persona; una slo con la inicial y la otra con la inicial
seguida por un punto.

Probar los mtodos sobrecargados en la clase Persons


Abrimos el proyecto Persons que creamos en la secciones anteriores.
En el Explorador de soluciones, seleccionamos Persons.vb y, en el men Ver,
elegimos Cdigo.
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

146

Agregamos el siguiente cdigo debajo de los mtodos existentes.


Public Function MiddleInitial() As String
MiddleInitial = Left$(middleNameValue, 1)
End Function
Public Function MiddleInitial(ByVal period As Boolean) As String
MiddleInitial = Left$(middleNameValue, 1) & "."
End Function
En el Explorador de soluciones, seleccionamos Form1 y, en el men Ver,
hacemos clic en Diseador.
En el Cuadro de herramientas, arrastramos dos controles ms de Button al
formulario.
Seleccionamos el tercer control Button y en la ventana Propiedades
establecemos su propiedad Text en With.
Seleccionamos el cuarto control Button y en la ventana Propiedades
establecemos su propiedad Text en Without.
Hacemos doble clic en el primer botn (With) para abrir el Editor de cdigo y
escribimos el siguiente cdigo en el controlador de eventos Button3_Click.
En el controlador de eventos Button4_Click, agregamos el siguiente cdigo.
MsgBox(person1.FirstName & " " & person1.MiddleInitial & _
" " & person1.LastName)
Presionamos F5 para ejecutar el proyecto y mostrar el formulario.

-En el primer cuadro de texto, escribimos nuestro nombre.


-En el segundo cuadro de texto, escribimos nuestro segundo apellido.
-En el tercer cuadro de texto, escribimos nuestro tercer apellido.
-En el cuarto cuadro de texto, escribimos el ao de nuestro nacimiento con
cuatro dgitos (por ejemplo, 1983).
-Activamos la casilla si est casado/a.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

147

Hacemos clic en el botn Actualizar para establecer las propiedades de la clase


y hacemos clic en el botn With.
Se abrir un cuadro de mensaje. Muestra nuestro nombre con un punto tras la
inicial del primer apellido.

Hacemos clic en el botn Without.


Se abrir un cuadro de mensaje. Muestra nuestro nombre sin el punto tras la
inicial del primer apellido.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

148

En el men Archivo, hacemos clic en Guardar todo.

6.12.-Probar controladores de eventos


Si deseamos escribir cdigo que responda a un evento (o que controle un evento),
debemos asociar ese evento a un controlador de eventos. Podemos hacerlo mediante
la instruccin Handles o Add Handler.
La instruccin Add Handler permite asociar los eventos a los controladores en tiempo
de ejecucin, mientras que la instruccin Handles slo asocia los eventos a los
controladores en tiempo de compilacin. La instruccin Handles se puede agregar al
final de cualquier subrutina que tenga la misma firma que el evento.
Por ejemplo, antes, agregamos un evento denominado "AgeCalculated" que toma un
parmetro de tipo "Integer". La subrutina que crea para controlar el evento tambin
debe tomar un parmetro Integer, como se observa en el cdigo siguiente.
Private Sub person1_AgeCalculated(ByVal Age As Integer) _
Handles person1.AgeCalculated
El objeto person1 se debe crear con la instruccin WithEvents para que se pueda tener
acceso al evento AgeCalculated. Al usar la instruccin Add Handler, puede asociar
dinmicamente los eventos a controladores en tiempo de ejecucin.
Probamos el controlador de eventos en la clase Person
En el Explorador de soluciones, seleccionamos Form1 y, en el men Ver,
hacemos clic en Cdigo.
Agregamos la instruccin WithEvents antes de la declaracin person1, como se
muestra en el cdigo siguiente:
WithEvents person1 As New Persons.Persons

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

149

Agregamos el procedimiento siguiente a Form1. Este cdigo comprueba la edad


calculada y muestra un mensaje basado en el resultado.
Private Sub person1_AgeCalculated(ByVal Age As Integer) _
Handles person1.AgeCalculated
If Age > 18 Then
MsgBox("You have been over 18 for " & Age - 18 _
& " years.")
Else
MsgBox("You will be 18 in " & 18 - Age & " years")
End If
End Sub
Presionamos F5 para ejecutar el proyecto y mostrar el formulario.
-En el primer cuadro de texto, escribimos nuestro nombre.
-En el segundo cuadro de texto, escribimos nuestro segundo apellido.
-En el tercer cuadro de texto, escribimos nuestro tercer apellido.
-En el cuarto cuadro de texto, escribimos el ao de nuestro nacimiento con
cuatro dgitos (por ejemplo, 1983).
-Activamos la casilla si est casado/a.
Hacemos clic en el botn Actualizar para establecer las propiedades de la clase
y haga clic en el botn Full Name.
Un cuadro de mensaje muestra su nombre completo. Si tiene ms de 18 aos,
otro cuadro de mensaje muestra informacin sobre cunto tiempo hace que
cumpli los 18 aos. Si tiene menos de 18 aos, aparece un cuadro de mensaje
que muestra informacin sobre cunto tiempo queda hasta que cumpla los 18
aos. A continuacin, otro cuadro de mensaje muestra su edad.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

150

En el men Archivo, hacemos clic en Guardar todo.

6.13.- Herencia en Visual Basic NET


La Herencia especifica una relacin es un tipo de
Mltiples clases comparten los mismos atributos y operaciones, permitiendo una eficaz
reutilizacin del cdigo

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.

Cmo heredar de una clase


Una clase derivada hereda de una clase base
Pueden heredarse propiedades, mtodos, miembros de datos, eventos y controladores de
eventos (dependiendo del mbito)
Palabras clave
Inherits: hereda de una clase base
NotInheritable: no es heredable
MustInherit: no pueden crearse instancias de la clase; deben heredarse como una clase
base
Introduccin

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

151

En Visual Basic .NET, la herencia puede utilizarse para derivar una clase de una clase
existente. La clase derivada puede heredar todas las propiedades, mtodos, miembros de
datos, eventos y controladores de eventos de la clase base, facilitando la reutilizacin de
la clase base por toda la aplicacin.
La palabra clave Inherits
La palabra clave Inherits se utiliza para definir una clase derivada que heredar de una
clase base existente.
Ejemplo: El siguiente ejemplo muestra cmo utilizar la palabra clave Inherits:
Public Class CheckingAccount
Inherits BankAccount
Private Sub ProcessCheck( )
' Add code to process a check drawn on this account
End Sub
End Class
Observacion Podemos utilizar la palabra clave MyBase para invocar mtodos en una
clase base cuando invalidan mtodos en una clase derivada. Tambin podemos utilizar
la palabra clave MyBase para invocar el constructor y el destructor de la clase base en
nuestra clase derivada.
Observemos el siguiente ejemplo:
'Crear clase derivada en dos lneas
Public Class Administrativo
Inherits Empleado
' Crear clase derivada en la misma lnea
Public Class Administrativo : Inherits Empleado
La palabra clave NotInheritable
La palabra clave NotInheritable se utiliza para definir una clase que no puede utilizarse
como clase base para herencia. Si otra clase intenta heredar de esta clase, se generar un
error de compilacin.
Ejemplo: El siguiente ejemplo muestra cmo utilizar la palabra clave NotInheritable:
Public NotInheritable Class TestClass
...
End Class
Public Class DerivedClass
' The following line generates a compiler error
Inherits TestClass
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

152

...
End Class
La palabra clave MustInherit
La palabra clave MustInherit se utiliza para definir clases que no estn pensados para
ser utilizados directamente como objetos instanciados. La clase resultante debe ser
heredada como una clase base para utilizarla en el objeto de una clase derivada
instanciada.
Ejemplo: El siguiente ejemplo muestra cmo utilizar la palabra clave MustInherit:
Public MustInherit Class BaseClass
...
End Class
...
Si el cdigo cliente intenta crear una instancia de este tipo de clase, se generar un error
de compilacin, como se muestra en el siguiente ejemplo:
' Client code
' The following line generates a compiler error
Dim x As New BaseClass( )
La palabra clave Protected
Utilizamos el acceso Protected para limitar el mbito de una propiedad, mtodo,
miembro de datos, evento o controlador de eventos a la clase que los define y cualquier
clase derivada basada en esa clase base.
Ejemplo
El siguiente ejemplo muestra cmo utilizar la palabra clave Protected:
Public Class BaseClass
' Accessible anywhere
Public counter As Integer
' Accessible only in this class or a derived class
Protected name As String
...
End Class

Generar una clase a partir de una clase existente: Herencia de clases


Ahora veremos cmo utilizar la herencia de clases para crear una clase basada en una
clase existente.
Muchos objetos de la vida real tienen atributos y comportamientos en comn, por
ejemplo, todos los coches tienen ruedas y motores, y pueden avanzar y detenerse. Sin
embargo, algunos automviles tienen atributos que no son comunes, por ejemplo, un

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

153

descapotable tiene una parte superior que se puede subir/bajar electrnica o


manualmente.
Si se cre un objeto para representar un automvil, se pueden incluir propiedades y
mtodos para todos los atributos y comportamientos comunes, pero no se podran
agregar atributos como la cubierta de un descapotable, puesto que dicho atributo no
es generalizable a todos los automviles.
Mediante el uso de la herencia, se puede crear una clase "descapotable" que deriva de
la clase "automvil". sta hereda todos los atributos de la clase automvil y puede
agregar los atributos y comportamientos que son nicos de un auto descapotable.

Heredar a partir de una clase existente


La instruccin Inherits se utiliza para declarar una nueva clase, denominada clase
derivada, basada en una clase existente conocida como clase base. Las clases derivadas
heredan todas las propiedades, los mtodos, los eventos, los campos y las
constantes definidos en la clase base.
El siguiente cdigo muestra la declaracin de una clase derivada.
Class DerivedClass
Inherits BaseClass

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.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

154

En el cuadro de dilogo Agregar nuevo elemento, escribimos Players en el


cuadro Nombre, a continuacin, hacemos clic en Agregar.

Se agregar un nuevo mdulo de clase al proyecto.

En el Editor de cdigo, agregamos lo siguiente justo debajo de la lnea Public


Class Players.
Inherits Persons
Agregamos tambin el siguiente cdigo para definir las dos nuevas
propiedades.
Private numberValue As Integer
Private positionValue As String
Public Property Number() As Integer
Get
Number = numberValue
End Get
Set(ByVal value As Integer)

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

Probar la clase Players


Hemos creado una clase Players, derivada de la clase Persons.Ahora haremos una
nueva aplicacin para probar la clase Players.
Para crear un proyecto de prueba para la clase:
1. En el men Archivo, elegimos Agregar y, a continuacin, hacemos clic en Nuevo
proyecto.
2. En el cuadro de dilogo Agregar nuevo proyecto, en el panel Plantillas,
seleccionamos una Aplicacin de Windows Forms.
3. En el cuadro Nombre, escribimos PlayerTest y hacemos clic en Aceptar.

4. Se agregar un nuevo proyecto de Windows Forms al Explorador de soluciones


y aparecer un nuevo formulario.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

156

5. En el Explorador de soluciones, seleccionamos el proyecto PlayerTest y, en el


men Proyecto, hacemos clic en Establecer como proyecto de inicio.
6. En el Explorador de soluciones, seleccionamos el proyecto PlayerTest y, en el
men Proyecto, haga clic en Agregar referencia.
7. Se abrir el cuadro de dilogo Agregar referencia.
8. Hacemos clic en la ficha Proyectos, elegimos Persons y hacemos clic en Aceptar.

9. Hacemos doble clic en el formulario para abrir el Editor de cdigo y escribimos


la siguiente declaracin justo debajo de la lnea Public Class Form1.
Dim player1 As New Persons.Players
Dim player2 As New Persons.Players
Esto declara dos nuevas instancias de la clase Players.
10. En el men Archivo, hacemos clic en Guardar todo.
Para probar la clase derivada:
1. En el Explorador de soluciones, seleccionamos Form1 en el proyecto PlayerTest
y, a continuacin, en el men Ver, hacemos clic en Cdigo.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

157

2. En el Editor de cdigo, agregamos el siguiente cdigo al procedimiento de


evento Form1_Load.
With player1
.FirstName = "Wyrm"
.LastName = "Garcia"
.Number = 13
.Position = "Shortstop"
End With
With player2
.FirstName = "Joe"
.LastName = "Black"
.Number = 51
.Position = "Catcher"
End With
3. En el Explorador de soluciones, seleccionamos Form1 en el proyecto PlayerTest
y, a continuacin, en el men Ver, hacemos clic en Diseador.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

158

4. En el Cuadro de herramientas, arrastramos dos controles Button al formulario.


5. Seleccionamos el primer control Button y en la ventana Propiedades
establecemos su propiedad Text en At Bat.
6. Seleccionamos el segundo control Button y en la ventana Propiedades
establecemos su propiedad Text en On Deck.
7. Hacemos doble clic en el primer botn (At Bat) para abrir el Editor de cdigo y
escribimos el siguiente cdigo en el controlador de eventos Button1_Click.
MsgBox(player1.Position & " " & player1.FullName & ", #" &
CStr(player1.Number) & " is now at bat.")
Observamos que estamos utilizando el mtodo FullName que se hered de la
clase base Persons.
8. En el controlador de eventos Button2_Click, agregamos el siguiente cdigo.
MsgBox(player2.Position & " " & player2.FullName & ", #" &
CStr(player2.Number) & " is on deck.")

9. Presionamos F5 para ejecutar el programa. Hacemos clic en cada botn para


ver los resultados.
Clic al Boton1(At Bat):

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

159

Clic al Boton2 (on Deck):

10. En el men Archivo, elegimos Guardar todo.


Hemos visto, qu son y cmo crear clases, agregarle propiedades, mtodos y eventos,
las hemos heredado, etc. la mejor forma de aprender y de que las cosas se entiendan,
es hacindolo uno mismo...

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

160

7.- Impresin en Visual Basic .NET


Introduccin
Muchos de los usuarios de Visual Basic 6 que han migrado a .NET han sufrido (incluso
estn sufriendo) la carencia de este "nuevo" entorno de programacin de un objeto
que les permita imprimir de forma tan fcil como lo era el objeto Printer o de una
coleccin que les permita saber las impresoras disponibles en el sistema. En este
artculo explicaremos cmo imprimir en .NET y comprobaremos que aunque parezca
complicado, a la larga, imprimir en .NET es igual o ms fcil que con VB6, aunque
tratndose de un lenguaje orientado a objetos, debemos cambiar un poco el chip.

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.

7.1.-La solucin: Cmo imprimir en .NET


Bsicamente para imprimir en .NET solamente necesitamos una clase: PrintDocument
la cual est definida en el espacio de nombres System.Drawing.Printing. Con esta clase
tenemos todo lo necesario para imprimir (en la impresora predeterminada) cualquier
tipo de documento.
Simplemente necesitamos llamar al mtodo Print y asunto arreglado. Seguramente el
lector se preguntar que si esto es as, dnde est el problema? Problema, lo que se
dice problema, realmente no hay ninguno, lo que ocurre es que esta clase,
particularmente el mtodo Print, se utiliza sin tener que indicar qu es lo que
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

Para muestra, un botn


En el listado podemos ver un ejemplo de la forma ms simple de imprimir en .NET, en
este ejemplo mostramos la cadena "Hola, Mundo" en la parte superior de la pgina
usando una fuente Arial de 24 puntos en negrita.
Private Sub btnImprimirSimple_Click(ByVal sender As Object, _
ByVal e As EventArgs)Handles btnImprimirSimple.Click
' ejemplo simple para imprimir en .NET
' Usamos una clase del tipo PrintDocument
Dim printDoc As New PrintDocument
' asignamos el mtodo de evento para cada pgina a imprimir
AddHandler printDoc.PrintPage, AddressOf print_PrintPage
' indicamos que queremos imprimir
printDoc.Print()
End Sub
Private Sub print_PrintPage(ByVal sender As Object, _
ByVal e As PrintPageEventArgs)
'Este evento se producir cada vez que se imprima una nueva pgina
' imprimir HOLA MUNDO en Arial tamao 24 y negrita
' imprimimos la cadena en el margen izquierdo
Dim xPos As Single = e.MarginBounds.Left
' La fuente a usar
Dim prFont As New Font("Arial", 24, FontStyle.Bold)

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

162

' la posicin superior


Dim yPos As Single = prFont.GetHeight(e.Graphics)
' imprimimos la cadena
e.Graphics.DrawString("Hola, Mundo", prFont, Brushes.Black, xPos, yPos)
' indicamos que ya no hay nada ms que imprimir
' (el valor predeterminado de esta propiedad es False)
e.HasMorePages = False
End Sub

Ejemplo simple de impresin


Como podemos comprobar el proceso es bien simple:
Primero tenemos el cdigo usado para dar la orden de imprimir, (este cdigo
puede estar en el evento Click de un botn), en el que creamos un nuevo
objeto del tipo PrintDocument al que asignamos el procedimiento de evento a
usar cuando se vaya a imprimir cada pgina, cosa que ocurrir despus de
llamar al mtodo Print de esta clase.
En el evento PrintPage le indicamos a .NET que es lo que queremos imprimir,
en nuestro caso slo la cadena "Hola, Mundo", para imprimir dicho texto
utilizamos el mtodo DrawString del objeto Graphics, (una propiedad del
segundo parmetro pasado al evento).
Esta simpleza es en parte porque tampoco hacemos demasiadas cosas en el cdigo del
evento PrintPage, aunque aqu mostramos algunas de las cosas necesarias, como por
ejemplo indicar el tipo de fuente a usar para la impresin, la cual se puede cambiar en
cada una de las lneas a imprimir (e incluso en distintas partes de esa lnea), ya que
cada lnea se "dibuja" por medio del mtodo DrawString del objeto Graphics obtenido
del segundo parmetro pasado a este mtodo.
Como vemos en DrawString debemos indicarle que es lo que queremos imprimir, con
qu tipo de fuente y en qu posicin. Por ltimo indicaremos si quedan ms pginas a
imprimir, esto lo haremos asignado un valor verdadero o falso a la propiedad
HasMorePages del objeto recibido como segundo parmetro del evento, si el valor
asignado es True estaremos indicando que queremos seguir imprimiendo, por el
contrario, asignando un valor False terminaremos la impresin, cosa que tambin
ocurrir si no le asignamos expresamente nada a esa propiedad.

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.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

Seleccionar la impresora a usar


Otra de las tareas que seguramente nos veremos en la necesidad de ofrecer a los
usuarios de nuestras aplicaciones es que puedan seleccionar de una manera fcil qu
impresora usar y darles la posibilidad de que ajusten sus preferencias de impresin.
Todo esto lo podramos hacer manualmente creando un formulario que utilice un
objeto del tipo PrinterSettings y que le ofrezca a los usuarios las opciones que creamos
conveniente, pero para que todo sea, digamos, ms homogneo y no tengamos que
reinventar la rueda, podemos hacer que toda esta configuracin y seleccin de la
impresora a usar la ofrezcamos mediante los mismos cuadros de dilogo que utiliza el
resto de aplicaciones, los cuales se basan en los cuadros de dilogos comunes del
sistema operativo, si esta es nuestra eleccin, nos resultar fcil, ya que podemos usar
la clase PrintDialog.
Con un objeto de esta clase, tal como hemos comentado, podemos mostrar el mismo
cuadro de dilogo que utilizan el resto de aplicaciones de Windows, con la ventaja
aadida de que podemos configurar las opciones que se mostrarn, de forma que lo
configuremos para que se adapte, en la medida de lo posible, a las preferencias de
nuestra aplicacin.
En breve veremos cules son las opciones que podemos usar para ajustar este cuadro
de dilogo a nuestras preferencias o a la de nuestra aplicacin.

7.3.-Las clases para imprimir en .NET


Como hemos comentado en los prrafos anteriores, existen varias clases que nos
permitirn tanto imprimir como configurar la impresin. Todo esto es posible gracias a
las clases que .NET Framework pone a nuestra disposicin para poder realizar esta
tarea.
Echando mano del comodn que los que nos dedicamos a escribir artculos o libros,
tenemos que decir que en este artculo no disponemos del espacio suficiente para
enumerar en detalle todas las clases, delegados y enumeraciones que tanto el espacio
de nombres System.Drawing.Printing como System.Windows.Forms pone a nuestra
disposicin para realizar tareas relacionadas con la impresin, por tanto haremos una
pequea criba para mostrar solamente los tipos que desde nuestro punto de vista
pueden resultarnos ms tiles, particularmente porque sern los que utilicemos en la
mayora de los casos.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

166

Figura 1. El cuadro de dilogo para seleccionar la impresora


En la figura 1 podemos comprobar que hay ciertos elementos que puede que no nos
interese mostrar o dejar habilitados, por ejemplo, si nuestra aplicacin no permite
imprimir el cdigo seleccionado no tiene mucho significado ofrecerle la opcin
"Seleccin", (la figura est capturada de un Windows XP en ingls, por eso se muestran
las opciones en ingls), lo mismo ocurre con el botn de ayuda o con las cajas de texto
que permiten indicar el rango de pginas a imprimir. Todas estas caractersticas las
podemos habilitar o deshabilitar mediante algunas de las propiedades de la clase
PrintDialog, tales como: AllowPrintToFile, AllowSelection, AllowSomePages,
PrintToFile, ShowHelp y ShowNetwork.

La ayuda del cuadro de dilogo de imprimir


Como curiosidad, decir que la propiedad ShowHelp nos permite indicar si se debe
mostrar o no el botn de ayuda, (no la interrogacin de la barra de ttulos que siempre
estar funcional), pero entre las propiedades de esta clase no tenemos ninguna a la
que indicarle que ayuda se debe mostrar si pulsamos en ese botn, en lugar de eso, de
lo que disponemos es de un evento: HelpRequest el cual se producir cuando el
usuario pulse en dicho botn, por tanto si queremos mostrar algn tipo de ayuda,
tendremos que usar ese evento para mostrar la informacin que creamos conveniente
para nuestro cuadro de dilogo.
Al igual que en el resto de cuadros de dilogos de .NET, tenemos el mtodo
ShowDialog que ser el que nos permita mostrar el cuadro de dilogo y saber si el
usuario ha pulsado en el botn OK (Aceptar) o Cancelar, para que de esta forma
sepamos si debemos seguir con el proceso de impresin o no.
La propiedad PrinterSettings ser la que nos permita saber lo que el usuario ha
seleccionado, adems de ser la que usemos para asignar los valores predeterminados
o bien los que tengamos almacenado de ocasiones anteriores; tal como indicamos
anteriormente, lo habitual ser que tengamos una variable del tipo de esta propiedad

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

168

NOTA:
Por regla general deberamos asignar a la propiedad Document de la clase
PrintPreviewDialog el mismo objeto PrintDocument usado para imprimir, ya que
la clase PrintPreviewDialog se encargar de que se produzcan los mismos eventos
que si hubisemos llamado al mtodo Print del objeto PrintDocument asignado,
de forma que lo que se muestre mediante este dilogo sea lo mismo que se
imprima, que es al fin y al cabo lo que queremos conseguir.
Tal como hemos resaltado en la nota, tanto el mtodo Print de la clase PrintDocument
como la clase PrintPreviewDialog utilizan los mismos eventos del objeto
PrintDocument, por tanto podramos usar un mtodo genrico que sea el encargado
de mostrar una vista preliminar de lo que queremos imprimir o de mandarlo a la
impresora, de esta forma podemos usar de forma comn las opciones ofrecidas al
usuario, como por ejemplo permitir la seleccin de la impresora antes de imprimir, etc.
En el listado podemos ver cmo podra ser ese mtodo genrico para elegir entre
imprimir o previsualizar lo que deseamos imprimir.
Private Sub imprimir(ByVal esPreview As Boolean)
' imprimir o mostrar el PrintPreview
If prtSettings Is Nothing Then
prtSettings = New PrinterSettings
End If
If chkSelAntes.Checked Then
If seleccionarImpresora() = False Then Return
End If
If prtDoc Is Nothing Then
prtDoc = New System.Drawing.Printing.PrintDocument
AddHandler prtDoc.PrintPage, AddressOf prt_PrintPage
End If
' la lnea actual
lineaActual = 0
' la configuracin a usar en la impresin
prtDoc.PrinterSettings = prtSettings
If esPreview Then
Dim prtPrev As New PrintPreviewDialog
prtPrev.Document = prtDoc
prtPrev.Text = "Previsualizar documento"
prtPrev.ShowDialog()
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

169

Else
prtDoc.Print()
End If
End Sub
Tal como podemos ver en la figura, el formulario (o cuadro de dilogo) de
previsualizacin nos permite seleccionar el nmero de pgina a mostrar, si queremos
ver una o ms pginas a un mismo tiempo, el porcentaje de ampliacin e incluso
imprimir lo que estamos viendo, todos estas caractersticas ya estn incluidas en ese
formulario.

El formulario de previsualizacin

La clase PrintPreviewControl
Si nuestra intencin es crear nuestro propio formulario de previsualizacin, tambin
podemos hacerlo si usamos el control PrintPreviewControl que es el que la clase
PrintPreviewDialog utiliza, si bien todos los botones y opciones tendremos que
crearlos nosotros, para ello podemos usar los miembros especficos de este control,
tales como:
AutoZoom lo usaremos para que al cambiar el tamao del control se cambie
tambin la pgina mostrada.
Columns indica el nmero de pginas a mostrar cuando se elija la orientacin
horizontal (apaisada).
Document es donde asignaremos el objeto PrintDocument a imprimir.
Rows indica el nmero de pginas a mostrar cuando elijamos la orientacin
vertical.
Zoom para indicar la ampliacin con la que queremos mostrar los documentos.
StartPageChanged en un evento que se producir cada vez que cambiemos la
pgina de inicio (este evento nos servir para crear un equivalente al
NumericDropDown usado en la clase PrintPreviewDialog).

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

170

Si tambin quisiramos implementar un botn para imprimir, tendremos que manejar


nosotros mismos la impresin, pero realmente resultara fcil, ya que lo nico que
tendramos que hacer es llamar al mtodo Print del objeto PrintDocument asignado a
la propiedad Document.
Como siempre la ltima palabra la tendremos nosotros y dependiendo de lo que
queramos hacer usaremos una clase u otra.

7.4.- Conclusin: Imprimir en .NET es fcil


Tal como hemos podido comprobar, imprimir en .NET no es tan complicado como en
un principio pudiera parecer, adems de que tenemos valores aadidos que nos
permiten un mayor control sobre la impresin y, especialmente, sobre las opciones
que podemos ofrecer a los usuarios de nuestras aplicaciones, ya que como hemos
visto, hacer algo como la presentacin preliminar, que en otros lenguajes nos obligara
a escribir bastante cdigo, es tan sencillo como crear un nuevo objeto en la memoria y
asignar un par de propiedades.
Por supuesto, lo que no es totalmente sencillo ni automtico es la presentacin o
impresin de los datos que necesitamos mostrar, al menos si queremos darle un
toque, digamos, profesional a nuestra impresin, ya que seremos nosotros los que
debamos "afinar" en la forma de mostrar esos resultados; pero de todas formas eso es
algo que siempre nos tocar hacer, utilicemos el entorno de programacin que
utilicemos, la ventaja de usar lo que .NET nos ofrece es que tenemos ciertas
posibilidades de hacerlo de una forma ms o menos fcil y que de alguna forma nos
facilita bastante la tarea, aunque para la mayora de situaciones ser ms que
suficiente e incluso podemos automatizar, principalmente porque podemos
aprovechar las posibilidades que nos da la programacin orientada a objetos de crear
nuestras propias clases e implementar mtodos de impresin que se adapten a los
datos que tengamos que mostrar, ya que una de las claves de la POO es la abstraccin
y que mejor forma de abstraccin que crear un mtodo que se encargue de manejar
los datos que la propia clase mantiene y que "sepa" cmo mostrar esos datos e incluso
qu formato deben aplicarse a la hora de presentar esos datos por la impresora.
Posiblemente tengamos que quemar unas cuantas neuronas ms a la hora de
"concebir" esa clase, pero a la larga ese esfuerzo habr valido la pena ya que puede
suponernos una forma de "olvidarnos" de esos pequeos detalles de ajustar cada una
de las lneas que vamos a imprimir.
De seguro que el lector puede pensar que tampoco es necesario ese "esfuerzo" extra
para imprimir una lnea, y seguramente tenga razn, pero precisamente si cuando
diseamos nuestras clases para manejar datos tenemos en cuenta estos detalles,
seguramente nos resultar ms fcil realizar cambios en ocasiones futuras. Por
ejemplo, si tenemos una clase en la que hay datos de cadena y de tipo numrico y
queremos mostrar esos datos, la forma de tratar cada uno de esos datos ser
diferente, ya que con toda seguridad los datos numricos querremos ajustarlos a la
derecha y los de cadena a la izquierda, adems de que si debemos recortar la

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

172

7.5.-Hacer Crystal Report con DataSet en Visual Basic.NET


La mayora de las veces que trabajamos con Visual Basic .Net y Crystal Report, solemos
conectarnos a SQL Server u Oracle como fuente de datos, debido a que tienen
integracin con el IDE de Visual Studio, para facilitar la creacin de los mismos.
Cuando hablamos de motores como PostgreSQL, MySQL, Firebird, Teradata y otros,
no tenemos la integracin del IDE con el servidor de base de datos, esto hace que no
podamos crear tan sencillamente los reportes como los hacemos como con los otros
motores, pero no lo hace imposible, slo se debe seguir unos pasos distintos, que
tambin sirve para los 2 primeros motores mencionados anteriormente.
Lo siguiente sirve en muchos casos para proyectos pequeos de la universidad, a pesar
de que utlizar Visual Studio 2008 esto sirve muy bien para Visual Studio 2005
tambin, asi que comencemos:
1.- Proceder a crear un proyecto en Visual Basic 2008, con el Framework 2.0, y le
pondr de nombre EjemploReporteCrystal, obviamente si ya tienen el proyecto creado
no deben de hacerlo.

2.- Despus lo que hacemos es insertar un DataSet de nuestra base de datos, si no sabes
como hacerlo da clic aqu.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

178

13.- Luego de lo que hicimos vamos a la caja de herramientas y buscamos un control


llamado CrystalReportViewer, lo arrastramos y colocamos en el formulario, este control
ser el que nos permita vizualizar nuestro reporte hecho anteriormente.

14.- Entonces una vez hecho esto damos doble clic en el borde del form para entrar al
metodo load del mismo y poner el codigo que sigue a continuacin. Aclarando un poco
sobre ese cdigo, lo que hacen las 2 primeras lneas es filtrar los datos de las tablas
indistintamente si estn relacionadas, las otras 3 lneas sirven para cargar nuestro
reporte en el reportviewer que pusimos en el form, para esto cree un objeto llamado rpt
del reporte(), que fue mi reporte que creamos hace rato, y en su propiedad
SetDataSource le envie el dataset del proyecto que obviamente ya tiene los datos
filtrado gracias a las 2 lneas primeras, por ltimo mande a cargar este reporte al control
del form con su propiedad ReportSource.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

179

15.- Luego de esto si lo ejecutan debern ver algo como esto.

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.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

180

18.- Lo que haremos a las siguientes 2 pantallas es simplemente darles clic en siguiente.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

182

22.- Ya al haberle dado clic en OK debe de presentarnos la siguiente imagen en la


cual veremos ya hecha nuestra sentencia query de consulta, damos clic en siguiente para
continuar.

23.- Ahora le pondremos un nombre tanto en la parte donde dice Fill a DataTable como
en Return a DataTable, damos clic en siguiente.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

184

8.- Acceso a datos con ADO.NET en Visual Basic


8.1. Acercndonos a ADO.NET
En este mdulo, aprenderemos a trabajar con datos y fuentes de datos en Visual Basic
ADO.NET es la tecnologa principal para conectarse a una base de datos, nos ofrece un alto
nivel de abstraccin, ocultando los detalles de bajo nivel de la implementacin de la base
de datos de un fabricante.
En este tutorial, encontrar las cosas ms importantes que debe saber, para trabajar con
fuentes de datos con Visual Basic. De esta manera, aprender en poco tiempo, a
encontrarse cmodo en el entorno de clases de ADO.NET y podr as, sacar el mximo
provecho a sus desarrollos. Las partes que forman parte de este mdulo son las siguientes:
ADO.NET ha sufrido a lo largo de los ltimos aos diferentes mejoras y actualizaciones, desde
que .NET apareci.El resumen de las diferentes versiones de ADO.NET podra quedar de la
siguiente forma.
ADO.NET 1.0 apareci con Microsoft .NET Framework 1.0. Posteriormente, ADO.NET 1.1 sufri
una pequeas y casi inapreciables actualizaciones con la aparicin de Microsoft .NET
Framework 1.1. En el caso del entorno Visual Studio, ste trabaja con Microsoft .NET
Framework 2.0 y por lo tanto, utiliza ADO.NET 2.0, el cul aade algunas caractersticas nuevas
adicionales.
En nuestro caso, nos centraremos nica y exclusivamente en ADO.NET como modelo de
objetos de acceso a datos para la plataforma .NET de Microsoft, ya que es el mismo para
cualquier tipo de versin de ADO.NET.

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.

Qu capas o qu partes hay dentro de ADO.NET?

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

185

Dentro de ADO.NET tenemos dos partes importantes.


La primera de ellas es la que corresponde con el nombre de espacio System.Data y que
constituye los objetos y clases globales de ADO.NET.
La otra parte es la que corresponde con los objetos que permiten el acceso a datos a una
determinada fuente de datos desde ADO.NET y que utilizan as mismo, las clases del nombre
de espacio System.Data.
Esta ltima parte, queda constituida por las clases y objetos de los diferentes proveedores de
acceso a datos como se muestra en la figura 1.

Visin general de las clases de ADO.NET


Para resumir de alguna forma lo que estamos comentando, diremos que el trabajo de conexin
con la base de datos, la ejecucin de una instruccin SQL determinada, una vista, etc., la realiza
el proveedor de acceso a datos.
Recuperar esos datos para tratarlos, manipularlos o volcarlos a un determinado control o
dispositivo, es accin de la capa superior que corresponde con el nombre de espacio
System.Data.
A continuacin veremos todo esto con ms detalle y comprenderemos de una forma ms clara
cada una de las partes que componen el modelo de trabajo con ADO.NET.

Qu nos permite realmente ADO.NET cuando trabajamos con XML?


El entorno de Microsoft .NET Framework nos proporciona el trabajo con estndares y con ello,
la posibilidad de trabajar con diferentes tipos de aplicaciones, entornos, sistemas operativos y
lenguajes sin necesidad de conocer lo que hay al otro lado de nuestra aplicacin.
XML es sin lugar a dudas, el lenguaje de etiquetas por excelencia, vlido para llevar a cabo esta
tarea sin tener un impacto relevante cuando trabajamos con diferentes soluciones en entornos
dispares.
Tanto la posibilidad de trabajar con Servicios Web XML como con documentos e informacin
en XML, sobre todo al trabajar con fuentes de datos en ADO.NET, nos proporciona a los
desarrolladores las posibilidades necesarias que nos permite hacer que la informacin con la
que trabajamos, pueda ser tratada entre diferentes sistemas o entornos, sin que por ello nos

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

Un pequeo ejemplo prctico


El siguiente ejemplo prctico, nos ensea a utilizar un DataSet y nos muestra cmo
podemos acceder a los objetos que dependen de un DataSet para recuperar por ejemplo,
los campos y propiedades de una determinada tabla o tablas.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

Ejemplo en ejecucin del uso de DataSet, DataTable y DataColumn

8.3. Los proveedores de acceso a datos


Los proveedores de acceso a datos es la capa inferior de la parte correspondiente al

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

Proveedores de acceso a datos de .NET Framework


Dentro del entorno .NET Framework, encontramos un nutrido conjunto de
proveedores de acceso a datos. Estos son los siguientes:
ODBC .NET Data Provider
OLE DB .NET Data Provider
Oracle Client .NET Data Provider
SQL Server .NET Data Provider
Estos proveedores de acceso a datos incluidos en Microsoft .NET Framework, los
podemos encontrar en los nombres de espacio:
System.Data.Odbc
System.Data.OleDb
System.Data.OracleClient
System.Data.SqlClient
El proveedor ODBC .NET permite conectar nuestras aplicaciones a fuentes de datos a travs
de ODBC.
El proveedor OLE DB .NET permite conectar nuestras aplicaciones a fuentes de datos a travs
de OLE DB.
El proveedor Oracle Client .NET es un proveedor de acceso a datos especialmente
diseado para bases de datos Oracle.
Por ltimo, el proveedor SQL Server .NET es un proveedor de acceso a datos nativo, que
nos permite conectar nuestras aplicaciones a fuentes de datos Microsoft SQL Server 7 o
posterior. Se trata de un proveedor especfico para bases de datos Microsoft SQL Server
7.0, Microsoft SQL Server 2000 y Microsoft SQL Server 2005; 2008

Nota:
Siempre que pueda, utilice para acceder a fuentes de datos, un proveedor de
acceso a datos nativo. Esto le permitir aumentar considerablemente el
rendimiento a la hora de establecer la conexin con una determinada fuente
de datos

Los proveedores de acceso a datos que distribuye Microsoft en ADO.NET y algunos


desarrollados por otras empresas o terceros, contienen los mismos objetos, aunque los

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

Otros proveedores de acceso a datos


Si bien el proveedor de acceso a datos es el mecanismo a travs del cul podemos establecer
una comunicacin nativa con una determinada fuente de datos, y dado que Microsoft
proporciona los proveedores de acceso a datos ms corrientes, es cierto que no los
proporciona todos, si bien, con OLE DB y ODBC, podemos acceder a la inmensa totalidad de
ellos.
Sin embargo, hay muchos motores de bases de datos de igual importancia como Oracle, MySql,
AS/400, etc. En estos casos, si queremos utilizar un proveedor de acceso a datos nativo,
deberemos acudir al fabricante o a empresas o iniciativas particulares para que nos
proporcionen el conjunto de clases necesarias que nos permitan abordar esta accin.

El objeto Connection
Este objeto es el encargado de establecer una conexin fsica con una base de datos
determinada. Para establecer la conexin con una determinada fuente de datos, no slo
debemos establecer la cadena de conexin correctamente, sino que adems deberemos
usar los parmetros de conexin y el proveedor de acceso a datos adecuado. Con este
objeto, podremos adems abrir y cerrar una conexin.

El objeto Command
Este objeto es el que representa una determinada sentencia SQL o un Stored
Procedure. Aunque no es obligatorio su uso, en caso de necesitarlo, lo utilizaremos
conjuntamente con el objeto DataAdapter que es el encargado de ejecutar la instruccin
indicada.

El objeto DataAdapter
Este objeto es quizs el objeto ms complejo y a la vez complicado de todos los que
forman parte de un proveedor de acceso a datos en .NET. Cuando deseamos establecer
una comunicacin entre una fuente de datos y un DataSet, utilizamos como intermediario
a un objeto DataAdapter. A su vez, un DataAdapter contiene 4 objetos que debemos
conocer:
SelectCommand es el objeto encargado de realizar los trabajos de seleccin de datos
con una fuente de datos dada. En s, es el que se encarga de devolver y rellenar los
datos de una fuente deb datos a un DataSet.
DeleteCommand es el objeto encargado de realizar las acciones de borrado de
datos.
InsertCommand es el objeto encargado de realizar las acciones de insercin de
datos.

UpdateCommand es el objeto encargado de realizar las acciones de


actualizacin de datos.
Los objetos DeleteCommand, InsertCommand y UpdateCommand son los objetos que se

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

8.4.- El concepto DataBinding


DataBinding es una expresin de enlace a datos. Como veremos a continuacin es una forma
rpida y sencilla de manejar la fuentes de datos mediante su enlace con controles o clases..

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.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

191

Ejemplo en ejecucin del uso de DataBinding

8.5.- Otras consideraciones


Dentro de las conexiones a fuentes de datos, hay algunas partes de stas que permanecen a
veces en el olvido y su importancia sin embargo, es bastante grande. La accin ms pesada
cuando realizamos un acceso a una fuente de datos, se encuentra en la conexin con la fuente
de datos. Esa tarea, simple tarea, es la que ms recursos del sistema consume cuando
Accedemos a fuentes de datos.
Esto lo debemos tener en cuenta, y por lo tanto, variante de esto que comentamos son
las siguientes premisas:
La conexin debe realizarse siempre que se pueda, con los proveedores de acceso a datos
nativos, que por lo general salvo raras excepciones, sern ms rpidos que los accesos a
fuentes de datos a travs de proveedores del tipo OLE DB y ODBC.
La conexin con la fuente de datos (apertura de la conexin), debe realizarse lo ms tarde
posible. Es recomendable definir todas las variables que podamos, antes de realizar la
conexin.
La conexin debe cerrarse lo antes posible, siempre y cuando no tengamos la necesidad de
utilizar la conexin previamente abierta.
Hay ms particularidades a tener en cuenta cuando trabajamos con fuentes de datos. El
hecho de que con un DataSet podamos trabajar con datos desconectados, no significa que
dentro de l, podamos abrir una tabla con una cantidad de registros enormes, y trabajemos
sobre ella creyendo que esto nos beneficiar. Todo lo contrario.

8.6.- El paradigma de la conexin


Cuando abordamos un proyecto de acceso a fuentes de datos, siempre nos
encontramos con una duda existencial.
Debemos crear una conexin con la base de datos al principio de nuestra aplicacin y cerrarla
cuando la aplicacin se cierre?, o debemos crear una conexin con la base de datos slo
cuando vayamos a trabajar con la fuente de datos?. Y si estamos trabajando continuamente
con una fuente de datos?, cmo penalizaran todas estas acciones?.
Es difcil de asumir que accin tomar en cada caso, y es que dependiendo de lo que vayamos a
realizar, a veces es ms efectiva una accin que otra, y en otras ocasiones, no est del todo
claro, ya que no existe en s una regla clara que especifique qu accin tomar en un momento
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

Visin general de ADO.NET respecto a la conectividad con bases de


datos
El objeto DataSet nos ofrece la posibilidad de almacenar datos, tablas y bases de datos de una
determinada fuente de datos. De esta manera, podemos trabajar con las aplicaciones estando
desconectados de la fuente de datos.
Sin embargo, a veces necesitamos trabajar con la fuente de datos estando conectados a ella.
El objeto DataReader nos ofrece precisamente la posibilidad de trabajar con fuentes de datos
conectadas.
Por otro lado, el objeto DataReader tiene algunas particularidades que conviene
conocer y que veremos a continuacin.

8.7.- Conociendo el objeto DataReader


El objeto DataReader nos permite como hemos indicado anteriormente, establecer una
conexin con una fuente de datos y trabajar con esta fuente de datos sin desconectarnos
de ella, sin embargo, hay diferentes cualidades y particularidades que conviene conocer.

DataReader es de solo lectura


Lo que hemos dicho anteriormente, requiere sin embargo, que esta conexin se
establezca en un modo de slo lectura, al contrario de lo que se puede hacer con el objeto
DataSet, con el que podemos interactuar con la fuente de datos en modo lectura y modo
escritura.

DataReader se maneja en una sola direccin


El objeto DataReader slo permite que nos desplacemos por los datos en una sola direccin,
sin vuelta atrs. Por el contrario, el objeto DataSet nos permite movernos por los registros
para adelante y para atrs.
Adems, slo podemos utilizar el objeto DataReader con conexiones establecidas en una
sentencia SQL por ejemplo, pero no podemos variar esta. Para hacerlo, debemos entonces

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

Analizando el flujo de trabajo de DataReader


Cuando trabajamos con fuentes de datos conectadas, trabajaremos con el objeto DataReader.
Para trabajar con este objeto, utilizaremos los objetos siguientes del proveedor de
acceso a datos:
Connection
Command
DataReader
Un resumen grfico de esto es lo que podemos ver en la figura 1.

El flujo de conectividad de DataReader

8.8.- Un primer contacto con el objeto DataReader


A continuacin veremos un ejemplo sencillo sobre la forma de trabajar con DataReader

Un ejemplo simple para entenderlo mejor


Tenga en cuenta que en el siguiente ejemplo nos conectaremos a Microsoft SQL Server
y recorreremos los registros uno a uno en un ambiente conectado y volcaremos estos
registros en un control TextBox.

Imports System.Data

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

Ejemplo en ejecucin del uso simple de DataReader


Este es un ejemplo simple del uso de DataReader.

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.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

195

8.9.- Trabaja DataReader en un ambiente conectado


realmente?
Pese a todo esto, que ocurre si trabajando en un ambiente conectado se desconecta el
servidor de acceso a datos?. Imaginemos por un instante, que la conexin con SQL Server se
establece correctamente y que en un momento dado se detiene el servicio del servidor de
base de datos. Esto es lo que veremos en el siguiente ejemplo.

Desenchufando la fuente de datos usando DataReader


Inicie un nuevo proyecto, inserte en el formulario de la aplicacin un control TextBox y un
control Button, y escriba el cdigo que se detalla a continuacin:

Imports System.Data
Imports System.Data.SqlClient
Imports System.Xml
Public Class Form1
Private Conexion As String =
"server=.;uid=sa;password=VisualBasic;database=MSDNVideo"
Private strSQL As String = "SELECT TITULO FROM ALQUILERES,
PELICULAS WHERE PELICULACODBARRAS = CODBARRAS AND SOCIONIF = '111111'"
Private MiConexion As New SqlConnection(Conexion)
Private MiDataReader As SqlDataReader
Private Contador As Long = 0
Private Posicion As Long = 0
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles MyBase.Load
' Establecemos la Conexin con la base de datos
Establecer_Conexion(True)
' Si hay datos los mostramos, sino deshabilitamos la opcin (botn) para recorrerlos
If Not MiDataReader.HasRows Then
Button1.Enabled = False
Else
Button1_Click(sender, e)
End If
End Sub
Private Sub Establecer_Conexion(ByVal bolAccion As Boolean)
Dim Comando As SqlCommand
If bolAccion Then
' True => Establecemos la conexin
Comando = New SqlCommand(strSQL, MiConexion)
' Abrimos la Conexin
MiConexion.Open()
' Ejecutamos la sentencia SQL
MiDataReader = Comando.ExecuteReader()
' Obtenemos la cantidad de registros obtenidos
Contador = MiDataReader.VisibleFieldCount() + 1
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

196

Else
' False => Finalizamos la conexin
Button1.Enabled = False
' Cerramos la Conexin
Comando = Nothing
MiConexion.Close()
End If
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
' Recorremos los registros y los mostramos
Posicion += 1
MiDataReader.Read()
TextBox1.Text = MiDataReader("TITULO")
' Si hemos recorrido el objeto por completo, finalizamos la Conexin y
' deshabilitamos el control Button que nos permite recuperar los registros
If Posicion = Contador Then
Establecer_Conexion(False)
End If
End Sub
End Class
Suponiendo que tenemos en nuestra base de datos varios registros, ejecute la aplicacin. Si
todo ha ido como se esperaba, observaremos que nuestra aplicacin tiene un aspecto como el
que se muestra en la figura

.
Ejemplo en ejecucin del uso de DataReader en un ambiente conectado,
forzando la desconexin de la fuente de datos
En este punto, detenga el servicio de SQL Server y pulse el botn Siguiente >>. Observar que
la aplicacin sigue funcionando. En este punto se har la pregunta que todos nos hemos
hecho, no es el objeto DataReader un objeto conectado?, cmo es posible que funcione si
hemos detenido el servicio de SQL Server?. La respuesta es sencilla. El objeto DataReader
recupera un nutrido conjunto de valores llenando un pequeo buffer de datos e informacin.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

8.10.- Usando DataSource con DataReader


Podemos usar el mtodo DataSource con el objeto DataReader?.

Demostracin del uso de DataSource con DataReader


La respuesta es s, en ADO.NET 2.0, se ha incorporado un nuevo mtodo al objeto
DataTable que le permite tener mayor independencia respecto al modo en el que nos
conectemos y recuperemos datos de una fuente de datos. Recuerde que podemos
recuperar datos en modo conectado DataReader o en modo desconectado DataSet.
Este mtodo que se ha incorporado a ADO.NET y que tiene por nombre Load, nos permite
cargar un DataReader para volcarlo a continuacin dentro de un control como por ejemplo el
control DataGridView. Lo mejor es que veamos como funciona esto con un ejemplo que nos
ayude a comprender mejor la teora. Inserte en un formulario un control DataGridView y
escriba el siguiente cdigo:

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

198

' Cargamos los resultados en el objeto DataTable


MiDataTable.Load(MiDataReader, LoadOption.OverwriteChanges)
' Volcamos los datos en el control DataGridView
DataGridView1.DataSource = MiDataTable
' Cerramos la Conexin
Comando = Nothing
MiConexion.Close()
End Sub
End Class
Nuestro ejemplo en ejecucin es el que podemos ver en la figura

Ejemplo en ejecucin del uso de DataReader y DataSource en un control


DataGridView
Con todo y con esto, lo que realmente es curioso, es que hemos olvidado por un instante que
el objeto DataReader es un objeto de slo lectura que funciona en una nica direccin, hacia
delante. Qu significa esto o como puede influir o como podemos aprovechar esta
circunstancia en nuestros desarrollos?.

Carga segmentada de datos con DataSource y DataReader


Si recuperamos los datos de una fuente de datos con DataReader y leemos algunos de sus
datos y posteriormente, ejecutamos el mtodo DataSource, el resto de datos, aquellos datos
que quedan en el DataReader, sern los que se vuelquen en el control que definamos como
destino de los datos. Imaginemos el ejemplo anterior, y 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
' Declaramos las variables a utilizar
Dim Conexion As String =

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

8.11.- Usando los componentes de acceso a datos de .NET


Los componentes del entorno .NET nos proporcionan las caractersticas necesarias para
poder acceder a fuentes de datos de forma rpida y sencilla.
El mejor ejemplo de esto que comento es el que veremos a continuacin.

Demostracin del uso de BindingSource y BindingNavigator


Para ello, crearemos un proyecto nuevo e insertaremos un control BindingSource y un control
BindingNavigator dentro del formulario.
Tambin insertaremos un control TextBox al formulario, dnde presentaremos la informacin
sobre la que navegaremos. Nuestro formulario con los controles insertados en l, tendr un
aspecto similar al que se presenta en la figura 1.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

200

Controles de navegacin y acceso a datos dispuestos en el


formulario Figura 1
Una vez llegado a este punto, lo que tendremos que hacer a continuacin ser escribir el
cdigo fuente necesario para poder representar los datos de la sentencia SQL en el
control BingindNavigator, para que a su vez los presente en el control TextBox. A
continuacin se indica el cdigo fuente de esta parte de demostracin de la aplicacin.

Imports System.Data
Imports System.Data.SqlClient
Imports System.Xml
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal eAs System.EventArgs)
Handles MyBase.Load
' Declaramos las variables a utilizar
Dim Conexion As String =
"server=.;uid=sa;password=VisualBasic;database=MSDNVideo"
Dim strSQL As String = "SELECT TITULO FROM ALQUILERES,
PELICULAS WHERE PELICULACODBARRAS = CODBARRAS AND SOCIONIF = '111111'"
Dim MiConexion As New SqlConnection(Conexion)
Dim MiDataReader As SqlDataReader
Dim MiDataTable As New DataTable
Dim Comando As SqlCommand
' Establecemos la Conexin con la base de datos
Comando = New SqlCommand(strSQL, MiConexion)
' Abrimos la Conexin
MiConexion.Open()
' Ejecutamos la sentencia SQL
MiDataReader = Comando.ExecuteReader()
' Cargamos los resultados en el objeto DataTable
MiDataTable.Load(MiDataReader, LoadOption.OverwriteChanges)
' Volcamos los datos en el control TextBox
BindingSource1.DataSource = MiDataTable
BindingNavigator1.BindingSource = BindingSource1
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

201

TextBox1.DataBindings.Add(New Binding("Text", BindingSource1, "TITULO", True))


' Cerramos la Conexin
Comando = Nothing
MiConexion.Close()
End Sub
End Class

8.12.- Esquema general de la estructura desconectada de acceso


a datos
En los captulos anteriores de este mdulo, hemos visto ya el uso de la clase DataSet. Incluso lo
hemos visto con algn ejemplo.
La clase DataSet est pensada y diseada para trabajar con fuentes de datos
desconectadas. Indudablemente, en este punto, debemos tener clara la estructura
general de cmo funciona el acceso desconectado con fuentes de datos. En la figura,
podemos observar el diagrama general de esta parte

Estructura general del uso de DataSet en el acceso desconectado a


datos

Connection, DataAdapter y DataSet


Como podemos observar en la figura 1, para comunicarnos con una fuente de datos, siempre
deberemos establecer una conexin, independientemente de si la conexin con la fuente de
datos va a permanecer a lo largo del tiempo o no.
El objeto Connection nos permite por lo tanto, establecer la conexin con la fuente de datos.
El objeto DataSet nos permite por otro lado, recoger los datos de la fuente de datos y
mandrselos a la aplicacin.
Entre medias de estos dos objetos, encontramos el objeto DataAdapter que hace las funciones
de puente o nexo de unin entre la conexin y el objeto DataSet.
Esto es lo que veremos a continuacin, como funciona el objeto DataAdapter, y como encaja
todo esto en el acceso a fuentes de datos desconectadas.

8.13.- Conociendo el objeto DataAdapter

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

202
El objeto DataAdapter forma parte del proveedor de acceso a datos, tal y como se muestra en
la figura

Visin general de las clases de ADO.NET


Cada proveedor de acceso a datos posee su propio objeto DataAdapter. Cuando realizamos
alguna modificacin o accin sobre la fuente de datos, utilizaremos siempre el objeto
DataAdapter a caballo entre el objeto DataSet y la fuente de datos establecida a travs de la
conexin con el objeto Connection.Con el objeto DataAdapter, podremos adems realizar
diferentes acciones sobre nuestras bases de datos, acciones como la ejecucin general de
sentencias de SQL no slo para seleccionar un conjunto de datos, sino para alterar el
contenido de una base de datos o de sus tablas.

Connection, DataAdapter y DataSet


Antes de entrar en materia ms profundamente, diremos que en lo que respecta a los
proveedores de acceso a datos que vienen integrados con .NET, encontramos dos formas de
usar un DataAdapter.
La primera de ellas es utilizando los componentes del proveedor de acceso a datos. La segunda
de ellas es utilizando las clases del nombre de espacio del proveedor de acceso a datos. La
mejor forma de entender todo esto que comentamos, es trabajando con un ejemplo prctico
que nos ensee a usar el objeto DataAdapter en Visual Studio

Utilizando las clases de .NET


En este primer ejemplo de demostracin del uso de DataAdapter a travs de cdigo
usando para ello las clases de .NET, estableceremos una conexin con SQL Server y
mostraremos los datos recogidos en un control TextBox.
niciaremos Visual Studio 2005 y seleccionaremos un proyecto de formulario de Windows.
Dentro del formulario, insertaremos un control TextBox y aadiremos dos referencias al
proyecto. Las referencias aadidas sern a las libreras System.Data y System.XML, como
se muestra en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

203

Referencias a las clases de acceso a datos de .NET


Una vez que hemos aadido las referencias necesarias para utilizar las clases que queremos en
nuestro proyecto, iremos al cdigo y escribiremos las siguientes instrucciones:

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 &

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

204

Row("FechaAlquiler") & vbCrLf


Next
' Vaciamos el DataSet para liberar memoria
MiDataSet = Nothing
End Sub
End Class
El ejemplo en ejecucin del uso de DataAdapter junto con las clases de .NET es el que se
muestra en la figura

Ejemplo del acceso a datos con DataAdapter a travs de las clases de .NET

Utilizando los componentes de .NET


Sin embargo y como ya hemos comentado, existe otro mtodo de acceso a fuentes de datos
diferente a las clases de .NET, el acceso a travs de componentes que nos faciliten esa tarea.
Sin embargo, los componentes de acceso a datos, utilizan por detrs las clases de .NET que
hemos visto, lo que ocurre, es que simplifica enormemente el trabajo y ahorra tiempo a la
hora de desarrollar aplicaciones.
De todos los modos, todo depende de la utilidad o
necesidades con las que nos encontremos en un momento dado. Iniciaremos un proyecto
Windows nuevamente, e insertaremos en l un control TextBox como hicimos en el caso
anterior.
A continuacin, aadiremos los componentes de acceso a fuentes de datos SQL Server que es
la fuente de datos origen. Como hemos visto, para conectar a fuentes de datos SQL Server,
hemos utilizado el nombre de espacio System.Data y hemos importado en el proyecto los
nombres de espacio System.Data y System.Data.SqlClient.
Los componentes .NET de acceso a fuentes de datos de SQL Server, se identifican por el
nombre Sqlxxx, siendo xxx el tipo de componente a utilizar. Para poder utilizarlos, deberemos
aadirlo a la barra de herramientas.
Para aadir los componentes a nuestro proyecto, haremos soble clic sobre el formulario y
posteriormente haremos clic con el botn secundario del mouse sobre la barra de
herramientas y seleccionaremos la opcin Elegir elementos... como se muestra en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

205

Opcin de la barra de herramientas para aadir componentes al entorno


Una vez que hemos hecho esto, seleccionaremos los componentes SqlCommand,
SqlCommandBuilder, SqlConnection, SqlDataAdapter y SqlDataSource, tal y como se
muestra en la figura

Componentes a aadir al entorno


Una vez que hemos aadido los componentes al entorno, estos quedarn dispuestos
dentro de la barra de herramientas como se indica en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

206

Componentes aadidos en la barra de herramientas


Lo primero que haremos ser insertar un componente SqlConnection dentro del
formulario.
Acudiremos a la ventana de propiedades del componente y
modificaremos la propiedad ConnectionString dentro de la cul escribiremos la
instruccin:

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.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

207

Componente SqlDataAdapter con la conexin establecida para ser


usada en la ejecucin de nuestra aplicacin
Por ltimo, inserte un componente DataSet al formulario. Todos los componentes quedarn
por lo tanto insertados, tal y como se indica en la figura

Componentes aadidos en el formulario de nuestra aplicacin


Una vez que tenemos todo preparado, tan slo nos queda escribir la parte de cdigo fuente
necesario para poder realizar todas las operaciones y acciones que necesitamos. A
continuacin, se expone el cdigo fuente de nuestra aplicacin de demostracin:
Public Class Form1

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


System.EventArgs) Handles MyBase.Load
' Establecemos la cadena SQL a utilizar
SqlDataAdapter1.SelectCommand.CommandText = "SELECT
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

208

SocioNIF, FechaAlquiler FROM ALQUILERES"


' Abrimos la Conexin
SqlConnection1.Open()
' Rellenamos el DataSet con el contenido de la instruccin SQL
SqlDataAdapter1.Fill(DataSet1)
' Cerramos la Conexin
SqlConnection1.Close()
' Declaramos la propiedad Row para recorrer las filas contenidas en el DataSet
Dim Row
' Recorremos todas las filas y las tratamos
For Each Row In DataSet1.Tables(0).Rows
TextBox1.Text += Row("SocioNIF").ToString & vbTab & Row("FechaAlquiler") & vbCrLf
Next
End Sub
End Class
Ahora nos queda nicamente ejecutar nuestra aplicacin para estudiar el resultado final. Este
es el que se puede ver en la figura

Ejemplo en ejecucin del uso de componentes


Pese a todo lo que hemos visto, quizs se pregunte como es que en el caso del primer ejemplo
que hemos visto y en el que hemos declarado el uso de un DataAdapter sin usar componentes,
hemos tenido la obligatoriedad de aadir las referencias a los nombres de espacio
System.Data y System.Xml, mientras que en este segundo ejemplo, no hemos hecho
referencia a ellos.
En realidad nosotros no hemos hecho referencia a ellos, pero al insertar los componentes
dentro del formulario, el entorno Visual Studio 2005 se ha encargado por nosotros de aadir
esas referencias al proyecto, tal y como puede verse en la figura.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

209

Referencias aadidas automticamente al trabajar con componentes de acceso a


datos

8.14.- Insertando datos a travs del objeto DataAdapter


Hasta ahora, todos los ejemplos que hemos visto del objeto DataAdapter, han sido ejemplos
del uso de seleccin de datos, pero an no hemos visto como debemos trabajar cuando
realicemos otras acciones sobre la fuente de datos.
A continuacin, veremos como realizar acciones de actualizacin de datos, utilizando para
ello el objeto DataAdapter.

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.

Cmo se insertan datos con el objeto DataAdapter


Suponiendo que hemos recogido un conjunto de datos y que trabajando con el objeto
DataSet hemos realizado una insercin de datos y que a continuacin, queremos propagar
dicha insercin a la base de datos, deberemos hacer uso del mtodo Insert del objeto
DataAdapter.

El objeto DataAdapter se encargar de llamar al comando apropiado para cada una de las filas

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

210
que han sido modificadas en un determinado DataSet.
Esto lo realizar siempre a travs del mtodo Update.

Trabajando con un ejemplo


La mejor manera de ver esto es con un ejemplo que nos ayude a entender mejor como
funciona la insercin de datos a travs del objeto DataAdapter.
Tenga en cuenta adems, que la actualizacin y el borrado de datos funciona de la misma
manera. Iniciaremos un nuevo proyecto de formulario Windows y en l insertamos los
componentes SqlConnection, SqlDataAdapter, DataSet y SqlCommand.
Para el
componente SqlConnection, estableceremos la propiedad ConnectionString con el valor:

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.

Formulario con los componentes y controles insertados en l Figura 1


Finalmente, escribiremos el cdigo necesario para ejecutar nuestra aplicacin tal y como
queremos. Este es el que se detalla a continuacin:

Public Class Form1


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
' Establecemos la cadena SQL a utilizar
SqlDataAdapter1.SelectCommand.CommandText = "SELECT NIF, Nombre, Apellido1,

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

211

Apellido2, Telefono, Email, Direccion, Ciudad, Provincia, CP FROM SOCIOS"


' Abrimos la Conexin
SqlConnection1.Open()
' Rellenamos el DataSet con el contenido de la instruccin sql
SqlDataAdapter1.Fill(DataSet1, "Ejemplo")
' Cerramos la Conexin
SqlConnection1.Close()
' Asociamos el control DataGridView al DataSet
DataGridView1.DataSource = DataSet1.Tables("Ejemplo")
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
' Declaramos un objeto DataRow para insertar en l los nuevos datos
Dim MiDataRow As Data.DataRow
' Creamos una nueva fila en el DataSet
MiDataRow = DataSet1.Tables("Ejemplo").NewRow()
' Insertamos los datos en el DataSet
MiDataRow("NIF") = "222222"
MiDataRow("Nombre") = "Mara"
MiDataRow("Apellido1") = "Jurez"
MiDataRow("Apellido2") = "Fernndez"
MiDataRow("Telefono") = "1112233"
MiDataRow("Email") = "mara@cuentademail.com"
MiDataRow("Direccion") = "C\ Fernndez de los Ros, 77"
MiDataRow("Ciudad") = "Valladolid"
MiDataRow("Provincia") = "Valladolid"
MiDataRow("CP") = "11111"
DataSet1.Tables("Ejemplo").Rows.Add(MiDataRow)
' Si el DataSet tiene cambios ?
If DataSet1.HasChanges Then
' Indicamos la instruccin SQL correspondiente
SqlCommand1.CommandText = "INSERT INTO SOCIOS(NIF,
Nombre, Apellido1, Apellido2, Telefono, Email, Direccion, Ciudad, Provincia, CP)
VALUES(@NIF, @Nombre, @Apellido1, @Apellido2, @Telefono, @Email, @Direccion,
@Ciudad, @Provincia, @CP)"
' Establecemos para el comando, la (conexin) que utilizaremos
SqlCommand1.Connection = SqlConnection1
' Le indicamos al DataAdapter, cul es el comando de insercin que usaremos
SqlDataAdapter1.InsertCommand = SqlCommand1
' Aadimos los parmetros y comandos correspondientes
' para cada campo a aadir en la base de datos

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

212

SqlCommand1.Parameters.Add("@NIF", Data.SqlDbType.NChar, 10, "NIF")


SqlCommand1.Parameters.Add("@Nombre",
Data.SqlDbType.NVarChar, 50, "Nombre")
SqlCommand1.Parameters.Add("@Apellido1",
Data.SqlDbType.NVarChar, 50, "Apellido1")
SqlCommand1.Parameters.Add("@Apellido2",
Data.SqlDbType.NVarChar, 50, "Apellido2")
SqlCommand1.Parameters.Add("@Telefono",
Data.SqlDbType.NVarChar, 13, "Telefono")
SqlCommand1.Parameters.Add("@Email",
Data.SqlDbType.NVarChar, 50, "Email")
sqlCommand1.Parameters.Add("@Direccion",
Data.SqlDbType.NVarChar, 100, "Direccion")
SqlCommand1.Parameters.Add("@Ciudad",
Data.SqlDbType.NVarChar, 50, "Ciudad")
SqlCommand1.Parameters.Add("@Provincia",
Data.SqlDbType.NVarChar, 50, "Provincia")
SqlCommand1.Parameters.Add("@CP", Data.SqlDbType.NChar, 5,"CP")
' Abrimos la conexin
SqlConnection1.Open()
' Realizamos la insercin de datos desde el DataSet a travs del DataAdapter
SqlDataAdapter1.Update(DataSet1, "Ejemplo")
' Cerramos la conexin
SqlConnection1.Close()
' Indicamos con un mensaje que la insercin de datos se ha realizado con xito
MessageBox.Show("Datos insertados correctamente")
End If
End Sub
End Class
Por ltimo, ejecute la aplicacin. Si todo ha ido correctamente, los datos habrn quedado
correctamente insertados en la base de datos. Un ejemplo de nuestra aplicacin en ejecucin
es la que puede verse en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

213

Aplicacin de ejemplo de insercin de datos con DataAdapter y DataSet en ejecucin


Como vemos, el uso de DataAdapter en el caso de manipular datos, vara ligeramente. Sin
embargo, no es mucho ms complicado con la actualizacin y borrado de datos. De hecho, la
forma de actuar es la misma como veremos a continuacin.

8.15.- Actualizando datos a travs del objeto DataAdapter


De la misma manera que hemos insertado datos en nuestra base de datos, debemos hacer a la
hora de actualizar los mismos. Sobre la base del ejemplo anterior (componentes y controles),
escriba o modifique el siguiente cdigo:

Public Class Form1


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
' Establecemos la cadena SQL a utilizar
SqlDataAdapter1.SelectCommand.CommandText = "SELECT NIF, Nombre, Apellido1,
Apellido2, Telefono, Email, Direccion, Ciudad, Provincia, CP FROM SOCIOS"
' Abrimos la Conexin SQL
SqlConnection1.Open()
SqlDataAdapter1.Fill(DataSet1, "Ejemplo")
' Cerramos la Conexin
SqlConnection1.Close()
' Asociamos el control DataGridView al DataSet
DataGridView1.DataSource = DataSet1.Tables("Ejemplo")
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
' En nuestro ejemplo, sabemos que queremos modificar
' la fila 2, columna 4 (todos los elementos empiezan por 0)
DataSet1.Tables("Ejemplo").Rows(1)(4) = "1112234"
' Si el DataSet tiene cambios ?
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

214

If DataSet1.HasChanges Then
' Indicamos la instruccin SQL correspondiente
SqlCommand1.CommandText = "UPDATE SOCIOS SET
Telefono=@Telefono WHERE NIF=@NIF"
' Establecemos para el comando, la (conexin) que utilizaremos
SqlCommand1.Connection = SqlConnection1
' Le indicamos al DataAdapter, cul es el comando de actualizacin que usaremos
SqlDataAdapter1.UpdateCommand = SqlCommand1
' Aadimos los parmetros y comandos orrespondientes
' para cada campo a actualizar en la base de datos
SqlCommand1.Parameters.Add("@NIF", Data.SqlDbType.NChar,10, "NIF")
SqlCommand1.Parameters.Add("@Nombre",
Data.SqlDbType.NVarChar, 50, "Nombre")
SqlCommand1.Parameters.Add("@Apellido1",
Data.SqlDbType.NVarChar, 50, "Apellido1")
SqlCommand1.Parameters.Add("@Apellido2",
Data.SqlDbType.NVarChar, 50, "Apellido2")
SqlCommand1.Parameters.Add("@Telefono",
Data.SqlDbType.NVarChar, 13, "Telefono")
SqlCommand1.Parameters.Add("@Email",
Data.SqlDbType.NVarChar, 50, "Email")
SqlCommand1.Parameters.Add("@Direccion",
Data.SqlDbType.NVarChar, 100, "Direccion")
SqlCommand1.Parameters.Add("@Ciudad",
Data.SqlDbType.NVarChar, 50, "Ciudad")
SqlCommand1.Parameters.Add("@Provincia",
Data.SqlDbType.NVarChar, 50, "Provincia")
SqlCommand1.Parameters.Add("@CP", Data.SqlDbType.NChar, 5, "CP")
' Abrimos la conexin
SqlConnection1.Open()
' Realizamos la actualizacin de datos desde el DataSet a travs del DataAdapter
SqlDataAdapter1.Update(DataSet1, "Ejemplo")
' Cerramos la conexin
SqlConnection1.Close()
' Indicamos con un mensaje que la actualizacin de datos se ha realizado con xito
MessageBox.Show("Datos actualizados correctamente")
End If
End Sub
End Class
Nuestro ejemplo en ejecucin es el que se puede ver en la figura 1.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

215

Aplicacin de ejemplo de actualizacin de datos con DataAdapter y DataSet

8.16.- Eliminando datos a travs del objeto DataAdapter

De igual forma sucede con la eliminacin de datos utilizando para ello el objeto DataAdapter
junto al objeto DataSet.
Utilizaremos nuevamente en este caso, la base del ejemplo anterior (componentes y
controles), y escribiremos el siguiente cdigo:

Public Class Form1


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
' Establecemos la cadena SQL a utilizar
SqlDataAdapter1.SelectCommand.CommandText = "SELECT NIF,Nombre, Apellido1,
Apellido2, Telefono, Email, Direccion, Ciudad,Provincia, CP FROM SOCIOS"
' Abrimos la Conexin
SqlConnection1.Open()
' Rellenamos el DataSet con el contenido de la instruccin SQL
SqlDataAdapter1.Fill(DataSet1, "Ejemplo")
' Cerramos la Conexin
SqlConnection1.Close()
' Asociamos el control DataGridView al DataSet
DataGridView1.DataSource = DataSet1.Tables("Ejemplo")
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
' En nuestro ejemplo, sabemos que queremos eliminar
' la fila 2 (todos los elementos empiezan por 0) por lo que la fila 2 es aqu la 1
DataSet1.Tables("Ejemplo").Rows(1).Delete()

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

216

' Si el DataSet tiene cambios ?


If DataSet1.HasChanges Then
' Indicamos la instruccin SQL correspondiente
SqlCommand1.CommandText = "DELETE SOCIOS WHERE NIF=@NIF"
' Establecemos para el comando, la (conexin) que utilizaremos
SqlCommand1.Connection = SqlConnection1
' Le indicamos al DataAdapter, cul es el comando de eliminacin que usaremos
SqlDataAdapter1.DeleteCommand = SqlCommand1
' Aadimos los parmetros y comandos correspondientes
' para cada campo a actualizar en la base de datos
SqlCommand1.Parameters.Add("@NIF", Data.SqlDbType.NChar,10, "NIF")
SqlCommand1.Parameters.Add("@Nombre",
Data.SqlDbType.NVarChar, 50, "Nombre")
SqlCommand1.Parameters.Add("@Apellido1",
Data.SqlDbType.NVarChar, 50, "Apellido1")
SqlCommand1.Parameters.Add("@Apellido2",
Data.SqlDbType.NVarChar, 50, "Apellido2")
SqlCommand1.Parameters.Add("@Telefono",
Data.SqlDbType.NVarChar, 13, "Telefono")
SqlCommand1.Parameters.Add("@Email",
Data.SqlDbType.NVarChar, 50, "Email")
SqlCommand1.Parameters.Add("@Direccion",
Data.SqlDbType.NVarChar, 100, "Direccion")
SqlCommand1.Parameters.Add("@Ciudad",
Data.SqlDbType.NVarChar, 50, "Ciudad")
SqlCommand1.Parameters.Add("@Provincia",
Data.SqlDbType.NVarChar, 50, "Provincia")
SqlCommand1.Parameters.Add("@CP", Data.SqlDbType.NChar, 5,"CP")
' Abrimos la conexin
SqlConnection1.Open()
' Realizamos la eliminacin de datos desde el DataSet a travs del DataAdapter
SqlDataAdapter1.Update(DataSet1, "Ejemplo")
' Cerramos la conexin
SqlConnection1.Close()
' Indicamos con un mensaje que la eliminacin de datos se ha realizado con xito
MessageBox.Show("Datos eliminados correctamente")
End If
End Sub
End Class
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

217

Nuestro ejemplo en ejecucin es el que se puede ver en la figura .

Aplicacin de ejemplo de eliminacin de datos con DataAdapter y DataSet

8.17.- Qu son los datos Maestro Detalle?


El desarrollador de aplicaciones que debe trabajar con datos y fuentes de datos relacionadas
entre s, encuentra con frecuencia problemas de desarrollo en aplicaciones con datos
interrelacionados. Adems, este tipo de aplicaciones, consumen gran parte del tiempo de
desarrollo y son por lo general, acciones repetitivas.
Supongamos como ejemplo general, la tabla Socios de un videoclub. Adems, relacionemos
los socios del videoclub, con una tabla Alquileres, para saber si un socio determinado tiene
pelculas alquiladas, y en ese caso, saber cules.
Este sencillo ejemplo, es un claro exponente de una aplicacin que relaciona datos maestro
detalle. Ambas tablas deben estar relacionadas para recopilar la informacin que se necesite
en un momento dado.
Los datos maestros seran expuestos por los socios del videoclub, mientras que los datos
detalle estaran relacionados con los datos de los alquileres de los socios.
En nuestro caso, vamos a cambiar las palabras maestro y detalle por padre e hijo, y a partir de
ahora, nos referiremos a padre como la tabla Socios, e hijo como la tabla Alquileres. De esta
forma, ubicaremos sin problemas ambos conceptos dentro del entorno de Visual Studio 2008,
ya que ste tiene alguna ligera connotacin que podra infundirnos a error como observar
ms adelante.
Por suerte, Visual Studio nos proporciona un conjunto de herramientas, que hace que realizar
una aplicacin Windows con todas las caractersticas de una aplicacin maestro detalle, sea un
autntico juego de nios, que nos llevar aproximadamente un minuto de nuestro tiempo
como mucho. No me cree?. Contine el captulo, y se sorprender de lo que Visual Studio
2008 puede hacer por usted.

8.18.- Configurando la fuente de datos


Trabajar con fuentes de datos requiere como tarea inicial, que tengamos listo y preparado un

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

Configurando el origen de la fuente de datos


Iniciaremos una nueva aplicacin Windows con Visual Studio y seleccionaremos el men Datos
> Mostrar orgenes de datos como se indica en la figura

Men para mostrar los orgenes de datos


En este punto, aparecer una ventana como la que se muestra en la figura.

Ventana de orgenes de datos


Como podemos apreciar, la ventana no tiene por defecto ningn origen de datos asignado,
adems, esta ventana inicialmente, no est anclada a ningn sitio del entorno. Para situarla en
un lugar especfico del entorno, haga clic sobre la ventana y arrstrela sobre la parte en la que
desee situarla, como se indica por ejemplo, en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

219

La ventana orgenes de datos podemos situarla dnde deseemos dentro de Visual


Studio
En este punto, la ventana de orgenes de datos, quedar anclada en el entorno de
desarrollo, como se muestra en la figura

La ventana orgenes de datos anclada en Visual Studio


Cada uno, puede situar esta ventana dnde considere oportuno. En mi caso la he situado entre
las ventanas del Explorador de soluciones y de Propiedades, pero podemos situarla dnde
consideremos oportuno. Sobre la configuracin del origen de datos, haga clic sobre la opcin
Agregar nuevo origen de datos... como se indica en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

220

Opcin para agregar un nuevo origen de datos


Aparecer una ventana como la que se muestra en la figura 6 en la cul indicaremos el lugar de
dnde la aplicacin obtendr los datos, y que en nuestro caso ser de una Base de datos.

Como tipo de origen de datos elegiremos una Base de datos


Una vez seleccionado la opcin de Base de datos como tipo de origen de datos, presionaremos
el botn Siguiente.
En la siguiente ventana, elegiremos la conexin de la base de datos que vamos a utilizar, o
presionaremos sobre el botn Nueva conexin... sino tenemos seleccionada la conexin que
queremos utilizar.
En la figura podemos ver como hemos establecido la conexin con nuestra fuente de
datos, que utilizaremos en nuestro ejemplo de creacin de la aplicacin de acceso a
datos maestro detalle.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

221

Ventana dnde elegimos la conexin de datos


A continuacin, haremos clic en el botn Siguiente.
En la nueva ventana que aparece ahora dentro del asistente para la creacin del origen de
datos, indicaremos el nombre de la cadena de conexin que crearemos. En nuestro caso, no
modificaremos el nombre de la cadena de conexin, dejndola por defecto como se muestra
en la figura

Asignamos un nombre para el nombre de la cadena de conexin


A continuacin, haremos clic sobre el botn Siguiente.
En este punto, el asistente se conecta a la base de datos para recuperar la
informacin de la base de datos y mostrarla en la ventana del asistente como se
muestra en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

222

Ventana con los objetos de la base de datos seleccionada


A continuacin, despliegue el objeto Tablas y seleccione las tablas Alquileres y Socios como se
indica en la figura

Seleccin de los objetos de la base de datos seleccionada


Una vez que hemos seleccionado los objetos de la base de datos, haremos clic sobre el botn
Finalizar para que el asistente concluya las opciones aadidas al asistente. La ventana del
origen de datos, quedar ahora configurado de una forma similar a la que se presenta en la
figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

223

Ventana de origen de datos con la configuracin aadida


A partir de aqu, deberemos preparar las tablas del origen de datos para que se comporten
como autnticos datos e informaciones maestro detalle. Esto es lo que veremos en el siguiente
mdulo.

8.19.- Preparando el origen de datos


Ya hemos aprendido a aadir nuestro origen de datos, y ahora aprenderemos a prepararlo
para poder utilizarlo posteriormente en la aplicacin Windows.
La preparacin del origen de datos, nos permitir seleccionar que tabla o datos queremos que
acten como maestro y cuales como detalle, o dicho de otra forma, que datos queremos que
sean padre y cuales hijo.
Nuestro objetivo principal es mostrar la tabla Alquileres como tabla hijo y la tabla Socios como
padre de la tabla anterior.
Prepararemos e incrustaremos primero la tabla Socios dentro del formulario Windows como
Detalle de la informacin, y posteriormente insertaremos la tabla Alquileres dentro del
formulario.
Por ltimo, asignaremos alguna relacin que permita trabajar con las dos tablas en nuestro
formulario Windows sin perder la conexin entre ambas tablas y permitindonos acceder a la
informacin que nos proporciona dicha relacin.

Preparando la tabla padre


Lo primero que haremos ser preparar la tabla padre para poderla aadir al formulario
Windows. Por esa razn, haremos clic sobre la tabla Socios de la ventana de Orgenes de datos
como se indica en la figura

Tabla Socios de la ventana de orgenes de datos

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

Campo NIF de la tabla Socios


Pulse sobre la lista desplegable que aparece a la derecha del campo NIF y seleccione la
opcin Label como se indica en la figura

Lista desplegable con la opcin Label seleccionada como campo de la tabla


desplegada
En este caso, la ventana de Orgenes de datos quedar informada tal y como se indica
en la figura

Campo NIF modificado en la ventana de Orgenes de datos


A continuacin, haremos clic sobre la tabla Socios como se indica en la figura, y
posteriormente presionaremos sobre la lista desplegable que aparece a la derecha de la
tabla.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

225

Tabla Socios seleccionada en la ventana de Orgenes de datos


Si hacemos clic sobre la lista desplegable, aparecer una lista de opciones o
posibilidades, para indicar cmo queremos que sean los campos de la tabla
seleccionada con respecto a que tipo de controles queremos que sean. Esto es lo que
se indica en la figura

Lista desplegable de la tabla Socios de la ventana de Orgenes de


datos
Por defecto, una tabla queda determinada con un icono que representa el control
DataGridView, aunque se puede modificar la representacin que deseamos tengan los datos
dentro de un formulario seleccionando cualquiera de las opciones que tenemos de la lista
desplegable. Estas opciones pueden ser cualquiera de las siguientes:

Representa los datos volcados dentro de un control DataGridView


Representa los datos volcados dentro de controles estndar como TextBox u
otros controles para reflejarla como Detalle de la informacin
No representa ningn control como tipo de control de volcado de datos
En el caso de la tabla Socios que usaremos como tabla padre, cambiaremos la representacin
por defecto de DataGridView para indicarle que nos represente la informacin en controles,
tal y como se indica en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

226

Tabla Socios seleccionada en la ventana de Orgenes de datos como Detalle


Ahora que tenemos la tabla maestra ya preparada, pasaremos a preparar la tabla
hija.

Preparando la tabla hija


Ahora que ya tenemos preparada la tabla tabla padre, prepararemos la tabla hija de los
alquileres de las pelculas de video, para poder usar su informacin dentro del formulario
Windows. Por esa razn, haga clic sobre la tabla Alquileres de la ventana de Orgenes de
datos como se indica en la figura

Tabla Alquileres de la ventana de orgenes de datos


Dentro de la ventana de Orgenes de datos y en concreto de la tabla Alquileres
desplegada, centraremos nuestra atencin en el campo AlquilerID y SocioNIF como se
indica en la figura

Campos AlquilerID y SocioNIF de la tabla Alquileres


Sobre el campo AlquilerID y SocioNIF, haremos una pequea modificacin. Pulse sobre
la lista desplegable que aparece a la derecha del campo AlquilerID y SocioNIF y
seleccione la opcin Label como se indica en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

227

Lista desplegable de opciones de un campo de la tabla desplegada


De esta manera, el campo AlquilerID y SocioNIF quedarn modificados en la ventana
Orgenes de datos como se indica en la figura

Campo AlquilerID y SocioNIF modificados en la ventana de Orgenes de datos


A continuacin, haremos clic sobre la tabla Alquileres como se indica en la figura, y
posteriormente presionaremos sobre la lista desplegable que aparece a la derecha de la
tabla.

Tabla Alquileres seleccionada en la ventana de Orgenes de datos


Nos aseguraremos que est seleccionada la opcin DataGridView que es la que
aparece por defecto. Esto es lo que se indica en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

228

En la tabla Alquileres, nos aseguraremos de seleccionar la opcin DataGridView


Una vez que tenemos las tabla maestra y detalle preparadas para utilizarlas, las aadiremos al
formulario Windows para que tengan el funcionamiento esperado.

8.20.- Incrustando los datos maestro detalle


Ya sabemos como crear un origen de datos, tambin sabemos como preparar los datos
maestro y detalle, y por ltimo, lo que nos queda es insertar esos datos en el formulario, y
relacionar todos sus datos para que funcionen de la forma esperada. A continuacin,
veremos como llevar a cabo esta tarea y aprenderemos a hacerlo posible de forma muy
rpida y sencilla.

Incrustando la tabla padre en el formulario


Nuestra primera accin, ser incrustar en el formulario los datos o tabla padre, que en
nuestro caso es la formada por la tabla Socios.
Para situar los datos de la tabla Socios dentro de un formulario y en concreto como una
informacin de detalle, bastar con arrastrar y soltar la tabla Socios sobre el formulario
como se indica en la figura

Para presentar la informacin como detalle, arrastraremos la tabla Socios


de la ventana Orgenes de datos sobre el formulario Windows
Observaremos que Visual Studio, generar por nosotros un conjunto de componentes y
controles, que por defecto tendr una apariencia similar a la que se presenta en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

229

Controles y Componentes de la tabla maestra aadidos al formulario Windows


Observe por un momento, que el campo NIF que declaramos como Label en la ventana de
Orgenes de datos, aparece como tal en el formulario, tal y como se indica en la figura

Campo NIF de la tabla, representado como un control Label en el


formulario Windows
Si ejecutamos nuestra aplicacin, observaremos que esta acta como una tpica aplicacin de
acceso a datos que nos permite navegar a travs de los campos de la tabla Socios, tal y como
se indica en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

230

Aplicacin en ejecucin de la tabla de detalle incrustada en el formulario Windows


A continuacin, insertaremos en el formulario la tabla Alquileres y relacionaremos ambas
tablas para que se muestren los datos relacionados, dentro del formulario Windows.

Incrustando la tabla hija en el formulario


Ya tenemos la tabla padre insertada en nuestro formulario Windows. Nuestra segunda accin,
ser la de incrustar en el formulario los datos o tabla hoja, que en nuestro caso es la formada
por la tabla Alquileres, la cul adems, posee una relacin entre campos con la tabla Socios
insertada anteriormente.
Para llevar a cabo esta accin arrastraremos y soltaremos la tabla Alquileres sobre el
formulario como se indica en la figura

Para presentar la informacin de la tabla Alquileres, arrastraremos la tabla


de la ventana Orgenes de datos sobre el formulario Windows

Como podemos observar, el entorno de trabajo ha hecho por nosotros el trabajo ms


complejo para representar los datos de forma rpida y sencilla.
El esquema de datos tipados, apareca ya en nuestro proyecto cuando asignamos el
correspondiente origen de datos. Ahora lo que ha ocurrido, es que al arrastrar y soltar la
tabla padre Socios de la ventana de Orgenes de datos, en el entorno se ha aadido un
componente de nombre MSDNVideoDataSet que es el que permitir relacionar el DataSet
tipado con nuestros datos.
Este componente ser usado por la relacin maestro detalle de las dos tablas aadidas al
formulario.
En la figura, podemos ver el esquema aadido a nuestro proyecto, y el componente del que
estamos hablando.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

231

Esquema del DataSet tipado aadido al proyecto y su componente de relacin


Ejecute la aplicacin y observe el comportamiento de la misma.

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.

Ejecucin de la aplicacin confirmando que los datos mostrados no estn


relacionados
A continuacin, la tarea que nos queda para completar el correcto funcionamiento de
nuestra aplicacin, es la de relacionar la tabla detalle y la tabla maestra entre s, para que
los datos que se muestran en la aplicacin, estn relacionados entre s.

Relacionando la tabla padre con la tabla hija


La tarea ms sencilla es la de relacionar la tabla detalle con la tabla maestra. Es una tarea
sencilla, porque Visual Studio nos proporciona las herramientas necesarias para simplificar al
mximo esta tarea.
Para llevar a cabo esta tarea, haga clic sobre el control DataGridView que corresponde a

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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.

Propiedad DataSource del control DataGridView de la informacin maestra


Despliegue esta propiedad, y de la lista desplegable que aparece, seleccione la
opcin FK_Alquileres_Socios como se indica en la figura

Asignacin de la clave de relacin entre las tablas


Cuando se asigna el campo de relacin de las tablas, dentro de la aplicacin se aade esta
relacin para que cuando naveguemos entre los datos de la tabla Socios aparezca toda la
informacin de la tabla Alquileres relacionada con la tabla Socios.
Esto
de
lo
que
hablamos,
est
supeditado
por
FK_Alquileres_SociosBindingSource que es lo que se indica en la figura

MSc. Ing. Jorge J. Prado D.

el

componente

Docente: Univ. Nac. De Ingenieria, Managua

233

Controles y componentes incluido el de relacin entre tablas, aadidos al formulario


Windows
Para finalizar, ejecutaremos nuestra aplicacin y comprobaremos que el funcionamiento de
esta, incluida la relacin entre tablas, funciona como esperbamos. En la figura, podemos
observar el comportamiento de nuestra aplicacin en ejecucin.

Aplicacin en ejecucin, mostrando la correcta relacin entre las tablas

8.21.- Manipulando los datos maestro detalle


Obviamente, los datos maestro detalle no nos sirve nicamente para insertar las tablas de
datos en un formulario, mostrarlos y navegar por ellos. Adems de esto, podemos tambin
manipular los datos maestro detalle, modificarlos, actualizarlos, borrarlos, sin hacer ninguna
accin adicional. El control BindingNavigator ya proporciona todas las caractersticas
necesarias para realizar estas acciones.
Podemos personalizar el control para permitir o denegar estas acciones. Adems, dentro de la

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

Modificaremos el valor de un campo para que nos sirva de ejemplo


Acto seguido, cuando hayamos realizado la modificacin, haremos clic sobre la opcin de
Guardar datos, tal y como se muestra en la figura.

Opcin del control BindingNavigator para guardar los datos modificados


Como vemos, la manipulacin de datos es realmente sencilla y en la relacin de datos
mostrada, no tiene porqu presentarnos ninguna dificultad.

Insertando y eliminando datos


Si queremos agregar datos, deberemos hacer clic sobre la opcin Agregar nuevo del control
BindingNavigator como se muestra en la figura

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

235

Aadir un registro nuevo es realmente sencillo


De la misma manera funciona el mecanismo para eliminar un registro, tal y como se
muestra en la figura

Eliminar un registro de forma Rpida

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

236

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

237

Vistas y ordenacin de datos con la clase DataView


La clase DataView nos permite la aplicacin de vistas personalizadas a partir de una
tabla contenida en un DataSet, as como la ordenacin y bsqueda de filas.
Partiendo de un objeto DataTable situado en un DataSet, vamos a definir varias vistas
simultneamente, ordenar y buscar registros, con la ventaja de que el consumo de
recursos es menor, puesto que los objetos DataView se alimentan del mismo
DataTable. Para realizar algunas pruebas, se acompaa el proyecto Vistas
El DataSet del formulario de pruebas va a estar compuesto por dos tablas. El
Cdigo fuente muestra el evento de carga del formulario.
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles MyBase.Load
' crear conexin
Dim oConexion As New SqlConnection()
oConexion.ConnectionString = "Server=(local);" & _
"Database=Northwind;uid=sa;pwd=;"
'crear dataset
oDataSet = New DataSet()
Dim oDataAdapter As SqlDataAdapter
' crear un adaptador de datos para la tabla Customers
oDataAdapter = New SqlDataAdapter("SELECT * FROM Customers", oConexion)
' aadir tabla al dataset con el adaptador
oDataAdapter.Fill(oDataSet, "Customers")
oDataAdapter = Nothing
' crear un adaptador de datos para la tabla Products
oDataAdapter = New SqlDataAdapter("SELECT * FROM Products", oConexion)
' aadir tabla al dataset con el adaptador
oDataAdapter.Fill(oDataSet, "Products")
oDataAdapter = Nothing
End Sub

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

238

Vistas por cdigo y DefaultView


Podemos crear una vista instanciando un objeto de la clase DataView, o
tambin obteniendo la denominada vista por defecto de una tabla de un DataSet,
a travs de la propiedad DefaultView del objeto DataTable. La opcin de men
Vistas + Normal del formulario, crea dos vistas de esta manera. Ver Cdigo fuente .
Private Sub mnuNormal_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuNormal.Click
' crear una vista por cdigo y asignarla a un datagrid
Dim dvNormal As DataView
dvNormal = New DataView(oDataSet.Tables("Customers"))
Me.grdDatos.CaptionText = "Customers"
Me.grdDatos.DataSource = dvNormal
' tomar la vista por defecto de una tabla
' del dataset y asignarla a un datagrid
Me.grdDatosBIS.CaptionText = "Products"
Me.grdDatosBIS.DataSource = oDataSet.Tables("Products").DefaultView
End Sub
La Figura muestra estas vistas en sendos DataGrid del formulario.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

239

Objetos DataView creados por cdigo y obtenido de DataTable.DefaultView.

Filtros con objetos DataView


La propiedad RowFilter de la clase DataView nos permite asignar a este objeto,
una cadena con la expresin de filtro, que en una consulta en lenguaje SQL sera la
parte correspondiente a la partcula Where.
El Cdigo fuente muestra el cdigo de la opcin de men Vistas + Pas, del
formulario de ejemplo, en la que se crea un filtro que se muestra posteriormente en
un DataGrid.
Private Sub mnuPais_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuPais.Click
' crear dataview
Dim oDataView As New DataView()
oDataView.Table = oDataSet.Tables("Customers")
' establecer un filtro
oDataView.RowFilter = "Country='Spain'"
Me.grdDatos.CaptionText = "Filtrar Customers por pas Spain"
Me.grdDatos.DataSource = oDataView
End Sub
La Figura muestra las filas de la tabla con el filtro aplicado.

DataView con filtro.


Como hemos comentado anteriormente, a partir de un DataTable podemos
obtener varios filtros mediante distintos objetos DataView, sin que ello
MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

240

suponga una penalizacin en el consumo de recursos. Para demostrar este


punto, la opcin Vistas + Combinada, crea una vista basada en un filtro combinado,
y una vista normal, ambas empleando la misma tabla base. Veamos el Cdigo fuente
Private Sub mnuCombinada_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuCombinada.Click
' tomar la tabla Customers del dataset y aplicar...
' ...filtro combinado por dos campos y depositar en un datagrid
Dim oDataView As New DataView()
oDataView.Table = oDataSet.Tables("Customers")
oDataView.RowFilter = "ContactTitle LIKE '%Manager%' AND Country IN
('Spain','USA')"
Me.grdDatos.CaptionText = "Filtro combinado por campos ContactTitle y
Country"
Me.grdDatos.DataSource = oDataView
' ...filtro por un campo y depositar en otro datagrid
Dim oDV As New DataView()
oDV.Table = oDataSet.Tables("Customers")
oDV.RowFilter = "ContactName LIKE '%an%'"
Me.grdDatosBIS.CaptionText = "Filtro por campo ContactName"
Me.grdDatosBIS.DataSource = oDV
End Sub
La Figura muestra el formulario con los diversos filtros establecidos

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

241

Filtros combinados con objetos DataView.

Bsquedas con DataView


Estableciendo el adecuado filtro a un objeto DataView, podemos realizar
bsquedas de registros en tablas, como muestra el Cdigo fuente, correspondiente
a la opcin de men Vistas + Buscar fila, del formulario de ejemplo. Deberemos
previamente, haber escrito en el TextBox del formulario, el identificador de la
tabla Customers a buscar.
Private Sub mnuBuscarFila_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuBuscarFila.Click
' crear un dataview y buscar una fila en la vista
' estableciendo un filtro
Dim oDataView As New DataView()
oDataView.Table = oDataSet.Tables("Customers")
oDataView.RowFilter = "CustomerID = '" & Me.txtCustomerID.Text & "'"
Me.grdDatosBIS.CaptionText = "Buscar ID cliente: " & Me.txtCustomerID.Text
Me.grdDatosBIS.DataSource = oDataView
End Sub
En la Figura vemos el resultado de una bsqueda, mostrado en uno de los
DataGrid del formulario.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

242

Bsqueda de una fila en una tabla de un DataSet, empleando un DataView.

Ordenacin de filas mediante DataView


Para ordenar las filas en un DataView emplearemos su propiedad Sort, asignndole
una cadena con el nombre de columna/s a ordenar, tal y como muestra el Cdigo
fuente , de la opcin de men Ordenacin + Normal, en el formulario del ejemplo.
Private Sub mnuOrdNormal_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuOrdNormal.Click
' crear dataview y ordenar las filas con la propiedad Sort
Dim oDataView As New DataView()
oDataView.Table = oDataSet.Tables("Customers")
oDataView.Sort = "Country"
Me.grdDatos.CaptionText = "Ordenar por campo Country"
Me.grdDatos.DataSource = oDataView
End Sub
Veamos el resultado al ejecutar en la Figura
Si necesitamos ordenar por mltiples columnas de la tabla, slo tenemos que asignar a
Sort una cadena con la lista de columnas requeridas. Ver Cdigo fuente .

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

243

DataView ordenando las filas por la columna Country.


oDataView.Sort = "Country, PostalCode"
Tambin es factible asignar a un DataView una combinacin de filtro y ordenacin,
utilizando en la misma operacin las propiedades RowFilter y Sort. El men del
formulario Ordenacin + Con filtro realiza este trabajo, que vemos en el Cdigo
fuente .
Private Sub mnuOrdenFiltro_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuOrdenFiltro.Click
Dim oDataView As New DataView()
oDataView.Table = oDataSet.Tables("Customers")
' establecer un filtro al dataview
oDataView.RowFilter = "Country='USA'"
' ordenar las filas del filtro
oDataView.Sort = "City"
Me.grdDatos.CaptionText = "Filtrar por USA. Ordenar por campo City"
Me.grdDatos.DataSource = oDataView
End Sub
Los datos con el filtro y orden podemos verlos en el DataGrid del formulario, que
muestra la Figura .

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

244

Resultado de DataView con filtro y orden.

Obtener el esquema de un DataSet


El esquema de un DataSet consiste en toda la informacin contenida por este
objeto, acerca de los nombres de tablas, columnas, relaciones, etc.; es decir, se trata
de metainformacin sobre los datos que contiene el DataSet.
Podemos obtener estos metadatos del DataSet recorriendo la coleccin que nos
interese en cada caso: Tables, Columns, etc.
El Cdigo fuente muestra como tras crear un DataSet, recorremos sus tablas, y
dentro de estas, sus columnas, mostrando la informacin obtenida en un ListBox.
Private Sub btnEsquema_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnEsquema.Click
' crear conexin
Dim oConexion As New SqlConnection()
oConexion.ConnectionString = "Server=(local);" & _
"Database=Northwind;uid=sa;pwd=;"
' crear dataset
Dim oDataSet As New DataSet()
' crear adaptadores de datos para las tablas
' y aadir cada tabla al dataset con el adaptador
Dim oDataAdapter As SqlDataAdapter
oDataAdapter = New SqlDataAdapter("SELECT * FROM Customers", oConexion)
oDataAdapter.Fill(oDataSet, "Customers")
oDataAdapter = Nothing

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

245

oDataAdapter = New SqlDataAdapter("SELECT * FROM Orders", oConexion)


oDataAdapter.Fill(oDataSet, "Orders")
oDataAdapter = Nothing
oDataAdapter = New SqlDataAdapter("SELECT * FROM Products", oConexion)
oDataAdapter.Fill(oDataSet, "Products")
oDataAdapter = Nothing
oDataAdapter = New SqlDataAdapter("SELECT * FROM Territories", oConexion)
oDataAdapter.Fill(oDataSet, "Territories")
oDataAdapter = Nothing
' crear un objeto tabla y columna para mostrar
' la informacin del esquema que el dataset contiene
Dim oDataTable As DataTable
Dim oDataColumn As DataColumn
Me.lstEsquema.Items.Add("Estructura del DataSet")
' recorrer la coleccin de tablas del DataSet
For Each oDataTable In oDataSet.Tables
Me.lstEsquema.Items.Add("Tabla: " & oDataTable.TableName)
Next
' recorrer la coleccin de columnas de la tabla
For Each oDataColumn In oDataTable.Columns
Me.lstEsquema.Items.Add("Campo: " & _
oDataColumn.ColumnName & " --- " & _
"Tipo: " & oDataColumn.DataType.Name)
Next
End Sub
La Figura muestra el ListBox relleno con el esquema del DataSet tras haber pulsado el
botn del formulario.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

246

Obtencin del esquema de un DataSet.

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

247

Ejemplos de programa de uso de clase en Visual Basic NET


Ejemplo Calcular el salario de un empleado, informacin a sacar por pantalla Nombre del
empleado y Salario semanal, datos conocidos: nombre, nmero de horas trabajadas y pago
por hora del empleado
El salario se calcula de la manera siguiente:
Si el nmero de horas trabajadas es mayor que 40, el excedente de 40 se paga al doble de
la cuota por hora, en caso de no ser mayor que 40 se paga a la cuota por hora normal.
Realicemos la solucin de acuerdo al modelo-vista-controlador
Algoritmo Calcular Salario de un empleado

Algoritmo Calcular Salario de un empleado


Clase Empleado
1.- Declaraciones :Datos
NombreEmpleado: Cadena
HorasTrabajadas: Entero
PagoHora:
Real
Salario:
Real
2.- Metodo EstablecerNombre( nom: cadena)
NombreEmpleado = nom
Fin Metodo EstablecerNombre
3.- Metodo Establecerhoras(horas: Entero)
HorasTrabajadas = horas
Fin Metodo EstablecerHoras
4.- Metodo EstablecerPago( pago: Real)
PagoHora = pago
Fin Metodo EstablecerPago
5.-Metodo CalcularSalario( )
If HorasTrabajadas<= 40 Then
Salario = HorasTrabajadas * PagoHora
Else
Salario= (40*PagoHora)+
(( HorasTrabajadas -40) *( PagoHora * 2))
Endif
Fin Metodo EstablecerNombre

Public Class Empleado


'Declaraciones de Datos
Private NombreEmpleado As String
Private HorasTrabajadas As Integer
Private PagoHora As Double
Private Salario As Double

6.- Metodo ObtenerNombre() : Cadena

Public ReadOnly Property obtenerHoras() As


Integer
' bloque Get para devolver el valor de la
propiedad
Get
Return HorasTrabajadas
End Get
End Property

Return NombreEmpleado
Fin Metodo ObtenerNombre
7.- Metodo ObtenerSalario( ) : Real
Return Salario
Fin Metodo ObtenerSalario

Public ReadOnly Property obtenerNombre() As


String
' bloque Get obtener para devolver el valor
de la propiedad
Get
Return NombreEmpleado
End Get
End Property
Public WriteOnly Property establecerNombre()
As String
' bloque Set (Establecer) para asignar valor a
la propiedad
Set(ByVal Value As String)
NombreEmpleado = Value
End Set
End Property

Fin de clase empleado

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

248

Public WriteOnly Property EstablecerHoras()


As Integer
' bloque Set para establecer valor a la
propiedad
Set(ByVal hora As Integer)
HorasTrabajadas = hora
End Set
End Property

Diseo en Visual Basic

Public WriteOnly Property EstablecerPago()


As Double
' bloque Get para devolver el valor de la
propiedad
Set(ByVal value As Double)
PagoHora = value
End Set
End Property

Public ReadOnly Property ObtenerPagoHora()


As Double
' bloque Set para estsblecer el valor a la
propiedad
Get
Return PagoHora
End Get
End Property
Public Sub CalcularSalario()
' en este mtodo calculamos el salario del
empleado
If HorasTrabajadas <= 40 Then
Salario = HorasTrabajadas * PagoHora
Else
Salario = (40 * PagoHora) +
((HorasTrabajadas - 40) * (PagoHora * 2))
End If
End Sub
Public ReadOnly Property ObtenerSalario() As
Double
Get
Return Salario
End Get
End Property
End Class

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

249

Rem Clase Ejecuta Empleado (Esta se


encuentra en el Form)

Clase EjecutaEmpleado

Public Class Form1


Public NEmple As String
Dim HT As Double
Dim PagoH As Double

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

Private Sub Button1_Click(ByVal


sender As System.Object, ByVal e As
System.EventArgs) Handles
Button1.Click
'Declarar e iniciar objeto
Dim objEmpleado As Empleado
objEmpleado = New Empleado()
'Trasladar datos a las variables
NEmple = TextBox1.Text
HT = Val(TextBox2.Text)
PagoH = Val(TextBox3.Text)
'Metodos establecer
objEmpleado.establecerNombre =
NEmple
objEmpleado.EstablecerPago = PagoH
objEmpleado.EstablecerHoras = HT
'Metodo Calcular
objEmpleado.CalcularSalario()
'Metodos obtener datos
Label4.Text = "Empleado
" &
UCase(objEmpleado.obtenerNombre)
Label5.Text = "Pago por hora " &
objEmpleado.ObtenerPagoHora
Label6.Text = "Salario
" &
objEmpleado.ObtenerSalario
End Sub
Private Sub Button2_Click(ByVal
sender As System.Object, ByVal e As
System.EventArgs) Handles
Button2.Click
End
End Sub
End Class

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

250

Algoritmo y programa OO usando seleccin mltiple en Visual Basic NET


Ejercicio: Elaborar un algoritmo que dado un numero del 1 al 7, el programa
imprima por pantalla Domingo ,si es 1, Lunes, si es 2 Sbado, si es 7.
Solucin:

Algoritmo PresentaDia de la semana


Clase PresentaDia
Declaraciones
Datos
NumDia : Entero
NombreDia : Cadena
Metodo EstablecerNDia( num: Entero)
NumDia = Num
Fin de mtodo EstablecerDia
Metodo CalcularNombredia()
Swith NumDia
1: Nombredia = Domingo
2: Nombredia = Lunes
3: Nombredia = Martes
4: Nombredia = Mircoles
5: Nombredia = Jueves
6: Nombredia = Viernes
7: Nombredia = Sbado
DEFAULT
NombreDia = No est en el rango de 1 a 7
ENDSWITCH
Fin Metodo CalcularNombreDia
Metodo ObtenerNombreDia() : Cadena
Return NombreDia
Fin Metodo ObtenerDia
Fin clase PresentaDia

MSc. Ing. Jorge J. Prado D.

Public Class PresentaDia


REM Declaraciones de
Datos
Private INumDia As Integer
Public SNombreDia As String
' Metodo obtener nombreDia de solo
escritura
ReadOnly Property Nombre() As String
Get
Nombre = SNombreDia
End Get
End Property
'Metodo establecer Numero del Dia solo
lectura
WriteOnly Property Dia() As Integer
Set(ByVal value As Integer)
INumDia = value
End Set
End Property
'
Metodo CalcularNombredia()
Public Sub CalcularDia()
Select Case (INumDia)
Case 1
SNombreDia = "Domingo"
Case 2
SNombreDia = "Lunes"
Case 3
SNombreDia = "Martes"
Case 4
SNombreDia = "Miercoles"
Case 5
SNombreDia = "Jueves"
Case 6
SNombreDia = "Viernes"
Case 7
SNombreDia = "Sabado"
Case Else
SNombreDia = "No existe ese dia"
End Select
End Sub
End Class

Docente: Univ. Nac. De Ingenieria, Managua

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

Public Class Form1


REM programa con clases utilizando
seleccion multiple
REM Elaborar un algoritmo que dado
un numero del 1 al 7, el programa
imprima por pantalla Domingo ,si
es 1, Lunes, si es 2 Sbado, si
es 7.
Dim INdia As Integer
' Declara la instancia de la clase
Dim objDia As PresentaDia
Private Sub Button2_Click(ByVal
sender As System.Object, ByVal e As
System.EventArgs) Handles
Button2.Click
End
End Sub
Private Sub Button1_Click(ByVal
sender As System.Object, ByVal e As
System.EventArgs) Handles
Button1.Click
objDia = New PresentaDia
objDia.Dia = Val(TextBox1.Text)
objDia.CalcularDia()
' presentar el nombre del dia
Label2.Text = "El dia de la semana
es " & objDia.Nombre
End Sub
End Class

Fin Clase EjecutaPresentaDia

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

252

Algoritmo y programa OO usando Estructura de repeticin DOWHILE en


Visual Basic NET
Ejemplo: Elaborar un algoritmo para calcular e imprimir el sueldo de varios
empleado de una empresa.
Datos disponibles: Nombre, Horas Trabajadas, Cuota por Hora
Proceso: Sueldo = Horas Trabajadas * cuota por Hora
Imprimir: Nombre, Sueldo.
Public Class Empleado
Private NombreE As String
Public Property Nombre() As String
Get
Nombre = NombreE
End Get
Set(ByVal valor As String)
NombreE = valor
End Set
End Property

Solucin:

Clase Empleado
Declaraciones
Datos
NombreE : Cadena
HorasT : Entero
PagoH : Real
Sueldo : Real
Metodo
EstablecerNombreE(nom
Cadena)
NombreE = nom
Fin mtodo EstablecerNombreE

Metodo EstablecerHorasT (Horas : Enterol)


HorasT = Horas
Fin de mtodo EstablecerHorasT.
Metodo EstablecerPagoH( Pago : Real)
PagoH = Pago
Fin Metodo EstablecerPagoH
Metodo CacularSueldo()
Sueldo = HorasT * PagoH
Fin mtodo CalcularSueldo
Metodo ObtenerNombreE(): Cadena
Return NombreE
Fin Metoddo ObtenerNombreE

Private HorasT As Double


Public Property Horas() As String
Get
Horas = HorasT
End Get
Set(ByVal valor As String)
HorasT = valor
End Set
End Property
Private PagoH As Double
Public Property Pago() As String
Get
Pago = PagoH
End Get
Set(ByVal valor As String)
PagoH = valor
End Set
End Property
Private Sueldo As Double
ReadOnly Property Salario() As Double

Metodo ObtenerSueldo() : Real


Return Sueldo
Fin mtodo ObtenerSueldo
Fin Clase Empleado

Get
Salario = Sueldo
End Get
End Property
Public Sub CalcularSueldo()
Sueldo = HorasT * PagoH
End Sub
End Class

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

253

Public Class Form1


Dim ObjEmpleado As Empleado
Private Sub Button2_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs)
Handles Button2.Click
ObjEmpleado = New Empleado
' Recibir datos
ObjEmpleado.Nombre = TextBox1.Text
ObjEmpleado.Horas = Val(TextBox2.Text)
ObjEmpleado.Pago = Val(TextBox3.Text)
' Procesar salario
ObjEmpleado.CalcularSueldo()
Label4.Text = "El empleado " &
Clase EjecutaEmpleado
Metodo Principal
Declaraciones
Variables
NomEmple : Cadena
HTraba : Entero
PagoHora : Real
Desea : Carcter
Do
Declarar, crear e iniciar objeto
Empleado objEmpleado = new Empleado()
Solicitar Nombre, horas trabajadas, cuota por hora
Leer nomEmple, HTraba,PagoHora
Establecer
ObjEmpleado.EstablecerNombreE(NomEmple)
ObjEmpleado.EstablecerHorasT(HTraba)
ObjEmpleado.EstablecerPagoH(PagoHora)

ObjEmpleado.Nombre & " tiene un salario de "


& ObjEmpleado.Salario
Dim otros As String
otros = InputBox("Otro proceso S/N")
If UCase(otros) = "S" Then
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
Label4.Text = ""
TextBox1.Focus()
End If
End Sub
Private Sub Button1_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs)

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

MSc. Ing. Jorge J. Prado D.

Handles Button1.Click
End
End Sub
End Class

Docente: Univ. Nac. De Ingenieria, Managua

254

Algoritmo y programa OO usando arreglos unidimensionales en Visual


Basic NET, Ejemplo:
Se conoce el nmero de unidades producidas por un obrero en cada uno de los 30
das del mes. Elaborar un algoritmo y programa que permita leer la produccin de
cada uno de los 30 das y luego los visualice.

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

255

Algoritmo y programa OO usando herencia en Visual Basic NET


Ejemplo:
En cierta empresa se tienen empleados; los empleados se dividen en dos tipos,
empleados por hora, a los que se les paga de acuerdo con el nmero de horas
trabajadas y a una cuota por hora. El otro tipo son los empleados asalariados, a
quienes se les paga de acuerdo a un sueldo fijo mensual. Se desea procesar a los
empleados para realizar los pagos por medio de un programa de computo.

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

256

Clase EmpleadoPor Hora


Declaraciones
Datos
horasTrabajadas : Entero
cuotaHora : Real
SueldoQnal : Real
Metodo establecerHoras(horasT : Entero)
horasTrabajadas = horasT
Fin mtodo establecerHoras
Metodo establecerCuota(cuotaH : Real)
cuotaHora = cuotaH
Fin mtodo establecerCuota
Metodo calcularSueldoQnal()
SueldoQnal = horasTrabajadas *
cuotaHora
Fin mtodo CalcularSueldoQnal
Metodo obtenerSueldoQnal() : Real
Return sueldoQnal
Fin mtodo obtenerSueldoQnal
Fin Clase EmpleadoPorHoras

Clase EmpleadoAsalariado
Declaraciones
Datos
SueldoQnalAsal : Real
SueldoMensual : Real
Mtodo calcularrSueldoQnalAsal()
SueldoQnalAsal = SueldoMensual/2
Fin mtodo calcularSueldoQnalAsal
Mtodo establecerSueldoMensual(sdo : Real)
SueldoMensual = sdo
Fin mtodo establecersueldoMensual
Metodo obtenerSueldoQnalAsal() : Real
Return SueldoQnalAsal
Fin mtodo obtenerSueldoQnalAsal
Fin clase EmpleadoAsalariado

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

259

Algoritmo y programa OO usando polimorfismo en Visual Basic NET.


Ejemplo: El mismo ejercicio anterior, pero utilizando el concepto de
polimorfismo

Clase abstracta Empleado2


Declaraciones
Datos
# nombreEmpleado: Cadena
# deptoEmple : Cadena
# puestoTrabajo : Cadena
# SueldoQna: Real
Metodo establecerNombre(nom: Cadena)
nombreEmpleado = nom
Fin mtodo establecerNombre
Mtodo establecerDepto(dep: cadena)
deptoEmple = dep
Fin de mtodo establecerDepto
Mtodo establecerPuesto(pues : cadena)
puestoTrabajo = pue
fin mtodo establecerPuesto
Metodo abstracto calcularSueldoQna()
Metodo obtenerNombre() : cadena
Return nombreEmpleado
Fin mtodo obtenerNombre
Mtodo obtenerPuesto() : cadena
Return puestoTrabajo
Fin mtodo obtenerPuesto
Mtodo obtenerDpto() : cadena
Return deptoEmple
Fin mtodo obtenerDpto
Mtodo obtenerSueldoQna() : Real
Return SueldoQna
Fin mtodo obtenerDpto
Fin clase Empleado2

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

260

Clase EmpleadoPor Hora2


Empleado2
Declaraciones
Datos
horasTra : Entero
cuotaHora : Real

hereda

de

Metodo establecerHoras(horasT : Entero)


horasTrab = horasT
Fin mtodo establecerHoras
Metodo establecerCuota(cuotaH : Real)
cuotaHora = cuotaH
Fin mtodo establecerCuota
Metodo calcularSueldoQna()
SueldoQnal = horasTrabajadas *
cuotaHora
Fin mtodo CalcularSueldoQna
Fin Clase EmpleadoPorHora2

Clase EmpleadoAsalariado2
Declaraciones
Datos
SueldoMensual : Real
Mtodo calcularrSueldoQnalAsal()
SueldoQnalAsal = SueldoMensual/2
Fin mtodo calcularSueldoQnalAsal
Metodo obtenerSueldoQnalAsal() : Real
Return SueldoQnalAsal
Fin mtodo obtenerSueldoQnalAsal
Fin clase EmpleadoAsalariado2

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

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

MSc. Ing. Jorge J. Prado D.

Docente: Univ. Nac. De Ingenieria, Managua

También podría gustarte