Vous êtes sur la page 1sur 217

CUARTO

AO
MDULO DE:
P
P
R
R
O
O
G
G
R
R
A
A
M
M
A
A
C
C
I
I

N
N
UNIVERSIDAD TCNICA DE MACHALA
FACULTAD DE CIENCIAS SOCIALES
CENTRO DE PROFESIONALIZACIN
SEMIPRESENCIAL Y MEJORAMIENTO DOCENTE
(CEPSYMED)
ESPECIALIZACIN: INFORMATICA .
Luis E!"# S$%&'() L.
AUTOR * MEDIADOR
D#. Ru+,% L(-" Ru.)
DIRECTOR DEL CEPSYMED
A/O LECTIVO
0121
Programacin de sistemas 3 UTM-FCS-CEPSYMED
Luis Edgar Snchez
MDULO DE FUNDAMENTOS DE PROGRAMACIN
2. I%3#4u&&i5%
Para el Licenciado en Ciencias de la educacin con especialidad en
informtica, la programacin de computadoras debe estar dentro de su
conocimiento de primera mano, tomando en cuenta que, dada su
especialidad, debe dominar dichas herramientas a un nivel ptimo,
entendiendo las tcnicas utilizadas y las diversas formas que pueden utilizar
las mismas, as como ser capaz de desarrollar soluciones y elementos de
apoyo a su labor docente a travs de las tecnologas mencionadas
!entro de este conte"to, la programacin de sistemas, que debe entenderse
como las tcnicas de programacin de computadoras orientadas a la produccin
de sistemas informticos de gestin de datos, es el punto culminante de su
conocimiento tcnico, para sacarle el m"imo provecho a la tecnologa,
llevando, claro est, este conocimiento posteriormente a las aulas de clase,
donde deber preparar a las futuras generaciones en el uso de la tecnologa
en beneficio propio y de la sociedad
#s as que en el presente mdulo, se aborda la manera de utilizar la
programacin de computadoras y todas sus herramientas para la elaboracin de
soluciones informticas integrales orientadas a la gestin de datos,
orientando las distintas facetas y ambientes que esta labor puede conllevar,
apoyndose en las herramientas ms avanzadas hasta el momento
0. I%s3#u&&i4%(s !(%(#"6(s 7"#" (6 -"%(84 (6 -4u64.
0.2. I%i&"4#(s
G(%(#"6(s
#l mdulo de P$%&$'('C)*+ !# ,),-#(', . como parte de la organizacin
acadmica de la #scuela de Ciencias de la #ducacin, se ha estructurado
atendiendo los siguientes aspectos/
Luis Edgar Snchez
Programacin de sistemas 3 UTM-FCS-CEPSYMED
La relevancia que tiene la programacin de sistemas en la labor docente del
profesor de )nformtica
!esarrollo de concepciones generales aplicadas a herramientas de desarrollo
especficas
,olucionar problemas de procesamiento de datos mediante con0untos de
instrucciones que la computadora pueda seguir
0.0. P#4&(s4s 94#-"3i:4s:
#l proceso de formacin del participante, durante este modulo, se basar en el
auto1estudio, auto1compromiso, tareas individuales y colectivas intra y e"tra1
ulicas, contrastacin de los conocimientos aprendidos entre los binomios
educativos/ alumno1alumno, alumno1maestro y maestro1alumno
#l aborda0e de los contenidos se realiz a travs de las siguientes estrategias de
aprendiza0e
A.* M(34464!.":
,e requiere de la participacin permanente de todos, en cada una de las sesiones
de traba0o, del estudio individual de los contenidos propuestos o de investigacin,
de la realizacin de propuestas, talleres y traba0os de grupo que permitan el logro
de los ob0etivos del mdulo #l proceso didctico esta sustentado en la e"presin
laboral individual1grupal, con apoyaturas de 0uicio analticos1prctico1cientfico1
crtico1creativos
;.* E:"6u"&i5%:
,er sistemtica y permanente sustentada en los siguientes elementos/
a2 (etodologa de estudio
b2 Pertinencia, claridad y coherencia de los conocimientos3
c2 4undamentacin e"perimental y comprometida 5aparato crtico23
d2 $elacin del binomio/ alumno1alumno, alumno1maestro
e2 Compromiso de estudio intra y e"tra1ulico3
Luis Edgar Snchez
Programacin de sistemas 3 UTM-FCS-CEPSYMED
f2 ,ustentacin de informes 5cuestionarios, consultas, talleres, etc2
g2 +ivel de compa6erismo, criticidad, habilidades y destrezas
h2 Pruebas escritas, automatizadas y prcticas 5por unidad y final2
i2 $equisitos de acreditacin
C.* A&#(i3"&i5%
Para acreditar el mdulo de -#C+%L%&7', !# )+-#$+#- se requiere/
a2 (nimo un 89: de asistencia a clases, como valoracin tico acadmico
b2 Presentacin total de las tareas adquiridas, seg;n las circunstancias
requeridas
c2 )ntegracin significativa al desarrollo y construccin del conocimiento
cientfico
d2 Puntualidad a clase y entrega de informes
e2 'creditacin cualitativa particularidades establecidas por el binomio
educativo f2 'creditacin cuantitativa mnimo 9< y m"imo <9
g2 $equisitos de aprobacin del mdulo mnimo 9=
h2 %tros de acuerdo a lo estipulado en el orgnico funcional del C#P,>(#!
O+8(3i:4s
< $econocer de forma acertada las diversas formas y metodologas
que emplea la programacin de sistemas de gestin de datos
? !esarrollar aplicaciones para ambientes 4orms y @eb e interaccin
con bases de datos
. !eterminar la pertinencia de la utilizacin de una u otra
metodologa dependiendo de la solucin a desarrollar
Luis Edgar Snchez
Programacin de sistemas 3 UTM-FCS-CEPSYMED
M,344 < T,&%i&"s
F"s( 7#(s(%&i"6: #"posicin y dilogo con los participantes
-aller/ traba0o de grupo sobre la base de lecturas previas y
tareas prcticas en casa, para analizar el contenido del
mdulo, problematizar y resolver situaciones
,ocializacin de los traba0os grupales, en funcin de resultados
obtenidos y organizadores grficos yAo presentaciones
interactivas
F"s( 74s3*7#(s(%&i"6: #laboracin de res;menes y organizadores grficos sobre
el contenido del mdulo y documentos complementarios
requeridos, resolucin de cuestionarios que complementen o
refuercen los contenidos, desarrollo de material y e0ercicios
que lleven lo estudiado al nivel prctico de implementacin
Luis Edgar Snchez
Programacin de sistemas 3 UTM-FCS-CEPSYMED
7+!)C# &#+#$'L
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Luis Edgar Snchez 7
UNIDAD 1
Herramientas para la programacin de
sistemas.
8
Tema 1.1: Herramientas de desarrollo.
Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
ACTIVIDADES DE ASIMILACIN E!T"ACLASE
Acti#idad 1.1$
< (ediante un organizador grfico resuma lo siguiente/
") BCu es un sistema informticoD
+) BCu son sistemas de gestinD
&) BCu herramientas se utilizan mayormente hoy en da para el
desarrollo de sistemas de gestinD
d2 BCu es la P%%D
La programacin de sistemas.
Como sa!emos" #a $rogramacin de com$utadoras no es otra cosa" %ue dar instrucciones a
una com$utadora $ara %ue rea#ice #os $rocesos %ue nosotros necesitamos" recordando
siem$re e# ti$o de instrucciones %ue #e $odemos dar&
Al escribir programas para una computadora" se de!e tomar en cuenta #as
instrucciones %ue 'sta ser ca$az de cum$#ir" tomando en cuenta %ue un ordenador es una
m%uina construida es$ecia#mente $ara e# $rocesamiento de datos" e# ti$o de instrucciones
!ase %ue 'sta $uede cum$#ir se reduce a #as siguientes(
)& *eci!ir +$edir o ingresar, datos&
-& Mostrar o $resentar datos&
3& Procesar datos( esto es s#o como o$eraciones #gico-matemticas&
.& /#macenar datos&
9 Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
En e# siguiente e0em$#o se demuestra de una manera mu1 senci##a como dar2amos
instrucciones a #a com$utadora sa!iendo e# ti$o de instrucciones %ue se #e $ueden dar&
)& Mostrar en $anta##a e# mensa0e 3ngrese un n4mero5&
-& *eci!ir un n4mero $or tec#ado 1 a#macenar#o en 6&
3& Procesar #o siguiente( 6 7 68-& Y a#macenar#o en *
.& Mostrar en $anta##a e# 9a#or a#macenado e *&
:!9iamente estas instrucciones estn en #engua0e natura#" #o cua# #a com$utadora no $odr
entender" es $or eso %ue se necesitan #os #engua0es de $rogramacin&
Lenguajes de programacin.
Son $rogramas en #os cua#es se escri!en #as instrucciones
en #engua0es ms sim$#es %ue e# #engua0e m%uina" #uego
'ste" mediante $rocesos conocidos como C:MPL/C:;
o ;TE*P*ET/C:;" #os traduce a# #engua0e de #a
com$utadora $ara %ue 'sta $ueda seguir #as instrucciones"
es decir" son como #os traductores de nuestras ordenes&
Metodologas de rogramacin.
De #a misma <orma %ue #os #engua0es de $rogramacin han
ido e9o#ucionando su ni9e# de com$#e0idad" tam!i'n #o ha
hecho #a metodo#og2a de $rogramacin" de ta# manera %ue
#os #engua0es estn creados $ara tra!a0ar ms $timamente
en una metodo#og2a determinada&
Programacin no estructurada: En un $rinci$io #os #engua0es de a#to ni9e# se
im$#ementa!an de ta# <orma %ue #a secuencia de #as instrucciones <#uctua!a tanto en una
direccin u otra sin ning4n contro#" #o %ue hac2a di<2ci# su seguimiento 1 deteccin de
errores& / 'ste ti$o de $rogramacin se #a conoci $osteriormente como no estructurada o
3$rogramacin en es$agueti5" siendo #a $rinci$a# instruccin em$#eada #a 3=o to5" %ue
$ermit2a sa#tar a una determinada #2nea de cdigo $ero no ha!2a #a condicin de retorno"
uno de #os so!re9i9ientes de este ti$o de #engua0es es C:>:L&
Programacin estructurada: Para $oner orden a# caos de #a $rogramacin en es$agueti se
ide una so#ucin senci##a $ero $oderosa" #os #engua0es de $rogramacin de!2an res$etar
una condicin" e0ecutar #as sentencias en un so#o sentido" de arri!a hacia a!a0o" de ta#
manera %ue e# <#u0o de# $rograma ahora tendr2a una estructura coherente& Si e# $rograma
necesita dirigir e# <#u0o hacia una #2nea de cdigo di<erente" se #o hace $ero con #a
condicin de %ue e# <#u0o retorne a# <ina# de un determinado con0unto de instrucciones
e?actamente a# #ugar de donde se des9i& De esta manera e# $rograma ahora tendr un
inicio 1 <in !ien determinados" creando adems e# conce$to de $rograma o instruccin
$rinci$a# as2 como e# de <unciones 1 $rocedimientos& / $artir de a%u2 $ro#i<eraron
#engua0es como C 1 P/SC/L&
1! Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Programacin modular: / medida %ue #os $rogramas crec2an en tama@o 1 com$#e0idad"
se necesit ordenar #as centenares de #2neas de cdigo %ue se genera!an" as2 como #imar un
nue9o ti$o de $ro!#emas" ta#es como #a recurrente re$eticin de instrucciones" de esta
manera se $ens en di9idir e# $ro!#ema genera# de un sistema en $ro!#emas de menor
2ndo#e" 1 'stos a su 9ez en su!-$ro!#emas" as2 un $rogramador $uede concentrarse en un
$ro!#ema $e%ue@o a #a 9ez" una 9ez resue#to e# con0unto" se ha!r resue#to e# sistema" en
esta serie de metodo#og2as se !asan $rogramas como Fo? 1 a#gunas 9ersiones $osteriores
de >asic&
Programacin Orientada a Objetos(POO): Si
!ien #a $rogramacin modu#ar ha!2a resue#to en
$arte #os deta##es deri9ados de #a com$#e0idad de
#os grandes sistemas" 'sta no satis<izo en su
tota#idad #as as$iraciones de #os desarro##adores" de
ta# manera %ue ##e9aron a# m?imo #as t'cnicas de
#a modu#aridad creando su! $rogramas %ue imitan
a #a 9ida rea#" #a cua# est com$uesta de o!0etos
%ue interact4an entre s2 +#os o!0etos $oseen
caracter2sticas di<erenciadas 1 $ueden rea#izar
acciones $or s2 mismas,& De esta <orma cada o!0eto
se crea de manera mu1 $articu#ar" con su $ro$ia
estructura de datos 1 <unciones" #uego e# sistema o $rograma $rinci$a# se con9ierte en e#
am!iente donde estos o!0etos interact4an& Con esto se acu@an conce$tos como( c#ases"
$ro$iedades" m'todos" 1 se crean caracter2sticas es$ecia#es 1 de mucha uti#idad orientadas
a #a o$timizacin 1 ahorro de cdigo como #a herencia" enca$su#acin" so!recarga 1
$o#imor<ismo& /un%ue Pasca# trata!a de im$#ementar a#gunos de 'stos conce$tos" e#
9erdadero im$u#so en esta #2nea #o dio una 9ersin es$ecia#izada de# #engua0e C %ue se
conoci como C77& /ctua#mente +a $artir de# a@o -AAA, e# $aradigma de orientacin a
o!0etos es e# estndar en todos #os ni9e#es de# desarro##o de sistemas" 1 aun%ue se han
e?$#orado a#gunas $ro$uestas desde hace d'cadas %ue han $retendido reem$#azar #a P::"
ninguno ha re$ercutido entre e# gusto de #os desarro##adores& Lengua0es como B/C/" CD" 1
9ersiones ms actua#es de Cisua# >asic son #os $re<eridos $or im$#ementar de manera mu1
e<ecti9a este $aradigma&
rogramacin "isual # $rientada a e%entos.
Con #a e9o#ucin de #a $rogramacin orientada a o!0etos se han ido creando nue9os
es%uemas 1 metodo#og2as" de esta manera surgen esti#os de $rogramacin" con sus
res$ecti9as herramientas" siem$re $ensando en #a <orma de <aci#itar e# $roceso de#
desarro##o de sistemas&
La $rogramacin 9isua# 1 #a orientada a e9entos son $osi!#e entonces como deri9ados de #a
$rogramacin orientada a o!0etos" actua#mente se com!inan am!os $ara traer a nosotros
#as herramientas de desarro##o ms $oderosas" inc#uso manteniendo #a $rogramacin
orientada a o!0etos como $aradigma estructura#&
11 Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
rogramacin "isual
E# conce$to de $rogramacin 9isua# es un $oco con<uso 1a %ue actua#mente se #e considera
$rogramacin 9isua# a #os #engua0es de $rogramacin te?tua# %ue tienen una inter<az
gr<ica $ara $oder 9isua#izar #o %ue uno esta desarro##ando& Este conce$to en $rogramacin
9isua# es errneo 1a %ue este es a%ue# %ue $or medio de iconos $uedes ir creando
$rogramas sin tener un #engua0e te?tua# atrs de e#& La $rogramacin 9isua# +9isua#
$rogramming, se re<iere a# desarro##o de so<tEare donde #as notaciones gr<icas 1 #os
com$onentes de so<tEare mani$u#a!#es interacti9amente son usados $rinci$a#mente $ara
de<inir 1 com$oner $rogramas& La $rogramacin 9isua# se de<ine com4nmente como e# uso
de e?$resiones 9isua#es +ta#es como gr<icos" animacin o iconos, en e# $roceso de #a
$rogramacin" $ueden ser uti#izadas $ara <ormar #a sinta?is de #os nue9os #engua0es de
$rogramacin 9isua#es %ue conducen a #os nue9os $aradigmas ta#es como $rogramacin
$or #a demostracinF o $ueden ser uti#izadas en #as $resentaciones gr<icas de#
com$ortamiento o de #a estructura de un $rograma& E# o!0eti9o de #a $rogramacin 9isua#
es me0orar #a com$rensin de #os $rogramas 1 sim$#i<icar #a $rogramacin en s2& Ms a##"
#a $rogramacin 9isua# de!er <omentar a #os usuarios <ina#es a construir sus $ro$ios
$rogramas" %ue de otra <orma de!en ser escritos $or $rogramadores $ro<esiona#es&
/s2 %ue rea#mente" en este mdu#o nos re<eriremos a $rogramacin 9isua# a #a
$rogramacin mediante te?to a$o1ada en /m!ientes de Desarro##o ntegrados +DE, %ue
$ermiten crear inter<aces di!u0ndo#as directamente a tra9's de herramientas 9isua#es&
En este conte?to #a $rogramacin 9isua# !rinda #os conocimientos necesarios $ara dise@ar
1 desarro##ar a$#icaciones con un entorno 9isua# amiga!#e 1 <ci# de uti#izar $ara e# usuario&
Los #engua0es de $rogramacin 9isua#" en e# conte?to antes descrito" tienden a <aci#itar #a
tarea de #os $rogramadores" dado %ue con #os $rimeros #engua0es de $rogramacin crear
una 9entana era tarea de meses de desarro##o 1 de un e%ui$o de tra!a0o&
rogramacin orientada a e%entos.
La $rogramacin dirigida $or e9entos es un $aradigma de $rogramacin en e# %ue tanto #a
estructura como #a e0ecucin de #os $rogramas 9an determinados $or #os sucesos %ue
ocurran en e# sistema" de<inidos $or e# usuario o %ue e##os mismos $ro9o%uen&
Para entender #a $rogramacin dirigida $or e9entos" $odemos o$oner#a a #o %ue no es(
mientras en #a $rogramacin secuencia# +o estructurada, es e# $rogramador e# %ue de<ine
cu# 9a a ser e# <#u0o de# $rograma" en #a $rogramacin dirigida $or e9entos ser e# $ro$io
usuario Go #o %ue sea %ue est' accionando e# $rogramaG e# %ue diri0a e# <#u0o de#
$rograma& /un%ue en #a $rogramacin secuencia# $uede ha!er inter9encin de un agente
e?terno a# $rograma" estas inter9enciones ocurrirn cuando e# $rogramador #o ha1a
determinado" 1 no en cua#%uier momento como $uede ser en e# caso de #a $rogramacin
dirigida $or e9entos&
E# creador de un $rograma dirigido $or e9entos de!e de<inir #os e9entos %ue mane0arn su
$rograma 1 #as acciones %ue se rea#izarn a# $roducirse cada uno de e##os" #o %ue se conoce
como e# administrador de e9ento& Los e9entos so$ortados estarn determinados $or e#
1& Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
#engua0e de $rogramacin uti#izado" $or e# sistema o$erati9o e inc#uso $or e9entos creados
$or e# mismo $rogramador&
En #a $rogramacin dirigida $or e9entos" a# comenzar #a e0ecucin de# $rograma se
##e9arn a ca!o #as inicia#izaciones 1 dems cdigo inicia# 1 a continuacin e# $rograma
%uedar !#o%ueado hasta %ue se $roduzca a#g4n e9ento& Cuando a#guno de #os e9entos
es$erados $or e# $rograma tenga #ugar" e# $rograma $asar a e0ecutar e# cdigo de#
corres$ondiente administrador de e9ento& Por e0em$#o" si e# e9ento consiste en %ue e#
usuario ha hecho c#icH en e# !otn de $#a1 de un re$roductor de $e#2cu#as" se e0ecutar e#
cdigo de# administrador de e9ento" %ue ser e# %ue haga %ue #a $e#2cu#a se muestre $or
$anta##a&
Un e0em$#o c#aro #o tenemos en #os sistemas de $rogramacin Le?ico 1 Cisua# >asic" en
#os %ue a cada e#emento de# $rograma +o!0etos" contro#es" etc'tera, se #e asignan una serie
de e9entos %ue generar dicho e#emento" como #a $u#sacin de un !otn de# ratn so!re '#
o e# redi!u0ado de# contro#&
La $rogramacin dirigida $or e9entos es #a !ase de #o %ue ##amamos inter<az de usuario"
aun%ue $uede em$#earse $ara desarro##ar inter<aces entre com$onentes de So<tEare como
mdu#os de# n4c#eo tam!i'n&
En #os $rimeros tiem$os de #a com$utacin" #os $rogramas eran secuencia#es" tam!i'n
##amados >atch& Un $rograma secuencia# arranca" #ee $armetros de entrada" $rocesa estos
$armetros" 1 $roduce un resu#tado" todo de manera #inea# 1 sin inter9encin de# usuario
mientras se e0ecuta&
Con #a a$aricin 1 $o$u#arizacin de #os $c" e# so<tEare em$ez a ser demandado $ara
usos a#e0ados de #os c#sicos acad'micos 1 em$resaria#es $ara #os cua#es era necesitado
hasta entonces" 1 %ued $atente %ue e# $aradigma c#sico de $rogramacin no $od2a
res$onder a #as nue9as necesidades de interaccin con e# usuario %ue surgieron a ra2z de
este hecho&
Los #engua0es 9isua#es orientados a# e9ento 1 con mane0o de com$onentes dan a# usuario
%ue no cuenta con mucha e?$eriencia en desarro##o" #a $osi!i#idad de construir sus $ro$ias
a$#icaciones uti#izando inter<aces gr<icas so!re #a !ase de ocurrencia de e9entos&
Para so$ortar este ti$o de desarro##o interact4an dos ti$os de herramientas" una %ue $ermite
rea#izar dise@os gr<icos 1" un #engua0e de a#to ni9e# %ue $ermite codi<icar #os e9entos& Con
dichas herramientas es $osi!#e desarro##ar cua#%uier ti$o de a$#icaciones !asadas en e#
entorno&
1' Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Visual Basic es uno de #os #engua0es de $rogramacin %ue ms entusiasmo des$iertan entre
#os $rogramadores de com$utadoras" tanto e?$ertos como no9atos& En e# caso de #os
$rogramadores e?$ertos $or #a <aci#idad con #a %ue desarro##an a$#icaciones com$#e0as en
$o%u2simo tiem$o +com$arado con #o %ue cuesta $rogramar en Visual C++" $or e0em$#o,&
En e# caso de #os $rogramadores no9atos $or e# hecho de 9er de #o %ue son ca$aces a #os
$ocos minutos de em$ezar su a$rendiza0e& E# $recio %ue ha1 %ue $agar $or uti#izar Visual
Basic es una menor 9e#ocidad o e<iciencia en #as a$#icaciones&
Visual Basic es un #engua0e de $rogramacin 9isua#" tam!i'n ##amado #engua0e de .ta&
=eneracin& Esto %uiere decir %ue un gran n4mero de tareas se rea#izan sin escri!ir cdigo"
sim$#emente con o$eraciones gr<icas rea#izadas con e# ratn so!re #a $anta##a&
Visual Basic es tam!i'n un $rograma basado en objetos" 1 a $artir de #as 9ersiones &;ET
en ade#ante tam!i'n es orientado a o!0etos como Visual C++ y C#& Visual Basic uti#iza
objetos con propiedades 1 mtodos" 1 ahora tam!i'n im$#ementa mecanismos de herencia
1 polimorfismo $ro$ios de #os #engua0es orientados a o!0etos como Java 1 C++.
TALLE"ES INT"A CLASE
Taller1.1$
< En gru$o rea#ice en un $a$e#ote un organizador gr<ico %ue resuma #os as$ectos
ms re#e9antes de# tema )&) 1 sust'nte#o <rente a sus com$a@eros&
Es3#"3(!i"s ( 3#"+"84:
a 'nalice detenidamente el tema <<
b !iscuta con los miembros de su grupo cules son los puntos ms
importantes del tema
c Lleguen a un consenso e"trayendo las ideas ms importantes
d #sco0an un tipo de organizador grfico o idee uno original para dibu0arlo en
el papelote
e #li0an uno o dos representantes para e"pliquen frente a todos lo hecho
en el grfico
1(
Tema 1.&: "isual )asic como *erramienta de desarrollo
Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Como hemos visto en el tema anterior, Eisual Fasic es una herramienta
sumamente poderosa al mismo tiempo que sencilla, por eso vamos a utilizarla
como herramienta de desarrollo de sistemas para el presente mdulo Las
versiones ms actuales distan mucho de las anteriores, e"actamente hablamos
del paso de Eisual Fasic G9 hacia Eisual Fasic +#- en el a6o ?99<3 es tan
grande la diferencia que prcticamente se trata de dos lengua0es de
programacin distintos, coincidiendo apenas en la sinta"is de las sentencias ms
bsicas
La versin 6.0 est entonces totalmente obsoleta, debido a que no cumple con
los estndares y paradigmas de programacin actuales, que se encuentran
totalmente sumergidos dentro de la P%%5Programacin %rientada a %b0etos2
'ctualmente encontramos en el mercado la versin de Eisual Fasic ?9<9, que no
tiene marcadas diferencias de su versin anterior, Eisual Fasic ?99H, todo como
parte de un solo paquete IEisual ,tudioJ
!urante el desarrollo de este mdulo analizaremos las soluciones en la versin
de Eisual ,tudio ?99H, por presentar mayor soporte y documentacin en
nuestro idioma
INSTALACIN DE VISUAL STUDIO 011=.
!esde la versin de Eisual ,tudio ?99K, (icrosoft ofrece diferentes versiones
gratuitas enfocadas a gente que quiere aprender o e"perimentar con +#-, este
grupo de de herramientas se denominan Ie"pressJ y estn orientadas a cuatro
grupos de la tecnologa net, como son el desarrollo Leb, la programacin con
CMM, CN o Eisual Fasic
#stas versiones las podemos descargar desde el sitio Leb de (icrosoft/
h tt p /AALL L m ic ro s o f t c om Ae " p re ssA p ro d u ctA de fau lt a s p "
1+ Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
I%s3"6"%4 Visu"6 S3ui4
Lo primero de todo es tener algo ms de ?&b de espacio libre en disco y
paciencia 5tarda un poco2, podemos aligerar el tiempo de instalacin si
marcamos solo las caractersticas 0ustas que necesitamos
Por lo dems metemos el disco y aparece la siguiente ventana para comenzar la
configuracin de la instalacin
Pulsamos sobre I)nstall Eisual ,tudio ?99HJ y carga los componentes necesarios
para iniciar la instalacin
Ona vez cargados los componentes pulsamos sobre I+e"tJ y en la siguiente
pantalla aceptamos el contrato de licencia
1, Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
'hora podemos indicar que programas vamos a instalar, todos, los ms
comunes o una seleccin que nos venga bien
)ndicamos la ruta de la instalacin y pulsamos en I)nstallJ para que inicie la copia
del programa
!espus de un momento aparecer esta pantalla/
17 Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
EL ENTORNO DE VISUAL STUDIO 011=.
Luego de instalar nuestro sistema seg;n la versin de nuestra preferencia
procedemos a conocer su entorno de desarrollo, que en el caso de E),O'L
,-O!)% es integrado, es decir el mismo )!# para cualquier lengua0e en el que se
vaya a traba0ar
Ona vez que lo e0ecutamos observamos un panel de bienvenida para crear
nuestro primer proyecto directamente solo presionamos archivo 54ile2 nuevo
5+eL2 Proyecto 5Proyect2 o ,itio @eb 5@eb site2 estas son las principales
funciones y las ms usadas, ambas tienes opcin a traba0ar con Eisual Fasic+#-
o CN+#-, en este caso traba0aremos con un proyecto @indoLs 4orm,
54ormulario de LindoLs2, es decir con esta podemos desarrollar aplicaciones de
escritorio para @indoLs Eer la siguiente imagen para ver de qu forma eliges el
lengua0e y tipo de aplicacin a desarrollar
18 Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
> aqu es cuando viene lo ms importante, nuestro entorno de
traba0o
#ste es lo que bsicamente se ve al crear un nuevo proyecto, lo primero que
podemos observar es la ;ARRA>CUADRO DE HERRAMIENTAS: en ella se
encuentra todos los controles que puedes agregar al proyecto como Ca0as de
te"to, label, tablas, combo bo", listas, botones que simplemente con arrastra ya
tienes tu control en el 4orm bien sea LindoLs o @eb #l E?PLORADOR DE
SOLUCIONES: 'qui es donde veras todos los archivos de tu proyecto como las
imagenes, cantidad de formularios, base de datos, nos permite agregar
elementos ya e"istentes o nuevos !estro del e"plorador tenemos todos los
archivos que tengan que ver con NUESTRO PROYECTO@ 'l crear un nuevo
proyecto por defecto se abre el primer formulario (AINDOAS FORM) por
defecto nombrado form<
19 Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
'hora tenemos un formulario al que ya le agregamos unos botones y una muy
importante la :(%3"%" ( 7#47i("(s, cada ob0eto que este en
nuestro formulario tiene sus propiedades distintas hasta el mismo formulario
una vez seleccionados la ventada de propiedades mostrara cada una de ella
y podrs modificarla Ona vez que agregamos los controles ahora
debemos darle funcionalidad si damos dos veces clicP a uno de los controles
vamos al #ditor de codigo/
Luis Edgar Snchez &!
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
#sta es otra parte muy importante ya que aqu es donde de damos funcionalidad
a nuestra aplicacin, el combo superior izquierdo +os indica (% 9u%&i5% ( &u"6
&4%3#46 (s3"-4s 3#"+"8"%4 (% (6 &5i!4, es este Caso Futton<, 'ba0o ven
enseguida en Ei34 ( &5i!4 en la cual se ha agregado funcionalidad al button<
y button?, mas adelante empezaremos a traba0ar con ms profundidad en
cdigo #l Combo ubicado del lado derecho que vemos desplegado es el
(:(%34 &4% (6 Bu( (s3" 3#"+"8"%4 (% C4%3#46, #"isten (uchsimos evento con
que traba0ar el mas usado es el evento ClicP de los botones Para terminar
de0o dos videos tutoriales muy bsicos #stn basados en Eisual ,tudio ?99K
pero el )!# #s lo mismo asi como el codigo, espero les guste y le saque
provecho para iniciar en este mundo de tecnologas de desarrollo
U%" 7#i-(#" "76i&"&i5%.
Eamos a utilizar lo visto en los temas anteriores para crear una peque6a
aplicacin que emita un mensa0e
<2 Cree una nueva solucin Q proyecto de Eisual Fasic de tipo @indoLs
4orm
?2 'gregue un control de tipo botn al formulario por default5desde el
cuadro de herramientas2, y modifique las propiedades 5te"t2 para que
se vea como la imagen a continuacin
.2 'bra la pgina de cdigos haciendo doble clic en el botn cuyo te"to
dice ,aludar, y agregue la siguiente codificacin
R2 #0ecute presionando 4K y compruebe su funcionamiento
&1 Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
TALLE"ES INT"A CLASE
Taller1.%$
a& nsta#e Microso< Cisua# Studio +Cersion -AAI o -A)A seg4n $re<iera, en su
com$utadora&
!& *ea#ice #a a$#icacin %ue consta en #a 4#tima $arte de# tema )&-
c& E?$#ore #as distintas $ro$iedades %ue 1 contro#es %ue o<rece e# entorno de
Cisua# >asic 1 $rocure cam!iar o me0orar #a a$ariencia de #a 9entana %ue
cre" $or e0em$#o" in9estigue cmo cam!iar co#ores 18o co#ocar gr<icos&
Luis Edgar Snchez &&
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
UNIDAD %
&rogramar con el IDE de Vis'al (asic
&'
Tema &.1: -scribir .digo en "isual )asic.
ACTIVIDADES DE ASIMILACIN E!T"ACLASE
Acti#idad %.1$
< $evise el tema ?<
? Plantee un problema de programacin sencillo, con ingresos y
presentacin de datos, luego resulvalo usando codificacin en Eisual
Fasic ?99H A ?9<9 5Puede ser modo consola o ,ervicio de @indoLs2
. $ealice un informe indicando paso a paso cmo cre y e0ecut dicho
programa 5Con captura de pantallas2
R )ncluya su nombre en las capturas ms relevantes
K )mprima el informe y presntelo al facilitador
/n programa escribiendo su cdigo
Camos a desarro##ar un senci##o $rograma" en e# %ue a di<erencia de# e0em$#o mostrado
en e# tema anterior" escri!iremos nosotros e# cdigo en #ugar de de0ar a# DE %ue #o
haga de <orma automtica&
Ser un $rograma como hemos dicho mu1 senci##o" no dise@aremos <ormu#arios"
so#amente tomaremos un 9a#or %ue introducir e# usuario $or $anta##a 1 #o mostraremos
$osteriormente& La idea $rinci$a# es %ue e# #ector a$renda como con<igurar e# $ro1ecto
$ara esta!#ecer e# #ugar $or e# %ue se iniciar e# $rograma" 1 e# modo de escri!ir cdigo
$ara e# &
.rear el pro#ecto
En $rimer #ugar" iniciaremos e# DE de CS&;ET 1 crearemos un nue9o $ro1ecto en
C>&;ET de #a misma <orma %ue #a e?$#icada en e# tema anterior& E# nom!re %ue
daremos a# $ro1ecto ser Escri!irCodigo&
/# igua# %ue en e# e0em$#o 3Sa#udar5" este ti$o de $ro1ecto crea un <ormu#ario 9ac2o"
$ero no 9amos a hacer uso de# mismo& / continuacin" agregaremos un nue9o mdu#o a#
$ro1ecto $ara e# cdigo %ue 9amos a escri!ir&
Luis Edgar Snchez
&(
/n nue%o mdulo de cdigo
Mediante #a o$cin de men4 de CS&;ET Proyecto + !re!ar m"dulo" se a!rir #a ca0a
de di#ogo !re!ar nuevo elemento" con #a %ue $odremos a@adir a nuestro $ro1ecto un
mdu#o +como este caso," <ormu#ario" c#ase" etc&" se#eccionando dicho e#emento de# $ane#
derecho& Cer Figura J-&
Daremos e# nom!re MiCodigo&9! a# mdu#o" con #o %ue se crear e# nue9o mdu#o en un
<ichero 1 se mostrar una nue9a $esta@a en #a 9entana $rinci$a# de# DE con e# editor
de cdigo $ara e# mdu#o&
Un mdu#o se de<ine mediante #as $a#a!ras c#a9e #odule...$nd #odule% %ue indican
res$ecti9amente e# comienzo 1 <in de# mdu#o" 1 entre e##as escri!iremos e# cdigo %ue
9a a contener( $rocedimientos" dec#araciones" etc&
Figura J3& Editor de cdigo $ara e#
&+ Luis Edgar Snchez
mdu#o&
La ubicacin 0sica del cdigo
Como 9imos en e# e0em$#o anterior" e# cdigo de un $rograma se escri!e en <icheros
con e?tensin&9!& /hora hemos a@adido un mdu#o a# $ro1ecto %ue se ha creado en un
nue9o <ichero de este ti$o&
Los <icheros &C> $ueden contener cua#%uier instruccin en #engua0e C>&;ET" de
manera %ue es $osi!#e tener un 4nico <ichero &C> con todo e# cdigo de #a a$#icacin"
en e# caso de %ue esta no sea mu1 e?tensa" ta# 1 como muestra de <orma es%uemtica e#
Cdigo <uente ).&
CodigoProg.VB
=============
Class Cliente
' cdigo de la clase
' ............
'
............
End Class
Module General
' cdigo del mdulo
' ............
'
............
End Module
Class Facturas
' cdigo de la clase
' ............
'
............
End Class
Cdigo <uente ).
/un%ue tam!i'n $odemos a@adir todos #os <icheros &C> %ue necesitemos a#
$ro1ecto" $ara tener nuestro cdigo organizado $or $rocedimientos genera#es"
$rocedimientos es$ec2<icos de #a a$#icacin" c#ases de <ormu#arios" c#ases no 9isua#es"
etc&" este e# modo recomendado de organizacin cuando e# $rograma es mu1 grande&
Cer Cdigo <uente )J& En cua#%uier caso" dis$onemos de una gran <#e?i!i#idad a
este res$ecto&
CodigoClases.VB
========
=====
Class
Cliente
' cdigo de la clase
' ............
'
............
Luis Edgar Snchez
&,
End Class
Class Facturas
' cdigo de la clase
' ............
'
............
End Class
**************************************************
RutinasVarias.VB
===========
=====
Module
General
' cdigo del mdulo
' ............
' ............
End Module
Module Listados
' cdigo del mdulo
' ............
'
............
End Module
Cdigo <uente )J
.omentarios de cdigo
Para introducir un comentario ac#aratorio en e# cdigo de un $rograma uti#izaremos #a
comi##a sim$#e + K ," seguida de# te?to corres$ondiente a# comentario& Podemos
insertar comentarios desde e# comienzo de #2nea o a continuacin de cdigo e0ecuta!#e&
Cer Cdigo <uente )L&
Sub Prueba()
' este es un comentario desde el principio de lnea
Dim Valor As Integer
Valor = 158 ' este es un comentario junto a una lnea de cdigo
End Sub
Cdigo <uente )L
rocedimientos 1subrutinas2
Dentro de cua#%uier #engua0e de $rogramacin" un $rocedimiento o rutina de cdigo es
a%ue##a entidad %ue guarda un con0unto de #2neas de cdigo %ue sern e0ecutadas a#
##amar a# $rocedimiento desde cua#%uier otro $unto de# $rograma&
Para crear un $rocedimiento en e# $rograma usaremos #as $a#a!ras c#a9e
Luis Edgar Snchez
&ub...$nd
&7 Luis Edgar Snchez
&ub" 1 entre #as mismas escri!iremos #as instrucciones de# $rocedimiento& E# Cdigo
<uente )M muestra un e0em$#o&
Sub Prueba()
' instruccin1
' instruccin2
' instruccin3
' ............
' ............
' ............
'
instruccinN
End Sub
Cdigo
<uente )M
Los $rocedimientos $odemos inc#uir#os en cua#%uier #ugar dentro de# $rograma& En e#
e0em$#o actua#" escri!iremos un $rocedimiento en e# mdu#o MiCodigo" a# %ue daremos
e# nom!re de Main+ , 1 %ue re$resenta e# $rocedimiento $or e# cua# se comienza a
e0ecutar #a a$#icacin&
-l punto de entrada al programa
Todo $rograma de!e tener un $unto de entrada" o e#emento %ue sea e# %ue se comienza a
e0ecutar en $rimer #ugar&
En e# caso de una a$#icacin con esti#o NindoEs" #o $rimero %ue comienza a e0ecutarse
$or de<ecto es e# <ormu#ario& Sin em!argo" $uede ha!er ocasiones en %ue no
%ueramos e0ecutar e# <ormu#ario en $rimer #ugar" !ien $or%ue de!amos esta!#ecer
9a#ores de inicia#izacin $ara e# $rograma" en un $rocedimiento %ue sea e# %ue da $aso a#
<ormu#ario" o sim$#emente" $uede %ue s#o %ueramos e0ecutar uno o 9arios
$rocedimientos sin usar <ormu#arios&
En esta situacin" de!emos escri!ir un $rocedimiento es$ecia# a# %ue daremos e#
nom!re Main+ ," 1 %ue en C>&;ET re$resenta e# $unto de entrada a #a a$#icacin" antes
inc#uso %ue e# $ro$io <ormu#ario& Tam!i'n de!emos con<igurar e# $ro1ecto" $ara %ue
conozca #a e?istencia de dicho $rocedimiento 1 #o e0ecute en $rimer #ugar&
En e# mdu#o de cdigo" escri!iremos $or #o tanto este $rocedimiento" aun%ue de
momento 9ac2o&
Module MiCodigo
Sub Main()
End Sub
End Module
&8 Luis Edgar Snchez
La clase Message)o3
Cdigo <uente )I
Oueremos mostrar un a9iso cuando em$ecemos a e0ecutar #a a$#icacin" $or #o %ue
$odemos usar #a c#ase Message>o?& Esta es una c#ase de# sistema" %ue $ermite
mostrar un mensa0e en $anta##a a# usuario mediante su m'todo ShoE+ ," 1 una cadena
de caracteres %ue $asaremos como $armetro a dicho m'todo&
Se trata de una c#ase no instanciable" es decir" no $ermite %ue creemos o!0etos a $artir de
e##a& /# uti#izar#a" es e# entorno e# encargado de crear un o!0eto com$artido" %ue
usaremos $ara ##amar a sus miem!ros com$artidos o shared&
Para usar esta c#ase en nuestro $rocedimiento Main+ ," $odemos hacer#o como se muestra
en e# Cdigo <uente )P&
Sub Main()
MessageBox.Show("Empieza el programa")
End Sub
Cdigo <uente )P
.on0igurar el punto de entrada del pro#ecto
Si ahora e0ecutamos e# $ro1ecto" seguir a$areciendo e# <ormu#ario 1 no e# mensa0e %ue
es$er!amos& Esto es de!ido a %ue no hemos con<igurado e# $ro1ecto $ara %ue se inicie
$or Main+ ,&
Para esta!#ecer %u' e#emento de# $ro1ecto de!e e0ecutarse en $rimer #ugar" de!emos
acudir a #as $ro$iedades de# $ro1ecto" a #as %ue accedemos a tra9's de #a 9entana
$'plorador de soluciones" de a#guna de #as siguientes <ormas(
Q :$cin Ver + $'plorador de soluciones" de# men4 de CS&;ET&
Q Situando e# cursor de# ratn so!re #a $esta@a $'plorador de soluciones" se
e?$andir su 9entana&
Q Raciendo c#ic so!re e# !otn de #a !arra de herramientas corres$ondiente a esta
o$cin& Cer
Figura J.&
Figura J.& >otn $ara a!rir e# E?$#orador de so#uciones&
&9
Cua#%uiera de estas 92as" nos ##e9ar a #a 9entana de #a Figura JJ&
Figura JJ& E?$#orador de so#uciones de CS&;ET&
Seguidamente haremos c#ic so!re e# nom!re de# $ro1ecto" 1 $ara acceder a sus
$ro$iedades em$#earemos a#guna de #as siguientes <ormas(
Q Raremos c#ic so!re e# tercer !otn de esta 9entana" %ue corres$onde a #as
$ro$iedades de# e#emento se#eccionado& Cer Figura JL&
Figura JL& >otn de $ro$iedades de# E?$#orador de so#uciones&
Q Se#eccionaremos #a o$cin de men4 de CS&;ET Proyecto + Propiedades&
Q Raremos c#ic so!re e# nom!re de# $ro1ecto en e# E?$#orador de so#uciones" 1
se#eccionaremos #a o$cin Propiedades de# men4 conte?tua#&
Cua#%uiera de estas acciones nos mostrar #a 9entana de $ro$iedades de# $ro1ecto en e##a"
de!emos e#egir en ti$o de a$#icacin 3ser9icio de NindoEs5 1 a!rir #a #ista des$#ega!#e
de# e#emento (bjeto de inicio 1 se#eccionar &ub #ain& Pu#saremos /ce$tar 1 a
$artir de ese momento" e# entorno de e0ecucin !uscar un $rocedimiento con e#
nom!re Main+ ," $ara e0ecutar en $rimer #ugar& Cer Figura JM&
Luis Edgar Snchez '!
Figura JM& Centana de $ro$iedades de# $ro1ecto&
E# resu#tado ahora" a# e0ecutar e# $rograma" ser e# mensa0e %ue mostramos a tra9's de
Message>o?& Cer Figura JI&
Figura JI& Mensa0e mostrado desde Main+ ,&
"ariables
Creemos %ue mostrar un sim$#e mensa0e es insu<iciente en este e0em$#o" $or #o %ue
9amos adems" a $edir a# usuario %ue introduzca un 9a#or" %ue mostraremos en otro
mensa0e $osterior& Dicho 9a#or #o a#macenaremos en una 9aria!#e de# $rograma&
Para dec#arar 9aria!#es en C>&;ET uti#izaremos #a instruccin )im" seguida de# nom!re
de #a 9aria!#e 1 e# ti$o de dato %ue %ueremos asignar#e& En Main+ , dec#araremos una
9aria!#e como muestra e# Cdigo <uente -A&
Sub Main()
MessageBox.Show("Empieza el programa")
Dim Nombre As String
End Sub
Cdigo <uente -A
'1 Luis Edgar Snchez
4nput)o31 2
n$ut>o?+ , es una <uncin %ue muestra una ca0a de di#ogo en #a %ue e# usuario $uede
introducir un 9a#or" %ue ser de9ue#to a# ace$tar dicha ca0a& E# Cdigo <uente -) muestra
e# <ormato de n$ut>o?+ ,&
InputBox(Mensaje,Ttulo,RespuestaDefecto,XPosicion,YPosicion)
Cdigo
<uente -)
Q Mensaje& :!#igatorio& Cadena de caracteres con e# te?to %ue 9a a mostrar #a
ca0a de di#ogo&
Q Ttulo& :$ciona#& T2tu#o %ue a$arecer en #a ca0a de di#ogo&
Q 5espuesta6e0ecto& :$ciona#& Cadena de caracteres con e# 9a#or %ue de9o#9er
esta <uncin" en e# caso de %ue e# usuario no escri!a nada&
Q 7osicion8 9osicion& :$ciona#es& Ca#ores num'ricos %ue indican #as
coordenadas en donde ser mostrada #a ca0a& Si se omiten" se mostrar en e#
centro de #a $anta##a&
.ompletando el procedimiento
L#egados a este $unto de# e0em$#o" tenemos todos #os ingredientes $ara com$#etar#o&
;ecesitamos %ue e# usuario introduzca su nom!re uti#izando n$ut>o?+ ," 9o#car dicho
nom!re en #a 9aria!#e %ue hemos dec#arado 1 mostrar#o usando otro Message>o?& Todo
e##o #o 9emos en e# Cdigo <uente --&
Sub Main()
MessageBox.Show("Empieza el programa")
Dim Nombre As String
Nombre = InputBox("Escribe tu nombre")
MessageBox.Show("El nombre del usuario es: " & Nombre, "Programa de prueba")
End Sub
Cdigo <uente --
Luis Edgar Snchez '&
Des$u's de #a dec#aracin de #a 9aria!#e ;om!re" ##amamos a #a <uncin n$ut>o?+ ,&
Como dicha <uncin de9ue#9e una cadena de caracteres con e# 9a#or %ue ha1a escrito e#
usuario" necesitamos recu$erar#a de a#guna <orma" 1 esta es asignando e# resu#tado de #a
##amada a #a <uncin en #a 9aria!#e& La Figura JP muestra #a ca0a de di#ogo resu#tante de
n$ut>o?+ ,&
Figura JP& E0ecucin de #a <uncin n$ut>o?+ ,&
Des$u's de escri!ir su nom!re en e# cam$o de #a ca0a" si e# usuario $u#sa :S" n$ut>o?+
, de9o#9er e# 9a#or de dicho cam$o a #a 9aria!#e ;om!re& Por 4#timo" mostraremos e#
9a#or de #a 9aria!#e usando e# m'todo ShoE+ , de Message>o?" $ero con a#gunas
9ariaciones res$ecto a #a $rimera 9ez %ue uti#izamos esta c#ase en Main+ ,& En este
caso concatenamos una cadena de caracteres a# nom!re" $ara e##o de!emos uti#izar e#
o$erador T" 1 em$#eamos un segundo $armetro" %ue muestra un t2tu#o en #a 9entana de#
mensa0e& Cer Figura LA&
Figura LA& Mensa0e con e# 9a#or resu#tante o!tenido a# ##amar a n$ut>o?+ ,&
-structura de un programa ").:-T
En e# tema anterior 1a hicimos una descri$cin de #os $rinci$a#es e#ementos de %ue
consta un $rograma $ara C>&;ET de ti$o NindoEs& En este caso 9amos a crear desde e#
DE un nue9o $ro1ecto" en esta ocasin de ti$o conso#a& Los com$onentes de un
$rograma de estas caracter2sticas sern #os mismos" sa#9ando c#aro est" #as di<erencias
de inter<az de usuario entre am!as c#ases de a$#icacin&
'' Luis Edgar Snchez
Figura )LJ& Estructura en ni9e#es de una a$#icacin C>&;ET&
Como muestra e# diagrama" una a$#icacin est <ormada $or uno o ms <icheros de
cdigo" %ue a su 9ez contienen mdu#os de cdigo o c#ases" dentro de #os %ue se escri!en
$rocedimientos %ue son #os e#ementos %ue contienen e# cdigo !ase&
Cuando creamos una a$#icacin usando CS&;ET" es e# $ro$io DE %ui'n se encarga de
crear $or nosotros #a estructura !sica de# $rograma( crea un <ichero de cdigo
conteniendo un mdu#o %ue tiene e# $rocedimiento de entrada" s#o <a#ta e# cdigo de#
$rogramador&
Todos #os e#ementos %ue com$onen una a$#icacin C>&;ET" son organizados $or
CS&;ET !a0o e# conce$to de $ro1ecto& Un $ro1ecto ag#utina #os <icheros de cdigo de #a
a$#icacin" recursos" re<erencias a c#ases g#o!a#es de #a $#ata<orma &;ET" etc& Consu#te e#
#ector e# tema dedicado a #a $rimera a$#icacin en C>&;ET $ara una descri$cin genera#
de estos ti$os de <ichero&
De manera im$#2cita" cada 9ez %ue creamos un nue9o $ro1ecto uti#izando e# DE" dicho
$ro1ecto es a# mismo tiem$o un ensam!#ado de m!ito $ri9ado" $or #o %ue tam!i'n
$odemos re<erirnos a una a$#icacin uti#izando am!os t'rminos( $ro1ecto o ensam!#ado&
Main1 2 como procedimiento de entrada al programa
Todo $rograma necesita una rutina o $rocedimiento de entrada" %ue sea e# $rimero %ue se
e0ecute& En C>&;ET ese $rocedimiento reci!e e# nom!re es$ecia# Main+ ," 1 de!e estar
contenido dentro de un mdu#o de cdigo" como muestra e# Cdigo <uente .I
'( Luis Edgar Snchez
Module Module1
Sub Main()
End Sub
End Module
Cdigo <uente .I
En e# caso de una a$#icacin de conso#a creada desde CS&;ET" se crea un
mdu#o de <orma automtica %ue contiene un $rocedimiento Main+ , 9ac2o& Dentro de
este $rocedimiento escri!iremos e# cdigo de #os $r?imos e0em$#os&
"ariables
Una 9aria!#e es un identi<icador de# $rograma %ue guarda un 9a#or %ue $uede ser
modi<icando durante e# transcurso de dicha a$#icacin&
6eclaracin
La dec#aracin de una 9aria!#e es e# $roceso $or e# cua# comunicamos a# com$i#ador %ue
9amos a crear una nue9a 9aria!#e en e# $rograma&
Para dec#arar una 9aria!#e uti#izaremos #a $a#a!ra c#a9e Dim" seguida de# identi<icador o
nom!re %ue daremos a dicha 9aria!#e& Cer Cdigo <uente .P
Sub Main()
Dim MiValor
End Sub
6enominacin
Cdigo <uente .P
*es$ecto a# nom!re de #a 9aria!#e" de!e em$ezar $or #etra" 1 no $uede ser ninguna de #as
$a#a!ras reser9adas de# #engua0e" ni contener caracteres como o$eradores u otros
s2m!o#os es$ecia#es& CerCdigo <uente JA
'+
Sub Main()
Dim MiValor ' nombre
correcto Dim Total2 '
nombre correcto Dim
Mis_Datos ' nombre
correcto Dim 7Datos '
nombre incorrecto
Dim Nombre+Grande ' nombre incorrecto
Dim End ' nombre incorrecto
End Sub
Cdigo <uente JA
Como $odemos com$ro!ar en este <uente" 1 1a e?$#icamos en un tema anterior"
inc#uimos comentarios en e# cdigo usando #a comi##a sim$#e + U , seguida de# comentario
corres$ondiente&
A%isos del 46- sobre errores en el cdigo
/# dec#arar una 9aria!#e con un nom!re incorrecto" o si se $roduce otro ti$o de error en
#a escritura de# cdigo" e# $ro$io DE se encarga de a9isarnos %ue e?iste un $ro!#ema
su!ra1ando e# <ragmento de cdigo con<#icti9o 1 mostrando una 9i@eta in<ormati9a a#
situar so!re dicho cdigo e# cursor& Cer Figura )LL
Figura )LL& Cdigo con errores su!ra1ado $or e# DE&
Estos a9isos constitu1en una gran a1uda" 1a %ue $ermiten a# $rogramador o!ser9ar
$ro!#emas en #a escritura de# cdigo" antes inc#uso de e0ecutar e# $rograma&
E?isten mu#titud de a9isos de mu1 di9ersa natura#eza" teniendo en cuenta %ue #a
tnica genera# consiste en %ue e# cdigo $ro!#emtico %uedar su!ra1ado $or e# DE
hasta %ue no modi<i%uemos #a #2nea en cuestin 1 #a escri!amos correctamente&
Lugar de la declaracin
Podemos dec#arar 9aria!#es en mu1 di9ersos #ugares de# cdigo& E# $unto en e# %ue
dec#aremos una 9aria!#e ser determinante a #a hora de# m!ito o accesi!i#idad a esa
9aria!#e desde otros $untos de# $rograma& Por ahora" 1 ci@'ndonos a #a dec#aracin de
9aria!#es dentro de $rocedimientos" recomendamos dec#arar todas #as 9aria!#es en #a
ca!ecera o comienzo de# $rocedimiento" $ara dar una ma1or c#aridad a# mismo&
',
Des$u's de #a dec#aracin" escri!ir2amos e# resto de instrucciones de# $rocedimiento&
Tipi0icacin
La ti$i<icacin de una 9aria!#e es #a o$eracin $or #a cua#" a# dec#arar una 9aria!#e"
es$eci<icamos %u' c#ase de 9a#ores o ti$o de datos 9amos a $oder a#macenar en dicha
9aria!#e&
En C>&;ET uti#izamos #a $a#a!ra c#a9e /s seguida de# nom!re de# ti$o de datos"
$ara esta!#ecer e# ti$o de una 9aria!#e& Cer Cdigo <uente J)
Sub Main()
Dim Valor As String ' cadena de caracteres
Dim Cuenta As Integer ' numrico entero
Dim FhActual As Date ' fecha
End Sub
Cdigo <uente J)
La Ta!#a muestra #a re#acin de ti$os de datos dis$oni!#es en e# #engua0e&
Tipo de
dato en
").:-T
Tipo correspondiente
en el entorno de .:-T
;rame<or
=
Tama>o 5ango de %alores
>oo#ean S1stem&>oo#ean ) !1te True o Fa#se +Cerdadero o Fa#so,
>1te S1stem&>1te ) !1te A a -JJ +sin signo,
Char S1stem&Char - !1tes A a LJJ3J +sin signo,
Date S1stem&DateTime
I !1tes ) de enero de ) a 3) de diciem!re de
PPPP
Decima# S1stem&Decima# )- !1tes 78-
MP&--I&)L-&J).&-L.&33M&JP3&J.3&PJA&
33J sin $unto decima#F
78-
M"P--I)L-J).-L.33MJP3J.3PJA33J
con -I $osiciones a #a derecha de#
signo decima#F e# n4mero ms
$e%ue@o distinto de cero es
78-
Dou!#e
+$unto
<#otante con
$recisin
do!#e,
S1stem&Dou!#e I !1tes -)"MPMLP3)3.IL-3-E3AI a
-."P.ALJL.JI.)-.ME-3-. $ara
9a#ores negati9osF
."P.ALJL.JI.)-.ME-3-. a
)"MPMLP3)3.IL-3-E3AI $ara
9a#ores $ositi9os
Luis Edgar Snchez '7
nteger S1stem&nt3- . !1tes --&).M&.I3&L.I a -&).M&.I3&L.M
Long +entero
#argo,
S1stem&ntL. I !1tes -P&--3&3M-&A3L&IJ.&MMJ&IAI a
P&--3&3M-&A3L&IJ.&MMJ&IAM
Short S1stem&nt)L - !1tes -3-&MLI a 3-&MLM
Sing#e
+$unto
<#otante con
$recisin
sim$#e,
S1stem&Sing#e . !1tes -3".A-I-3E3I a V)".A)-PIE-.J $ara
9a#ores negati9osF )".A)-PIE-.J a
3".A-I-3E3I $ara 9a#ores $ositi9os
:!0ect S1stem&:!0ect . !1tes Cua#%uier ti$o
String
+cadena de
#ongitud
9aria!#e,
S1stem&String
)A !1tes 7
+- W
#ongitud
de #a
cadena,
Desde A a unos -&AAA mi##ones de
caracteres Unicode
Estructura +ti$o
de dato
de<inido $or e#
usuario,
Rereda de
S1stem&Ca#ueT1$e
Suma de
#os
tama@os
de #os
miem!ros
de #a
estructura
Cada miem!ro de #a estructura tiene un
inter9a#o de 9a#ores determinado $or
su ti$o de datos e inde$endiente de
#os
inter9a#os de 9a#ores corres$ondientes
a
#os dems miem!ros
Ta!#a J& Ti$os de datos en C>&;ET&
Si a# dec#arar una 9aria!#e no indicamos e# ti$o" $or de<ecto tomar :!0ect" %ue
corres$onde a# ti$o de datos gen'rico en e# entorno de# CL*+Lengua0e com4n en
tiem$o de 0ecucin," 1 admite cua#%uier 9a#or&
Seg4n #a in<ormacin %ue aca!amos de 9er" si dec#aramos una 9aria!#e de ti$o >1te e
intentamos asignar#e e# 9a#or JIPP se 9a a $roducir un error" 1a %ue no se encuentra en
e# inter9a#o de 9a#ores $ermitidos $ara esa 9aria!#e& Esto $uede ##e9ar a# #ector a
$reguntar( 3X$or %u' no uti#izar siem$re :!0ect 1 $oder usar cua#%uier 9a#orY" o me0or
X$ara %u' necesitamos asignar ti$o a #as 9aria!#esY5&
E# moti9o de ti$i<icar #as 9aria!#es reside en %ue cuando rea#izamos una dec#aracin" e#
CL* de!e reser9ar es$acio en #a memoria $ara #os 9a#ores %ue $ueda tomar #a 9aria!#e"
como $uede 9er e# #ector en #a ta!#a anterior" no re%uiere e# mismo es$acio en memoria
una 9aria!#e >1te %ue una Date& Si adems" dec#aramos todas #as 9aria!#es como
:!0ect" #os gastos de recursos de# sistema sern ma1ores %ue si esta!#ecemos e# ti$o
adecuado $ara cada una" 1a %ue como e# CL* no sa!e e# 9a#or %ue $uede tomar en cada
ocasin #a 9aria!#e" de!e rea#izar un tra!a0o e?tra de adecuacin" consumiendo una
ma1or cantidad de recursos&
Una correcta ti$i<icacin de #as 9aria!#es redundar en un me0or a$ro9echamiento de
#as ca$acidades de# sistema 1 en un cdigo ms 9e#oz en e0ecucin& Cuantos ms
$rogramas se dise@en o$timizando en este sentido" e# sistema o$erati9o ganar en
'8
Luis Edgar Snchez
rendimiento !ene<icindose e# con0unto de a$#icaciones %ue est'n en e0ecucin&
CS&;ET dis$one de una a1uda a# asignar e# ti$o a una 9aria!#e" %ue nos muestra #a #ista
de ti$os dis$oni!#es $ara $oder se#eccionar uno sin tener %ue escri!ir nosotros e#
nom!re& /# terminar de escri!ir #a $a#a!ra /s" a$arecer dicha #ista" en #a %ue
$u#sando #as $rimeras #etras de# ti$o a !uscar" se ir situando en #os ms $arecidos& Una
9ez encontrado" $u#saremos #a tec#a Enter o Ta! $ara tomar#o& Cer Figura )LM&
Figura )LM& Lista de ti$os de datos a# dec#arar una 9aria!#e&
6eclaracin m?ltiple en lnea
En e# caso de %ue tengamos %ue dec#arar ms de una 9aria!#e de# mismo ti$o"
$odemos dec#arar#as todas en #a misma #2nea" se$arando cada una con una coma" e
indicando 0unto a cada 9aria!#e e# ti$o de dato %ue 9a a tenerF o !ien" si es$eci<icamos
e# ti$o de dato a# <ina# de #a #ista de 9aria!#es" todas tendrn e# mismo ti$o de dato&
Cer e# Cdigo <uente J-
Dim Nombre As String, Cantidad As Integer, MiFecha As Date
Dim Importe, Totalizado, Precision As Integer
Cdigo <uente J-
Arra#s8 conceptos b@sicos
Un arra1 consiste en una #ista de 9a#ores asociada a un identi<icador& /# em$#ear una
9aria!#e $ara contener ms de un dato" e# modo de acceder a #os 9a#ores se consigue a
tra9's de un 2ndice asociado a #a 9aria!#e" %ue $ermite sa!er con %u' e#emento o $osicin
de #a #ista estamos tratando& :tros nom!res $ara re<erirnos a un arra1 son matriz 1
9ector" aun%ue en este te?to em$#earemos e# t'rmino arra1 de <orma gen'rica&
En este a$artado 9amos a rea#izar una introduccin mu1 e#ementa# a #os arra1s 1 su uso"
Luis Edgar Snchez '9
%ue sir9a a# #ector $ara o!tener #os conocimientos m2nimos necesarios $ara este tema
dedicado a# #engua0e& Dado %ue #a gran $otencia de #os arra1s reside en su uso a
tra9's de #as caracter2sticas de orientacin a o!0etos de %ue dis$onen" cu!riremos #os
arra1s en $ro<undidad $osteriormente" dentro de un tema es$ec2<ico en e# %ue trataremos
todos sus as$ectos $rinci$a#es&
6eclaracin
Para dec#arar un arra1 actuaremos $rcticamente igua# %ue $ara dec#arar una 9aria!#e
norma#" con #a di<erencia de %ue uti#izaremos #os $ar'ntesis 0unto a# nom!re de #a
9aria!#e" $ara indicar %ue se trata de un arra1" 1 o$ciona#mente" dentro de #os $ar'ntesis"
indicaremos e# n4mero de e#ementos de %ue inicia#mente 9a a constar e# arra1& Tam!i'n
es $osi!#e" asignar 9a#ores a #os e#ementos en e# mismo momento de su dec#aracin&
De!emos tener en cuenta a #a hora de esta!#ecer e# n4mero de e#ementos" %ue e# $rimer
2ndice de un arra1 es e# cero" $or #o %ue a# ser creado" e# n4mero rea# de e#ementos en un
arra1 ser e# es$eci<icado en #a dec#aracin ms uno&
La Figura )MA muestra #a re$resentacin de un arra1 en un modo gr<ico&
Figura )MA& *e$resentacin gr<ica de un arra1&
/ continuacin 9emos unos e0em$#os de creacin de arra1s en e# Cdigo <uente L3&
(! Luis Edgar Snchez
Sub Main()
' array sin elementos
Dim Colores() As String
' array con 4 elementos: de 0 a 3
Dim Nombres(3) As String
' array con 3 elementos, cuyos valores asignamos
' en el momento de la declaracin del array
Dim Frutas() As String = {"Manzana", "Naranja", "Pera"}
End Sub
Cdigo <uente L3
/# dec#arar un arra1" todos sus 9a#ores son de# mismo ti$o de dato& Si necesitamos %ue
dichos 9a#ores sean de ti$os di<erentes" de!emos dec#arar e# arra1 como ti$o :!0ect" 1a
%ue a# ser este" e# ti$o de dato gen'rico en e# entorno de &;ET" nos $ermitir asignar
9a#ores de distintos ti$os a# arra1&
Asignacin # obtencin de %alores
Para asignar 1 o!tener 9a#ores de #os e#ementos de un arra1" actuaremos igua# %ue $ara
una 9aria!#e norma#" $ero em$#eando adems e# 2ndice $ara indicar %u' $osicin
%ueremos mani$u#ar& Cer Cdigo <uente L. +a$#icacin de conso#a,&
Sub Main()
' array con 4 elementos: de 0 a 3
Dim Nombres(3) As String
' asignar valores al
array Nombres(0) =
"Ana" Nombres(1) =
"Pedro" Nombres(2) =
"Antonio" Nombres(3)
= "Laura"
' obtener valores de un array
Dim ValorA As String
Dim ValorB As String
ValorA = Nombres(1) ' Pedro
ValorB = Nombres(3) ' Laura
' mostrar los valores obtenidos del array
Console.WriteLine("Variables: ValorA --> {0}, ValorB --> {1}", ValorA,
ValorB) Console.ReadLine()
End Sub
Cdigo <uente L.
(1
Luis Edgar Snchez
.onceptos mnimos sobre depuracin
Para $ro!ar #os e0em$#os en este tema hemos uti#izado hasta ahora #a sa#ida a conso#a&
Sin em!argo" $ueden $#antearse situaciones en #as %ue #a 9isua#izacin $or conso#a no
sea su<iciente" re%uiriendo un seguimiento #2nea a #2nea durante #a e0ecucin de#
$rograma&
/nte esta tesitura de!emos recurrir a un e#emento im$rescindi!#e" %ue toda herramienta
de desarro##o %ue se $recie de!e dis$oner( e# de$urador&
Un de$urador nos $ermite introducirnos dentro de# cdigo de nuestro $rograma durante
#a e0ecucin de# mismo" $ara o!ser9ar %u' es #o %ue est ocurriendo( e0ecutar #2nea a
#2nea e# $rograma" o!ser9ar e# 9a#or de #as 9aria!#es" etc&" as$ectos todos e##os
<undamenta#es $ara e# seguimiento de errores 1 <a##os en #a #gica de #a a$#icacin&
CS&;ET dis$one de un e?ce#ente de$uradorF de# %ue descri!iremos a continuacin sus
e#ementos ms !sicos" $ara %ue e# #ector $ueda rea#izar un seguimiento ms $reciso de
#o %ue sucede durante #a e0ecucin de su a$#icacin&
Para e0ecutar e# $rograma en modo de de$uracin $u#saremos ZFI[" o
se#eccionaremos e# men4 )epurar + *r a instrucciones& Cua#%uiera de estas acciones
iniciarn e# $rograma dentro de# conte?to de# de$urador" deteniendo #a e0ecucin en #a
$rimera #2nea de cdigo e0ecuta!#e" destacada en co#or amari##o& La #2nea marcada en
amari##o indica %ue est a $unto de e0ecutarse" $ara e0ecutar#a 1 $asar a #a siguiente #2nea
$u#saremos de nue9o ZFI[" 1 as2 sucesi9amente hasta ##egar a #a 4#tima #2nea de#
$rograma" donde se <ina#izar e# mismo" cerrndose e# de$urador&
Podemos 9er de <orma inmediata e# 9a#or de una 9aria!#e sim$#emente situando e#
cursor de# ratn so!re e##a" con #o %ue se mostrar una 9i@eta in<ormati9a de su 9a#or&
Cer Figura )M-&
(& Luis Edgar Snchez
Figura )M-& E0ecucin de# $rograma en e# de$urador&
Podemos tam!i'n 9er con deta##e e# 9a#or %ue 9an ad%uiriendo #as 9aria!#es a #o #argo de
#a e0ecucin" a!riendo #a 9entana Loca#es de# de$urador" mediante e# men4 )epurar +
Ventanas + +ocales" o #a $u#sacin ZCT*L 7 /LT 7 C" L[& Cer Figura )M3&
Figura )M3& Centana Loca#es de# de$urador&
En e# caso de arra1s" de!emos hacer c#ic en e# signo ms + 7 , %ue a$arece 0unto a#
nom!re de #a 9aria!#e" $ara a!rir 1 mostrar #os e#ementos de# arra1& Cer Figura )M.&
Figura )M.& Centana Loca#es de# de$urador" mostrando e# contenido de un arra1&
Si en cua#%uier momento %ueremos continuar #a e0ecucin norma# de# $rograma sin
seguir usando e# de$urador" $u#saremos ZFJ[&
Fuente( >L/;C:" Luis Migue# V 3Programacin en Cisua# >asic &;ET5
('
Tema &.&: -structuras en "isual )asic.
Luis Edgar Snchez
Taller %.1$
< Uti#ice Cisua# >asic" en modo conso#a o ser9icio de NindoEs" $ara reso#9er #os
siguientes $ro!#emas(
a2 Sacer un programa que reciba el valor de T y presente el resultado de
la siguiente frmula/ T
?
M?T1K
b2 $ealizar un programa que reciba el sueldo de un empleado y muestre
el nuevo sueldo con un aumento del <9:
c2 $ealizar un programa que reciba las notas trimestrales de un
estudiante, almacene estas notas en un array llamado I+otasJ,
presente el promedio general del mismo e informe al final si el
estudiante 'prueba, $eprueba o Ea al supletorio seg;n el siguiente
criterio/
UV<R 'prueba
(enor a <R y mayor a <9 ,upletorio
WV<9 $eprueba
-structuras de control
Las estructuras de contro# contienen !#o%ues de cdigo %ue sern e0ecutados en <uncin
de# resu#tado o!tenido a# e9a#uar una e?$resin asociada a #a estructura& / este $roceso
de redireccin de# <#u0o de# $rograma hacia un determinado !#o%ue de cdigo se #e
denomina !i<urcacin
Seg4n e# modo de e0ecucin de# cdigo %ue contienen" #as estructuras de contro# se
di9iden en #os siguientes ti$os( se#eccin 1 re$eticin&
Aeleccin
Las estructuras de se#eccin o decisin $ermiten e0ecutar un !#o%ue de cdigo entre
9arios dis$oni!#es" seg4n e# resu#tado de #a e9a#uacin de una e?$resin situada en #a
ca!ecera de #a estructura&
(( Luis Edgar Snchez
40...-nd 40
La sinta?is de esta estructura $uede a$#icarse de di<erentes <ormas en <uncin de# ti$o
de decisin a reso#9er&
6ecisin simple.
La sinta?is de decisin sim$#e se muestra en e# Cdigo <uente )3J&
If Expresin Then
' cdigo
' ......
' ...... End If
Cdigo <uente )3J
Si a# e9a#uar E?$resin se de9ue#9e como resu#tado Cerdadero" se e0ecutarn #as #2neas o
!#o%ue de cdigo com$rendido entre < 1 End <& Si E?$resin es Fa#so" se des9iar #a
e0ecucin a #a $rimera #2nea de cdigo %ue ha1a des$u's de End <& Ceamos un e0em$#o
en e# Cdigo <uente )3L&
Sub Main()
Dim Valor As Integer
Console.WriteLine("Introducir un nmero") Valor = Console.ReadLine()
If Valor = 5 Then
Console.WriteLine("Estamos dentro de la estructura If," & _
" ya que su expresin devuelve Verdadero")
End If
Console.ReadLine()
End Sub
Cdigo <uente )3L
6ecisin simple en una lnea.
En e# caso de %ue s#o ha1a %ue e0ecutar una instruccin senci##a cuando se cum$#e #a
e?$resin de #a estructura" $odemos omitir #a $a#a!ra c#a9e End <" escri!iendo #a
sentencia a e0ecutar en #a misma #2nea de #a dec#aracin de #a estructura <" 0usto a
continuacin de #a $a#a!ra Then& La sinta?is en este caso" se sim$#i<ica" como muestra e#
Cdigo <uente )3M&
If Expresin Then Instruccin
Cdigo <uente )3M
(+ Luis Edgar Snchez
Ceamos un e0em$#o en e# Cdigo <uente )3I&
Sub Main()
Dim Valor As Integer
Dim Resultado As Integer
Console.WriteLine("Introducir un
nmero") Valor = Console.ReadLine()
If Valor = 5 Then Resultado = Valor + 10
Console.WriteLine("La variable resultado contiene {0}", Resultado)
Console.ReadLine()
End Sub
Cdigo <uente )3I
Como ha!r com$ro!ado e# #ector" #a sentencia %ue ha1 a continuacin de Then s#o se
e0ecutar cuando #a 9aria!#e Ca#or contenga J&
6ecisin doble.
/dems de e0ecutar un !#o%ue de cdigo cuando #a e?$resin 9a#ga Cerdadero" $odemos
tam!i'n e0ecutar cdigo cuando #a e?$resin de9ue#9a Fa#so& En este caso a@adiremos a
#a estructura #a $a#a!ra c#a9e E#se" como muestra #a sinta?is de# Cdigo <uente )3P&
If Expresin Then
' cdigo cuando Expresin es Verdadero
' ......
' ......
Else
End If
' cdigo cuando Expresin es Falso
' ......
' ......
Cdigo <uente )3P
Ceamos un e0em$#o en e# Cdigo <uente ).A&
(, Luis Edgar Snchez
Sub Main()
Dim Valor As Integer
Dim Resultado As Integer
Console.WriteLine("Introducir un nmero") Valor = Console.ReadLine()
If Valor = 5 Then
Resultado = Valor + 10
Else
Resultado = 777
End If
Console.WriteLine("La variable resultado contiene {0}",
Resultado) Console.ReadLine()
End Sub
Cdigo <uente ).A
En este e0em$#o" cuando Ca#or contenga J se e0ecutar e# !#o%ue de cdigo %ue ha1 a
continuacin de <" $ero cuando Ca#or contenga un n4mero distinto" se e0ecutar e#
cdigo %ue ha1 a continuacin de E#se& La e0ecucin en cua#%uier caso" continuar
des$u's a $artir de #a siguiente #2nea %ue ha1a a $artir de #a $a#a!ra c#a9e End <&
6ecisin doble en una lnea.
/# igua# %ue ocurre con #a decisin sim$#e" si $ara cada resu#tado de #a e?$resin" s#o
necesitamos e0ecutar una instruccin" $odemos escri!ir todo e# cdigo en una so#a #2nea&
Ceamos #a sinta?is en e# Cdigo <uente ).)&
If Expresin Then InstruccinVerdadero Else InstruccinFalso
Cdigo <uente ).)
En e# Cdigo <uente ).- tenemos un e0em$#o de uso&
Sub Main()
Dim Valor As Integer
Dim Resultado As Integer
Console.WriteLine("Introducir un
nmero") Valor = Console.ReadLine()
If Valor = 5 Then Resultado = Valor + 10 Else Resultado = 777
Console.WriteLine("La variable resultado contiene {0}",
Resultado) Console.ReadLine()
End Sub
(7 Luis Edgar Snchez
Cdigo <uente ).-
Si !ien #a e0ecucin de #a estructura < en una #2nea $uede ser 4ti# en ocasiones"
tiene como contra$artida e# %ue nuestro cdigo se 9ue#9a ms di<2ci# de #eer& Por e##o es
ms recomenda!#e e# uso de esta estructura de contro# en su <ormato <&&&End <&
6ecisin m?ltiple.
En e# caso de %ue #a e?$resin $rinci$a# a e9a#uar de9ue#9a Fa#so" $odemos agregar
e?$resiones adiciona#es uti#izando #a $a#a!ra c#a9e E#se<" con su !#o%ue de cdigo
res$ecti9o& En e# caso de %ue ninguna de e##as se cum$#an" $odemos inc#uir un E#se" $ara
e0ecutar un !#o%ue de cdigo $or de<ecto& Ceamos #a sinta?is en e# Cdigo <uente ).3&
If ExpresinA Then
' cdigo cuando ExpresinA es Verdadero
' .......
ElseIf ExpresinB
Then
' cdigo cuando ExpresinB es Verdadero
' .......
[ElseIf ExpresinN Then]
' cdigo cuando ExpresinN es Verdadero
' .......
[Else]
' cdigo cuando ninguna epxresin devuelve Verdadero
' .......
End If
Cdigo <uente ).3
/ continuacin 9emos un e0em$#o en e# Cdigo <uente )..&
Sub Main()
Dim Valor As Integer
Dim Resultado As Integer
Console.WriteLine("Introducir un
nmero") Valor = Console.ReadLine()
If Valor = 5 Then
Resultado = Valor + 10
ElseIf Valor > 100 Then
Resultado = Valor + 200
ElseIf Valor < 1
Then
Resultado
= -8
(8
Luis Edgar Snchez
Else
Resultado = 777
End If
Console.WriteLine("La variable Resultado contiene {0}",
Resultado) Console.ReadLine()
End Sub
Cdigo <uente )..
En esta situacin" si #a $rimera e?$resin es Cerdadero" se e0ecutar e# cdigo situado
a $artir de <& Sin em!argo" si < de9ue#9e Fa#so" se com$ro!arn sucesi9amente #as
e?$resiones de cada uno de #os E#se< e?istentes& En e# caso de a#g4n E#se< de9ue#9a
Cerdadero" se e0ecutar e# cdigo %ue ha1a a $artir de# mismo& Si ninguna de #as
anteriores situaciones se cum$#e" se e0ecutar e# cdigo %ue ha1a a $artir de E#se en e#
caso de %ue este se ha1a de<inido&
Aelect .ase...-nd Aelect
Se trata de una e9o#ucin en #a estructura <&&&End < de decisin m4#ti$#e" 1 su tra!a0o
consiste en e9a#uar una e?$resin 1 com$arar e# resu#tado con #a #ista de e?$resiones de
cada uno de #os casos $ro$orcionados& E# Cdigo <uente ).J muestra #a sinta?is&
Select Case Expresin
Case ListaExpresionesA
' cdigo si se cumple ListaExpresionesA
' .....
[Case ListaExpresionesB]
' cdigo si se cumple ListaExpresionesB
' .....
[Case Else]
' cdigo si no se cumple ninguna ListaExpresiones
' .....
End Select
Cdigo <uente ).J
La #ista de e?$resiones asociada a cada Case en esta estructura estar se$arada $or comas
1 $odr tener a#guno de #os siguientes <ormatos(
Q E?$resin&
Q E?$resinMenor To E?$resinMa1or
Q s :$eradorCom$aracin E?$resin
Tras e9a#uar #a e?$resin de #a estructura" si se encuentra una coincidencia con a#guno de
(9 Luis Edgar Snchez
#os Case" se e0ecuta e# !#o%ue de cdigo situado entre dicho Case 1 e# siguiente& En caso
de %ue no ha1a ninguna coincidencia" $odemos o$ciona#mente" e0ecutar un !#o%ue $or
de<ecto" uti#izando #a $a#a!ra c#a9e Case E#se& Fina#izada esta estructura" #a e0ecucin
continuar a $artir de #a #2nea situada des$u's de End Se#ect&
Ceamos a continuacin" en e# Cdigo <uente ).L un e0em$#o de uso de
esta estructura&
Sub Main()
Dim Valor As Integer
Console.WriteLine("Introducir un nmero") Valor = Console.ReadLine()
Select Case Valor
Case 5
Console.WriteLine("El valor es 5")
Case 120, 250
Console.WriteLine("El valor es 120 250")
Case 3000 To 4000
Console.WriteLine("El valor est en el rango de 3000 a 4000")
Case Is < 10
Console.WriteLine("El valor es menor de 10")
Case Else
Console.WriteLine("El valor es {0}, y no se cumple ningn caso",
Valor)
End Select
Console.ReadLine() End Sub
Cdigo <uente ).L
En e# caso de %ue tras e9a#uar #a e?$resin" ha1a ms de un Case cu1a #ista de
e?$resiones se cum$#a" se e0ecutar e# %ue est' situado en $rimer #ugar& En e# e0em$#o
anterior" cuando #a 9aria!#e Ca#or contiene J" se cum$#en dos casos& Cer Cdigo <uente
).M&
Case 5
Console.WriteLine("El valor es 5")
' .....
' .....
Case Is < 10
Console.WriteLine("El valor es menor de 10")
Cdigo <uente ).M
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
+!
Sin em!argo s#o se e0ecuta e# cdigo de# $rimer Case&
Por otro #ado" #a #ista de e?$resiones $uede ser una com!inacin de #os distintos
<ormatos dis$oni!#es& Cer Cdigo <uente ).I&
Case 12 To 15, 4, 7, Is > 20
Cdigo
<uente ).I
5epeticin
Estas estructuras" tam!i'n denominadas !uc#es" e0ecutan un !#o%ue de cdigo de <orma
re$etiti9a mientras se cum$#a una condicin asociada a #a estructura& / cada una de #as
9eces en %ue se e0ecuta e# cdigo contenido en estas estructuras se #e denomina iteracin&
B*ile...-nd B*ile
Se trata de# ti$o ms senci##o" e0ecuta #as #2neas de cdigo %ue contiene" mientras %ue #a
e?$resin situada 0unto a Nhi#e de9ue#9a Cerdadero& Ceamos su sinta?is en e# Cdigo
<uente ).P&
While Expresin
' cdigo
'
..... End
While
Cdigo
<uente ).P
Y a continuacin" un e0em$#o en e# Cdigo <uente )JA&
Sub Main()
Dim Valor As Integer
Dim Contador As Integer
Console.WriteLine("Introducir un nmero") Valor = Console.ReadLine()
Console.WriteLine("Mostrar en consola todos los nmeros desde 1 hasta el
introducido")
While Contador < Valor Console.Write("-" & Contador) Contador += 1
End While
Console.ReadLine() End Sub
Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Luis Edgar Snchez +1
Cdigo <uente )JA
6o...Loop
Esta estructura e0ecuta un con0unto de #2neas de cdigo" en <uncin de# 9a#or
de9ue#to $or una e?$resin" %ue a modo de condicin" $odemos situar a# comienzo o
<ina# de #a estructura&
Es $osi!#e adems" no uti#izar #a e?$resin de e9a#uacin a# $rinci$io o <ina#" de!iendo
en ese caso" introducir a#guna condicin en e# interior de# cdigo de #a estructura" $ara
<orzar #a sa#ida de# !uc#e 1 e9itar caer en un !uc#e in<inito& La instruccin E?it Do nos
$ermite <orzar #a sa#ida de# !uc#e" $udiendo em$#ear#a tantas 9eces como sea necesario&
Ceamos a continuacin" #as di<erentes 9ariantes
dis$oni!#es&
.ondicin al principio.
La sinta?is se muestra en e# Cdigo
<uente )J)&
Do While | Until Expresin
' cdigo
' ...... [Exit Do]
' cdigo
' ......
Loop
Cdigo <uente )J)
La di<erencia entre usar Nhi#e o Unti# reside en %ue em$#eando Nhi#e" e# cdigo de#
!uc#e se e0ecutar mientras #a e?$resin de9ue#9a Cerdadero& En e# caso de Unti#" e#
cdigo se e0ecutar mientras %ue #a e?$resin de9ue#9a Fa#so& Ceamos #os e0em$#os de#
Cdigo <uente )J-&
Sub Main()
Dim Valor As Integer Dim Palabra As String Dim Contador As Integer Dim
Pruebas As Integer
' bucle con While
Do While Valor <> 200
Console.WriteLine("Introducir un nmero") Valor = Console.ReadLine()
Loop
' bucle con Until
Do Until Palabra = "coche" Console.WriteLine("Introducir una palabra")
Palabra = Console.ReadLine()
Loop
' inicializar contador,
' en este caso vamos a pedir tambin
Luis Edgar Snchez +&
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
' al usuario que introduzca un nmero,
' pero si despus de cinco intentos,
' no consigue acertar, forzamos la salida
' de la estructura
Contador = 1
Do While Pruebas <> 200
Console.WriteLine("Introducir un nmero - Intento nro.{0}", Contador)
Pruebas = Console.ReadLine()
Loop
End Sub
If Contador = 5 Then
Exit Do
Else
Contador += 1
End If
Cdigo <uente )J-
En e# 4#timo caso de este e0em$#o" $odemos o!ser9ar como em$#eamos adems" #a
anidacin de di<erentes estructuras" com!inndo#as $ara rea#izar #as com$ro!aciones
o$ortunas&
.ondicin al 0inal.
La di<erencia en este caso" consiste en %ue e# contenido de #a estructura se e0ecuta
a# menos una 9ez& E#
Cdigo <uente )J3 muestra su sinta?is&
Do
' cdigo
'
....
..
[Exi
t
Do]
' cdigo
' ......
Loop While | Until Expresin
Cdigo <uente )J3
+' Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
E# Cdigo <uente )J. muestra a#gunos e0em$#os&
Sub Main()
Dim Valor As Integer
Dim Palabra As String
' bucle con While
Do
Console.WriteLine("Introducir un nmero")
Valor = Console.ReadLine()
oop While Valor <> 200
' bucle con Until
Do
Console.WriteLine("Introducir una palabra")
Palabra = Console.ReadLine()
Loop Until Palabra = "coche"
End Sub
Cdigo <uente )J.
Ain condicin.
Este es e# modo ms senci##o de #a estructura( sin inc#uir condicin a# $rinci$io o <ina#&
Tam!i'n es e# modo ms $e#igroso" 1a %ue si no inc#uimos un contro# dentro de#
cdigo" corremos e# riesgo de caer en un !uc#e in<inito& En e# e0em$#o de# Cdigo <uente
)JJ" esta!#ecemos una condicin de sa#ida mediante una estructura < dentro de# !uc#e"
%ue com$rue!a e# contenido de #a 9aria!#e" 1 <uerza #a sa#ida cuando tenga un 9a#or
su$erior a cierto n4mero&
Sub Main()
Dim Valor As Integer
Do
Console.WriteLine("Introducir un
nmero") Valor = Console.ReadLine()
' comprobar y salir del bucle si es necesario
If Valor > 400 Then
Exit Do
End If
Loop
End Sub
Cdigo
<uente )JJ
;or...:e3t
Esta estructura e0ecuta un !#o%ue de cdigo un n4mero determinado de 9eces"
esta!#ecido $or un rango de 9a#ores 1 contro#ado $or un contador& E# Cdigo <uente )JL
muestra su
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Luis Edgar Snchez +(
sinta?is
For Contador = Inicio To Fin [Step Incremento]
' cdigo
' ......
[Exit For]
' cdigo
' ......
Next
Cdigo <uente )JL
E# e#emento Contador se inicia#iza con un 9a#or 1 e# cdigo e?istente entre For 1 ;e?t es
e0ecutado una serie de 9eces" hasta %ue e# 9a#or de Contador se igua#a a Fin&
Por de<ecto" #os incrementos de Contador son en uno" $ero $odemos cam!iar este as$ecto
uti#izando e# modi<icador Ste$" mediante e# %ue $odemos esta!#ecer e# n4mero en e# %ue
se 9an a rea#izar #os incrementos& Ste$ tam!i'n nos $ermite rea#izar decremento
uti#izando un n4mero negati9o&
Si %ueremos rea#izar una sa#ida de #a e0ecucin de esta estructura antes de ha!er
com$#etado e# n4mero de iteraciones esta!#ecidas" $odemos uti#izar #a instruccin E?it
For" %ue $ro9ocar dicha sa#ida de igua# modo %ue e# e?$#icado anteriormente en #a
estructura Do&&&Loo$&
E# Cdigo <uente )JM muestra di<erentes e0em$#os de uso de este
ti$o de !uc#e&
Sub Main()
Dim Contador As Integer
Dim Final As Integer
' recorrido simple del bucle
Console.WriteLine("Bucle For normal")
For Contador = 1 To 10
Console.WriteLine("Variable Contador: {0}", Contador)
Next
Console.WriteLine()
' recorrer el bucle especificando un incremento
Console.WriteLine("Bucle For con incremento")
Console.WriteLine("Introducir el nmero de ejecuciones para el bucle")
Final = Console.ReadLine()
For Contador = 1 To Final Step 4
Console.WriteLine("Variable Contador: {0}", Contador)
Next
Console.WriteLine()
' recorrer el bucle especificando un decremento
Console.WriteLine("Bucle For con decremento")
For Contador = 18 To 4 Step -1
Luis Edgar Snchez ++
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Console.WriteLine("Variable Contador: {0}", Contador)
Next
Console.WriteLine()
' este bucle no se ejecutar,
' al ser mayor el valor de contador
' que el valor final, y no haber
' establecido un decremento
For Contador = 18 To 4
Console.WriteLine("Variable Contador: {0}", Contador)
Next
' recorrer el bucle y salir antes de completar
' todas las iteraciones
Console.WriteLine("Bucle For con salida antes de completar")
For Contador = 1 To 10
Console.WriteLine("Variable Contador: {0}", Contador)
Next
If Contador = 7 Then
Exit For
End If
Console.ReadLine()
End Sub
Cdigo <uente )JM
Un truco $ara o$timizar 1 ace#erar #a e0ecucin en un !uc#e de este ti$o" consiste en
uti#izar como contador una 9aria!#e de ti$o nteger" en 9ez de una de ti$o Short" Long"
Decima#" etc& Esto es de!ido a %ue #os ti$os nteger se actua#izan ms r$idamente %ue
#os otros ti$os num'ricos" aun%ue #a di<erencia s#o ser a$recia!#e en !uc#es %ue
e0ecuten muchos mi#es de iteraciones 1 %ue contengan muchas instrucciones& Cer Cdigo
<uente )JI&
Dim ContRapido As Integer
Dim ContLento As Decimal
' este bucle se ejecutar ms rpido que el siguiente
For ContRapido = 1 To 10000
' cdigo
Next
For ContLento = 1 To 10000
' cdigo
Next
Cdigo
<uente )JI
+, Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
;or -ac*...:e3t
Se trata de una 9ariante de #a estructura For&&&;e?t" 1 su misin consiste en e0ecutar
un !#o%ue de cdigo $or cada uno de #os e#ementos e?istentes en un arra1 o
co#eccin& E# Cdigo <uente )JP muestra su sinta?is&
For Each Elemento In ColecArray
' cdigo
' ......
[Exit
For]
' cdigo
' ......
Next
Cdigo
<uente )JP
E# Cdigo <uente )LA muestra un e0em$#o de# uso de esta estructura de contro#&
Sub Main()
' crear un array y rellenarlo con valores
Dim lsColores() As String = {"Azul", "Verde", "Marino", "Violeta"}
Dim lsColor As String
' en cada iteracin se obtiene un elemento
' del array lsColores, y se guarda en la variable lsColor
For Each lsColor In lsColores
Console.WriteLine(lsColor)
Next
End Sub
Cdigo
<uente )LA
Fuente( >L/;C:" Luis Migue# V 3Programacin en Cisua# >asic &;ET5
+7 Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Taller %.%$
< Uti#ice Cisua# >asic" en modo conso#a o ser9icio de NindoEs" $ara reso#9er #os
siguientes $ro!#emas(
a, *ea#izar un $rograma %ue reci!a n n4meros $or tec#ado 1 #uego #os muestre $or
$anta##a en orden in9erso a# %ue se ingres&
!, *ea#izar un $rograma %ue reci!a n n4meros" #os a#macene en un 9ector 1 #uego
$resente $or $anta##a e# menor 1 e# ma1or de #os n4meros ingresados&
c, *ea#izar un $rograma %ue #ea n n4meros+entre e# ) 1 e# )A," donde n sea ma1or
o igua# a -A 1 muestre a# <ina# #as 9eces %ue a$areci cada n4mero en #a #ista &
E# $rograma $reguntar si se %uieren introducir #os n n4meros 1 en e# caso %ue
#a res$uesta sea negati9a re##enar e# arra1 con n4meros a#eatorios&
d, Uti#izando arra1s cree un $rograma %ue $ermita ingresar #os nom!res de #os
candidatos a una dignidad" $reguntando a# $rinci$io cuntos candidatos ha1"
una 9ez ingresados $ermitir a n 9otantes dar su 9oto $or uno de #os candidatos"
a# <ina# e# $rograma #istar #a cantidad de 9otos o!tenidas $or cada candidato e
indicar cu# <ue e# ganador&
e, *ea#izar un $rograma %ue $ermita ingresar #os nom!res de una #ista de n
estudiantes" seguidamente e# $rograma $reguntar a# usuario si desea ingresar
#as ca#i<icaciones trimestra#es $ara cada uno o si $re<iere %ue se generen
automticamente" a# <ina# e# $rograma de!e $resentar e# nom!re 1 #a
ca#i<icacin <ina#+$romedio trimestra#, de# me0or 1 $eor a#umno&
<, *ea#izar un $rograma %ue reci!a n nom!res" seguidamente $regunte a# usuario
$or un nom!re a consu#tar 1 a# <ina# $resente $or $anta##a e# n4mero de 9eces
%ue dicho nom!re <ue ingresado en #a #ista de# $rinci$io&
Tema &.': 1sub25utinas en "isual )asic.
Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
rocedimientos
Todo e# cdigo e0ecuta!#e de una a$#icacin se u!ica en rutinas de c"di!o o
procedimientos& Un $rocedimiento es un e#emento de# #engua0e com$uesto $or un
con0unto de #2neas de cdigo" a #as %ue se denomina cuer$o de# $rocedimiento& Su
comienzo 1 <in #o esta!#ecemos mediante ciertas $a#a!ras reser9adas de# #engua0e"
asocindo#e un identi<icador" %ue nos ser9ir $ara reconocer#o entre e# resto de
$rocedimientos creados en e# $rograma& Podemos en9iar#e tam!i'n in<ormacin adiciona#
en <orma de $armetros" con #o %ue e# resu#tado de #a e0ecucin de un $rocedimiento
9ariar seg4n #os 9a#ores %ue $asemos en cada ##amada&
En C>&;ET dis$onemos de #os siguientes ti$os de $rocedimientos(
Q Aub& Procedimiento %ue rea#iza un con0unto de o$eraciones $ero no de9ue#9e
9a#or a# $unto de ##amada& / #o #argo de# te?to tam!i'n nos re<eriremos a #as rutinas
de ti$o Su! con e# nom!re gen'rico de procedimiento&
Q ;unction& Procedimiento %ue rea#iza un con0unto de o$eraciones" 1
de9ue#9e un 9a#or denominado 9a#or de retorno a# $unto de cdigo %ue rea#iz #a
##amada& / #o #argo de# te?to tam!i'n nos re<eriremos a #as rutinas de ti$o Function con e#
nom!re gen'rico de funci"n.
Q ropert#& Procedimiento %ue se uti#iza $ara #a!ores de acceso 1 asignacin de
9a#ores a #as $ro$iedades de un o!0eto& Sern tratados con ms $ro<undidad en e# tema
dedicado a #a $rogramacin orientada a o!0etos&
Ainta3is de un procedimiento
Aub
E# <ormato $ara #a escritura de un $rocedimiento Su! se muestra en e# Cdigo <uente ))M&
[mbito] Sub NombreProcedimiento[(ListaParmetros)]
[CdigoEjecutable]
[Exit Sub | Return]
[CdigoEjecutable]
End Sub
Cdigo <uente ))M
+8 Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Los e#ementos %ue <orman $arte de este ti$o de rutina son #os siguientes(
+9 Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Q Cmbito& De<ine e# modo en %ue 9amos a $oder acceder o ##amar a#
$rocedimiento desde otro $unto de #a a$#icacin& E# m!ito de #os e#ementos de# #engua0e
ser tratado en un a$artado $osterior&
Q Aub...-nd Aub& Pa#a!ras c#a9e %ue indican e# comienzo 1 <ina# de#
$rocedimiento res$ecti9amente& Cuando hagamos una ##amada a# $rocedimiento" e#
com$i#ador e0ecutar e# cdigo com$rendido entre estas dos $a#a!ras c#a9e&
Q :ombrerocedimiento& denti<icador %ue uti#izamos $ara reconocer 1
##amar a# $rocedimiento&
Q Listaar@metros& Lista de 9aria!#es se$aradas $or comas" 1 encerradas entre
$ar'ntesis" %ue re$resentan #a in<ormacin %ue reci!e e# $rocedimiento desde e# cdigo
##amador&
Q 5eturn& Esta $a#a!ra c#a9e $ermite sa#ir de #a e0ecucin de# $rocedimiento sin
ha!er ##egado a su <in& Podemos uti#izar#a en tantos #ugares dentro de un $rocedimiento
como sea necesario& Se recomienda su uso en #ugar de E?it Su!" 1a %ue $odemos em$#ear
*eturn $ara sa#ir de cua#%uier ti$o de $rocedimiento" con #o cua# se uni<ica #a escritura de#
cdigo&
Q -3it Aub& /# igua# %ue en e# $unto anterior" esta $a#a!ra c#a9e $ermite sa#ir de #a
e0ecucin de# $rocedimiento sin ha!er ##egado a su <in" $udiendo igua#mente" situar#a
en tantos #ugares dentro de# $rocedimiento como sea necesario&
E# Cdigo <uente ))I muestra e# modo ms sim$#e de crear un $rocedimiento& Escri!a e#
#ector este $rocedimiento en #a a$#icacin de conso#a so!re #a %ue est rea#izando #as
$rue!as" a continuacin de Main+ ,&
Sub Prueba()
Console.WriteLine("Estamos en el procedimiento Prueba")
End Sub
Cdigo <uente ))I
Llamada a un procedimiento Aub
Para rea#izar una ##amada o e0ecutar un $rocedimiento Su!" de!emos escri!ir su nom!re
en un $unto de# $rograma& E# Cdigo <uente ))P muestra e# cdigo a# com$#eto de#
mdu#o de nuestra a$#icacin de conso#a& La e0ecucin de este $rograma comienza como
es ha!itua# $or Main+ ," dentro de# cua# se rea#iza una ##amada a# $rocedimiento Prue!a+ ,&
,! Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Module Module1
Sub Main()
Console.WriteLine("Estamos en el procedimiento Main")
' llamada a un procedimiento
Prueba()
Console.ReadLine()
End Sub
Sub Prueba()
Console.WriteLine("Estamos en el procedimiento Prueba")
End Sub
End Module
Cdigo <uente ))P
En #a ##amada a un $rocedimiento Su!" e# uso de #os $ar'ntesis es o$ciona#"
inde$endientemente de si $asamos o no $armetros& ;o o!stante" es mu1 recomenda!#e
es$eci<icar dichos $ar'ntesis" 1a %ue a$ortan una gran c#aridad a nuestro cdigo" de
<orma %ue a# #eer#o $odemos 9er r$idamente #os $untos en #os %ue se rea#iza una
##amada a una rutina de cdigo& De!ido a esto" e# DE sit4a automticamente #os $ar'ntesis
en e# caso de %ue no #os es$eci<i%uemos de <orma e?$#2cita&
;o es $osi!#e situar #a ##amada a un $rocedimiento Su! como $arte de una e?$resin"
$uesto %ue este ti$o de $rocedimientos" a# no de9o#9er un 9a#or" $ro9ocar2a un error de
com$i#acin& Cer Figura )ML&
Figura )ML& ;o es $osi!#e hacer una ##amada a un $rocedimiento Su! en una e?$resin&
Ainta3is de un procedimiento ;unction
E# <ormato $ara #a escritura de un $rocedimiento Function se muestra en e# Cdigo <uente
)-A&
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Luis Edgar Snchez ,1
[mbito] Function NombreFuncin[(ListaParmetros)] As TipoDato
[CdigoEjecutable]
[Return Valor]
[Exit Function]
[CdigoEjecutable]
End Function
Cdigo <uente )-A
Los e#ementos %ue <orman $arte de este ti$o de rutina son #os siguientes(
Q Cmbito& De<ine e# modo en %ue 9amos a $oder acceder o ##amar a#
$rocedimiento desde otro $unto de #a a$#icacin& E# m!ito de #os e#ementos de# #engua0e
ser tratado en un a$artado $osterior&
Q ;unction...-nd ;unction& Pa#a!ras c#a9e %ue indican e# comienzo 1 <ina# de
#a <uncin res$ecti9amente& Cuando hagamos una ##amada a #a <uncin" e# com$i#ador
e0ecutar e# cdigo com$rendido entre estas dos $a#a!ras c#a9e&
Q :ombre;uncin& denti<icador %ue uti#izamos $ara reconocer 1 ##amar a #a
<uncin& En este ti$o de $rocedimiento" tam!i'n uti#izamos su nom!re $ara asignar e#
9a#or %ue ser de9ue#to a# cdigo ##amador en e# modo ,ombre-unci"n . Valor" en esta
4#tima situacin" $odemos situar esta e?$resin de de9o#ucin en tantos #ugares como
necesitemos dentro de #a <uncin&
Q Tipo6ato& Ti$o de dato de# 9a#or de9ue#to como resu#tado de #a e0ecucin de #a
<uncin&
Q Listaar@metros& Lista de 9aria!#es se$aradas $or comas" 1 encerradas entre
$ar'ntesis" %ue re$resentan #a in<ormacin %ue reci!e #a <uncin desde e# cdigo ##amador&
Q 5eturn& Esta $a#a!ra c#a9e $ermite sa#ir de #a e0ecucin de #a <uncin
de9o#9iendo a# mismo tiem$o un 9a#or a# cdigo %ue hizo #a ##amada& Podemos
uti#izar#a dentro de una <uncin" en tantos #ugares como necesitemos&
Q -3it ;unction& Esta $a#a!ra c#a9e $ermite sa#ir de #a e0ecucin de #a <uncin sin
ha!er ##egado a su <in& Podemos uti#izar#a dentro de una <uncin" en tantos #ugares como
necesitemos&
E# Cdigo <uente )-) muestra un senci##o e0em$#o de $rocedimiento Function" en e#
cua# se $ide a# usuario %ue introduzca un n4mero %ue es de9ue#to como resu#tado de #a
<uncin&
Function Calcular() As Integer
Dim MiValor As Integer
Console.WriteLine("Introducir un nmero de 1 a 100")
MiValor = Console.ReadLine()
Return MiValor
' tambin podemos utilizar esta
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Luis Edgar Snchez ,&
' sintaxis para devolver el valor
' de retorno de la funcin:
'Calcular = MiValor
End Function
Cdigo <uente )-)
En e# caso de de9o#9er e# 9a#or de retorno de una <uncin uti#izando e# $ro$io nom!re de
#a <uncin" nos encontramos con e# $ro!#ema de %ue si en un momento determinado
tenemos %ue cam!iar e# nom!re de #a <uncin" tam!i'n de!eremos cam!iar todos a%ue##os
$untos de #a rutina en donde de9o#9emos e# 9a#or& Por este moti9o es recomenda!#e e# uso
de *eturn $ara e# de9o#9er e# 9a#or de #a <uncin" 1a %ue si tenemos %ue cam!iar e#
nom!re de #a <uncin" no ser necesario modi<icar #os $untos en #os %ue se de9ue#9e e#
9a#or de este ti$o de $rocedimiento&
Llamada a un procedimiento ;unction
Para rea#izar una ##amada o e0ecutar un $rocedimiento Function de!emos escri!ir su
nom!re en un $unto de# $rogramaF en este as$ecto am!os ti$os de $rocedimiento son
igua#es&
Por otro #ado" #os $untos %ue marcan #as di<erencias entre un Function 1 un Su! son #os
siguientes(
Q Un $rocedimiento Function de9ue#9e un 9a#or" de modo %ue si %ueremos
o!tener#o" de!emos asignar #a ##amada a #a <uncin a una 9aria!#e& Los $rocedimientos Su!
no $ueden de9o#9er 9a#ores&
Q De!ido $recisamente a #a ca$acidad de un $rocedimiento Function de
de9o#9er un 9a#or" $odemos situar #a ##amada a una <uncin dentro de una e?$resin" 1
o$erar con e# 9a#or de retorno dentro de #a e?$resin" #o cua# dota a nuestro cdigo de una
ma1or <#e?i!i#idad& Los $rocedimientos Su! no $ueden <ormar $arte de e?$resiones&
En e# Cdigo <uente )-- 9emos 9arios e0em$#os de ##amadas a #a <uncin Ca#cu#ar+ ,"
seg4n e# modo en %ue 9amos a mani$u#ar su 9a#or de retorno&
Module Module1
Sub Main()
Dim Resultado As Integer
Dim NuevoValor As Integer
' llamada a una funcin sin recoger el valor de retorno,
' por este motivo, dicho valor se pierde
Calcular()
' llamada a una funcin obteniendo el valor
' de retorno y asignando el valor a una variable
Resultado = Calcular()
Console.WriteLine("La variable Resultado contiene: {0}", Resultado)
Luis Edgar Snchez
,'
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
' llamada a una funcin como parte de una expresin
NuevoValor = 1500 + Calcular() * 2
Console.WriteLine("La variable NuevoValor contiene: {0}", NuevoValor)
Console.ReadLine()
End Sub
Function Calcular() As Integer
Dim MiValor As Integer
Console.WriteLine("Introducir un nmero de 1 a 100")
MiValor = Console.ReadLine()
Return MiValor
' tambin podemos utilizar esta
' sintaxis para devolver el valor
' de retorno de la funcin:
'Calcular = MiValor
End Function
End Module
Cdigo <uente )--
aso de par@metros a
procedimientos
Un $armetro consiste en un 9a#or %ue es $asado a un $rocedimiento& Dicho 9a#or $uede
ser una 9aria!#e" constante o e?$resin& Los $rocedimientos $ueden reci!ir $armetros en
<orma de #ista de 9aria!#es se$arada $or comas" siguiendo #a sinta?is %ue 9emos en e#
Cdigo <uente )-3&
[Optional] [ByVal | ByRef] [ParamArray] NombreParametro As TipoDato
Cdigo <uente )-3
Las reg#as 1 cuestiones so!re $aso de $armetros descritas en #os siguientes a$artados
son 9#idas tanto $ara $rocedimientos como $ara <unciones" e?ce$to en a%ue##os
#ugares donde se indi%ue #o contrario&
rotocolo de llamada o 0irma de un
procedimiento
/ #a #ista de $armetros de un $rocedimiento se #e denomina protocolo de llamada o firma
+signature, de# $rocedimiento&
Tipo de dato de un par@metro
/# igua# %ue hacemos cuando dec#aramos una 9aria!#e" a# dec#arar un $armetro de!emos
Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
es$eci<icar e# ti$o de dato %ue e# $armetro 9a a contener& Esto ser o no o!#igatorio" en
<uncin de# modi<icador esta!#ecido en #a instruccin :$tion Strict&
,( Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
En e# Cdigo <uente )-. hemos a@adido un $armetro de ti$o String a# $rocedimiento
Prue!a+ ,& Cuando ##amemos desde otro $rocedimiento a Prue!a+ ," a# $asar desde e# cdigo
##amador una cadena de caracteres" !ien de <orma #itera# o en una 9aria!#eF e# contenido de
dicha cadena se tras$asar a #a 9aria!#e situada en #a #ista de $armetros de#
$rocedimiento" %ue $osteriormente 9isua#izaremos en #a conso#a&
Sub Main()
Dim Nombre As String
Nombre = "Juan" Prueba(Nombre)
Prueba("Esto es una prueba")
Console.ReadLine()
End Sub
Sub Prueba(ByVal ValorMostrar As String)
Console.WriteLine("El valor del parmetro pasado es {0}", ValorMostrar)
End Sub
Cdigo <uente )-.
aso de par@metros por %alor # por
re0erencia
E?isten dos modos en e# #engua0e de $asar $armetros a un $rocedimiento( por valor 1
por referencia& Este as$ecto de# #engua0e est re#acionado con #a manera en %ue e#
contenido de #os $armetros es gestionado internamente en memoria& E##o nos $ermitir
seg4n e# ti$o de $aso em$#eado" $oder a#terar e# 9a#or de# $armetro en e# cdigo %ue
rea#iz #a ##amada&
aso por %alor 1)#"al2
Cuando $asamos un $armetro $or 9a#or a un $rocedimiento" #a 9aria!#e %ue contiene e#
$armetro $uede ser modi<icada dentro de# $rocedimiento" sin %ue estos cam!ios a<ecten a#
9a#or origina# en e# cdigo ##amador& De!emos situar en este caso en e# $rocedimiento"
#a $a#a!ra c#a9e >1Ca# antes de# nom!re de# $armetro& Cer Cdigo <uente )-J&
,+
Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Sub Main()
Dim Nombre As String
Nombre = "Juan"
' llamamos a un procedimiento
' y le pasamos una variable por valor
Prueba(Nombre)
' la variable que hemos pasado al procedimiento,
' al volver aqu no ha sido cambiada, debido a que
' ha sido pasada por valor, sigue conteniendo
' la cadena "Juan"
Console.WriteLine("Valor de la variable dentro de Main(): {0}", Nombre)
Console.ReadLine()
End Sub
Sub Prueba(ByVal ValorMostrar As String)
' modificamos el valor del parmetro,
' este cambio no afecta a la variable Nombre
ValorMostrar = "Elena"
Console.WriteLine("Valor del parmetro dentro de Prueba(): {0}", ValorMostrar)
End Sub
Cdigo <uente )-J
Lo %ue ocurre en e# <uente anterior a ni9e# de gestin interna en memoria de #os $armetros
es #o siguiente( cuando se rea#iza #a ##amada a# $rocedimiento 1 se $asa e# $armetro" e#
entorno detecta %ue se trata de un $armetro $asado $or 9a#or" $or #o %ue crea una nue9a
9aria!#e en memoria %ue ser #a %ue mani$u#emos dentro de# $rocedimiento& La Figura
)MM muestra una re$resentacin gr<ica de este $roceso&
Figura )MM& Es%uema de gestin interna de 9aria!#es en e# $aso $or 9a#or&
Luis Edgar Snchez ,,
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
En e# entorno de &;ET FrameEorH" $or de<ecto" todos #os $armetros son $asados $or
9a#or& Esto #o $uede com$ro!ar e# #ector de un modo mu1 sim$#e( si a# dec#arar un
$armetro no es$eci<ica e# ti$o de $aso" e# DE automticamente situar 0unto a ese
$armetro #a $a#a!ra c#a9e >1Ca#&
Se recomienda siem$re %ue sea $osi!#e e# $aso de $armetros $or 9a#or" 1a %ue a1uda a
generar un cdigo ms o$timizado 1 contri!u1e a me0orar #a enca$su#acin&
aso por re0erencia 1)#5e02
Cuando $asamos un $armetro $or re<erencia a un $rocedimiento" si modi<icamos dentro
de# $rocedimiento #a 9aria!#e %ue contiene e# $armetro" dichos cam!ios en este caso
s2 a<ectarn a# cdigo ##amador& De!emos situar en este caso en e# $rocedimiento" #a
$a#a!ra c#a9e >1*e< antes de# nom!re de# $armetro& Cam!iemos e# cdigo de# anterior
e0em$#o" haciendo %ue en este caso" e# $armetro sea $asado $or re<erencia 1 o!ser9emos
#os resu#tados& Cer Cdigo <uente )-L&
Sub Main()
Dim Nombre As String
Nombre = "Juan"
Console.WriteLine("Valor de la variable antes de llamar a Prueba(): {0}", Nombre)
' llamamos a un procedimiento
' y le pasamos una variable por referencia
Prueba(Nombre)
' el cambio realizado al parmetro en el procedimiento
' ha afectado a la variable Nombre, que aqu contiene
' el mismo valor que se asign en el procedimiento
Console.WriteLine("Valor de la variable al volver a Main(): {0}", Nombre)
Console.ReadLine()
End Sub
Sub Prueba(ByRef ValorMostrar As String)
' modificamos el valor del parmetro
ValorMostrar = "Elena"
Console.WriteLine("Valor del parmetro dentro de Prueba(): {0}", ValorMostrar)
End Sub
Cdigo <uente )-L
Lo %ue ocurre en e# <uente anterior a ni9e# de gestin interna en memoria de #os $armetros
es #o siguiente( cuando se rea#iza #a ##amada a# $rocedimiento 1 se $asa e# $armetro" e#
entorno detecta %ue se trata de un $armetro $asado $or re<erencia" 1 tanto #a 9aria!#e de#
cdigo ##amador como #a de# $rocedimiento ##amado uti#izan #a misma direccin de
memoria o re<erencia hacia #os datos" $or #o %ue #os cam!ios rea#izados en un
$rocedimiento a<ectarn tam!i'n a# otro& La Figura )MI muestra una re$resentacin gr<ica
de este $roceso&
,7 Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Figura )MI& Es%uema de gestin interna de 9aria!#es en e# $aso $or re<erencia&
Fuente( >L/;C:" Luis Migue# V 3Programacin en Cisua# >asic &;ET5
Taller %.)$
< Uti#ice Cisua# >asic" en modo conso#a o ser9icio de NindoEs" $ara reso#9er #os
siguientes $ro!#emas(
a2 Cree una subrutina que reciba un entero y devuelva su factorial, luego
demuestre su uso en un programa principal
b2 Cree una subrutina que reciba las tres notas trimestrales de un alumno
y devuelva un te"to indicando si est/J'probadoJ, I$eprobado o
IsupletorioJ, use el mismo criterio que en el taller ?<, literal c Luego
demuestre su funcionamiento desde un programa principal
c2 Cree un programa que permita encontrar el rea de una figura
geomtrica a escoger entre/ rectngulo, tringulo y crculo Ose una
subrutina diferente para el clculo de cada figura
,8
Tema &.(: $$ en "isual )asic.
Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Los 0undamentos de la programacin orientada a objeto
La organizacin de una a$#icacin en ::P se rea#iza mediante estructuras de c"di!o&
Una estructura de cdigo contiene un con0unto de $rocedimientos e in<ormacin %ue
e0ecutan una serie de $rocesos destinados a reso#9er un gru$o de tareas con un
denominador com4n& Una a$#icacin orientada a o!0etos tendr tantas estructuras de
cdigo como as$ectos de# $rograma sea necesario reso#9er&
Un $rocedimiento %ue est' situado dentro de una de estructura de este ti$o" no $odr
##amar ni ser ##amado $or otro $rocedimiento situado en una estructura distinta" si no es
!a0o una serie de reg#as& Lo mismo suceder con #os datos %ue contenga #a estructura"
$ermanecern ais#ados de# e?terior" 1 s#o sern accesi!#es siguiendo ciertas normas& Una
estructura de cdigo" es #o %ue en ::P identi<icamos como o!0eto&
/# ser #as estructuras de cdigo u o!0etos" entidades %ue contienen una in<ormacin
$recisa 1 un com$ortamiento !ien de<inido a tra9's de# con0unto de $rocedimientos %ue
inc#u1en" $ueden ser c#asi<icados en <uncin de #as tareas %ue desem$e@an&
Precisamente" uno de #os <ines $erseguidos $or #a ::P es conseguir una me0or
cata#ogacin de# cdigo" en !ase a estructuras 0err%uicas de$endientes" a# esti#o de
un r!o# genea#gico&
Tras#adando #as nociones %ue aca!amos de e?$oner a# e0em$#o anterior" en e# cua# se
$rograma!an #os $rocesos de gestin de #os em$#eados de una em$resa" e# resu#tado
o!tenido ser una estructura de cdigo conteniendo todos #os $rocedimientos" <unciones 1
9aria!#es de #a a$#icacin" im$#icados en #as o$eraciones a rea#izar con un em$#eado" o
#o %ue es #o mismo" un o!0eto Em$#eado& Entre #os e#ementos de este o!0eto
encontraremos e# nom!re" a$e##idos" a#ta de# em$#eado" $ago de nmina" etc&
Todos #os e#ementos %ue <orman $arte de un o!0eto com$onen #a c#ase de# o!0eto& Una
c#ase consiste en e# con0unto de es$eci<icaciones %ue $ermiten crear #os o!0etosF en e#
caso e?$uesto $or e# e0em$#o anterior ser2a #a c#ase Em$#eado&
Como aca!amos de com$ro!ar" #as moti9aciones %ue han ##e9ado a# desarro##o de #a ::P
son <aci#itar una me0or organizacin 1 c#asi<icacin de# cdigo" %ue #a $ro$orcionada $or
#a $rogramacin $rocedura# tradiciona#F a$ro?imando a# mismo tiem$o" e# modo de
$rogramar a #a manera en %ue nuestra mente tra!a0a $ara a$#icar so#uciones a #os
$ro!#emas $#anteados&
$bjetos
Un o!0eto es una agru$acin de cdigo" com$uesta de $ro$iedades 1 m'todos" %ue
,9
Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
$ueden ser mani$u#ados como una entidad inde$endiente& Las $ro$iedades de<inen #os
datos o in<ormacin de# o!0eto" $ermitiendo consu#tar o modi<icar su estadoF mientras %ue
#os m'todos son #as rutinas %ue de<inen su com$ortamiento&
Un o!0eto es una $ieza %ue se ocu$a de desem$e@ar un tra!a0o concreto dentro de una
estructura organizati9a de ni9e# su$erior" <ormada $or m4#ti$#es o!0etos" cada uno de #os
cua#es e0erce #a tarea $articu#ar $ara #a %ue ha sido dise@ado&
En t'rminos concretos" se dice %ue un o!0eto es una 3instancia de una c#ase5" conce$to
mu1 sim$#e %ue com$renderemos ms ade#ante" a# sa!er con deta##e #o %ue es una
3instanciacin5&
.lases
Una c#ase no es otra cosa %ue e# con0unto de es$eci<icaciones o normas %ue de<inen cmo
9a a ser creado un o!0eto de un ti$o determinadoF a#go $arecido a un manua# de
instrucciones conteniendo #as indicaciones $ara crear e# o!0eto&
Los t'rminos o!0eto 1 c#ase son uti#izados en ::P con gran $ro<usin 1 en conte?tos
mu1 simi#ares" $or #o %ue $ara intentar ac#arar en #o $osi!#e am!os conce$tos" diremos
%ue una c#ase constitu1e #a re$resentacin a!stracta de a#go" mientras %ue un o!0eto
constitu1e #a re$resentacin concreta de #o %ue una c#ase de<ine&
La c#ase determina e# con0unto de $untos c#a9e %ue ha de cum$#ir un o!0eto $ara ser
considerado $erteneciente a dicha c#ase o categor2a" 1a %ue no es o!#igatorio %ue dos
o!0etos creados a $artir de #a misma c#ase sean e?actamente igua#es" !asta con %ue
cum$#an #as es$eci<icaciones c#a9e de #a c#ase&
E?$ongamos ahora #as anteriores de<iniciones mediante un e0em$#o $reciso( un
mo#de $ara crear <iguras de cermica 1 #as <iguras o!tenidas a $artir de# mo#de& En este
caso" e# mo#de re$resentar2a #a c#ase Figura" 1 cada una de #as <iguras creadas a $artir de#
mo#de" ser2a un o!0eto Figura& Cada o!0eto Figura tendr una serie de $ro$iedades
comunes( tama@o 1 $eso igua#esF 1 otras $ro$iedades $articu#ares( un co#or distinto $ara
cada <igura&
/un%ue o!0etos distintos de una misma c#ase $ueden tener ciertas $ro$iedades di<erentes"
de!en tener e# mismo com$ortamiento o m'todos& Para e?$#icar me0or esta
circunstancia" tomemos e# e0em$#o de #a c#ase CocheF $odemos crear dos coches con
di<erentes caracter2sticas +co#or" tama@o" $otencia" etc&," $ero cuando a$#icamos so!re
e##os #os m'todos /rrancar" /ce#erar o Frenar" am!os se com$ortan o res$onden de #a
misma manera&
4nstancias de una clase
E# $roceso $or e# cu# se o!tiene un o!0eto a $artir de #as es$eci<icaciones de una
7!
Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
c#ase se conoce como instanciacin de o!0etos& En #a Figura )P- 9o#9emos a# e0em$#o de#
mo#de 1 #as <igurasF en dicha imagen 9emos un mo#de $ara <a!ricar <iguras
rectangu#ares" donde #a c#ase Figura estar2a re$resentada $or e# mo#de" 1 cada uno de #os
o!0etos Figura +igua#es en <orma $ero con #a $ro$iedad Co#or distinta," re$resentar2a una
instancia de #a c#ase&
Figura )P-& nstanciacin de o!0etos a $artir de una c#ase&
.aractersticas b@sicas de un sistema orientado a objeto
Para %ue un #engua0e o sistema sea considerado orientado a o!0eto" de!e cum$#ir #as
caracter2sticas de #os siguientes a$artados&
Abstraccin
La a!straccin es a%ue##a caracter2stica %ue nos $ermite identi<icar un o!0eto a tra9's de
sus as$ectos conce$tua#es&
Las $ro$iedades de #os o!0etos de una misma c#ase" $ueden hacer#os tan distintos %ue sea
di<2ci# reconocer %ue $ertenecen a una c#ase id'ntica& ;o o!stante" nosotros reconocemos
a %u' c#ase $ertenecen" identi<icando adems" si se trata de #a misma c#ase $ara am!os&
E##o es $osi!#e gracias a #a a!straccin&
Tomemos como e0em$#o dos o!0etos coche" uno de$orti9o 1 otro <ami#iarF su as$ecto
e?terior es mu1 di<erente" sin em!argo" cuando $ensamos en cua#%uiera de e##os" sa!emos
71
Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
%ue am!os $ertenecen a #a c#ase Coche" $or%ue rea#izamos una a!straccin o
identi<icacin menta# de #os e#ementos comunes %ue am!os tienen +ruedas" 9o#ante"
motor" $uertas" etc&,&
De# mismo modo %ue hacemos a# identi<icar o!0etos rea#es" #a a!straccin nos a1uda a #a
hora de desarro##ar una a$#icacin" $ermiti'ndonos identi<icar #os o!0etos %ue 9an a
<ormar $arte de nuestro $rograma" sin necesidad de dis$oner a4n de su im$#ementacinF
nos !asta con reconocer #os as$ectos conce$tua#es %ue cada o!0eto de!e reso#9er&
Por e0em$#o" cuando a!ordamos e# desarro##o de un $rograma de gestin orientado
a o!0etos" rea#izamos una a!straccin de #os o!0etos %ue necesitar2amos $ara reso#9er #os
$rocesos de# $rograma( un o!0eto Em$#eado" $ara gestionar a# $ersona# de #a em$resaF un
o!0eto Factura" $ara gestionar #as 9entas rea#izadas de $roductosF un o!0eto Usuario"
$ara 9eri<icar #as $ersonas %ue uti#izan #a a$#icacin" etc&
-ncapsulacin
La enca$su#acin esta!#ece #a se$aracin entre e# inter<az de# o!0eto 1 su
im$#ementacin" a$ortndonos dos 9enta0as <undamenta#es&
Por una $arte $ro$orciona seguridad a# cdigo de #a c#ase" e9itando accesos 1
modi<icaciones no deseadasF una c#ase !ien enca$su#ada no de!e $ermitir #a modi<icacin
directa de una 9aria!#e" ni e0ecutar m'todos %ue sean de uso interno $ara #a c#ase&
Por otro #ado #a enca$su#acin sim$#i<ica #a uti#izacin de #os o!0etos" 1a %ue un
$rogramador %ue use un o!0eto" si este est !ien dise@ado 1 su cdigo correctamente
escrito" no necesitar conocer #os deta##es de su im$#ementacin" se #imitar a uti#izar#o&
Tomando un e0em$#o rea#" cuando nosotros uti#izamos un o!0eto Coche" a# $resionar e#
ace#erador" no necesitamos conocer #a mecnica interna %ue hace mo9erse a# coche"
sa!emos %ue e# m'todo /ce#erar de# coche es #o %ue tenemos %ue uti#izar $ara
des$#azarnos" 1 sim$#emente #o usamos&
Pasando a un e0em$#o en $rogramacin" si estamos creando un $rograma de
gestin 1 nos $ro$orcionan un o!0eto C#iente %ue tiene e# m'todo /#ta" 1 sir9e $ara
a@adir nue9os c#ientes a #a !ase
de datos" no $recisamos conocer e# cdigo %ue contiene dicho m'todo" sim$#emente #o
e0ecutamos 1 damos de a#ta a #os c#ientes en nuestra a$#icacin&
olimor0ismo
E# $o#imor<ismo determina %ue e# mismo nom!re de m'todo" rea#izar di<erentes acciones
seg4n e# o!0eto so!re e# %ue sea a$#icado& /# igua# %ue suced2a en #a enca$su#acin" e#
$rogramador %ue haga uso de# o!0eto" no necesita conocer #os deta##es de im$#ementacin
de #os m'todos" se #imita a uti#izar#os&
Pasando a un e0em$#o rea#" tomamos dos o!0etos( Pe#ota 1 CasoCrista#F si e0ecutamos
7&
Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
so!re am!os e# m'todo Tirar" e# resu#tado en am!os casos ser mu1 di<erenteF mientras
%ue e# o!0eto Pe#ota re!otar a# ##egar a# sue#o" e# o!0eto CasoCrista# se rom$er&
En un e0em$#o a$#icado a #a $rogramacin" su$ongamos %ue dis$onemos de #os o!0etos
Centana 1 FicheroF si e0ecutamos so!re am!os e# m'todo /!rir" e# resu#tado en Centana
ser #a 9isua#izacin de una 9entana en e# monitor de# usuarioF mientras %ue en e# o!0eto
Fichero" se tomar un <ichero en e# e%ui$o de# usuario 1 se de0ar #isto $ara rea#izar so!re
'# o$eraciones de #ectura o escritura&
Herencia
Se trata de #a caracter2stica ms im$ortante de #a ::P" 1 esta!#ece %ue $artiendo de una
c#ase a #a %ue denominamos c#ase !ase" $adre o su$erc#ase" creamos una nue9a c#ase
denominada c#ase deri9ada" hi0a" o su!c#ase& En esta c#ase deri9ada dis$ondremos de
todo e# cdigo de #a c#ase !ase" ms e# nue9o cdigo $ro$io de #a c#ase hi0a" %ue
escri!amos $ara e?tender sus <unciona#idades&
/ su 9ez $odemos tomar una c#ase deri9ada" creando una nue9a su!c#ase a $artir de e##a"
1 as2 sucesi9amente" com$oniendo #o %ue se denomina una 0erar%u2a de c#ases" %ue
e?$#icaremos seguidamente&
E?isten dos ti$os de herencia( sim$#e 1 m4#ti$#e& La herencia sim$#e es a%ue##a en #a %ue
creamos una c#ase deri9ada a $artir de una so#a c#ase !ase" mientras %ue #a herencia
m4#ti$#e nos $ermite crear una c#ase deri9ada a $artir de 9arias c#ases !ase& E# entorno de
&;ET FrameEorH s#o $ermite uti#izar herencia sim$#e&
Como e0em$#o rea# de herencia" $odemos usar #a c#ase Coche como c#ase !aseF en e##a
reconocemos una serie de $ro$iedades como Motor" *uedas" Co#ante" etc&" 1 unos
m'todos como /rrancar" /ce#erar" Frenar" etc& Como c#ase deri9ada creamos
CocheDe$orti9o" en #a cu#" adems de todas #as caracter2sticas mencionadas $ara #a
c#ase Coche" encontramos $ro$iedades 1 com$ortamiento es$ec2<icos como />S" Tur!o"
etc&
Un e0em$#o !asado en $rogramacin consistir2a en dis$oner de #a 1a conocida c#ase
Em$#eado& Esta c#ase se ocu$a" como 1a sa!emos" de #as o$eraciones de a#ta de
em$#eados" $ago de nminas" etc&F $ero en un momento dado" surge #a necesidad de
rea#izar $agos a em$#eados %ue no tra!a0an en #a centra# de #a em$resa" 1a %ue se trata de
comercia#es %ue $asan #a ma1or $arte de# tiem$o des$#azndose& Para rea#izar dichos
$agos usaremos nternet" necesitando e# n4mero de tar0eta de cr'dito 1 #a direccin emai#
de# em$#eado& *eso#9eremos esta situacin creando #a c#ase deri9ada Ci!erEm$#eado" %ue
hereda de #a c#ase Em$#eado" en #a %ue s#o tendr2amos %ue a@adir #as nue9as
$ro$iedades 1 m'todos $ara #as transacciones e#ectrnicas" $uesto %ue #as o$eraciones
tradiciona#es 1a #as tendr2amos dis$oni!#es $or e# mero hecho de ha!er heredado de
Em$#eado&
.reacin de clases
Co#9amos a# e0em$#o e?$uesto a# comienzo de este tema" en e# cu#" ha!2amos de0ado a
nuestro $rogramador desarro##ando #os $rocesos de un em$#eado dentro de una a$#icacin
Luis Edgar Snchez 7'
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
de gestin em$resaria#& *ecordemos %ue se $#antea!a e# $ro!#ema de %ue ante e#
crecimiento de# $rograma" e# mantenimiento de# cdigo" a# en<ocarse de modo
$rocedura#" $od2a 9o#9erse una tarea rea#mente di<2ci#&
Camos a re$#antear este dise@o" encauzndo#o !a0o una $ers$ecti9a orientada a o!0eto"
%ue nos $ermita un uso ms senci##o de# cdigo 1 un mantenimiento tam!i'n ms <ci#&
Para #o cua# desarro##aremos una c#ase %ue contenga todas #as o$eraciones a rea#izar $or
e# em$#eadoF en de<initi9a" crearemos #a c#ase Em$#eado" cu1o $roceso descri!iremos a
continuacin&
Podemos escri!ir una c#ase en C>&;ET uti#izando di<erentes ti$os de a$#icacin" en este
caso em$#earemos una a$#icacin de conso#a& niciaremos en $rimer #ugar CS&;ET"
creando un $ro1ecto de ti$o conso#a& / continuacin se#eccionaremos e# men4 Proyecto
+ !re!ar clase" %ue nos mostrar #a 9entana $ara agregar nue9os e#ementos a# $ro1ecto&
E# nom!re $or de<ecto asignado $or e# DE $ara #a c#ase ser C#ass)F cam!iaremos dicho
nom!re $or Em$#eado" 1 $u#saremos /!rir& Cer Figura )P.&
Figura )P.& /@adir una c#ase a un $ro1ecto&
Se crear de esta <orma un nue9o <ichero de cdigo +EMPLE/D:&C>," mostrndose e#
editor de cdigo con su contenido& :!ser9emos en este sentido" %ue #a de<inicin de una
c#ase se rea#iza uti#izando #as $a#a!ras c#a9e C#ass&&&End C#assF entre estas $a#a!ras
escri!iremos e# cdigo de #a c#ase& Cer Cdigo <uente -A)&
Public Class Empleado
End Class
7( Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
.digo de clase # cdigo cliente
Cdigo <uente -A)
/ntes de comenzar a rea#izar $rue!as con #as c#ases %ue 9a1amos escri!iendo" de!emos
e?$#icar dos conce$tos re<erentes a #a escritura de cdigo orientado a o!0eto" 1a %ue en
<uncin de# #ugar desde e# %ue sea mani$u#ado" de!emos distinguir entre cdigo de c#ase
1 cdigo c#iente&
Q .digo de clase& Se trata de# cdigo %ue escri!imos $ara crear nuestra
c#ase" 1 %ue se encuentra entre #as $a#a!ras c#a9e C#ass&&&End C#ass&
Q .digo cliente& Se trata de# cdigo %ue hace uso de #a c#ase mediante #a
accin de crear o instanciar o!0etos a $artir de #a misma& /%u2 se eng#o!ar2a todo
e# cdigo %ue se encuentra <uera de #a c#ase&
4nstanciacin de objetos
En este momento" nuestra c#ase Em$#eado cuenta con e# cdigo m2nimo $ara $oder ser
uti#izada" $ara #o %ue de!emos instanciar o!0etos a $artir de #a misma&
Como 1a se e?$#ic en un a$artado anterior" e# $roceso de instanciacin consiste en crear
un o!0eto a $artir de #as es$eci<icaciones de #a c#ase& E# modo ms com4n de tra!a0ar con
una instancia de una c#ase" o #o %ue es #o mismo" con un o!0eto" $asa $or asignar dicho
o!0eto a una 9aria!#e&
nstanciaremos un o!0eto en e# cdigo uti#izando #a sinta?is de dec#aracin de 9aria!#es
0unto a #a $a#a!ra c#a9e ;eE" em$#eando como ti$o de dato e# nom!re de #a c#ase& Todo
este cdigo #o $odemos situar en un mdu#o dentro de# $ro1ecto" !ien en un <ichero de
cdigo a$arte o en e# mismo <ichero en donde estamos escri!iendo #a c#ase& E# Cdigo
<uente -A3 muestra #as <ormas dis$oni!#es de instanciar un o!0eto 1 asignar#o a una
9aria!#e&
Module General
Sub Main()
' declarar primero la variable
' y despus instanciar el objeto
Dim loEmpleado1 As Empleado
loEmpleado1 = New Empleado()
' declaracin e instanciacin simultnea
Dim loEmpleado2 As New Empleado()
' declaracin y posterior instanciacin en
' la misma lnea de cdigo
Dim loEmpleado3 As Empleado = New Empleado()
End Sub
End Module
Cdigo <uente -A3
Luis Edgar Snchez
7+
Si !ien es cierto %ue 1a es $osi!#e crear o!0etos a $artir de nuestra c#ase" no #o es menos
e# hecho de %ue no $odemos hacer grandes cosas con e##os" $uesto %ue #a c#ase se
encuentra 9ac2a de cdigo& De!emos a@adir $ro$iedades 1 m'todos $ara conseguir %ue
#os o!0etos act4en en nuestra a$#icacin&
.reacin de campos para la clase
Un cam$o de una c#ase no es otra cosa %ue una 9aria!#e" genera#mente con m!ito
$4!#ico" accesi!#e desde e# e?terior de #a c#ase& E# Cdigo <uente -A. muestra #a creacin
de un cam$o $ara #a c#ase Em$#eado&
Public Class Empleado
' declaramos un campo en la clase
' para guardar el identificador
' del empleado
Public piIdentificador As Integer
End Class
Cdigo <uente -A.
Para mani$u#ar un cam$o desde cdigo c#iente" de!emos instanciar un o!0eto" a
continuacin de #a 9aria!#e %ue #o contiene situar un $unto + & ," 1 <ina#mente e#
nom!re de# cam$o a mani$u#ar& Este modo de o$eracin es com4n $ara todos #os
miem!ros de c#ases" tanto creadas $or e# $rogramador" como $ertenecientes a #a $ro$ia
$#ata<orma &;ET FrameEorH& Cer e# Cdigo <uente -AJ&
Module General
Sub Main()
Dim loEmpleado As Empleado
' instanciar el objeto
loEmpleado = New Empleado()
' asignar un valor al campo del objeto
loEmpleado.piIdentificador = 75
' mostrar el valor de un campo del objeto
Console.WriteLine("El valor del campo es: {0}", _
loEmpleado.piIdentificador)
Console.ReadLine()
End Sub
End Module
Cdigo <uente -AJ
Como ha!r o!ser9ado e# #ector" a# escri!ir e# nom!re de# o!0eto 1 e# $unto" a$arece una
7,
Luis Edgar Snchez
#ista con #os miem!ros de #a c#ase accesi!#es desde e# cdigo c#iente& De momento s#o
dis$onemos de# cam$o 1 e# m'todo =etT1$e+ ," %ue de9ue#9e un o!0eto de #a c#ase
T1$e" conteniendo in<ormacin so!re e# ti$o de# o!0eto& Esta #ista ir aumentando
$rogresi9amente seg4n a@adimos ms $ro$iedades 1 m'todos a #a c#ase" constitu1endo
una inestima!#e a1uda $ara e# $rogramador" %ue #e e9ita e# tener %ue recordar #os nom!res
de todos #os e#ementos de #a c#ase" o consu#tar continuamente su documentacin&
.reacin de propiedades para la clase
Una $ro$iedad en #a c#ase se de<ine" $or norma genera#" mediante dos e#ementos( una
9aria!#e de $ro$iedad 1 un $rocedimiento de $ro$iedad&
La 9aria!#e de $ro$iedad" ta# 1 como su nom!re indica" es una 9aria!#e con m!ito
$ri9ado a ni9e# de #a c#ase" %ue se encarga de guardar e# 9a#or de #a $ro$iedad& Por
su $arte e# $rocedimiento de $ro$iedad o Pro$ert1" es e# encargado de actuar de $uente
entre e# cdigo c#iente 1 #a 9aria!#e de $ro$iedad" rea#izando #as o$eraciones de acceso 1
asignacin de 9a#ores a dicha 9aria!#e&
Por #o tanto" $ara crear una $ro$iedad en nuestra c#ase" dec#araremos en $rimer #ugar una
9aria!#e Pri9ate" 1 en segundo #ugar un $rocedimiento de ti$o Pro$ert1" %ue consta de
dos !#o%ues( =et" $ara de9o#9er e# 9a#or de #a 9aria!#e de $ro$iedadF 1 Set" $ara
asignrse#o& La sinta?is a em$#ear se muestra en e# Cdigo <uente -AL&
Public Class Empleado
' declarar una variable de propiedad
' para la propiedad Nombre
Private msNombre As String
' declarar el procedimiento Property
' para la propiedad Nombre
Public Property Nombre() As String
' bloque Get para devolver
' el valor de la propiedad
Get
Return msNombre
End Get
' bloque Set para asignar
' valor a la propiedad
Set(ByVal Value As String)
msNombre = Value
End Set
End Property
End Class
Cdigo <uente -AL
Cuando dec#aramos un $rocedimiento Pro$ert1" de!emos" a# igua# %ue en una <uncin"
ti$i<icar#o" 1a %ue una de sus #a!ores consiste en #a de9o#ucin de un 9a#or&
Luis Edgar Snchez 77
Para de9o#9er e# 9a#or" en e# !#o%ue =et $odemos uti#izar #a $a#a!ra c#a9e *eturn" seguida
de# 9a#or de retorno" o !ien #a sinta?is c#sica de asignar e# 9a#or a# nom!re de #a
<uncin& ;uestra recomendacin es e# uso de *eturn $or #as 9enta0as e?$#icadas en e#
tema de# #engua0e&
En cuanto a #a asignacin de 9a#or" e# !#o%ue Set uti#iza un $armetro con e# nom!re
Ca#ue" %ue contiene e# 9a#or $ara asignar a #a $ro$iedad&
:!ser9e e# #ector %ue a# dec#arar un $rocedimiento de este ti$o" e# DE de CS&;ET crea
automticamente #os corres$ondientes !#o%ues =et 1 Set" ahorrando ese tra!a0o a#
$rogramador&
/ #a hora de mani$u#ar una $ro$iedad desde e# cdigo c#iente" 1 como 1a
ha!2amos a$untado anteriormente" #a di<erencia no ser notoria" como muestra e#
Cdigo <uente -AM& La 4nica <orma de
hacer ms $atente e# uso de# $rocedimiento Pro$ert1" consiste en e0ecutar e# $rograma
uti#izando e# de$uradorF de esta manera com$ro!aremos como e# <#u0o de #a e0ecucin
sa#ta a #os !#o%ues =et 1 Set a# mane0ar #a 9aria!#e de# o!0eto&
Sub Main()
Dim loEmpleado As New Empleado()
' asignar valor a una propiedad loEmpleado.Nombre = "Guillermo"
' mostrar el valor de una propiedad del objeto
Console.WriteLine("El valor de la propiedad Nombre es: {0}", _
loEmpleado.Nombre) Console.ReadLine()
End Sub
Cdigo <uente -AM
Dado %ue #os $rocedimientos Pro$ert1 no son otra cosa %ue rutinas de cdigo"
tam!i'n se #es denomina mtodos de acceso y asi!naci"n en e# argot ::P&
"entajas en el uso de propiedades
Com$ro!ada #a <aci#idad de #os cam$os de c#ase" e# #ector se estar $reguntando en
estos momentos $or %u' de!e uti#izar $ro$iedades" si en de<initi9a" su <ina#idad es #a
misma %ue #os cam$os( guardar un 9a#or en e# o!0eto&
E?isten 9arias 1 $oderosas razones" $or #as cua#es nos de!emos decantar en muchas
ocasiones" hacia e# uso de $ro$iedades& En #os siguientes a$artados haremos una
descri$cin de e##as&
78
Luis Edgar Snchez
4nstanciar # utiliDar objetos
Raremos esto mediante un e0em$#o senci##o" en $rimer #ugar 9amos a crear una a$#icacin
de conso#a 1 agregar#e una c#ase ##amada estudiante de<inida de #a siguiente manera(
Estudiante
;om!re
Curso
;ota)
;ota-
Presentarse+,( string
Promediar+, ( dou!#e
E# gr<ico anterior re$resenta una c#ase en e# estndar de mode#ado UML" donde #a c#ase se
#a muestra como un rectngu#o di9idido en tres secciones" #a $rimera re$resenta e# nom!re
de #a c#ase" #a segunda $arte de0a 9er #os cam$os o $ro$iedades $4!#icas de# o!0eto" 1 $or
4#timo #a tercera seccin re$resenta #os m'todos %ue se 9an a dise@ar en dicha c#ase" %ue
en este caso son( Presentarse 1 Promediar" donde res$ecti9amente sern <unciones %ue
de9o#9ern un string 1 un dou!#e&
Esta c#ase codi<icada en Cisua# >asic ser2a como se 9e en #a siguiente codi<icacin(
Public Class Estudiante
'Campos
Public Nombre As String
Public Curso As String
Public Nota1 As Double
Public Nota2 As Double
'Metodos
Public Sub Presentarse()
Console.Write("Hola, mi nombre es {0} y estoy en {1}", _
Nombre, Curso)
End Sub
Public Function Promediar() As Double
Dim aux As Double
aux = Nota1 + Nota2 / 2
Return aux
End Function
End Class
/#go %ue de!e destacarse es %ue e# m'todo Presentarse rea#iza una o$eracin de sa#ida" es
decir" escri!e en #a conso#a& En sistemas !ien estructurados se de!e e9itar en #o $osi!#e #as
o$eraciones de Entrada 1 Sa#ida o interaccin directa con e# usuario" a menos %ue #a c#ase
sea creada es$ec2<icamente $ara eso" $ero en nuestro caso" a# ser un e0em$#o tan senci##o se
nos $erdona esto&
79
Luis Edgar Snchez
Una 9ez creado e# dise@o" es decir" #a c#aseF $odemos comenzar a uti#izar#a +en e# su!
Main, a tra9's de instanciaciones de o!0etos !asados en #as mismas& Para esto
$rimeramente de!emos dec#arar una 9aria!#e %ue 9a a re$resentar nuestro o!0eto&
Una 9aria!#e %ue mane0e un o!0eto de una c#ase determinada se dec#ara de #a misma <orma
%ue se #o har2a con un ti$o de datos com4n" sim$#emente uti#izamos e# nom!re de #a c#ase
en #ugar de# ti$o de datos" as2 si %uisi'ramos dec#arar una 9aria!#e ##amada / de# ti$o
entera #o har2amos de #a siguiente manera(
Dim A As Integer;
Y si #o %ue %ueremos es dec#arar una 9aria!#e ##amada E) %ue mane0e un o!0eto de# ti$o
Estudiante" !asado en #a c#ase de# e0em$#o mostrado $re9iamente" #o har2amos as2(
Dim E1 As Estudiante
Ra1 dos di<erencias sustancia#es entre dec#arar una 9aria!#e ti$o o!0eto 1 otra de un ti$o de
datos !sico(
/# dec#arar una 9aria!#e de# ti$o !sico" se reser9a de manera automtica un
es$acio de memoria con #a estructura adecuada $ara #a misma" mientras %ue con #a
9aria!#e de ti$o o!0eto no sucede esto" $or #o %ue de!emos crear este es$acio de
memoria en e# momento de #a e0ecucin a tra9's de #a $a#a!ra reser9ada neE" de #a
siguiente manera(
Dim E1 As Estudiante
E1 = New Estudiante()
La asignacin de# nue9o es$acio de memoria tam!i'n se #a $uede hacer en e#
momento de #a dec#aracin de <orma directa(
Dim E1 As Estudiante = new Estudiante()
La segunda di<erencia tiene %ue 9er tam!i'n con #a <orma en %ue se gra!an en #a
memoria& Cuando rea#izamos una asignacin entre dos 9aria!#es de un ti$o !sico"
se crea una co$ia de# dato de #a una 9aria!#e en e# es$acio de #a otra 9aria!#e"
e0em$#o(
Dim B As Integer
Dim A As Integer = 3
Dim B As Integer = A
A = 2
En este e0em$#o tenemos dos zonas de memoria distintas" / 1 >F em$ezamos
co#ocando en / un 3" mientras %ue a #a siguiente #2nea > toma e# 9a#or de /" #o %ue
8!
Luis Edgar Snchez
da a #ugar a %ue e# dato" 3 en este caso" se co$ie hacia >" seguidamente se asigna a
#a 9aria!#e / e# n4mero -" #o %ue no a<ecta a >F a# <ina# > se %ueda con 3 1 / con -"
a#go as2(
3
-
Ragamos #o mismo con dos 9aria!#es de# ti$o Estudiante(
Dim A As Estudiante = New Estudiante()
Dim B As Estudiante = New Estudiante()
A.Nombre = "Mara"
B.Nombre = "Jos"
A = B
B.Nombre = "Carlos"
En #a codi<icacin creamos dos 9aria!#es" / 1 >F cada una con una instancia
di<erente de #a c#ase EstudianteF en este $unto se de!e e?$#icar %ue en #a memoria
de# com$utador" tanto en #a zona / como en #a >" rea#mente #o %ue se crea 1
a#macena es un 9a#or interno conocido como 3a$untador5" e# cua# es so#o una
re<erencia a otra zona de memoria" de ta# manera %ue cuando hacemos #a
asignacin /\ >" se co$ia #a re<erencia de memoria de > en /" ;: SE C:P/ L/
;ST/;C/ DE :>BET:" con #o %ue" #as dos zonas de memoria a$untan a#
mismo o!0eto" es decir" a# estudiante cu1o nom!re hemos $uesto 3Bos'5F as2 cuando
cam!iamos e# nom!re de Bos' a Car#os" se cam!ia en #a zona de memoria de #a
instancia de o!0eto" de ta# <orma %ue si consu#tamos des$u's de eso e# nom!re %ue
ha1 en /&;om!re" este ser2a Car#os 1 no Bos' como $udi'ramos $ensar" mientras
%ue #a instancia de Mar2a %uedar2a $erdida en #a memoria" $ero no de!emos
$reocu$arnos $or%ue una <uncin interna de CD ##amada 3=ar!age Co##ector5
+*eco#ector de !asura, se encarga de cada cierto tiem$o e#iminar #as instancias %ue
%uedan sin re<erencia desde a#guna 9aria!#e&
Luis Edgar Snchez 81
La memoria antes de #a /signacin /\ > de# e0em$#o se 9er2a re$resentada
gr<icamente de #a siguiente manera(
re<)
re<-
;om!re( Mar2a
;om!re( Bos'
Des$u's de #a asignacin /\ > ser2a(
*e<erencia a
o!0eto $erdida&
re<-
/ 1 > Racen re<erencia
a# mismo o!0eto
re<-
;om!re( Mar2a
;om!re( Bos'
Es $or eso %ue a# cam!iar e# nom!re de Bos' a Car#os en #a 9aria!#e >" sucede #o mismo
con /" $or%ue a$untan a# mismo o!0eto&
Para acceder tanto a #as $ro$iedades 1 m'todos de un o!0eto instanciado 1 re<erenciado $or
una 9aria!#e" ta# 1 como #o ha!r deducido 1a e# #ector" se #o hace a tra9's de# nom!re de #a
9aria!#e" seguida de un $unto e inmediatamente des$u's #a $ro$iedad o m'todo %ue se
%uiere uti#izar" tomando en cuenta %ue #as $ro$iedades se uti#izan ta# 1 como una 9aria!#e"
1 #os m'todos son ##amadas a su!rutinas&
E0em$#os de uti#izacin de $ro$iedades 1 m'todos(
Dim Aux As Double
Dim A As Estudiante = New Estudiante() 'instanciamos el objeto.
'Utilizacin de propiedades
A.Nombre = "Mara"
8&
A.Nota1 = Double.Parse(Console.ReadLine)
A.Nota2 = 15
Aux = A.Nota1
'utilizacin de mtodos
A.Presentarse()
Aux = A.Promediar()
Podemos 9er %ue a #as $ro$iedades de# o!0eto /" %ue es de# ti$o Estudiante" se #as $uede
uti#izar en asignaciones" #ectura de datos" 1 dems situaciones simi#ares a #as %ue
uti#izar2amos una 9aria!#e& Por otra $arte 9emos #a uti#izacin de #os m'todos Presentarse+,
1 Promediar+," uno %ue no de9ue#9e 9a#or 1 otro %ue s2" %ue se uti#iza de <orma simi#ar a
#as su!rutinas estudiadas $re9iamente&
Para una me0or a$reciacin de todo esto se muestra a continuacin e# e0em$#o de #a c#ase
Estudiantes con su uti#izacin desde e# M'todo M/; en un so#o !#o%ue de cdigo(
Module Programa
Sub Main()
Dim Aux As Double
Dim A As Estudiante = New Estudiante() 'instanciamos el objeto.
'Utilizacin de propiedades
A.Nombre = "Mara"
A.Curso = "Tercero"
Console.Write("Ingrese la primera nota del alumno:")
A.Nota1 = Double.Parse(Console.ReadLine())
A.Nota2 = 15
Aux = A.Nota1
'utilizacin de mtodos
A.Presentarse()
Aux = A.Promediar()
Console.WriteLine("Mi promedio es {0}", Aux)
Console.ReadKey()
End Sub ' fin del Main
Public Class Estudiante
'Campos
Public Nombre As String
Public Curso As String
Public Nota1 As Double
Public Nota2 As Double
'Metodos
Public Sub Presentarse()
Console.WriteLine("Hola, mi nombre es {0} y estoy en {1}", _
Nombre, Curso)
End Sub
Public Function Promediar() As Double
Dim aux As Double
aux = Nota1 + Nota2 / 2
Return aux
End Function
End Class 'fin de la clase estudiante
End Module 'fin del modulo
Algo 4nteresante
En e# siguiente e0em$#o se demuestra #a <unciona#idad %ue $uede tener #a $rogramacin
orientada a o!0etos" aun cuando se #a ha to$ado so#o de manera mu1 su$er<icia#&
8'
Camos a crear una a$#icacin de conso#a %ue $resenta o!0etos 3animados5 con
mo9imiento $ro$io en #a $anta##a" cada o!0eto $ro9eniente de #a misma c#ase $ero con
<orma 1 com$ortamientos distintos" $ara esto se uti#izan <unciona#idades de #a conso#a de
deteccin de $u#saciones de tec#as 1 de# sistema $ara e# contro# de #os tiem$os&
Co$ie #a siguiente codi<icacin en su a$#icacin de conso#a" $ru'!e#a 1 #uego ana#2ce#a&
Module Programa
Sub Main()
'Para darle un poco de aleatoriedad.
Dim r As Random = New Random(Math.Truncate(DateTime.Now.Ticks / 1000000000))
Dim a As objeto 'Objeto auxiliar para llenar la lista
'El siguiente es un Array List que contiene objetos del tipo "objeto".
Dim objetos As List(Of objeto) 'lista de objetos,
objetos = New List(Of objeto) Dim b As
ConsoleKeyInfo Console.BackgroundColor =
ConsoleColor.White Console.ForegroundColor =
ConsoleColor.Black Console.CursorVisible =
False
Console.Clear()
Console.Write("Presione <espacio> o <Enter> para aadir objetos \n cualquier tecla
para empezar ")
b = Console.ReadKey(True)
Console.Clear()
Do
If (Console.KeyAvailable) Then 'solo si se ha presionado una tecla.
b = Console.ReadKey(True)
End If
If b.Key = ConsoleKey.Spacebar Then
'cada vez que se presione espacio aade un objeto.
a = New objeto()
a.inicializa(objeto.tipoObjeto.Nave1, 0, 0, 1, 1, r.Next(500000, 1500000), "<-o->" _
, ConsoleColor.Blue)
objetos.Add(a)
'lo siguiente es para poner otro valor en el buffer de la tecla.
'para que no quede repitiendo el mismo.
b = New ConsoleKeyInfo("x", ConsoleKey.X, False, False, False)
ElseIf b.Key = ConsoleKey.Enter Then 'lo mismo pero desde otra posicion
a = New objeto()
a.inicializa(objeto.tipoObjeto.Nave1, r.Next(0, Console.WindowWidth - 5), _
r.Next(0, Console.WindowHeight - 1), 1, 1, r.Next(100000, 900000), "(*)" _
, ConsoleColor.DarkRed)
objetos.Add(a)
b = New ConsoleKeyInfo("x", ConsoleKey.X, False, False, False)
End If
For Each aux As objeto In objetos
aux.Mover()
'informacion en pantalla
Console.SetCursorPosition(0, 0) Console.ForegroundColor
= ConsoleColor.Black Console.Write("Cantidad de objetos:
{0}", objetos.Count)
Next 'fin del foreach
Loop While Not (b.Key = ConsoleKey.Escape) 'fin del do principal
End Sub
Public Class objeto
Private r As Random = New Random(Math.Truncate(DateTime.Now.Ticks / 1000000000))
Public Enum tipoObjeto 'Tipos enumerados para facilitar datos bandera.
8(
Nave1 '0
Nave2 '1
End Enum
'Propiedades -campos:
Public Tipo As tipoObjeto = tipoObjeto.Nave1
Public X As Integer = 0, Y As Integer = 0
Public UltimoMov As Long = DateTime.Now.Ticks
Public velocidad As Long = 1000000
Public Dirx As Integer = 1, DirY As Integer = 1, _
MovX As Integer = 1, MovY As Integer = 1
Public Forma As String = "xxx"
Public Color As ConsoleColor = ConsoleColor.Black
'Metodos
Public Sub Mover()
If ((UltimoMov + velocidad) <= DateTime.Now.Ticks) Then
'Demos un poco de aleatoriedad al movimiento
'10% de probabilidad.
If (r.Next(0, 100) > 90) Then Dirx *= -1
'2% de porbabilidad.
If (r.Next(0, 100) > 98) Then DirY *= -1
'comprobar si el objeto topa o se pasa de un borde de la consola.
If (Dirx = 1 And X + Forma.Length >= Console.WindowWidth) Then Dirx = -1
If (Dirx = -1 And X <= 0) Then Dirx = 1
If (DirY = 1 And Y + 1 >= Console.WindowHeight) Then DirY = -1
If (DirY = -1 And Y <= 0) Then DirY = 1
'Borrar el objeto de su posicion anterior
Borra(Forma)
'nuevos datos para el objeto.
X += (MovX * Dirx)
Y += (MovY * DirY)
UltimoMov = DateTime.Now.Ticks 'setear cuando fue ultimo movimiento.
'poner el objeto en la nueva posicion
Dibuja(Forma)
End If
End Sub
Public Sub Borra(ByVal Figura As String)
Dim aux As String = ""
Console.SetCursorPosition(X, Y)
Console.Write(aux.PadLeft(Figura.Length, " "))
End Sub
Public Sub Dibuja(ByVal figura As String)
Console.SetCursorPosition(X, Y)
Console.ForegroundColor= Color
Console.Write(figura)
End Sub
Public Sub inicializa(ByVal pTipo As tipoObjeto, ByVal pX As Integer, ByVal pY As Integer _
, ByVal pDirX As Integer, ByVal pDirY As Integer, ByVal pVelocidad As Integer _
, ByVal pForma As String, ByVal pColor As ConsoleColor)
Tipo = pTipo
X = pX
Y = pY
Dirx = pDirX
DirY = pDirY
velocidad = pVelocidad
Forma = pForma
Color = pColor
End Sub
End Class
End Module 'fin del modulo
Luis Edgar Snchez 8+
Taller %.*$
< Uti#ice Cisua# >asic" en modo conso#a o ser9icio de NindoEs" $ara reso#9er #os
siguientes $ro!#emas(
a, En codi<icacin de C>" dise@e una c#ase ##amada :!rero" en #a %ue se uti#icen
#as $ro$iedades-cam$os( ;om!re" Cargo" Sue#do" e inc#u1a un m'todo ##amado
>oni<icacin+, %ue de9ue#9e e# 9a#or de un !ono %ue reci!ir2a e# o!rero
de$endiendo de# cargo %ue ocu$a de #a siguiente manera( Si e# cargo es
3/<anador5" reci!ir un !ono %ue corres$onde a# )A] de su sue#do 1 si se trata
de un 3Su$er9isor5 e# !ono ser de# )J] de su sue#do& /dems rea#ice un
e0em$#o de #a uti#izacin de un o!0eto instanciado a $artir de esta c#ase dentro
de# su! Main&
!, En codi<icacin de C> rea#ice un e0em$#o in'dito de dise@o de una c#ase 1 su
uti#izacin dentro de# su! Main&
8,
Tema &.+: .ontrol de errores
Luis Edgar Snchez
-rrores8 ese mal com?n
Di<2ci# es" $or no decir im$osi!#e" encontrar a# $rogramador %ue no tenga errores en su
cdigo&
Por mucho cuidado %ue $ongamos a# codi<icar nuestras a$#icaciones" #os errores de
e0ecucin sern ese incmodo" $ero ine9ita!#e com$a@ero de 9ia0e %ue seguir a
nuestros $rogramas a## donde estos 9a1an&
-rrores # e3cepciones
Dentro de# es%uema de gestin de errores de# entorno &;ET FrameEorH" encontramos #as
<iguras de# error 1 #a e?ce$cin& Estos e#ementos son uti#izados indistintamente en muchas
ocasiones $ara hacer re<erencia gen'rica a #os errores $roducidosF sin em!argo" aun%ue
com$#ementarios" cada uno tiene su $ro$ia <unciona#idad dentro de# $roceso de tratamiento
de un error&
Q -rror& Un error es un e9ento %ue se $roduce durante e# <uncionamiento de un
$rograma" $ro9ocando una interru$cin en su <#u0o de e0ecucin& /# $roducirse esta
situacin" e# error genera un o!0eto e?ce$cin&
Q -3cepcin& Una e?ce$cin es un o!0eto generado $or un error" %ue contiene
in<ormacin so!re #as caracter2sticas de# error %ue se ha $roducido&
Manipuladores de e3cepciones
Un mani$u#ador de e?ce$cin es un !#o%ue de cdigo %ue $ro$orciona una res$uesta a#
error %ue se ha $roducido" 1 %ue se inc#u1e en una estructura $ro$orcionada $or e#
#engua0e a ta# e<ecto" es decir" $ara #a ca$tura de e?ce$ciones&
Manipulacin estructurada de errores
En este ti$o de tratamiento" cada 9ez %ue se $roduce un error" se genera un o!0eto
de #a c#ase E?ce$tion o a#guna de sus deri9adas" conteniendo #a in<ormacin de# error
ocurrido& La manera de ca$turar este ti$o de o!0etos $asa $or uti#izar una estructura de
contro# de# #engua0e" $ro$orcionada $ara esta <ina#idad&
La estructura Tr#...-nd Tr#
Esta estructura de contro# de# #engua0e" $ro$orciona e# medio $ara de<inir un !#o%ue de
87
Luis Edgar Snchez
cdigo sensi!#e a errores" 1 #os corres$ondientes mani$u#adores de e?ce$ciones" en
<uncin de# ti$o de error $roducido& E# Cdigo <uente 3PA muestra su sinta?is&
Try
`cdigo que puede provocar errores
' ....
' ....
[Catch [Excepcion [As TipoExcepcionA]] [When Expresin]
' respuesta a error de tipo A
' ....
' .... [Exit Try]
[Catch [Excepcion [As TipoExcepcionN]] [When Expresin]
' respuesta a error de tipo N
' ....
' .... [Exit Try]
]
[Finally]
' cdigo posterior al control de errores
' ....
' ....
End Try
Cdigo <uente 3PA
/na#icemos con deta##e #os $rinci$a#es e#ementos de esta estructura&
En $rimer #ugar nos encontramos con su dec#aracin mediante #a $a#a!ra c#a9e Tr1&
Todo e# cdigo %ue escri!imos a $artir de dicha $a#a!ra c#a9e" 1 hasta #a $rimera
sentencia Catch" es e# cdigo %ue de<inimos como sensi!#e a errores" o dicho de otro
modo" e# !#o%ue de instrucciones so!re #as %ue deseamos %ue se acti9e e# contro# de
errores cuando se $roduzca a#g4n <a##o en su e0ecucin&
/ continuacin" esta!#ecemos cada uno de #os mani$u#adores de e?ce$cin mediante #a
$a#a!ra c#a9e Catch& Bunto a esta $a#a!ra c#a9e" situaremos de <orma o$ciona#" un
identi<icador %ue contendr e# o!0eto con #a e?ce$cin generada& Fina#mente" 1 tam!i'n
de modo o$ciona#" con #a $a#a!ra c#a9e Nhen" es$eci<icaremos una condicin $ara #a
ca$tura de# o!0eto de e?ce$cin& Podemos escri!ir uno o 9arios mani$u#adores Catch
dentro de una estructura de contro# Tr1&&&End Tr1&
Cada 9ez %ue se $roduzca un error" e# <#u0o de #a e0ecucin sa#tar a #a sentencia Catch ms
acorde con e# ti$o de e?ce$cin generada $or e# error" siem$re 1 cuando ha1amos situado
9arios mani$u#adores de e?ce$ciones en e# contro#ador de errores&
Ta# 1 como aca!a de 9er e# #ector en #a sinta?is de #a estructura Tr1&&&End Tr1" es $osi!#e
uti#izar Catch de un modo gen'rico" es decir" sin esta!#ecer %u' ti$o de e?ce$cin se ha
$roducido& Este es e# ti$o de contro# de errores ms senci##o %ue $odemos im$#ementar"
aun%ue tam!i'n e# ms #imitado" 1a %ue s#o $odemos tener un mani$u#ador de
Luis Edgar Snchez 88
e?ce$ciones& Ceamos un e0em$#o en e# Cdigo <uente 3P)&
Public Sub Main()
Dim sValor As String
Dim iNumero As Integer
Try
' comienza el control de errores
Console.WriteLine("Introducir un nmero")
sValor = Console.ReadLine()
' si no hemos introducido un nmero...
iNumero = sValor ' ...aqu se producir un error...
' ...y no llegaremos a esta parte del cdigo
iNumero = iNumero + 1000
Catch
' si se produce un error, se genera una excepcin
' que capturamos en este bloque de cdigo
' manipulador de excepcin, definido por Catch
Console.WriteLine("Error al introducir el nmero" & _ ControlChars.CrLf & _
"El valor {0} es incorrecto", sValor)
End Try
' resto del cdigo del procedimiento
' .... Console.ReadLine()
End Sub
Cdigo <uente 3P)
Tanto si se $roduce un error como si no" #a sentencia Fina##1 de #a estructura
Tr1&&&End Tr1" nos $ermite escri!ir un !#o%ue de cdigo %ue ser e0ecutado a# darse una
condicin de error" o !a0o e0ecucin norma# de# $rocedimiento&
E# Cdigo <uente 3P- muestra e# mismo e0em$#o anterior" $ero introduciendo un
!#o%ue Fina##1& Prue!e e# #ector a#ternati9amente" a <orzar un error" 1 a e0ecutar sin errores
este <uenteF en am!os casos 9er %ue e# !#o%ue Fina##1 es e0ecutado& Para com$#etar e#
e0em$#o" tras #a estructura Tr1&&&End Tr1 se han escrito 9arias #2neas de cdigo
$otencia#mente $ro!#emticasF en e# caso de %ue se $roduzca un error" #a e0ecucin ser
cance#ada" a# no estar dichas #2neas situadas en un contro#ador de errores&
Public Sub Main()
Dim sValor As String
Dim iNumero As Integer
Try
' comienza el control de errores
Console.WriteLine("Introducir un nmero")
sValor = Console.ReadLine()
' si no hemos introducido un nmero...
iNumero = sValor ' ...aqu se producir un error...
' ...y no llegaremos a esta parte del cdigo
iNumero = iNumero + 1000
89
Luis Edgar Snchez
Catch
' si se produce un error, se genera una excepcin
' que capturamos en este bloque de cdigo
' manipulador de excepcin, definido por Catch
Console.WriteLine("Error al introducir el nmero" & _ ControlChars.CrLf & _
"El valor {0} es incorrecto",sValor)
Finally
' si se produce un error, despus de Catch se ejecuta este bloque;
' si no se produce error, despus de Try tambin se ejecuta
Console.WriteLine("El controlador de errores ha finalizado")
End Try
' resto del cdigo del procedimiento
Dim dtFecha As Date Console.WriteLine("Introducir una fecha")
' si ahora se produce un error,
' al no disponer de una estructura para controlarlo
' se cancelar la ejecucin dtFecha =
Console.ReadLine() Console.WriteLine("La
fecha es {0}", dtFecha) Console.ReadLine()
End Sub
Cdigo <uente 3P-
La clase -3ception
Como hemos e?$#icado en anteriores a$artados" cada 9ez %ue se $roduce un error" e#
entorno de e0ecucin genera una e?ce$cin con #a in<ormacin de# error acaecido&
Para <aci#itarnos #a tarea de mani$u#acin de #a e?ce$cin $roducida" en un contro#ador de
e?ce$ciones o!tenemos un o!0eto de #a c#ase E?ce$tion" o de a#guna de sus deri9adas" de
<orma %ue" a tra9's de sus miem!ros" $odemos sa!er %u' ha $asado& Entre #as $ro$iedades
1 m'todos %ue $odemos uti#izar" se encuentran #as siguientes&
Q Message& Descri$cin de# error&
Q Aource& ;om!re de# o!0eto o a$#icacin %ue $ro9oc e# error&
Q Atac=Trace& *uta o traza de# cdigo en #a %ue se $rodu0o e# error&
Q ToAtring1 2& De9ue#9e una cadena con in<ormacin deta##ada de# error& En esta
cadena $odemos encontrar tam!i'n" #os 9a#ores o!tenidos de #as $ro$iedades anterioresF
$or #o %ue e# uso de este m'todo" en muchas ocasiones ser e# modo ms recomenda!#e
$ara o!tener #os datos de #a e?ce$cin&
Podemos o!tener e# o!0eto de e?ce$cin creado a $artir de un error" uti#izando #a sentencia
Catch de #a estructura Tr1& Para e##o" a continuacin de Catch" escri!imos e# nom!re de un
identi<icador" de<ini'ndo#o como ti$o E?ce$tion o a#guno de #os ti$os de su 0erar%u2a&
E# Cdigo <uente 3P3 muestra #a ca$tura de #a e?ce$cin en e# e0em$#o anterior" dentro de
#a sentencia Catch" $ero en este caso uti#izando un o!0eto E?ce$tion& E# resto de# cdigo es
igua# %ue e# anterior e0em$#o&
Luis Edgar Snchez 9!
' .... Try
' ....
' ....
Catch oExcep As Exception
' si se produce un error, se crea un objeto excepcin
' que capturamos volcndolo a un identificador
' de tipo Exception
Console.WriteLine("Se produjo un error. Informacin de la excepcin")
Console.WriteLine("================================================")
Console.WriteLine("Message: {0}", oExcep.Message)
Console.WriteLine()
Console.WriteLine("Source: {0}", oExcep.Source) Console.WriteLine()
Console.WriteLine("StackTrace: {0}", oExcep.StackTrace)
Console.WriteLine()
Console.WriteLine(oExcep.ToString())
Finally
' ....
' .... End Try
' ....
Cdigo <uente 3P3
E# Cdigo <uente 3P. contiene una $e%ue@a muestra de #os 9a#ores o!tenidos a
$artir de #as $ro$iedades Message" Source 1 StacHTrace" tras #a e0ecucin de# <uente
anterior&
Message: Cast from String ('hola') to Integer is not valid.
Source: Microsoft.VisualBasic
StackTrace: at Microsoft.VisualBasic.Helpers.IntegerType.FromString(String
Value)
at ErroresPru.Module1.Main() in
K:\CursoVBNET\Texto\t16Errores\ErroresPru\Module1.vb:line 12
Cdigo <uente 3P.
E?ce$tion re$resenta #a c#ase !ase en #a 0erar%u2a de ti$os de e?ce$cin %ue se $ueden
$roducir dentro de# entorno de e0ecucin&
Partiendo de E?ce$tion" dis$onemos de un con0unto de c#ases deri9adas" %ue nos $ermiten
un tratamiento ms $articu#ar de# error $roducido" como /$$#icationE?ce$tion"
:E?ce$tion" S1stemE?ce$tion" etc& Cada una de e##as $uede tener" adems de #os
miem!ros genera#es de E?ce$tion" una serie de m'todos 1 $ro$iedades $articu#ares de su
ti$o de e?ce$cinF $or e##o" #o ms con9eniente" ser uti#izar estas c#ases" a tra9's de #as
%ue $odremos a9eriguar ms deta##es so!re e# $ro!#ema $roducido&
Fuente( >L/;C:" Luis Migue# V 3Programacin en Cisua# >asic &;ET5
91 Luis Edgar Snchez
UNIDAD )
&ro+ectos ,indo-s .orm.
9&
ACTIVIDADES DE ASIMILACIN E!T"ACLASE
Acti#idad ).1$
< Otilizando entorno @indoLs !ise6e un formulario que permita crear un
archivo con los datos de un estudiante, para manipular los elementos y
comportamientos del ob0eto estudiante dise6e una clase de acuerdo
como se define en el siguiente diagrama O(L
Estudiante
;om!re
Curso
;ota)
;ota-
;ota3
Promedio+, ( dou!#e
Estado+,( string
#l formulario debe permitir el ingreso de todos los campos, tal y como
figura en el diagrama, y utilizar los mtodos respectivos para calcular el
promedio de los estudiantes, as como su #stado 5'probado o
$eprobado2 tomando como nota base para ser aprobado <RA?9
)ncluya un botn I&enerar )nformeJ que grabe un archivo de te"to con
un informe que incluya todos los datos del estudiante, los ingresados y
los calculados
? $ealice un informe donde quede e"plicado claramente cada parte del
programa, esto es/ dise6o del formulario 5capturas de pantallas2,
nombres de los controles, codificacin de la clase, codificacin de los
eventos del formulario y resultados obtenidos Presntelo en un
documento impreso al facilitador
9'
Tema '.1: /na Aplicacin Aencilla en entorno Bindo<s 0orm
4ntegrando lo %isto *asta el momento
Los e0em$#os de #os temas anteriores constitu1en un !uen comienzo" 1 nos han $ermitido
dar nuestros $rimeros $asos tanto con e# #engua0e como con e# DE" $ero
e9identemente" no nos 9an a ##e9ar mu1 #e0os si #o %ue $retendemos es crear a$#icaciones
con a#go ms de contenido&
/n programa m@s operati%o
En este tema 9amos a escri!ir una a$#icacin a#go ms com$#eta" %ue consistir en un
<ormu#ario en e# %ue introduciremos e# nom!re de un <ichero 1 un $e%ue@o te?to" %ue
seguidamente gra!aremos en nuestro e%ui$o& /s2 %ue" una 9ez es!ozado e# o!0eti9o a
conseguir&&& manos a #a o!ra&
6ise>o del 0ormulario
Des$u's de iniciar CS&;ET" crearemos un nue9o $ro1ecto a# %ue daremos e# nom!re de
EscritorTe?to +$ara acceder a EscritorTe?to" e# $ro1ecto de este e0em$#o" hacer
c#ica %u2 ,& En e# <ormu#ario de# $ro1ecto" Form)" a@adiremos #os contro#es %ue
$ermitirn a# usuario escri!ir un te?to" gra!ar dicho te?to en un <ichero" etc& En
concreto a@adiremos dos contro#es La!e#" dos Te?t>o? 1 dos >utton" cu1a u!icacin en
#a 9entana de# Cuadro de herramientas mostramos en #a Figura L)&
9(
Figura L)& Contro#es %ue de!emos di!u0ar en e# <ormu#ario de# e0em$#o&
La <orma de di!u0ar un contro# en un <ormu#ario 1a ha sido e?$#icada anteriormente" $or
#o %ue directamente mostramos en #a Figura L-" e# <ormu#ario resu#tante con #os contro#es
1a insertados" en donde indicamos e# ti$o de contro# 1 e# nom!re %ue hemos asignado a
cada contro# en su $ro$iedad ;ame&
Figura L-& Formu#ario $ara #a gra!acin de un te?to en un <ichero&
/ continuacin deta##amos !re9emente #a <unciona#idad de cada uno de #os
contro#es de este <ormu#ario(
Q Label18 Label&& Muestran un sim$#e #itera# %ue indica a# usuario #o %ue de!e
introducir en #os contro#es de te?to&
Q t3t:ombre;ic*ero& Contiene e# nom!re %ue daremos a# <ichero en e# %ue
gra!aremos e# te?to&
Q t3tTe3to& Contiene e# te?to %ue se 9a a guardar en un <ichero& La di<erencia de
este contro#" con e# otro contro# de ti$o Te?t>o? de# <ormu#ario" reside en %ue
$ermite escri!ir 9arias #2neas de te?to" gracias a %ue hemos asignado a su
$ro$iedad Mu#ti#ine e# 9a#or True& La $ro$iedad Mu#ti#ine $or de<ecto contiene
Fa#se" #o %ue indica %ue un Te?t>o? s#o $ermite introducir e# te?to en una 4nica
#2nea&
Q btnErabar& /# $u#sar este !otn" se tomar e# te?to de# contro# t?tTe?to 1 se
gra!ar en un <ichero con e# nom!re %ue contenga e# contro# t?t;om!reFichero&
Ceremos como escri!ir e# cdigo $ara un contro# ms ade#ante&
Q btnAalir& /# $u#sar este !otn" se <ina#izar #a e0ecucin de# $rograma" de igua#
<orma %ue si $u#sramos e# !otn de cierre de# <ormu#ario o Z/LT7F.[&
:!ser9e e# #ector %ue a# asignar e# nom!re de a#gunos contro#es" hemos uti#izado un
9+
$re<i0o& /s2" $ara un Te?t>o? uti#izamos e# $re<i0o t?t +t?t;om!reContro#,F $ara un
>utton" !tn +!tn;om!reContro#," etc&
Esta t'cnica" denominada convenciones de notaci"n" consiste en una serie de normas no
o!#igatorias" uti#izadas a #a hora de escri!ir e# cdigo" 1 %ue son $actadas genera#mente
en e%ui$os de tra!a0o" de manera %ue cuando un $rogramador de!e tomar $arte de un
$ro1ecto %ue ha estado desarro##ando otro $rogramador" #a inter$retacin de# cdigo se
<aci#ita" 1 e# desarro##o de# $ro1ecto en este sentido" se dinamiza&
E# $rogramador inde$endiente $uede igua#mente uti#izar este ti$o de con9enciones" 1a
%ue gran $arte de# cdigo <uente %ue circu#a en art2cu#os" demos" a$#icaciones shareEare"
etc&" em$#ean una serie de con9enciones gen'ricas de notacin" $or #o %ue si necesita en
a#g4n momento com$artir su cdigo" #a #egi!i#idad de# mismo se <aci#ita&
La Ta!#a . muestra una serie de con9enciones $ara #a codi<icacin de #os nom!res de
contro#es" %ue $ro$onemos como e0em$#o" $ara %ue e# #ector uti#ice estas o a#guna
simi#ar&
.ontrol re0ijo
La!e# #!#
>utton !tn
Te?t>o? t?t
ChecH>o? chH
List>o? #st
Com!o>o? c!o
*adio>utton r!t
MainMenu Mnu
=rou$>o? gr$
MainMenu
Conte?tMenu
mnu
FontDia#og
Co#orDia#og
1 dems
contro#es de ca0a
di#ogo
d#g
Ta!#a .& Con9enciones de notacin $ara contro#es de <ormu#ario&
Para e# <ormu#ario $odemos uti#izar e# $re<i0o <rm&
Luis Edgar Snchez 9,
.ontroles # e%entos
NindoEs es un sistema !asado en e9entos& Esto %uiere decir %ue cua#%uier cosa %ue
ocurra dentro de un <ormu#ario" !ien so!re e# $ro$io <ormu#ario" o a cua#%uiera de #os
contro#es %ue #o com$onen" se detecta a tra9's de un suceso o e9ento( $asar e# ratn
so!re un contro#" hacer c#ic" escri!ir en un contro# de te?to" cerrar e# <ormu#ario"
redimensionar#o" etc& Cua#%uier accin de este ti$o $ro9oca e# e9ento corres$ondiente&
En nuestro e0em$#o actua#" si e0ecutamos e# $rograma 1 hacemos c#ic so!re a#guno de #os
!otones de# <ormu#ario" no ocurrir nada en a!so#uto& XOuiere esto decir %ue #os !otones
no tienen e9entosY" #a res$uesta es no" #os !otones s2 tienen e9entos" as2 como #os
dems contro#es" 1 aun%ue no #o $erci!amos" se estn $roduciendo constantemente" #o
%ue sucede" es %ue una 9ez %ue di!u0amos un contro# en un <ormu#ario" dicho contro#
inicia#mente no est $rogramado $ara res$onder a #os e9entos" $or #o %ue de!emos
escri!ir e# cdigo $ara e# e9ento corres$ondiente" en res$uesta a #a accin de# usuario&
Siguiendo con #os !otones de# <ormu#ario" 9amos a e#egir e# ms senci##o de codi<icar"
!tnSa#ir& Para escri!ir e# cdigo de# e9ento corres$ondiente a #a $u#sacin de este contro#"
#a <orma mas r$ida es haciendo do!#e c#ic so!re '# en e# dise@ador de# <ormu#ario" #o %ue
a!rir e# editor de cdigo 1 nos situar en un $rocedimiento 9ac2o %ue mostramos en e#
Cdigo <uente -3&
Private Sub btnSalir_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles btnSalir.Click
End Sub
Cdigo <uente -3& Procedimiento $ara e# e9ento C#icH de un >utton&
Se trata de un $rocedimiento cu1o nom!re" !tnSa#ir^C#icH" com$uesto de# nom!re de#
contro# 1 de# e9ento" #o $ro$orciona automticamente e# DE& *eci!e dos $armetros(
sender 1 e" con in<ormacin adiciona# $ro$orcionada $or e# entorno& Pero #o
9erdaderamente im$ortante est a# <ina# de #a dec#aracin( 3Rand#es !tnSa#ir&C#icH5& La
$a#a!ra c#a9e Rand#es" seguida de# nom!re de un contro#" un $unto 1 e# nom!re de un
e9ento de ese contro#" #e indica a# entorno de &;ET FrameEorH %ue de!e e0ecutar este
$rocedimiento cuando se $roduzca e# e9ento $ara ese contro#& ;o rea#izaremos en este
momento una e?$#icacin ms deta##ada $uesto %ue trataremos este as$ecto con ms
$ro<undidad en temas $osteriores de# te?to&
Este $rocedimiento ser e0ecutado cada 9ez %ue $u#semos e# contro# !tnSa#ir" $or #o %ue
si en ta# situacin" %ueremos cerrar e# <ormu#ario" s#o ser necesario inc#uir #a #2nea de
cdigo mostrada en e# Cdigo <uente -.&
Private Sub btnSalir_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnSalir.Click
' cerrar el formulario
Me.Close()
End Sub
97 Luis Edgar Snchez
Cdigo <uente -.& Cdigo de# e9ento C#icH $ara cerrar un <ormu#ario&
E# m'todo C#ose+ , de# <ormu#ario" $roduce su cierre" 1 $or ende" #a <ina#izacin de#
$rograma& E# e<ecto es e# mismo %ue si $u#samos e# !otn de cierre de# <ormu#ario o #a
com!inacin Z/LT7F.[& La $a#a!ra c#a9e Me indica %ue estamos haciendo usando una
$ro$iedad o m'todo de# <ormu#ario desde e# interior de #a c#ase de# $ro$io <ormu#arioF
esta $a#a!ra c#a9e ser e?$#icada con ms deta##e en e# tema dedicado a #a $rogramacin
orientada a o!0eto&
/hora nos <ormu#aremos una interesante cuestin( -XY $or %u' sa!2a CS&;ET cu# e9ento
%uer2a codi<icar 1 me #o ha mostrado directamenteY-& Pues senci##amente" CS&;ET no #o
sa!2a" #o %ue sucede es %ue cuando hacemos do!#e c#ic so!re un contro# en e# dise@ador
de# <ormu#ario" se a!re e# editor de cdigo 1 nos sit4a en e# e9ento $or de<ecto de# contro#&
Y sucede %ue e# e9ento $or de<ecto de un contro# >utton es C#icH+ ,&
$tro modo de escribir el cdigo de un e%ento
En e# a$artado anterior hemos mostrado e# medio ms <ci# 1 r$ido $ara escri!ir e#
cdigo de un e9ento& Sin em!argo" e?iste otra <orma de rea#izar esta o$eracin" 1a %ue en
muchas ocasiones tendremos %ue codi<icar un e9ento distinto a# e9ento $or de<ecto de un
contro# o <ormu#ario" 1 en ese caso de!eremos se#eccionar#o manua#mente& Ceamos #os
$asos a rea#izar cuando se $#antee dicha situacin&
En e# <ormu#ario tenemos toda92a $endiente de codi<icar e# !otn !tn=ra!ar& Lo %ue
necesitamos %ue haga este !otn" es gra!ar e# te?to escrito en e# contro# t?tTe?to" en un
<ichero a# %ue daremos como nom!re e# 9a#or %ue se ha1a escrito en e# contro#
t?t;om!reFichero&
Primeramente de!emos acceder a# editor de cdigo de# <ormu#ario" 1 a!rir #a #ista
des$#ega!#e ,ombre de clase" situada en #a $arte su$erior iz%uierda& Cer Figura L3&
Esta #ista muestra e# nom!re de# <ormu#ario 1 #os contro#es %ue hemos inc#uido en '#" o
dicho de otro modo" todos #os o!0etos de# <ormu#ario" teniendo en cuenta %ue e# $ro$io
<ormu#ario tam!i'n es un o!0eto&
Se#eccionaremos e# contro# $ara e# %ue 9amos a codi<icar un e9ento( !tn=ra!ar" 1 a
continuacin a!riremos #a #ista des$#ega!#e ,ombre de mtodo" situada esta 9ez en #a
$arte su$erior derecha de# editor de cdigo& Cer Figura L.&
Luis Edgar Snchez 98
Figura L3& Editor de cdigo mostrando #a #ista de nom!res de c#ases&
Figura L.& Editor de cdigo mostrando #a #ista de m'todos&
Esta #ista muestra todos #os e9entos %ue $odemos codi<icar $ara e# contro# %ue hemos
se#eccionado en e# <ormu#ario& /# se#eccionar e# e9ento C#icH+ ," se mostrar #a
dec#aracin de dicho $rocedimiento de e9ento 9ac2a $ara escri!ir #as acciones descritas
anteriormente&
Erabando te3to en un 0ic*ero
Una 9ez se#eccionado e# $rocedimiento de e9ento $ara e# !otn !tnSa#ir" escri!iremos #as
#2neas mostradas en e# Cdigo <uente -J %ue comentaremos deta##adamente&
99
Luis Edgar Snchez
' poner esta declaracin al comienzo del fichero de cdigo
Imports System.IO
'....
Private Sub btnGrabar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnGrabar.Click
' declarar una variable para la escritura
' de texto en un fichero
Dim oEscritor As StreamWriter
' crear un fichero de texto vaco
' y obtener un objeto StreamWriter
' para escribir en el fichero
oEscritor = File.CreateText(Environment.CurrentDirectory & "\" &
Me.txtNombreFichero.Text & ".TXT")
' escribir en el fichero el contenido del
' control
TextBox oEscritor.Write(Me.txtTexto.Text)
' cerrar el objeto, lo que cierra tambin el
' fichero, y eliminar el objeto
oEscritor.Close()
oEscritor = Nothing
End Sub
Cdigo <uente -J& E9ento C#icH+, de# !otn !tn=ra!ar&
En $rimer #ugar dec#aramos #a 9aria!#e oEscritor de ti$o StreamNriter& Este ti$o de
o!0etos nos $ermitirn rea#izar #a escritura de un <#u0o +stream, de caracteres so!re un
<ichero de# disco& Como 9emos en e# cdigo <uente" $ara $oder uti#izar o!0etos de #a c#ase
StreamNriter" tenemos %ue $oner a# comienzo de# <ichero de cdigo #a instruccin $ara
im$ortar e# es$acio de nom!res S1stem&:" %ue contiene esta c#ase&
/ continuacin" 9amos a crear un <ichero de te?to en nuestro disco duro" en #a misma
ruta en #a %ue se est e0ecutando #a a$#icacin& Esto #o conseguimos ##amando a# m'todo
com$artido CreateTe?t+ ," de# o!0eto Fi#e +o!ser9e e# #ector %ue a# ser un m'todo
com$artido no necesitamos instanciar un o!0eto de #a c#ase Fi#e 1 $asar#o a una 9aria!#e,&
E# m'todo CreateTe?t+ , reci!e como $armetro una cadena de caracteres con #a ruta 1 e#
nom!re de# <ichero a crear& Para com$oner esta ruta uti#izamos $or un #ado e# o!0eto
En9ironment 1 su $ro$iedad com$artida CurrentDirector1 %ue de9ue#9e #a ruta de#
directorio actua# en donde se est e0ecutando #a a$#icacin" 1 $or otro #ado #a $ro$iedad
Te?t de# contro# t?t;om!reFichero" %ue contiene e# 9a#or %ue e# usuario ha1a escrito en
dicho Te?t>o?& Estos dos e#ementos #os unimos" <ormando una so#a cadena" mediante e#
o$erador de concatenacin de C>( T&
La ##amada a CreateTe?t+ , de9ue#9e un o!0eto de ti$o StreamNriter" %ue de$ositamos en
#a 9aria!#e oEscritor" con #o %ue 1a tenemos en #a 9aria!#e un o!0eto $ara escri!ir te?to&
1!! Luis Edgar Snchez
E# siguiente $aso consiste en ##amar a# m'todo Nrite+ , de oEscritor 1 $asar#e como
$armetro #a $ro$iedad Te?t de# contro# t?tTe?to" %ue contiene e# te?to escrito $or e#
usuario& Este te?to es gra!ado en e# <ichero&
Para <ina#izar" cerramos e# o!0eto oEscritor ##amando a su m'todo C#ose+ , 1 #e
asignamos #a $a#a!ra c#a9e ;othing $ara #i!erar #os recursos de# sistema %ue $udiera estar
uti#izando&
:!ser9e e# #ector" como e# <ormato de mani$u#acin de o!0etos se !asa en #a 9aria!#e %ue
contiene e# o!0eto o e# $ro$io nom!re de# o!0eto +si es com$artido," un $unto 1 e#
nom!re de# m'todo a ##amar o $ro$iedad de #a %ue recu$eramos o a #a
%ue asignamos un 9a#or" ta# 1 como muestra de <orma es%uemtica e# Cdigo <uente
-L&
X objetos instanciados
'---------------------
oVar.Propiedad = valor ' asignar valor a propiedad variable = oVar.Propiedad
' recuperar valor de propiedad
oVar.Metodo([ListaParametros]) ' llamar a mtodo
variable = oVar.Metodo([ListaParametros]) ' llamar a mtodo y recuperar valor
X objetos compartidos
'---------------------
Objeto.Propiedad = valor ' asignar valor a propiedad variable =
Objeto.Propiedad ' recuperar valor de propiedad
Objeto.Metodo([ListaParametros]) ' llamar a mtodo
Variable = Objeto.Metodo([ListaParametros]) ' llamar a mtodo y recuperar valor
Cdigo <uente -L& Modos de mani$u#acin $ro$iedades 1 m'todos de o!0etos&
Ya s#o %ueda e0ecutar e# $rograma" escri!ir 9a#ores en #os contro#es" 1 generar e# <ichero
de te?to $ara com$ro!ar %ue todo <unciona correctamente" con e##o ha!remos conseguido
crear un $rograma %ue tenga una a$#icacin a#go ms $rctica %ue e# t2$ico ho#a mundo&
/na puntualiDacin sobre los e%entos
En un a$artado anterior hemos e?$#icado %ue si $u#s!amos so!re un nue9o contro#
>utton" este no rea#iza!a ninguna accin $or%ue no ha!2amos codi<icado toda92a su
e9ento corres$ondiente& Esto $uede dar #ugar a con<usiones" si $or e0em$#o" a# e0ecutar
un $rograma" en e# caso de un <ormu#ario" $u#samos su !otn de cierre" #o
redimensionamos" etc&F o en e# caso de una #ista des$#ega!#e" $u#samos so!re e# !otn %ue
a!re #a #ista de 9a#ores&
XPor %u' e# <ormu#ario 1 contro#es res$onden a esos e9entos si e# $rogramador no ha
escrito cdigo $ara e##osY& >ien" en este caso estamos ante unos e9entos %ue e#
$rogramador" en $rinci$io" no necesita codi<icar" 1a %ue <orman $arte intr2nseca de#
sistema o$erati9o" siendo e# $ro$io sistema e# %ue se ocu$a de %ue e# <ormu#ario o
contro# se com$orten de acuerdo con ta#es e9entos&
Fuente( >L/;C:" Luis Migue# V 3Programacin en Cisua# >asic &;ET5
Luis Edgar Snchez 1!1
Tema '.&: ;ormularios # controles comunes.
Taller ).1$
< En un $ro1ecto NindoEs <orms cree un <ormu#ario %ue uti#ice una c#ase ##amada
3Li!ro5 $ara ingresar #os datos de una o!ra" ta#es como( Titu#o" /utor" descri$cin"
edicin" $recio& Y %ue guarde #os datos en un archi9o de te?to mediante un m'todo
3/#macenar5 de<inido en #a c#ase" %ue reci!a como $armetro e# nom!re %ue se
desea $oner a# archi9o&
Dentro de Cisua# Studio" #as 9entanas c#sicas NindoEs" reci!en #a denominacin de
NindoEs Forms" o NinForms" $ara di<erenciar#as de #os <ormu#arios Ne! o Ne!Forms"
%ue son #os %ue se e0ecutan en $ginas /SP&;ET&
A#stem.Bindo<s.;orms
Este es$acio de nom!res contiene todos #os ti$os de# entorno" a tra9's de #os cua#es
$odremos desarro##ar a$#icaciones com$uestas $or <ormu#arios NindoEs" 0unto a #os
corres$ondientes contro#es %ue $ermiten a# usuario #a interaccin con e# $rograma&
E# con0unto de c#ases" estructuras" enumeraciones" etc&" de S1stem&NindoEs&Forms"
$ermiten #a creacin de a$#icaciones NindoEs" !asadas en e# nue9o motor de generacin
de <ormu#arios +Form Engine," ms $otente 1 9ersti# %ue e# dis$oni!#e en anteriores
9ersiones de C>&
La clase ;orm
Esta c#ase contiene todos #os miem!ros $ara #a creacin 1 mani$u#acin de <ormu#arios&
Tras instanciar un o!0eto de Form" mediante #a con<iguracin de #as adecuadas
$ro$iedades" $odemos crear <ormu#arios estndar" de di#ogo" de inter<az m4#ti$#e o MD"
con di<erentes !ordes" etc&
.reacin de un 0ormulario b@sico
Comenzaremos creando una a$#icacin !asada s#o en un <ormu#ario" $ara re$asar e#
1!&
Luis Edgar Snchez
dise@ador de <ormu#arios de# DE" 1 a#gunas de sus $ro$iedades&
niciaremos $or #o tanto Cisua# Studio &;ET" 1 crearemos un nue9o $ro1ecto
C>&;ET de ti$o a$#icacin NindoEs" $roceso este" %ue 1a descri!imos en #os
mencionados temas inicia#es& En este e0em$#o de0aremos e# nom!re de $ro1ecto %ue
nos $ro$one e# $ro$io DE" %ue ser NindoEs/$$#ication)" o !ien otro n4mero&
Figura -)I& =u2as de redimensin de# dise@ador de <ormu#arios&
Para asignar una imagen de <ondo a# <ormu#ario" recurriremos a #a $ro$iedad
>acHgroundmage" %ue nos mostrar una ca0a de di#ogo" mediante #a %ue se#eccionaremos
un archi9o con <ormato gr<ico %ue ser mostrado en #a su$er<icie de #a 9entana& Si $or
a#g4n moti9o" necesitamos e#iminar dicha imagen de <ondo $ara e# <ormu#ario" haremos
c#ic derecho so!re e# $e%ue@o rectngu#o situado a# #ado de# nom!re de #a $ro$iedad" 1
se#eccionaremos #a o$cin *esta!#ecer de# men4 conte?tua#& Cer Figura
-)P&
Figura -)P& E#iminar imagen de #a $ro$iedad >acHgroundmage de un <ormu#ario&
E# icono $or de<ecto #o cam!iaremos con #a $ro$iedad con" se#eccionndo#o de igua#
<orma %ue $ara #a imagen de <ondo" 1 asignando un archi9o con e?tensin &C:&
Fina#mente" asignaremos e# 9a#or Fa#se a #a $ro$iedad Ma?imize>o?" con #o %ue se
desha!i#itar e# !otn de# <ormu#ario %ue $ermite ma?imizar#o& La Figura --A muestra e#
<ormu#ario de este e0em$#o en e0ecucin&
Luis Edgar Snchez 1!'
Figura --A& Formu#ario de e0em$#o resu#tante&
-l cdigo del 0ormulario
Como 1a descri!imos en #os temas inicia#es de# te?to" cuando creamos un <ormu#ario desde
Cisua# Studio &;ET de# modo en %ue aca!amos de mostrar" e# dise@ador de# <ormu#ario
genera $or nosotros e# cdigo de# <ormu#ario" %ue consiste en una c#ase %ue hereda de #a
c#ase !ase Form& E# nom!re de #a c#ase es e# mismo %ue hemos asignado a #a
$ro$iedad ;ame en #a 9entana de $ro$iedades de# dise@ador" en este caso Form)& E#
cdigo es gra!ado en un archi9o con #a e?tensin &C>" %ue tiene e# nom!re de# <ormu#ario(
F:*M)&C>" en este e0em$#o&
Para 9er dicho cdigo" tan s#o tenemos %ue hacer c#ic derecho so!re e# <ormu#ario" 1 en e#
men4 conte?tua# se#eccionar Ver c"di!o" #o %ue a!rir #a 9entana de# editor de cdigo de#
DE" mostrando e# cdigo de nuestro <ormu#ario&
Parte de# cdigo estar ocu#to en otro archi9o %ue tiene #a codi<icacin necesaria $ara
generar e# <ormu#ario" esta $arte se #a conoce como Designer 1 es $osi!#e di9idir#a en dos
archi9os distintos" $ara reducir #a com$#e0idad" gracias a #as c#ases $arcia#es" dis$oni!#es a
$artir de #a 9ersin -AAI" $ara 9er#a de!emos acti9ar e# !otn 3mostrar todos #os archi9os5
en e# e?$#orador de so#uciones" #uego se 9ern #os archi9os como un agregado de# archi9o
de# <ormu#ario" como se $uede 9er en #a siguiente imagen&
1!( Luis Edgar Snchez
Es $osi!#e modi<icar este cdigo generado $or e# dise@ador" $ara com$#etar a%ue##os
as$ectos %ue necesitemos de# <ormu#ario& Sin em!argo" no de!emos modi<icar e# m'todo
nitia#izeCom$onent+ ," 1a %ue se trata de un m'todo directamente re#acionado con e#
as$ecto 9isua# de# <ormu#ario" 1 su edicin $odr2a de0ar e# <ormu#ario inser9i!#e&
E# Cdigo <uente .33 muestra e# cdigo de #a c#ase Form)" corres$ondiente a# <ormu#ario
de nuestro $ro1ecto" %ue ha generado e# dise@ador&
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Form1
Inherits System.Windows.Forms.Form
'Form reemplaza a Dispose para limpiar la lista de componentes.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Requerido por el Diseador de Windows Forms
Private components As System.ComponentModel.IContainer
'NOTA: el Diseador de Windows Forms necesita el siguiente procedimiento
'Se puede modificar usando el Diseador de Windows Forms.
'No lo modifique con el editor de cdigo.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.SuspendLayout()
'
'Form1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.BackgroundImage = Global.WindowsApplication12.My.Resources.Resources.flor
Me.ClientSize = New System.Drawing.Size(389, 195)
Me.MaximizeBox = False
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
End Sub
End Class
Cdigo <uente .33
Luis Edgar Snchez 1!+
Entre #os di<erentes miem!ros de esta c#ase" $odemos identi<icar e# m'todo constructor
;eE+ ,F e# m'todo Dis$ose+ ," %ue $odemos uti#izar $ara destruir e?$#2citamente e# o!0eto
<ormu#arioF 1 e# m'todo nitia#izeCom$onent+ ," %ue sir9e $ara inicia#izar #os 9a#ores tanto
de# $ro$io <ormu#ario" como de #os contro#es %ue $udiera contener&
4niciar el 0ormulario desde Main1 2
En todos #os e0em$#os con <ormu#arios NindoEs rea#izados hasta e# momento" #a
a$#icacin comienza su e0ecucin directamente $or e# <ormu#ario" #o cua# resu#ta una
comodidad" 1a %ue no tenemos %ue $reocu$arnos de con<igurar e# arran%ue de# $rograma&
/ $esar de todo" este es un escenario" %ue en muchas ocasiones no ser 9#ido" $uesto %ue
necesitaremos rea#izar a#guna tarea antes de #a 9isua#izacin de# <ormu#ario" como cam!iar
ciertas $ro$iedades de# mismo&
Podemos crear un $rocedimiento Main+ ," !ien en un mdu#o o en una c#ase" 1
con<igurar#o como $unto de entrada de #a a$#icacin" con<igurndo#a como 3Ser9icio de
NindoEs5" codi<icando en dicho $rocedimiento #a instanciacin de# <ormu#ario a mostrar&
/ continuacin mostramos #os $asos a dar $ara conseguir#o&
Creamos un nue9o $ro1ecto NindoEs" 1 a!rimos #a 9entana de $ro$iedades de#
$ro1ectoF en e# ti$o de a$#icacin e#egimos 3Ser9icio de NindoEs5 1 en #a #ista (bjeto
inicial" e#egimos esta 9ez e# e#emento &ub #ain&
Des$u's a@adimos un mdu#o a# $ro1ecto" em$#eando #a o$cin de men4 Proyecto +
!re!ar m"dulo" de CS&;ET" 1 en dicho mdu#o codi<icamos un $rocedimiento Main+ ,"
%ue se encargue de instanciar un o!0eto de# <ormu#ario& Si escri!imos a#go $arecido a
#o %ue muestra e# Cdigo <uente .3J" e# $rograma" en e<ecto" se iniciar" crear e#
<ormu#ario" $ero inmediatamente #o cerrar&
Module Entrada
Public Sub Main()
' instanciar un objeto de la clase del formulario
Dim frmVentana As New Form1()
frmVentana.Text = "probando desde cdigo"
frmVentana.Show()
End Sub
End Module
Cdigo <uente .3J
E# cdigo anterior" aun%ue 9#ido" tiene un $ro!#ema( un <ormu#ario" a# tratarse de una
9entana NindoEs" necesita #o %ue se denomina un !uc#e de mensa0es" %ue #e $ermita
detectar #os mensa0es %ue #e en92a e# sistema o$erati9o" 1 actuar en consecuencia&
En &;ET" $ara conseguir %ue un <ormu#ario dis$onga de un !uc#e de mensa0es"
de!emos uti#izar #a c#ase /$$#ication" entre cu1os miem!ros com$artidos" se encuentra
e# m'todo *un+ ,& Cuando a dicho m'todo" #e $asemos un o!0eto <ormu#ario como
$armetro" crear un !uc#e de mensa0es $ara dicho <ormu#ario 1 #o mantendr en
Luis Edgar Snchez
e0ecucin hasta %ue
1!,
Luis Edgar Snchez
e# usuario de #a a$#icacin #o cierre&
Modi<icando $ues" e# cdigo anterior" $or e# mostrado en e# Cdigo <uente .3L"
conseguiremos %ue e# <ormu#ario $ermanezca en e0ecucin una 9ez creado& Como deta##e
adiciona#" 1 a e<ectos meramente est'ticos" asignamos un co#or de <ondo a #a 9entana" de
modo %ue e# #ector com$rue!e #o senci##o %ue resu#ta mediante e# uso de #a $ro$iedad
>acHCo#or" 1 #a estructura Co#or&
Module Entrada
Public Sub Main()
' instanciar un objeto de la clase del formulario
Dim frmVentana As New Form1()
frmVentana.Text = "probando desde cdigo"
' asignamos el color de fondo al formulario
' utilizando uno de los miembros de la
' estructura Color de la plataforma
frmVentana.BackColor = Color.Aquamarine
' utilizamos el objeto Application y su
' mtodo Run() para crear un bucle de
' mensajes para el formulario y
' ponerlo en ejecucin
Application.Run(frmVentana)
End Sub
End Module
Cdigo <uente .3L
La Figura --J muestra e# <ormu#ario resu#tante a# e0ecutar e# $ro1ecto&
Figura --J& Formu#ario $uesto en e0ecucin mediante e# o!0eto /$$#ication&
Trabajo con controles
Los contro#es $ro$orcionan a# usuario e# medio $ara comunicarse con nuestro
<ormu#ario" 1 en de<initi9a" con #a a$#icacin& Por e##o" en #os siguientes a$artados"
mostraremos #os $rinci$a#es as$ectos %ue de!emos tener en cuenta a #a hora de su
creacin" mani$u#acin 1 codi<icacin&
Tam!i'n rea#izaremos una re9isin de #os $rinci$a#es contro#es" mostrando a#gunas de sus
caracter2sticas ms destacadas&
1!7 Luis Edgar Snchez
-l .uadro de *erramientas
Una 9ez creado un $ro1ecto" o des$u's de a@adir un nue9o <ormu#ario" $ara uti#izar
contro#es en e# mismo" tendremos %ue tomar#os de #a 9entana Cuadro de herramientas
dis$oni!#e en e# DE de CS&;ET" 1 a@adir#os a# <ormu#ario& Cer Figura --L&
Figura --L& Cuadro de herramientas de Cisua# Studio &;ET&
$rganiDacinF0ormato m?ltiple de controles
Cuando tenemos un gru$o numeroso de contro#es en e# <ormu#ario" %ue necesitamos
mo9er de $osicin" o cam!iar su tama@o" $ara redistri!uir e# es$acioF $odemos o$tar $or
cam!iar uno a uno #os contro#es" tarea $esada 1 nada aconse0a!#eF o !ien" $odemos
se#eccionar todos #os contro#es a modi<icar" 1 rea#izar esta tarea en un 4nico $aso"
mediante #as o$ciones de# men4 Formato de# DE&
Su$ongamos %ue en e# <ormu#ario tenemos dos contro#es >utton 1 un List>o? distri!uidos
como muestra #a Figura -3A&
Figura -3A& Contro#es $ara redistri!uir dentro de# <ormu#ario&
1!8 Luis Edgar Snchez
En $rimer #ugar" $ara se#eccionar#os todos" de!emos hacer c#ic so!re e# <ormu#ario 1
arrastrar" de modo %ue e# rectngu#o de se#eccin %ue a$arece" a!ar%ue a #os contro#es" %ue
%uedarn con sus corres$ondientes marcas de redimensin 9isi!#es" se@a# de %ue estn
se#eccionados&
En este $unto" $odemos hacer c#ic en uno de #os contro#es 1 des$#azar#os todos
con0untamente $or e# <ormu#ario" o !ien" hacer c#ic en una de #as gu2as de redimensin 1
cam!iar su tama@o" #o %ue a<ectar a todos #os contro#es se#eccionados& Si necesitamos
de a#guna accin es$ecia#" uti#izaremos #as o$ciones de# men4 Formato de# DE&
Por e0em$#o" $odemos e0ecutar #a o$cin -ormato + linear + +ados i/0uierdos" de modo
%ue todos #os contro#es se a#inearn $or #a iz%uierda" tomando como re<erencia e# contro#
%ue tiene #as marcas de redimensin negras& Cer Figura -3)&
Figura -3)& /#ineacin de contro#es $or su #ado iz%uierdo&
Des$u's e0ecutaremos #a o$cin de men4 -ormato + *!ualar tama1o + mbos" %ue
a0ustar tanto e# ancho como e# a#to de todos #os contro#es se#eccionados& Cer Figura -3-&
Luis Edgar Snchez 1!9
Figura -3-& gua#ando tama@o de contro#es&
Para e9itar %ue" una 9ez com$#etado e# dise@o 1 a0uste de todos #o contro#es"
accidenta#mente $odamos modi<icar a#guno" se#eccionaremos #a o$cin de men4
-ormato
+ Blo0uear controles" %ue !#o%uear #os contro#es se#eccionados" im$idiendo %ue $uedan
ser mo9idos o modi<icado su tama@o& Para des!#o%uear #os contro#es de# <ormu#ario"
de!emos se#eccionar a# menos uno 1 9o#9er a uti#izar esta o$cin de men4" %ue
des!#o%uear todos #os contro#es&
Una caracter2stica interesante de# !#o%ueo de contro#es" consiste en %ue una 9ez %ue
tengamos !#o%ueados #os contro#es de# <ormu#ario" si a@adimos un nue9o contro#" este no
estar inicia#mente !#o%ueado" #o %ue <aci#ita su dise@o& Una 9ez %ue ha1amos <ina#izado
de dise@ar e# 4#timo contro#" #o se#eccionaremos en e# <ormu#ario 1 se#eccionaremos #a
o$cin de !#o%ueo de contro#es" de modo %ue 1a estarn !#o%ueados todos de nue9o&
Anclaje de controles
La $ro$iedad /nchor" e?istente en un gran n4mero de contro#es" nos $ermite anclar
dicho contro# a uno o 9arios !ordes de# <ormu#ario&
Cuando un contro# es anc#ado a un !orde" #a distancia entre e# contro# 1 dicho !orde ser
siem$re #a misma" aun%ue redimensionemos e# <ormu#ario&
Para esta!#ecer esta $ro$iedad" de!emos $asar a #a 9entana de $ro$iedades de# contro#" 1
en /nchor" $u#sar e# !otn %ue dis$one" 1 %ue nos mostrar una re$resentacin de #os
!ordes $ara anc#ar& Cer Figura -33&
11! Luis Edgar Snchez
Figura -33& Pro$iedad /nchor de un contro#&
Las zonas de co#or gris oscuro re$resentan #os !ordes de# contro# %ue 1a estn anc#ados a
#os !ordes de# <ormu#ario& De!emos marcar 1 desmarcar res$ecti9amente estos e#ementos
seg4n #os !ordes %ue necesitemos anc#ar& Por de<ecto" #os contro#es se encuentran
inicia#mente anc#ados a #os !ordes su$erior e iz%uierdo +To$" Le<t," como hemos
com$ro!ado en #a anterior <igura&
La Figura -3. muestra un e0em$#o en e# %ue 9emos dos contro#es %ue tienen distintos ti$os
de anc#a0e& >utton) tiene e# anc#a0e norma#( To$-Le<t" mientras %ue >utton- tiene s#o
*ight" $or e##o" su !orde derecho siem$re mantendr #a misma distancia con ese !orde de#
<ormu#ario&
Figura -3.& Contro#es con di<erentes 9a#ores en #a $ro$iedad /nchor&
Acople de controles
/ tra9's de #a $ro$iedad DocH de #os contro#es" $odremos acoplar un contro# a uno de
#os !ordes de un <ormu#ario" consiguiendo %ue dicho contro# $ermanezca $egado a ese
!orde de# <ormu#ario en todo momento&
Para se#eccionar e# ti$o de aco$#e" haremos c#ic en e# !otn %ue tiene #a $ro$iedad DocH
en #a 9entana de $ro$iedades" 1 %ue nos mostrar un gu2a de #os ti$os de aco$#e
dis$oni!#es& Cer Figura -3J&
111 Luis Edgar Snchez
Figura -3J& Pro$iedad DocH" ti$os de aco$#e dis$oni!#es&
Por de<ecto" #os contro#es no se encuentran aco$#ados a# insertarse en e# <ormu#ario" 1 s#o
es $osi!#e esta!#ecer un ti$o de aco$#e en cada ocasin& La Figura -3L muestra un contro#
>utton aco$#ado a #a iz%uierda de# <ormu#ario&
Figura -3L& Contro# aco$#ado a #a iz%uierda de# <ormu#ario&
Si $u#samos en #a $ro$iedad DocH e# !otn centra# de #os indicadores de aco$#amiento" #a
$ro$iedad tomar e# 9a#or Fi##" es decir" e# contro# ##enar #a su$er<icie de# <ormu#ario&
Ceamos en #a Figura -3M" e# mismo contro# con este 9a#or de aco$#e&
Figura -3M& Contro# con e# 9a#or Fi## en #a $ro$iedad DocH&
11&
Luis Edgar Snchez
.ontroles m@s *abituales
Como ha!r com$ro!ado e# #ector" e# n4mero de contro#es de# cuadro de herramientas es
mu1 numeroso" $or #o %ue en #os $r?imos a$artados" 9amos a tra!a0ar con #os %ue se
consideran contro#es !sicos o estndar" dada su gran <recuencia de uso&
La Ta!#a 3A re#aciona este con0unto de contro#es !sico" 0unto a una !re9e descri$cin&
.ontrol 6escripcin
>utton >otn de $u#sacin
La!e# Eti%ueta de #itera#
Te?t>o? Cuadro de te?to
List>o? Lista de 9a#ores
Com!o>o?
Lista de 9a#ores
des$#ega!#e" 1
cuadro de te?to
ChecH>o? Casi##a de
9eri<icacin
*adio>utton >otn autoe?c#u1ente
=rou$>o?
Ca0a de agru$acin
de
contro#es
Ta!#a 3A& Contro#es !sicos de <ormu#arios NindoEs&
)utton
Este contro# re$resenta un !otn de $u#sacin" conocido en 9ersiones anteriores de C>
como Command>utton& Entre e# nutrido con0unto de $ro$iedades de este contro#"
destacaremos #as siguientes&
Q Te3t& Cadena con e# t2tu#o de# !otn&
Q Te3tAlign& /#ineacin o dis$osicin de# t2tu#o dentro de# rea de# !otnF $or
de<ecto a$arece centrado&
Q )ac=.olor& Co#or de <ondo $ara e# !otn&
Q .ursor& Permite modi<icar e# cursor de# ratn %ue $or de<ecto tiene e# !otn&
Q 4mage& magen %ue $odemos mostrar en e# !otn como com$#emento a su t2tu#o"
o !ien" en e# caso de %ue no asignemos un te?to a# !otn" nos $ermitir descri!ir su
<unciona#idad&
11' Luis Edgar Snchez
Q 4mageAlign& /# igua# %ue $ara e# te?to" esta $ro$iedad nos $ermite situar #a
imagen en una zona de# !otn distinta de #a centra#" %ue es en #a %ue se u!ica $or de<ecto&
Q )ac=ground4mage& magen de <ondo $ara e# !otn&
Q ;latAt#le& Ti$o de resa#tado $ara e# !otn& Por de<ecto" e# !otn a$arece con un
cierto re#ie9e" %ue a# ser $u#sado" $ro$orciona e# e<ecto de hundirse 1 recu$erar
nue9amente su estado" $ero $odemos" mediante esta $ro$iedad" hacer %ue e# !otn se
muestre en modo $#ano" con un #igero remarcado a# $u#sarse" etc&
Q ;ont& Cam!ia e# ti$o de #etra 1 todas #as caracter2sticas de# ti$o e#egido" $ara
e# te?to de# !otn&
La Figura -3I muestra un e0em$#o de contro# >utton" so!re e# %ue se han modi<icado
a#gunos 9a#ores $or de<ecto de sus $ro$iedades& +Para acceder a >uttonPru" e# $ro1ecto
de este e0em$#o" hacer c#ic a %u2,&
Figura -3I& Contro# >utton&
.odi0icacin de los e%entos de controles
NindoEs es un sistema o$erati9o orientado a e9entos" $or #o %ue cua#%uier m2nima
interaccin %ue rea#icemos so!re un <ormu#ario o contro#" generar e# o$ortuno e9ento"
$ara e# %ue si estamos interesados" de!eremos res$onder&
Prosiguiendo con e# contro# >utton" cuando $u#samos so!re e# mismo" se origina e# e9ento
C#icH de dicho contro#& Si di!u0amos un >utton en un <ormu#ario 1 $u#samos en '#" no
ocurrir nada" 1a %ue aun%ue e# e9ento se $roduce" no e?iste cdigo %ue #e $ro$orcione
res$uesta&
Para dar o$ortuna res$uesta a un e9ento emitido $or un contro#" de!emos escri!ir un
$rocedimiento mani$u#ador de# corres$ondiente e9ento& / este $roceso se #e conoce como
3De#egacin de cdigo5&
11(
Luis Edgar Snchez
Ceamos #a codi<icacin de# siguiente e9ento c#icH de un !otn de comando&
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
Cdigo <uente .3M
E# resu#tado en e0ecucin" ser2a e# %ue muestra #a Figura -3P&
:!ser9ando con ms deta##e e# $rocedimiento de# e9ento" 9emos %ue a# <ina# de su
dec#aracin" a$arece #a $a#a!ra c#a9e Rand#es" %ue como 9imos en e# tema so!re
e9entos" nos sir9e $ara asociar esta rutina de cdigo con un e9ento de un o!0eto& En e#
e0em$#o %ue nos ocu$a" asociamos e# $rocedimiento !tnMensa0e^C#icH+ ," con e# e9ento
C#icH de# o!0eto !tnMensa0e" $erteneciente a #a c#ase >utton&
Figura -3P& *esu#tado de #a e0ecucin de# e9ento C#icH de un contro# >utton" a# ser $u#sado&
Como 1a sa!emos" e# en#ace $rocedimiento-e9ento de o!0eto mediante #a $a#a!ra
Rand#es" se $roduce de modo esttico& Esto re%uiere %ue en e# cdigo" e# identi<icador %ue
contenga e# o!0eto de# contro#" de!a ser dec#arado con m!ito a ni9e# de c#ase" 1
uti#izando adems #a $a#a!ra c#a9e NithE9ents& Dicha tarea es rea#izada
automticamente $or e# dise@ador de# <ormu#ario cuando genera e# cdigo de# mismo&
.odi0icando otros e%entos de un control
En un contro# >utton" e# e9ento $or de<ecto es C#icHF esto su$one" como aca!amos de 9er"
%ue a# hacer do!#e c#ic so!re e# contro# en e# <ormu#ario" e# $rocedimiento de e9ento
so!re e# %ue nos situar e# editor ser $recisamente este& Sin em!argo" un contro# >utton"
a# igua# %ue e# resto de contro#es de #os <ormu#arios NindoEs" dis$onen de un gran n4mero
de e9entos %ue $odemos codi<icar $ara ada$tar a nuestras necesidades&
Por e0em$#o" e# e9ento MouseEnter" se $roduce cuando se detecta %ue e# ratn entra en e#
11+
rea de un contro#" en este caso >utton& Como este no es e# e9ento $or de<ecto" de!emos
!uscar su dec#aracin 9ac2a manua#mente en e# editor& Para e##o" a!riremos #a #ista
des$#ega!#e ,ombre de clase" situada en #a $arte su$erior iz%uierda de# editor de cdigo" 1
se#eccionaremos e# nom!re de nuestro contro#( !tnMensa0e& Cer Figura -.A&
Figura -.A& Lista de c#ases de# editor de cdigo&
/ continuacin" a!riremos #a otra #ista des$#ega!#e de# editor de cdigo( ,ombre de
mtodo" situada en #a $arte su$erior derecha de# editor& En e##a a$arecern #os nom!res
de todos #os e9entos de %ue dis$one e# contro#& Loca#izaremos e# e9ento MouseEnter" 1
#o se#eccionaremos& Cer Figura -.)&
Figura -.)& Lista de e9entos de una c#ase-contro# en e# editor de cdigo&
De igua# modo %ue sucedi con e# e9ento C#icH en e# a$artado anterior" e# editor de cdigo
crear e# $rocedimiento mani$u#ador de e9ento 9ac2o" $ara e# e9ento %ue aca!amos de
se#eccionar& Lo %ue 9amos a hacer a continuacin" es escri!ir e# cdigo %ue $ermita
cam!iar e# co#or de# !otn cuando e# ratn entre a# mismo& Ceamos e# Cdigo <uente .3P&
Private Sub btnMensaje_MouseEnter(ByVal sender As Object, ByVal e As
System.EventArgs) Handles btnMensaje.MouseEnter
btnMensaje.BackColor = Color.Cyan
End Sub
Cdigo <uente .3P
11,
Cuando a# e0ecutar" situemos e# ratn en e# !otn" este cam!iar su co#or" mostrando e#
as$ecto de #a
Figura -.-&
Figura -.-& *esu#tado de #a e0ecucin de# e9ento MouseEnter so!re un >utton&
-scritura del manipulador de e%ento sin usar el nombre
proporcionado por el editor
E# nom!re de# $rocedimiento mani$u#ador de e9ento" %ue crea automticamente e# editor
de cdigo" $or e0em$#o( !tnMensa0e^MouseEnter+ ," se !asa en una con9encin
esta!#ecida $or e# editor con e# siguiente <ormato( nom!re de# o!0eto-guin !a0o-nom!re
de# e9ento&
Sin em!argo" esta <orma de crear #a rutina mani$u#adora de e9ento no es o!#igatoria" 1a
%ue $odemos crear un $rocedimiento de e9ento con e# nom!re %ue %ueramos" siem$re 1
cuando" asociemos e# $rocedimiento con e# e9ento necesario uti#izando #a $a#a!ra c#a9e
Rand#es&
Siguiendo con e# e0em$#o %ue estamos desarro##ando" una 9ez %ue e# ratn entra en e# rea
de# !otn" este cam!ia de co#or" $ero a# sa#ir" no se de9ue#9e e# !otn a su co#or inicia#F
esto es #o %ue 9amos a hacer a continuacin&
E# e9ento %ue se $roduce cuando e# ratn a!andona e# rea de un contro# es MouseLea9e&
Conociendo este dato" 9amos a escri!ir un $rocedimiento con e# nom!re Sa#imos+ ," %ue
conectaremos con e# mencionado e9ento uti#izando Rand#es& Dentro de esta rutina"
haremos una ##amada a# m'todo *eset>acHCo#or+ , de# contro#" %ue de9ue#9e e# co#or de#
!otn a su estado origina#&
Como re%uerimiento adiciona#" 1 1a %ue #os mani$u#adores de e9ento de contro#"
internamente estn construidos mediante un de#egado de ti$o E9entRand#er" de!emos
inc#uir dos $armetros en #a #ista de nuestro $rocedimiento( uno de ti$o :!0ect" 1 otro de
ti$o S1stemE9ent/rgs& Para seguir e# mismo es%uema %ue e# resto de e9entos"
##amaremos a estos $armetros sender 1 e res$ecti9amente" aun%ue e##o no ser2a
necesario& /# $roducirse e# e9ento" e# contro# ser e# encargado de de$ositar en estos
$armetros #os o!0etos corres$ondientes" de modo trans$arente $ara e# $rogramador&
Ceamos e# cdigo de este mani$u#ador de e9ento en e# Cdigo <uente ..A&
117
Private Sub Salimos(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles btnMensaje.MouseLeave
Me.btnMensaje.ResetBackColor()
End Sub
Cdigo <uente ..A
/ $artir de ahora" cuando e0ecutemos e# $rograma" a# %uitar e# ratn de #a su$er<icie de#
!otn" e# contro# 9o#9er a tomar su co#or origina#&
5espondiendo a los e%entos de un 0ormulario
E# modo de escri!ir #os mani$u#adores de e9entos $ara un <ormu#ario es igua# %ue $ara un
contro#& E# $ro1ecto de e0em$#o E9entosForm i#ustra este as$ecto& En e# Cdigo <uente ..)
9emos #os mani$u#adores de dos e9entos de <ormu#ario&
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As
System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove
Me.Text = "Coordenadas ratn: X:" & e.X & " Y:" & e.Y
End Sub
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As
System.ComponentModel.CancelEventArgs) Handles MyBase.FormClosing
If MessageBox.Show("Cerrar la ventana?", _
"Atencin", MessageBoxButtons.YesNo, _
MessageBoxIcon.Hand) = DialogResult.No Then
e.Cancel = True
End If
End Sub
Cdigo <uente ..)
E# e9ento MouseMo9e se $roduce a# mo9er e# ratn $or e# <ormu#ario" mientras %ue
C#osing se $roduce cuando e# <ormu#ario est en $roceso de cierre& Este 4#timo e9ento
tiene #a caracter2stica de %ue nos $ermite cance#ar e# $roceso de cierre de# <ormu#ario"
mediante #a mani$u#acin de# $armetro %ue contiene #os argumentos de e9ento" en
concreto se trata de #os argumentos de cance#acin& La Figura -.3 muestra este e9ento en
e0ecucin&
118
Figura -.3& E0ecucin de# e9ento C#osing de un <ormu#ario&
Label
E# contro# La!e# o Eti%ueta" muestra un te?to in<ormati9o a# usuario& Podemos uti#izar este
contro# como com$#emento a otro contro#" $or e0em$#o" situndo#o 0unto a un Te?t>o?" de
modo %ue indi%uemos a# usuario e# ti$o de dato %ue es$eramos %ue introduzca en #a ca0a
de te?to&
Se trata de un control est2ticoF esto %uiere decir %ue e# usuario no $uede interaccionar con
'#" a di<erencia" $or e0em$#o" de un contro# >utton" so!re e# %ue s2 $odemos actuar
$u#sndo#oF o de un Te?t>o?" en e# %ue $odemos escri!ir te?to&
Una de sus $ro$iedades es >orderSt1#e" %ue $ermite de<inir un !orde o recuadro a#rededor
de# contro#" o %ue dicho !orde tenga un e<ecto 3DF $or de<ecto se muestra sin !orde&
Ceamos unos e0em$#os en #a Figura -..&
Figura -..& Contro#es La!e#&
Luis Edgar Snchez
119
;oco de entrada
Para %ue #as $u#saciones de tec#ado $uedan ser reci!idas $or un determinado contro#"
dicho contro# de!e tener #o %ue se denomina e# foco de entrada&
E# modo de dar a un contro# e# <oco de entrada" consiste en hacer c#ic so!re '#" o !ien"
$u#sar #a tec#a ZT/>[" $asando e# <oco hasta e# contro# deseado& Cuando un contro#
reci!e e# <oco" e# sistema o$erati9o #o remarca 9isua#mente o en e# caso de contro#es de
escritura" muestra e# cursor de escritura en su interior&
Te3t)o3
Un contro# Te?t>o? muestra un recuadro en e# %ue $odemos introducir te?to& Para $oder
escri!ir te?to en un contro# de este ti$o" de!emos dar#e $rimeramente e# <oco" #o %ue
detectaremos cuando e# contro# muestre e# cursor de escritura en su interior&
Entre #as $ro$iedades dis$oni!#es $or este contro#" destacaremos #as siguientes&
Q Te3t& Cadena con e# te?to de# contro#&
Q Multiline& Permite esta!#ecer si $odemos escri!ir una o 9arias #2neas& Por
de<ecto contiene
Fa#se" $or #o %ue s#o $odemos escri!ir e# te?to en una #2nea&
Q BordBrap& En contro#es mu#ti#2nea" cuando su 9a#or es True" a# ##egar a# <ina#
de# contro# cuando estamos escri!iendo" rea#iza un des$#azamiento automtico de# cursor
de escritura a #a siguiente #2nea de te?to&
Q -nabled& Contiene un 9a#or #gico mediante e# %ue indicamos si e# contro# est o
no ha!i#itado $ara $oder escri!ir te?to so!re '#&
Q 5ead$nl#& Permite indicar si e# contenido de# contro# ser de s#o #ectura o
!ien" $odremos editar#o&
Q .*aracter.asing& Esta $ro$iedad" $ermite %ue e# contro# con9ierta
automticamente e# te?to a ma14scu#as o min4scu#as seg4n #o estamos escri!iendo&
Q Ma3Lengt*& Ca#or num'rico %ue esta!#ece e# n4mero m?imo de caracteres
%ue $odremos escri!ir en e# contro#&
Q ass<ord.*ar& Carcter de ti$o mscara" %ue ser 9isua#izado $or cada carcter
%ue escri!a e# usuario en e# contro#& De esta <orma" $odemos dar a un cuadro de te?to
e# esti#o de un cam$o de introduccin de contrase@a&
Q AutoAiDe& Cuando esta $ro$iedad tenga e# 9a#or True" a# modi<icar e# tama@o de#
ti$o de #etra de# contro#" dicho contro# se redimensionar automticamente" a0ustando su
tama@o a# de# ti$o de #etra esta!#ecido&
1&! Luis Edgar Snchez
La Figura -.J muestra un <ormu#ario con 9arios contro#es Te?t>o?" a #os cua#es se han
a$#icado di<erentes e<ectos mediante sus $ro$iedades&
Figura -.J& Prue!as con contro#es Te?t>o?&
/# comenzar a e0ecutar e# $rograma" o!ser9aremos %ue e# <oco de entrada no est situado
en e# $rimer Te?t>o? de# <ormu#ario& Para asignar $or cdigo e# <oco a un determinado
contro#" dis$onemos de# m'todo Focus+ ,& En este caso" a# $u#sar e# !otn -oco nombre"
des9iamos e# <oco a# $rimer Te?t>o? de# <ormu#ario& Cer Cdigo <uente ..-&
Private Sub btnFoco_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnFoco.Click
Me.txtNombre.Focus()
End Sub
Cdigo <uente ..-
:!ser9e e# #ector" %ue en e# !otn -oco nombre" %ue aca!amos de mencionar" #a #etra F
se encuentra su!ra1ada" actuando de ace#erador o hotHe1& De este modo" no es necesario
$u#sar con e# ratn so!re ese !otn $ara e0ecutar#o" !asta con $u#sar #a tec#a ZC:;T*:L[
0unto a #a #etra su!ra1ada $ara conseguir e# mismo e<ecto&
Para de<inir una tec#a ace#eradora en un contro#" de!emos ante$oner e# carcter T a #a #etra
%ue 9amos a de<inir como ace#erador" en este e0em$#o se ha #ogrado con 3-oco nombre&
Por otro #ado" mediante e# !otn !tnSo#oLectura conseguimos acti9ar8desacti9ar #a
$ro$iedad *ead:n#1 de# Te?t>o? t?t;om!re" cam!iando e# estado de dicha $ro$iedad en
cada $u#sacin de# !otn& Cer Cdigo <uente ..3&
Luis Edgar Snchez
1&1
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 Sub
Cdigo <uente ..3
Sin em!argo" ha1 otro modo mucho ms e<iciente de cam!iar e# estado de una
$ro$iedad %ue contiene un ti$o >oo#ean( uti#izando e# o$erador ;ot&
Con e# !otn !tn/cti9ar" cam!iamos e# 9a#or de #a $ro$iedad Ena!#ed de# cuadro de te?to
%ue contiene #os a$e##idos& Para e##o" a$#icamos e# o$erador ;ot a dicha $ro$iedad" 1 e#
resu#tado #o asignamos a esa misma $ro$iedad& Cer Cdigo <uente ...&
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
Cdigo <uente ...
Fina#izando con este e0em$#o" 1 aun%ue no tiene re#acin directa con e# contro# Te?t>o?" e#
<ormu#ario se muestra con un ti$o de !orde es$ecia# %ue no $ermite su redimensin& La
$ro$iedad de# <ormu#ario con #a %ue $odemos esta!#ecer e# ti$o de !orde es
Form>orderSt1#e" 1 en este caso" su 9a#or es Fi?ed3D& /#terando #os 9a#ores de esta
$ro$iedad" conseguiremos distintos !ordes 1 ti$os de redimensin $ara e# <ormu#ario&
$rden de tabulacin de controles
Los contro#es dis$onen de #a $ro$iedad Ta!nde?" %ue contiene un n4mero %ue ser
uti#izado $ara $asar e# <oco entre e##os a# $u#sar #a tec#a ZT/>[ durante #a e0ecucin de#
$rograma&
Seg4n 9amos a@adiendo nue9os contro#es" e# DE 9a asignando automticamente nue9os
n4meros a esta $ro$iedadF de <orma %ue" cuando comencemos #a e0ecucin" e# $rimer
contro# %ue tomar e# <oco ser e# %ue tiene e# menor n4mero en su Ta!nde?&
1&&
Luis Edgar Snchez
En e# e0em$#o anterior" e# $rimer contro# %ue toma!a e# <oco era e# Te?t>o? de #a
contrase@a" #o cua# no era nada #gico" 1a %ue dicho contro# era e# 4#timo en e# <ormu#ario
$ara e# %ue de!2amos introducir datos&
Para so#ucionar este $ro!#ema" sim$#emente tenemos %ue cam!iar #os 9a#ores de #a
$ro$iedad Ta!nde? de #os contro#es" de modo %ue e# orden de ta!u#acin sea e# %ue me0or
se ada$te a nuestras necesidades&
Podemos o!tener un ma$a de# orden de ta!u#acin de #os contro#es de# <ormu#ario
se#eccionando e# men4 de# DE Ver + (rden de tabulaci"nF esto mostrar #os contro#es
con e# n4mero de Ta!nde? %ue #es hemos asignado& Como 9enta0a adiciona#" en esa
situacin" $odemos hacer c#ic en #os contro#es 1 cam!iar tam!i'n e# n4mero de ta!u#acin&
Cer Figura -.L&
Figura -.L& Dise@ador de# <ormu#ario mostrando e# orden de ta!u#acin de contro#es&
Si $or e# contrario" no %ueremos dar e# <oco a un contro# $u#sando ZT/>[" de!emos asignar
a #a $ro$iedad Ta!Sto$ de dicho contro# e# 9a#or Fa#se& Por de<ecto" Ta!Sto$ 9a#e True"
$ermitiendo de esta e# $aso de <oco entre contro#es mediante #a tec#a ZT/>[&
Aeleccin de te3to en un Te3t)o3
La se#eccin de te?to en un contro# Te?t>o? es un $roceso %ue <unciona de modo
trans$arente a# $rogramador" en e# sentido en %ue este no necesita a@adir cdigo adiciona#
$ara #as o$eraciones de se#eccin" cortar" co$iar" etc&" a# ser tareas integradas en e# sistema
o$erati9o&
Sin em!argo" $odemos necesitar en un determinado momento" tener in<ormacin acerca
de #as o$eraciones de se#eccin %ue est rea#izando e# usuario en nuestros contro#es de
te?to& Para e##o" e# contro# Te?t>o? dis$one de #as siguientes $ro$iedades&
Q AelectionAtart& Posicin de# te?to de# contro#" en #a %ue comienza #a se#eccin
%ue hemos rea#izado&
Q AelectionLengt*& ;4mero de caracteres se#eccionados en e# contro#&
1&' Luis Edgar Snchez
Q AelectedTe3t& Cadena con e# te?to %ue hemos se#eccionado en e# contro#&
Mediante estas $ro$iedades" no s#o a9eriguamos #a se#eccin %ue $ueda tener un
contro# Te?t>o?" sino %ue tam!i'n $odemos uti#izar#as $ara esta!#ecer $or cdigo una
se#eccinF teniendo e# mismo e<ecto %ue si #a hu!iera e<ectuado e# usuario con e# ratn o
tec#ado&
Para com$ro!ar e# <uncionamiento de #as $ro$iedades de se#eccin de# Te?t>o?"
crearemos un $ro1ecto NindoEs" 1 en su <ormu#ario a@adiremos 9arios contro#es $ara
mani$u#ar #a se#eccin de te?to %ue hagamos en un Te?t>o?&& La Figura -.M muestra e#
<ormu#ario de# e0em$#o&
Figura -.M& Formu#ario $ara rea#izar se#eccin en e# contro# Te?t>o?&
E# contro# de este <ormu#ario" %ue 9amos a em$#ear $ara #as o$eraciones de se#eccin es
t?t:rigen& En $rimer #ugar" 1 aun%ue no se trata de una se#eccin de te?to" 9eremos su
e9ento Te?tChanged" e# cua# se $roduce cada 9ez %ue cam!ia e# contenido de# cuadro de
te?toF #o usaremos $or tanto" $ara contar #a cantidad de caracteres escritos 1 mostrar#os en
un La!e#& Cer Cdigo <uente ..J&
' 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
Cdigo <uente ..J
1&(
Luis Edgar Snchez
Los e9entos MouseMo9e 1 Se1DoEn de# Te?t>o?" se $roducen res$ecti9amente" cuando
mo9emos e# ratn so!re e# contro#" o cada 9ez %ue $u#samos una tec#a $ara escri!ir
te?to& Detectaremos en este caso" si e?isten tec#as o !otones es$ecia#es $resionados" %ue
nos indi%uen %ue se est rea#izando una se#eccin de te?to" 1 mostraremos en e# <ormu#ario
e# te?to se#eccionado" e# n4mero de caracteres 1 #a $osicin de# carcter de inicio de #a
se#eccin& Ceamos #os $rocedimientos mani$u#adores de estos e9entos en e# Cdigo <uente
..L&
' 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
End If
End If
End Sub
Cdigo <uente ..L
Fina#mente" tras introducir un 9a#or en #os contro#es t?tPosicion 1 t?tLongitud" $u#saremos
e# !otn !tnSe#eccionar& Con e##o conseguiremos rea#izar una se#eccin de te?to en e#
Te?t>o? t?t:rigen" 1 $asar e# te?to se#eccionado a# contro# t?tDestino& E# e<ecto ser e#
mismo %ue si #o hu!iera rea#izado e# usuario" $ero en este caso sin su inter9encin&
Ceamos en e# Cdigo <uente ..M" e# e9ento C#icH de# !otn !tnSe#eccionar&
1&+ Luis Edgar Snchez
' 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
Cdigo <uente ..M
La Figura -.I muestra este e0em$#o en e0ecucin&
Figura -.I& Prue!as de se#eccin de te?to con e# contro# Te?t>o?&
.*ec=)o3
Este contro# muestra una casi##a de 9eri<icacin" %ue $odemos marcar $ara esta!#ecer un
estado& =enera#mente e# estado de un ChecH>o? es marcado +9erdadero, o desmarcado
+<a#so," sin em!argo"
$odemos con<igurar e# contro# $ara %ue sea detectado un tercer estado" %ue se
denomina
indeterminado" en e# cua#" e# contro# se muestra con #a marca en #a casi##a $ero en un
co#or de tono gris&
Las $ro$iedades remarca!#es de este contro# son #as siguientes&
Q .*ec=ed& Ca#or #gico %ue de9ue#9e True cuando #a casi##a est marcada" 1 Fa#se
cuando est desmarcada&
Q .*ec=Atate& Ca#or de# ti$o enumerado ChecHState" %ue indica e# estado de#
contro#& ChecHed" marcadoF UnchecHed" desmarcadoF e ndeterminate"
indeterminado&
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
1&,
Q T*reeAtate& Por de<ecto" un contro# de este ti$o s#o tiene dos estados" $ero
asignando True a esta $ro$iedad" conseguimos %ue sea un contro# de tres estados&
Q .*ec=Align& Permite esta!#ecer de modo 9isua# #a u!icacin de #a casi##a de
9eri<icacin dentro de# rea de# contro#&
Como deta##e destaca!#e de #as $ro$iedades ChecHed 1 ChecHState" si modi<icamos desde
cdigo sus 9a#ores" conseguiremos a#terar e# estado de #a casi##a de# contro#&
E# e0em$#o ChecH>o?Pru " muestra un <ormu#ario con dos contro#es ChecH>o?& E#
contro# chHPonCo#or asigna un co#or de <ondo a# <ormu#ario o resta!#ece e# co#or
origina#& Esto #o conseguimos codi<icando e# e9ento ChecHedChanged de# contro#& Cer
Cdigo <uente ..I&
' 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
Me.BackColor = Color.LightBlue
Else
Me.ResetBackColor()
End If
End Sub
Cdigo <uente ..I
Por su $arte" e# contro# chHMostrar" de<inido con tres estados" muestra" a# estar marcado"
una cadena en un contro# La!e#F e#imina #a cadena a# desmarcar#oF 1 muestra #a mitad a#
entrar en e# estado indeterminado& E# e9ento ChecHStateChanged es e# %ue de!emos de
uti#izar $ara detectar e# estado de# ChecH>o? en cada ocasin& Para mantener e# 9a#or de #a
cadena a mostrar" uti#izamos una 9aria!#e a ni9e# de #a c#ase %ue inicia#izamos en e#
constructor de# <ormu#ario& Cer Cdigo <uente ..P&
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
Luis Edgar Snchez
Luis Edgar Snchez 1&7
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Case CheckState.Unchecked
Me.lblMuestra.Text = ""
Case CheckState.Indeterminate
Me.lblMuestra.Text = sCadenaOriginal.Substring(0, (sCadenaOriginal.Length / 2))
End Select
End Sub
Cdigo <uente ..P
La Figura -.P muestra este e0em$#o en e0ecucin&
Figura -.P& Contro#es ChecH>o? en e0ecucin&
5adio)utton # Eroup)o3
Los contro#es *adio>utton nos $ermiten de<inir con0untos de o$ciones autoe?c#u1entes"
de modo %ue situando 9arios contro#es de este ti$o en un <ormu#ario" s#o $odremos tener
se#eccionado uno en cada ocasin&
Camos a crear un $ro1ecto de e0em$#o con e# nom!re *adio>uttonPru +hacer c #i c a%u2
$ara acceder a este e0em$#o," en e# %ue situaremos dentro de un <ormu#ario" una serie de
contro#es *adio>utton 1 un Te?t>o?" de modo %ue mediante #os *adio>utton
cam!iaremos e# ti$o de <uente 1 co#or de# cuadro de te?to& La Figura -JA muestra un
dise@o inicia# de# <ormu#ario&
1&8 Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Figura -JA& Prue!as con e# contro# *adio>utton&
/# e0ecutar e# $ro1ecto" sin em!argo" no $odemos conseguir esta!#ecer simu#tneamente
un ti$o de #etra 1 co#or" $uesto %ue a# $u#sar cua#%uiera de #os !otones de radio" se %uita e#
%ue hu!iera se#eccionado $re9iamente&
Para so#ucionar este $ro!#ema" dis$onemos de# contro# =rou$>o?" %ue nos $ermite" como
indica su nom!re" agru$ar contro#es en su interior" tanto *adio>utton como de otro ti$o"
1a %ue se trata de un contro# contenedor&
Una 9ez di!u0ado un =rou$>o? so!re un <ormu#ario" $odemos arrastrar 1 so#tar so!re '#"
contro#es 1a e?istentes en e# <ormu#ario" o crear nue9os contro#es dentro de dicho contro#&
De esta <orma" $odremos 1a" en este e0em$#o" se#eccionar ms de un *adio>utton de#
<ormu#ario" como 9emos en #a Figura -J)&
Figura -J)& Se#eccin de 9arios *adio>utton en un <ormu#ario&
E# e9ento ChecHedChanged" a# igua# %ue ocurr2a con #os contro#es ChecH>o?" ser e# %ue
tendremos %ue escri!ir $ara e0ecutar e# cdigo en res$uesta a #a $u#sacin so!re un
contro# *adio>utton& E# Cdigo <uente .JA muestra #os e9entos corres$ondientes a #os
contro#es de radio de este e0em$#o& Para cam!iar e# ti$o de <uente" instanciamos un
o!0eto Font 1 #o asignamos a #a $ro$iedad Font de# Te?t>o?F mientras %ue $ara
cam!iar e# co#or" uti#izamos #a estructura Co#or 1 #a $ro$iedad >acHCo#or" tam!i'n de#
1&9 Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Te?t>o?&
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
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
Cdigo <uente .JA
List)o3
Un contro# List>o? contiene una #ista de 9a#ores" de #os cua#es" e# usuario $uede
se#eccionar uno o 9arios simu#tneamente& Entre #as $rinci$a#es $ro$iedades de este
contro#" $odemos resa#tar #as siguientes&
Q 4tems& Contiene #a #ista de 9a#ores %ue 9isua#iza e# contro#& Se trata
de un ti$o List>o?&:!0ectCo##ection" de manera %ue e# contenido de #a #ista $uede
ser tanto ti$os carcter" como num'ricos 1 o!0etos de distintas c#ases& /# se#eccionar esta
$ro$iedad en #a 9entana de $ro$iedades de# contro#" 1 $u#sar e# !otn %ue contiene"
$odemos introducir en una 9entana e#ementos $ara e# contro#& Cer Figura -J-&
1'! Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Figura -J-& ntroduccin de 9a#ores $ara un List>o? en tiem$o de dise@o&
E# contro# %uedar2a $or #o tanto con 9a#ores asignados en #a eta$a de dise@o" como
muestra #a
Figura -J3&
Figura -J3& List>o? en dise@o con 9a#ores en su #ista&
Q Aorted& Cuando esta $ro$iedad contiene e# 9a#or True" ordena e# contenido de #a
#ista& Cuando contiene Fa#se" #os e#ementos %ue hu!iera $re9iamente ordenados"
$ermanecen con dicho orden" mientras %ue #os nue9os no sern ordenados&
Q 4ntegralHeig*t& Los 9a#ores de #a #ista son mostrados a# com$#eto cuando
esta $ro$iedad contiene True& Sin em!argo" a# asignar e# 9a#or Fa#se" seg4n e# tama@o de#
contro#" $uede %ue e# 4#timo 9a#or de #a #ista se 9isua#iza s#o en $arte& La Figura -J.
muestra un List>o? con esta $ro$iedad a Fa#se&
1'1 Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
Figura -J.& List>o? mostrando $arte de# 4#timo e#emento de!ido a #a $ro$iedad ntegra#Reight&
Q Multi.olumn& Cisua#iza e# contenido de #a #ista en una o 9arias co#umnas en
<uncin de si asignamos Fa#se o True res$ecti9amente a esta $ro$iedad&
Q AelectionMode& Esta!#ece e# modo en e# %ue 9amos a $oder se#eccionar #os
e#ementos de #a #ista& Si esta $ro$iedad contiene ;one" no se rea#izar se#eccinF :ne"
$ermite se#eccionar #os 9a#ores uno a unoF Mu#tiSim$#e $ermite se#eccionar m4#ti$#es
9a#ores de #a #ista $ero de!emos se#eccionar#os inde$endientementeF $or 4#timo"
Mu#tiE?tended nos $osi!i#ita #a se#eccin m4#ti$#e" con #a 9enta0a de %ue $odemos hacer
c#ic en un 9a#or" 1 arrastrar" se#eccionando en #a misma o$eracin 9arios e#ementos de #a
#ista&
Q Aelected4tem& De9ue#9e e# e#emento de #a #ista actua#mente se#eccionado&
Q Aelecteditems& De9ue#9e una co#eccin List>o?&Se#ected:!0ectCo##ection" %ue
contiene #os e#ementos de #a #ista %ue han sido se#eccionados&
Q Aelected4nde3& n<orma de# e#emento de #a #ista se#eccionado" a tra9's de#
2ndice de #a co#eccin %ue contiene #os e#ementos de# List>o?&
Para mostrar a#gunas de #as <unciona#idades de este contro#" uti#izaremos e# $ro1ecto de
e0em$#o List>o?Pru +hacer c#ic a %u2 $ara acceder a este e0em$#o,& La Figura -JJ
muestra esta a$#icacin en e0ecucin&
Figura -JJ& E0em$#o de uso de# contro# List>o?&
1'& Luis Edgar Snchez
P ro g r a m aci n d e s i s te m as UTM-FCS-CEPSYMED
E# e0em$#o" como $uede com$ro!ar e# #ector" consiste en un <ormu#ario %ue contiene un
List>o? $rinci$a#" con e# nom!re #stCa#ores" %ue dis$one de una serie de 9a#ores
asignados en tiem$o de dise@o&
Cada 9ez %ue hacemos c#ic en a#guno de #os 9a#ores" se $roduce e# e9ento
Se#ectednde?Changed" %ue uti#izamos $ara mostrar en este caso" e# nom!re de#
e#emento en e# t2tu#o de# <ormu#ario" como muestra e# Cdigo <uente .J)" de #a c#ase
<rmListas" corres$ondiente a# <ormu#ario&
' declaramos esta constante a nivel de clase, para poner como ttulo
' 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
Cdigo <uente .J)
/ tra9's de #os *adio>utton" cam!iamos e# ti$o de se#eccin %ue $odemos e<ectuar en
e# contro# #stCa#ores& Cer Cdigo <uente .J-&
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
Cdigo <uente .J-
1''
Mediante #os contro#es chH:rdenar 1 chHCo#umnas" ordenaremos 1 mostraremos
en co#umnas res$ecti9amente e# List>o?& Cer Cdigo <uente .J3&
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 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
Cdigo <uente .J3
E# Te?t>o? de este <ormu#ario #o usaremos $ara a@adir nue9os e#ementos a# List>o?
#stCa#ores" 1 !uscar tam!i'n e#ementos e?istentes" $u#sando #os !otones !tn/gregar 1
!tn>uscar en cada caso& :!ser9emos e# miem!ro ;oMatches de# List>o?" mediante e# %ue
a9eriguamos si #a !4s%ueda tu9o '?ito& Cer e# Cdigo <uente .J.&
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
1'(
Cdigo <uente .J.
La se#eccin de #os e#ementos de un List>o? no es com$etencia e?c#usi9a de# usuario& E#
$rogramador $uede tam!i'n" si #o necesita" se#eccionar 9a#ores de #a #ista mediante e#
cdigo de# $rograma& /# $u#sar e# !otn !tnSe#ecCod" uti#izaremos e# m'todo
SetSe#ected+ , de# List>o? $ara rea#izar esta tarea& En este m'todo $asamos como
$armetro e# 2ndice de #a #ista con e# %ue 9amos a o$erar" 1 e# 9a#or True $ara
se#eccionar#o" o Fa#se $ara %uitar#e #a se#eccin& Cer e# Cdigo <uente .JJ&
Private Sub btnSelecCod_Click(ByVal sender As System.Object, ByVal e As
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
Cdigo <uente .JJ
E# !otn !tnTras$asarSe#ec #o usaremos $ara tomar #os e#ementos se#eccionados de
#stCa#ores" 1 $asar#os a# otro List>o? de# <ormu#ario& La $ro$iedad Se#ectedtems de#
contro# #stCa#ores" de9ue#9e una co#eccin con sus e#ementos se#eccionados& Por otra
$arte" $odemos e#iminar #os e#ementos de un List>o? ##amando a# m'todo C#ear+ , de #a
co#eccin de 9a#ores de# contro#" cosa %ue hacemos $u#sando e# !otn !tnLim$iar& Cer
Cdigo <uente .JL&
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
1'+
' con el mtodo Clear() de la coleccin de elementos
' de un ListBox, borramos los elementos del controls
Me.lstTraspaso.Items.Clear()
End Sub
Cdigo <uente .JL
.ombo)o3
E# Com!o>o? es un contro# !asado en #a com!inacin +de ah2 su nom!re, de dos contro#es
%ue 1a hemos tratado( Te?t>o? 1 List>o?&
Un contro# Com!o>o? dis$one de una zona de edicin de te?to 1 una #ista de 9a#ores" %ue
$odemos des$#egar desde e# cuadro de edicin&
E# esti#o de 9isua#izacin $or de<ecto de este contro#" muestra e# cuadro de te?to 1 #a
#ista ocu#ta" aun%ue mediante #a $ro$iedad Dro$DoEnSt1#e $odemos cam!iar dicho esti#o&
La Figura -JL muestra un <ormu#ario con di9ersos Com!o>o?" cada uno con di<erente
esti#o& Este $ro1ecto de e0em$#o" Com!o>o?Pru" $uede o!tenerse haciendo c#ic a %u2&
Figura -JL& Contro#es Com!o>o? de distintos esti#os&
La $ro$iedad Dro$DoEnSt1#e tam!i'n in<#u1e en una di<erencia im$ortante de
com$ortamiento entre e# esti#o Dro$DoEnList 1 #os dems" dado %ue cuando creamos un
Com!o>o? con e# mencionado esti#o" e# cuadro de te?to s#o $odr mostrar in<ormacin"
no $ermitiendo %ue esta sea modi<icada&
En e# caso de %ue #a #ista des$#ega!#e sea mu1 grande" mediante #a $ro$iedad
Ma?Dro$DoEntems" asignaremos e# n4mero de e#ementos m?imo %ue mostrar #a
#ista de# contro#&
E# resto de $ro$iedades 1 m'todos son comunes con #os contro#es Te?t>o? 1 List>o?& En
e# Cdigo <uente .JM se muestra e# cdigo de# !otn !tn/gregar" mediante e# %ue ##enamos
de 9a#ores #os contro#es de este e0em$#o&
1',
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
Cdigo <uente .JM
Fuente( >L/;C:" Luis Migue# V 3Programacin en Cisua# >asic &;ET5
Taller ).%$
< En un $ro1ecto NindoEs <orms cree una a$#icacin %ue $resente un <ormu#ario con
un men4 de o$ciones a e#egir entre(3Te?t>o?5" *adio>uttons5" 3ChecH>o?5"
3List!o?5 1 3Com!o>o?5" a# e#egir una o$cin de!er $resentar un <ormu#ario con
e0em$#os $ara cada ti$o de contro# seg4n corres$onda& La a$#icacin de!er iniciar
desde un 3su! Main5&
1'7
Tema '.': Men?s e 4nter0aces de 0ormularios m?ltiples.
.ontroles de tipo men?
E# men4 es uno de #os ti$os de contro# ms <recuentemente uti#izados en #os <ormu#arios
NindoEs& Consiste en un con0unto de o$ciones" a tra9's de #as cua#es" e# usuario e0ecutar
a#gunos $rocesos de #a a$#icacin& Dis$onemos de tres ti$os de contro# men4( MainMenu"
Conte?tMenu 1 Menutem&
MainMenu 1 Conte?tMenu act4an como contenedores de gru$os de contro#es
Menutem" re$resentando este 4#timo contro#" #a o$cin de men4 so!re #a %ue e# usuario
$u#sa o hace c#ic&
E# $ro1ecto MenuPru %ue se acom$a@a como e0em$#o" muestra #os di<erentes ti$os de
men4& / continuacin" descri!iremos #os $rinci$a#es $asos a dar en e# $roceso de su
construccin&
Men? rincipal. MainMenu
Un contro# MainMenu" consiste en un con0unto de o$ciones %ue se sit4an horizonta#mente
de!a0o de# t2tu#o de# <ormu#ario& / $artir de cada o$cin" $odemos asociar a su 9ez" gru$os
de o$ciones %ue se mostraran 9ertica#mente a# hacer c#ic en #a o$cin $rinci$a# o situada
en #a !arra horizonta#&
Para crear un men4 $rinci$a#" se#eccionaremos de# cuadro de herramientas e# contro#
MainMenu" 1 tras di!u0ar#o en e# <ormu#ario" se a@adir una re<erencia de# contro# a#
$ane# de contro#es es$ecia#es situado !a0o e# dise@ador& La Figura -ML muestra
un contro# de este ti$o a# %ue #e hemos dado e# nom!re mnuPrinci$a#&
Figura -ML& Men4 de ti$o MainMenu a@adido a# dise@ador de# <ormu#ario&
1'8
La creacin de #as di<erentes o$ciones %ue com$ondrn e# men4 es un $roceso %ue se ha
me0orado 1 sim$#i<icado a# m?imo res$ecto a 9ersiones anteriores de C>& E# $roceso de
edicin de# men4 se rea#iza directamente en e# <ormu#ario" en e# mismo #ugar en e# %ue e#
men4 a$arecer en tiem$o de e0ecucin&
/# hacer c#ic en #a $rimera o$cin de# men4" $odemos dar nom!re 1 $ro$iedades a esa
o$cin& /# mismo tiem$o" de un modo mu1 intuiti9o" 9eremos #as $r?imas o$ciones
dis$oni!#es" tanto #as des$#ega!#es a $artir de dicho men4" como #as de #a !arra $rinci$a#&
S#o hemos de mo9ernos en #a direccin %ue necesitemos 1 dar nom!re a #as o$ciones" 1
9a#ores a sus $ro$iedades& Cer Figura -MM&
Figura -MM& Creacin de #as o$ciones de un men4 $rinci$a# de <ormu#ario&
Cada una de #as o$ciones %ue com$onen e# men4 es a su 9ez un contro# Menutem& Si
durante su creacin s#o $ro$orcionamos e# nom!re" e# DE 9a asignando a dicho contro#
9a#ores $or de<ecto en sus $ro$iedades&
Para modi<icar #as $ro$iedades de una o$cin de men4" s#o hemos de se#eccionar#o en #a
estructura de men4 %ue estamos creando en e# dise@ador de# <ormu#ario" 1 $asar a #a
9entana de $ro$iedades& Entre #as $ro$iedades dis$oni!#es $ara un Menutem" $odemos
destacar #as siguientes&
Q Te3t& Contiene una cadena con e# #itera# o te?to descri$ti9o de #a o$cin de men4&
Q -nabled& Permite ha!i#itar8desha!i#itar #a o$cin de men4& Cuando se encuentra
desha!i#itada" se muestra su nom!re en un tono gris" indicando %ue no $uede ser
se#eccionada $or e# usuario&
Q 6e0ault4tem& Permite esta!#ecer o$ciones $or de<ecto& En una o$cin de men4 $or
de<ecto" su te?to se resa#ta en negrita&
Q .*ec=ed& Marca8desmarca #a o$cin& Cuando una o$cin est marcada" muestra 0unto a
su nom!re un $e%ue@o s2m!o#o de 9eri<icacin o $unteo&
Q 5adio.*ec=& En e# caso de %ue #a o$cin de men4 se encuentre marcada" si asignamos
1'9
True a esta $ro$iedad" en #ugar de mostrar e# s2m!o#o de 9eri<icacin estndar" se muestra
uno con <orma de $unto&
Q A*ort.ut& Se trata de un ata0o de tec#ado" o com!inacin de tec#as %ue nos 9an a
$ermitir e0ecutar #a o$cin de men4 sin tener %ue des$#egar#o& /# e#egir esta $ro$iedad"
a$arecer una #ista con todos #os ata0os dis$oni!#es $ara asignar&
Q A*o<A*ort.ut& Permite mostrar u ocu#tar #a com!inacin de tec#as de# ata0o de tec#ado
%ue tenga asignado una o$cin de men4&
Q "isible& Muestra u ocu#ta #a o$cin de men4&
Q MdiList& Esta $ro$iedad se uti#iza ha!itua#mente en o$ciones situadas en #a !arra de
men4" 1 $ermite esta!#ecer %ue dicha o$cin a# des$#egarse" muestre" adems de #as
o$ciones de men4 %ue #e ha1amos asignado" #a #ista de 9entanas secundarias MD" en e#
caso de %ue e# men4 $rinci$a# est' contenido en un <ormu#ario de ti$o MD& Los
<ormu#arios MD sern tratados $osteriormente&
Podemos adiciona#mente" asignar una tec#a de acceso r$ido o hot4ey a una o$cin de
men4" ante$oniendo e# carcter T a #a #etra %ue deseemos" de #as %ue se encuentran en #a
$ro$iedad Te?t de# contro# Menutem& /# igua# %ue sucede con #os dems ti$os de
contro#es" en e# te?to de #a o$cin de men4" a$arecer su!ra1ada #a mencionada #etra& De
este modo" cuando des$#eguemos un men4" no ser necesario $osicionarnos en una de
e##as $ara e0ecutar#a" sino %ue sim$#emente $u#sando #a tec#a r$ida" se e0ecutar e# cdigo
de dicha o$cin&
Tam!i'n $odemos esta!#ecer se$aradores entre #as o$ciones de men4 sim$#emente creando
una o$cin 1 asignando a su $ro$iedad Te?t e# carcter de guin + - ,&
En nuestro <ormu#ario de e0em$#o" 9amos $ues a dise@ar un men4 con #a estructura de#
es%uema mostrado en #a Figura -MI&
Para todas #as o$ciones se ha asignado una tec#a de acceso r$ido" 1 adiciona#mente" $ara
#as o$ciones %ue se indican a continuacin" se han modi<icado a#gunas $ro$iedades $or
de<ecto&
Q Euardar& Desha!i#itada&
Q Aalir& /ta0o de tec#ado en Ctr#& 7 S&
Q .opiar& :$cin $or de<ecto&
Q egar& Marcada con s2m!o#o norma#&
Q .ortar& Marcada con s2m!o#o de c2rcu#o&
Q -lipse& :$cin no 9isi!#e&
1(!
Figura -MI& Es%uema de# men4 de e0em$#o&
La Figura -MP muestra e# <ormu#ario en e0ecucin con una $arte de# men4 a!ierta&
Figura -MP& Men4 des$#egado a 9arios ni9e#es" mostrando o$ciones&
Una 9ez <ina#izada #a <ase de dise@o de# men4" de!emos $roceder a escri!ir e#
cdigo $ara sus o$ciones& E# e9ento C#icH es e# %ue $ermite a un contro# Menutem
e0ecutar cdigo cuando #a o$cin de men4 es se#eccionada& /!riendo $or tanto" e# men4
desde e# dise@ador de# <ormu#ario" 1 haciendo do!#e c#ic en #a o$cin corres$ondiente"
nos situaremos en e# editor de cdigo" dentro de# $rocedimiento mani$u#ador de#
e9ento C#icH $ara esa o$cin& E# Cdigo <uente .MP muestra e# cdigo %ue se e0ecutar
cuando se#eccionemos #as o$ciones de men4 /!rir 1 Sa#ir de nuestro e0em$#o&
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
1(1
Cdigo <uente .MP
Puesto %ue muchas de #as $ro$iedades de un contro# Menutem son mani$u#a!#es en
tiem$o de e0ecucin" a@adiremos a# <ormu#ario 9arios !otones" mediante #os cua#es
rea#izaremos o$eraciones so!re #as o$ciones de# men4 ta#es como ha!i#itar 1 desha!i#itar"
mostrar 1 ocu#tar" cam!iar e# nom!re" etc& La Figura -IA muestra e# <ormu#ario con
estos nue9os !otones&
Figura -IA& Contro#es >utton $ara mani$u#ar $or cdigo #as $ro$iedades de #as o$ciones de# men4&
En e# Cdigo <uente .IA $odemos 9er #os mani$u#adores de e9ento de estos !otones&
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
1(&
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
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
Cdigo <uente .IA
Men? .onte3tual. .onte3tMenu
E# contro# Conte?tMenu re$resenta un men4 conte?tua# o <#otante& Este ti$o de men4 se
asocia a# <ormu#ario o a uno de sus contro#es" de modo %ue a# hacer c#ic derecho" se
mostrar so!re e# e#emento a# %ue se ha1a asociado&
E# modo de a@adir un contro# Conte?tMenu 1 sus corres$ondientes o$ciones a#
<ormu#ario" es e# mismo %ue $ara un MainMenuF situndose tam!i'n una re<erencia de#
men4 conte?tua# en e# $ane# de contro#es es$ecia#es de# dise@ador& /ntes de $oder dise@ar
#as o$ciones de un Conte?tMenu" de!emos $u#sar #a re<erencia de dicho men4 %ue e?iste
en e# $ane# de contro#es es$ecia#es" 1a %ue $or de<ecto" e# <ormu#ario muestra e# men4
$rinci$a# en caso de %ue tenga uno de<inido&
La Figura -I) muestra e# men4 conte?tua# mnuConte?to" %ue hemos a@adido a#
<ormu#ario& Para asociar este men4 con un contro# o <ormu#ario" uti#izaremos #a
$ro$iedad Conte?tMenu de %ue dis$onen #a ma1or2a de #os contro#es NindoEs& En este
e0em$#o" insertaremos e# contro# t?tCa#or" de ti$o Te?t>o?" 1 #e asociaremos e# men4 de
conte?to %ue aca!amos de crear&
1('
Figura -I)& Dise@o de un men4 conte?tua#&
Como resu#tado" cuando e0ecutemos #a a$#icacin" a# hacer c#ic derecho so!re e# Te?t>o?"
a$arecer e# men4 conte?tua# %ue hemos asignado" mediante e# %ue cam!iaremos e# ti$o
de <uente de #a ca0a de te?to" trans<ormaremos e# te?to a ma14scu#as 1 min4scu#as&
E# Cdigo <uente .I) muestra e# cdigo de #os e9entos C#icH corres$ondiente a #as
o$ciones de# men4 conte?tua#&
Private Sub mnuFuente_Click(ByVal sender As System.Object, ByVal e As
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
Cdigo <uente .I)
La Figura -I- muestra e# as$ecto de# men4 conte?tua#" cuando es uti#izado desde e# contro#
Te?t>o?&
Figura -I-& Contro# Conte?tMenu asociado a un Te?t>o?&
1((
Aplicaciones de estilo A64
Una a$#icacin de ti$o o esti#o SD +Sing#e Document nter<ace," nter<az de Documento
Senci##o" est com$uesta <undamenta#mente de un 4nico <ormu#ario" a tra9's de# cua#" e#
usuario rea#iza toda #a interaccin con e# $rograma& Como e0em$#os de este ti$o de
a$#icacin tenemos e# >#oc de ;otas o #a Ca#cu#adora de NindoEs&
Un $rograma SD $uede tener ms de un <ormu#ario" aun%ue no sea a#go ha!itua#& Cuando
eso ocurre" #os <ormu#arios se e0ecutan inde$endientemente" sin un e#emento contenedor
%ue #os organice&
Aplicaciones de estilo M64
Una a$#icacin de ti$o o esti#o MD +Mu#ti$#e Document nter<ace," nter<az de
Documento M4#ti$#e" se com$one de un <ormu#ario $rinci$a#" tam!i'n
denominado <ormu#ario MD" %ue actuar como contenedor de otros <ormu#arios
+documentos, a!iertos durante e# transcurso de# $rograma" denominados <ormu#arios
hi0os o secundarios MD& Como e0em$#os de este ti$o de a$#icacin tenemos PoEerPoint
o /ccess&
/ di<erencia de #o %ue ocurr2a en 9ersiones anteriores de C>" un <ormu#ario MD admite
#os mismos contro#es %ue un <ormu#ario norma#" aun%ue dada su orientacin de <ormu#ario
contenedor" se recomienda #imitar #os contro#es en un MD a #os estrictamente necesarios&
E# men4 es e# e0em$#o ms identi<icati9o de contro# idneo $ara un <ormu#ario MD" 1a
%ue a tra9's de sus o$ciones" $odremos a!rir #os <ormu#arios hi0os de #a a$#icacin&
Seguidamente descri!iremos e# $roceso de creacin de un $ro1ecto %ue contenga un
<ormu#ario MD 1 dos <ormu#arios hi0os" as2 como e# com$ortamiento de estos 4#timos
cuando son a!iertos dentro de# <ormu#ario $adre MD&
Una 9ez creado e# nue9o $ro1ecto" cam!iaremos e# nom!re de# <ormu#ario $or de<ecto a
<rmPrinci$a#& Para conseguir %ue este <ormu#ario tenga e# com$ortamiento de un
contenedor MD" de!emos asignar e# 9a#or True a su $ro$iedad sMdiContainer&
Tam!i'n de!emos esta!#ecer a este <ormu#ario como inicia# en #as $ro$iedades de#
$ro1ecto&
/hora $asaremos a #a creacin de #os <ormu#arios hi0os de# MD& E# $rimero" <rmCarta"
$ermite #a escritura en un Te?t>o? mu#ti#2nea" cu1o contenido $odremos gra!ar a un
archi9o en disco& La Figura
-P- muestra este <ormu#ario&
1(+
Figura -P-& Formu#ario hi0o de MD $ara escri!ir un te?to #argo&
E# cdigo de# !otn %ue rea#iza #a gra!acin de# te?to #o $odemos 9er en e# Cdigo <uente
.PL& De!emos im$ortar e# es$acio de nom!res S1stem&:" 1a %ue en esta c#ase de#
<ormu#ario hacemos uso de #os ti$os Fi#e 1 StreamNriter&
Private Sub btnGrabar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnGrabar.Click
' escribir en un archivo el contenido
' del TextBox
Dim oEscritor As StreamWriter
oEscritor = File.CreateText(Me.txtArchivo.Text)
oEscritor.Write(Me.txtCarta.Text)
oEscritor.Close()
End Sub
Cdigo <uente .PL
E# otro <ormu#ario hi0o" <rmn<o" muestra #a <echa 1 hora actua#F esta 4#tima es actua#izada
a tra9's de# contro# Timer tmrTiem$o& Cer #a Figura -P3&
1(,
Figura -P3& Formu#ario hi0o de MD $ara mostrar <echa 1 hora actua#es&
E# Cdigo <uente .PM muestra #as instrucciones %ue se e0ecutan en e# e9ento TicH de#
contro# Timer&
Private Sub tmrTiempo_Tick(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles tmrTiempo.Tick
Dim dtFecha As Date dtFecha = DateTime.Today
Dim dtHora As Date
dtHora = DateTime.Now
Me.lblFecha.Text = dtFecha.ToString("d/MMM/yyyy")
Me.lblHora.Text = dtHora.ToString("h:m:s")
End Sub
Cdigo <uente .PM
E# siguiente $aso consiste en crear un men4 $ara $oder a!rir #os <ormu#arios hi0os a
tra9's de sus o$ciones& Cer Figura -P.&
Figura -P.& Men4 de# <ormu#ario MD&
En #as o$ciones Carta e n<ormacin de# men4" instanciaremos un o!0eto de# <ormu#ario
corres$ondiente" teniendo en cuenta %ue $ara conseguir %ue dichos <ormu#arios se
com$orten como hi0os de# MD" de!emos asignar a su $ro$iedad MdiParent" #a instancia
actua# de# <ormu#ario en e0ecucin" es decir" Me& Ceamos este $unto en e# Cdigo <uente
.PI&
Private Sub mnuCarta_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuCarta.Click
Dim ofrmCarta As New frmCarta()
' con la siguiente lnea conseguimos que el
' formulario se comporte como hijo del actual ofrmCarta.MdiParent = Me
ofrmCarta.Show()
End Sub
1(7
Private Sub mnuInformacion_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuInformacion.Click
Dim ofrmInfo As New frmInfo()
' con la siguiente lnea conseguimos que el
' formulario se comporte como hijo del actual
ofrmInfo.MdiParent = Me
ofrmInfo.Show()
End Sub
Cdigo <uente .PI
En #a Figura -PJ mostramos e# <ormu#ario MD en e0ecucin" conteniendo a #os
<ormu#arios hi0os de$endientes&
Figura -PJ& /$#icacin MD en e0ecucin&
.reacin de men?s de tipo "entana8 en 0ormularios
M64
Es $ro!a!#e %ue e# #ector ha1a o!ser9ado" en a#gunas a$#icaciones NindoEs de ti$o
MD" %ue e?iste en #a !arra de men4s de #a 9entana $rinci$a#" un men4 con e# nom!re
Centana o NindoE +de$ende de# idioma de# $rograma," %ue nos muestra #os nom!res de
#os <ormu#arios hi0os a!iertos" $ermiti'ndonos cam!iar de <ormu#ario acti9o a# se#eccionar
1(8
una de esas o$ciones&
En nuestras a$#icaciones MD tam!i'n $odemos dis$oner de un men4 de este ti$o"
a@adiendo una nue9a o$cin a# men4 $rinci$a# de# <ormu#ario MD" 1 asignando a su
$ro$iedad MdiList e# 9a#or True&
/diciona#mente" 1 $ara dar#e un as$ecto ms $ro<esiona# a este men4" $odemos a@adir #os
Menutem corres$ondientes a #a organizacin de #os <ormu#arios hi0os en Cascada"
Mosaico Rorizonta#" etc& Para organizar #os <ormu#arios a!iertos en #a a$#icacin en a#guno
de estos modos" de!eremos e0ecutar e# m'todo La1outMdi+ , de# <ormu#ario MD"
$asndo#e como $armetro uno de #os 9a#ores corres$ondiente a #a enumeracin
MdiLa1out& E# Cdigo <uente .PP muestra #as o$ciones corres$ondientes a #a organizacin
en cascada 1 en mosaico horizonta# de nuestro e0em$#o&
Private Sub mnuCascada_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuCascada.Click
Me.LayoutMdi(MdiLayout.Cascade)
End Sub
Private Sub mnuHorizontal_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuHorizontal.Click
Me.LayoutMdi(MdiLayout.TileHorizontal)
End Sub
Cdigo <uente .PP
La Figura -PL muestra e# mencionado men4 Centana de este $ro1ecto" en cua#
contiene en este caso #os nom!res de #os <ormu#arios a!iertos %ue aca!an de ser
organizados en mosaico 9ertica#&
Figura -PL& Men4 9entana en <ormu#ario MD&
Luis Edgar Snchez
1(9
.omportamiento :o Modal 1Modeless2 de 0ormularios
Un <ormu#ario de com$ortamiento no moda#" $ermite e# #i!re cam!io de <oco entre
e# resto de <ormu#arios de #a a$#icacin&
Una c#ara muestra #a hemos 9isto en e# $ro1ecto de e0em$#o rea#izado durante #os
4#timos a$artados de# te?to& En dicha a$#icacin" $od2amos a!rir 9arios <ormu#arios
hi0os dentro de# <ormu#ario MD $rinci$a#" 1 $asar de uno a otro sin restricciones&
:tra caracter2stica de #os <ormu#arios no moda#es reside en %ue una 9ez creados 1
9isua#izados" e# resto de# cdigo de #a a$#icacin contin4a su e0ecucin& Cer Cdigo <uente
JA3&
Dim ofrmCarta As New frmCarta()
' crear formulario hijo de un mdi ofrmCarta.MdiParent = Me ofrmCarta.Show()
' despus de mostrar el formulario hijo
' se muestra a continuacin este mensaje
MessageBox.Show("Se acaba de abrir un formulario hijo")
Cdigo <uente JA3
.omportamiento Modal de 0ormularios
Como contra$artida a# anterior a$artado tenemos #os <ormu#arios de com$ortamiento
moda#" tam!i'n denominados cuadros o 9entanas de di#ogo&
Un <ormu#ario moda#" a# ser 9isua#izado" !#o%uea e# $aso a otros <ormu#arios de #a
a$#icacin hasta %ue no es cerrado +ace$tado o com$#etado, $or e# usuario&
Como e0em$#o de estos <ormu#arios se acom$a@a e# $ro1ecto FormDia#ogos" de# %ue
$asamos a descri!ir su $roceso de creacin&
Este $ro1ecto contiene un <ormu#ario MD ##amado <rmPrinci$a#" 1 uno hi0o con e#
nom!re <rmRi0o" %ue a!rimos mediante una o$cin de men4F #a creacin de este ti$o de
<ormu#arios se ha descrito en a$artados anteriores&
/ continuacin a@adimos un nue9o <ormu#ario a# $ro1ecto con e# nom!re <rmDia#ogo" %ue
tam!i'n a!riremos a tra9's de #a corres$ondiente o$cin de men4 de# <ormu#ario MD&
Para %ue este <ormu#ario tenga un com$ortamiento moda#" de!emos mostrar#o e0ecutando
e# m'todo ShoEDia#og+ , de #a c#ase Form& En e# Cdigo <uente JA. tenemos
#as instrucciones necesarias& :!ser9e tam!i'n e# #ector" cmo hasta %ue e# <ormu#ario
de di#ogo no es cerrado" no se mostrar e# mensa0e %ue ha1 a continuacin de #a
##amada a ShoEDia#og+ ,& Si adems intentamos $asar a# <ormu#ario hi0o" en e# caso de
%ue est' a!ierto" no $odremos&
1+!
Luis Edgar Snchez
Private Sub mnuDialogo_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuDialogo.Click
' instanciar el formulario que mostraremos como un dilogo
Dim ofrmDialogo As New frmDialogo()
' dar una posicin al formulario
ofrmDialogo.StartPosition = FormStartPosition.CenterParent
' mostrarlo de forma modal, como cuadro de dilogo ofrmDialogo.ShowDialog()
MessageBox.Show("Se ha cerrado el dilogo")
End Sub
Cdigo <uente JA.
Para cerrar un <ormu#ario moda# $odemos" a# igua# %ue $ara cua#%uier <ormu#ario" e0ecutar
su m'todo C#ose+ ,& ;o o!stante" un <ormu#ario de di#ogo sue#e $ro$orcionar" aun%ue esto
no es o!#igatorio" #os t2$icos !otones $ara ace$tar" cance#ar" reintentar" etc&F de modo %ue
una 9ez cerrado e# <ormu#ario" $odamos a9eriguar %u' !otn $u#s e# usuario&
Podemos $ro$orcionar este com$ortamiento en nuestros <ormu#arios moda#es"
asignando a #a $ro$iedad Dia#og*esu#t de #a c#ase Form" uno de #os 9a#ores de# ti$o
enumerado Dia#og*esu#t& Esto tendr como e<ecto adiciona# e# cierre de# cuadro de
di#ogo&
Por #o tanto" 9amos a a@adir a nuestro <ormu#ario <rmDia#ogo" dos contro#es >utton(
!tn/ce$tar 1 !tnCance#ar" en #os %ue escri!iremos #as instrucciones de# Cdigo <uente JAJ&
Private Sub btnAceptar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnAceptar.Click
' asignar un valor a esta propiedad,
' cierra al mismo tiempo el formulario
Me.DialogResult = DialogResult.OK
End Sub
Private Sub btnCancelar_Click(ByVal sender As Object, ByVal e As
System.EventArgs) Handles btnCancelar.Click
' asignar un valor a esta propiedad,
' cierra al mismo tiempo el formulario
Me.DialogResult = DialogResult.Cancel
End Sub
Cdigo <uente JAJ
Como a1uda en #a construccin de <ormu#arios moda#es de di#ogo" #a c#ase Form dis$one
de #as $ro$iedades /cce$t>utton 1 Cance#>utton" a #as %ue $odemos asignar sendos
contro#es >utton %ue sern e0ecutados a# $u#sar #as tec#as Z;T*:[ 1 ZESC/PE[
res$ecti9amente&
Esto es #o %ue haremos en e# <ormu#ario <rmDia#ogo" asignando a /cce$t>utton e# contro#
1+1 Luis Edgar Snchez
!tn/ce$tar" 1 en Cance#>utton asignaremos !tnCance#ar&
Fina#mente" en e# e9ento de #a o$cin de men4 %ue a!re este <ormu#ario moda#"
corres$ondiente a <rmPrinci$a#" a@adiremos" tras #a ##amada a ShoEDia#og+ ," e# cdigo
%ue com$ro!ar e# resu#tado de #a e0ecucin de# <ormu#ario de di#ogo& Cer e# Cdigo
<uente JAL&
Private Sub mnuDialogo_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuDialogo.Click
' instanciar el formulario que mostraremos como un dilogo
Dim ofrmDialogo As New frmDialogo()
' dar una posicin al formulario
ofrmDialogo.StartPosition = FormStartPosition.CenterParent
' mostrarlo de forma modal, como cuadro de dilogo
ofrmDialogo.ShowDialog()
' comprobar lo que ha hecho el usuario
' en el cuadro de dilogo
Dim Resultado As DialogResult
Resultado = ofrmDialogo.DialogResult
If Resultado = DialogResult.OK Then
MessageBox.Show("Datos del dilogo: " & _ ofrmDialogo.txtNombre.Text & " " & _
ofrmDialogo.txtApellidos.Text)
Else
MessageBox.Show("Se ha cancelado el dilogo")
End If
End Sub
Cdigo <uente JAL
La Figura -PI muestra e# $rograma en e0ecucin& Como $uede com$ro!ar e# #ector" e#
<ormu#ario moda#" de!ido a su com$ortamiento" no se encuentra #imitado a #os !ordes de#
<ormu#ario MDF $ero de$ende de este 4#timo" 1a %ue si intentamos $asar e# <oco a un
<ormu#ario hi0o" no $odremos&
1+& Luis Edgar Snchez
Figura -PI& Formu#ario moda# de di#ogo en e0ecucin&
.ontroles de cuadros de di@logo del sistema
De# con0unto de contro#es %ue nos o<rece #a 9entana Cuadro de herramientas de# DE"
e?iste un gru$o %ue nos $ermite e# acceso a #os cuadros de di#ogo estndar de# sistema
o$erati9o" esto es" #os cuadros de se#eccin de co#or" ti$o de #etra o <uente" a$ertura-
gra!acin de archi9o" etc&
Para i#ustrar e# uso de a#gunos de estos contro#es" 9amos a crear un $ro1ecto de e0em$#o
con e# nom!re Dia#ogosSistema " en e# %ue descri!iremos su modo de uso en #os as$ectos
de dise@o 1 codi<icacin&
Crearemos $ues" un nue9o $ro1ecto de ti$o a$#icacin NindoEs" 1 en su <ormu#ario"
insertaremos un men4" a@adiendo #as siguientes o$ciones( /!rir" =uardar" Co#or 1
Fuente& Cada o$cin mostrar un ti$o de di#ogo de# sistema&
Seguidamente insertaremos un Te?t>o?" %ue aco$#aremos con #a $ro$iedad DocH a todo e#
es$acio de# <ormu#ario" 1 %ue nos ser9ir como !ase $ara #as o$eraciones a rea#izar
mediante #os contro#es de di#ogo& La Figura -PP muestra e# as$ecto de este <ormu#ario&
Luis Edgar Snchez 1+'
Figura -PP& Formu#ario de $rue!as $ara contro#es de di#ogo estndar&
Una 9ez di!u0ado un contro# de cuadro de di#ogo en e# <ormu#ario" dicho contro# %uedar
u!icado en e# $ane# de contro#es es$ecia#es" a# igua# %ue sucede con #os men4s& Para a!rir
un contro# de este ti$o en tiem$o de e0ecucin" em$#earemos su m'todo ShoEDia#og+ ,&
/ continuacin descri!iremos cada uno de #os contro#es de di#ogo uti#izados en este
e0em$#o&
.olor6ialog
Este contro# muestra e# cuadro de di#ogo de# sistema $ara #a se#eccin de co#ores& Entre
sus $ro$iedades $odemos destacar #as siguientes&
Q .olor& Contiene un ti$o de #a estructura Co#or" %ue nos $ermite o!tener e# co#or
se#eccionado $or e# usuario mediante este cuadro de di#ogo" $ara $oder a$#icar#o so!re
a#guno de #os e#ementos de# <ormu#ario&
Q Allo<;ull$pen& Contiene un 9a#or #gico %ue $ermite ha!i#itar 1 desha!i#itar e# !otn
%ue muestra e# con0unto de co#ores $ersona#izados de# cuadro de di#ogo de se#eccin de
co#ores&
/# se#eccionar en e# <ormu#ario" #a o$cin de men4 Co#or" e0ecutaremos e# Cdigo <uente
JAM %ue nos $ermitir" uti#izando e# contro# d#gCo#or" de ti$o Co#orDia#og" e#egir un
co#or 1 a$#icar#o a #a $ro$iedad >acHCo#or" de# contro# Te?t>o?&
Private Sub mnuColor_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuColor.Click
Me.dlgColor.ShowDialog() Me.txtTexto.BackColor = Me.dlgColor.Color
End Sub
Cdigo <uente JAM
1+( Luis Edgar Snchez
La Figura 3AA muestra esta a$#icacin con e# <ormu#ario 1 e# cuadro de se#eccin de co#or
a!iertos&
Figura 3AA& Cuadro de di#ogo estndar $ara se#eccin de co#ores&
;ont6ialog
Este contro# muestra e# cuadro de di#ogo de# sistema $ara #a se#eccin de# ti$o de
<uente& Entre sus $ro$iedades $odemos destacar #as siguientes&
Q ;ont& Contiene un ti$o de #a c#ase Font& Una 9ez se#eccionada una <uente $or e# usuario
en e# cuadro de di#ogo" $odremos cam!iar e# <uente de #os contro#es de# <ormu#ario&
Q A*o<Appl#& Contiene un 9a#or #gico %ue $ermite mostrar-ocu#tar e# !otn /$#icar" %ue
nos $ermitir asignar e# ti$o de #etra sin cerrar e# di#ogo& /# $u#sar este !otn se
desencadenar e#
e9ento /$$#1 de este contro# de di#ogo" en e# %ue $odremos escri!ir e# cdigo necesario
$ara a$#icar #a nue9a <uente se#eccionada&
/# se#eccionar en e# <ormu#ario #a o$cin de men4 Fuente" e0ecutaremos e# Cdigo <uente
JAI %ue nos $ermitir" uti#izando e# contro# d#gFuente" de ti$o FontDia#og" e#egir un ti$o
de #etra" 1 a$#icar#o a #a $ro$iedad Font de# contro# Te?t>o?F con #a $articu#aridad de %ue
e# cam!io de #etra #o haremos tanto a# $u#sar e# !otn /ce$tar" como /$#icar de# cuadro de
di#ogo&
1++
Luis Edgar Snchez
' al hacer clic en este men, mostramos el cuadro
' de seleccin de fuente
Private Sub mnuFuente_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuFuente.Click
Me.dlgFuente.ShowApply = True Me.dlgFuente.ShowDialog() Me.AplicarFuente()
End Sub
' este mtodo cambia el fuente del TextBox
Private Sub AplicarFuente()
Me.txtTexto.Font = Me.dlgFuente.Font
End Sub
' al pulsar el botn Aplicar del dilogo de
' seleccin de fuente, se produce este evento
Private Sub dlgFuente_Apply(ByVal sender As Object, ByVal e As System.EventArgs)
Handles dlgFuente.Apply
Me.AplicarFuente()
End Sub
Cdigo <uente JAI
La Figura 3A) muestra e# cam!io de <uente so!re e# te?to de# <ormu#ario&
Figura 3A)& Cuadro de di#ogo de# sistema $ara se#eccin de ti$o de #etra
Aa%e;ile6ialog
Este contro# muestra e# cuadro de di#ogo de# sistema" mediante e# %ue escri!imos un
nom!re de archi9o" 1 e#egimos un directorio" so!re e# cua# gra!aremos in<ormacin&
Es im$ortante $recisar %ue e# contro# no se ocu$a de# $roceso de gra!acin de datosF su
cometido es e# $ermitirnos na9egar $or #a estructura de# sistema de archi9os de# e%ui$o" 1
1+, Luis Edgar Snchez
#a se#eccin de un nom!re $ara e# archi9o a gra!ar&
Entre #as $ro$iedades de# contro#" $odemos destacar #as siguientes&
Q Title& Contiene una cadena con e# t2tu#o %ue a$arecer en e# cuadro de di#ogo&
Q 4nitial6irector#& *uta inicia# %ue mostrar e# contro# a# a!rirse&
Q ;ilter& Cadena con e# ti$o de archi9os %ue mostrar e# cuadro de di#ogo a# na9egar
$or e# sistema de archi9os& E# <ormato de esta cadena es e# siguiente( ;om!re/rchi9o
+W&E?tensin,_W&E?tensinF $udiendo situar 9arios <i#tros se$arados $or e# carcter de !arra
9ertica# + _ ,&
Q ;ilter4nde3& ;4mero %ue corres$onde a a#guno de #os ti$os de archi9o esta!#ecidos en
#a $ro$iedad Fi#ter&
Q ;ile:ame& ;om!re de# archi9o en e# %ue se rea#izar #a escritura
Q 6e0ault-3t& Cadena con #a e?tensin $or de<ecto a a$#icar so!re e# nom!re de#
archi9o&
Q .*ec=;ile-3ists& Ca#or #gico %ue nos $ermite com$ro!ar si e# archi9o so!re e# %ue
9amos a gra!ar 1a e?iste&
Q "alidate:ames& Ca#or #gico %ue com$ro!ar si e# nom!re de archi9o
$ro$orcionado contiene caracteres es$ecia#es" es decir" si se trata de un nom!re 9#ido&
/# se#eccionar en e# <ormu#ario #a o$cin de men4 =ra!ar" e0ecutaremos e# Cdigo <uente
JAP" %ue nos $ermitir" uti#izando e# contro# d#g=ra!ar" de ti$o Sa9eFi#eDia#og"
se#eccionar e# nom!re de un archi9o" 1 gra!ar e# Te?t>o? de# <ormu#ario so!re e#
mismo" mediante un StreamNriter&
Private Sub mnuGuardar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuGuardar.Click
' configurar por cdigo el dilogo de grabacin de archivos
Me.dlgGrabar.Filter = "Documento (*.doc)|*.doc|Texto (*.txt)|*.txt"
Me.dlgGrabar.FilterIndex = 2
Me.dlgGrabar.ValidateNames = True
Me.dlgGrabar.ShowDialog() ' abrir el cuadro de dilogo
' si todo es correcto, escribir mediante un objeto Stream
' el contenido del TextBox en el archivo indicado por
' las propiedades del cuadro de dilogo
Dim swEscritor As IO.StreamWriter
swEscritor = New IO.StreamWriter(Me.dlgGrabar.FileName)
swEscritor.Write(Me.txtTexto.Text)
swEscritor.Close()
MessageBox.Show("Texto grabado en archivo")
End Sub
1+7
Luis Edgar Snchez
Cdigo <uente JAP
La Figura 3A- muestra e# cuadro de dia#ogo de gra!acin de archi9o&
Figura 3A-& Cuadro de di#ogo $ara #a gra!acin de archi9os&
$pen;ile6ialog
Este contro# muestra e# cuadro de di#ogo de# sistema" mediante e# %ue se#eccionamos un
archi9o $ara $oder a!rir#o $osteriormente" 1 rea#izar so!re e# mismo o$eraciones de
#ectura-escritura&
/# igua# %ue en e# contro# anterior" #a #ectura 1 escritura de in<ormacin es a#go %ue
de!eremos rea#izar $or cdigo" una 9ez %ue ha1amos e#egido e# archi9o mediante este
cuadro de di#ogo
Las $ro$iedades de este contro# son $rcticamente #as mismas %ue #as de Sa9eFi#eDia#og"
con a#gunas e?ce$ciones como #as siguientes&
Q Multiselect& Contiene un 9a#or #gico" %ue nos $ermitir #a se#eccin de m4#ti$#es
archi9os&
Q A*o<5ead$nl#& Permite mostrar #a casi##a de 9eri<icacin $ara mostrar #os archi9os de
s#o #ectura&
Q 5ead$nl#.*ec=ed& Permite o!tener 1 esta!#ecer e# 9a#or $ara #a casi##a de 9eri<icacin
de s#o #ectura de# cuadro de di#ogo&
/# se#eccionar en e# <ormu#ario #a o$cin de men4 /!rir" e0ecutaremos e# Cdigo <uente
1+8
Luis Edgar Snchez
J)A" %ue nos $ermitir" uti#izando e# contro# d#g/!rir" de ti$o :$enFi#eDia#og" se#eccionar
un archi9o e?istente" 1 $asar su contenido a# Te?t>o? de# <ormu#ario" uti#izando un
Stream*eader&
Private Sub mnuAbrir_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuAbrir.Click
' configurar el cuadro de dilogo por cdigo
Me.dlgAbrir.Title = "Seleccionar archivo a leer"
Me.dlgAbrir.InitialDirectory = "C:\CUBO"
Me.dlgAbrir.Filter = "Cdigo fuente (*.vb)|*.vb|Texto (*.txt)|*.txt"
' abrir el dilogo
Me.dlgAbrir.ShowDialog()
' si se han seleccionado varios archivos
' mostrar su nombre
If Me.dlgAbrir.FileNames.Length > 1 Then
Dim sArchivo As String
For Each sArchivo In Me.dlgAbrir.FileNames
MessageBox.Show("Archivo seleccionado: " & sArchivo) Next
End If
' abrir el primer archivo con un Stream
' y volcarlo al TextBox
Dim srLector As New IO.StreamReader(Me.dlgAbrir.FileName)
Me.txtTexto.Text = srLector.ReadToEnd()
End Sub
Cdigo <uente J)A
La Figura 3A3 muestra este cuadro de di#ogo en e0ecucin
Figura 3A3& Cuadro de di#ogo de a$ertura de archi9os
1+9 Luis Edgar Snchez
Fuente( >L/;C:" Luis Migue# V 3Programacin en Cisua# >asic &;ET5
Taller ).)$
< Modi<i%ue e# $rograma de #a acti9idad 3&) $ara %ue uti#ice cuadros de di#ogo $ara
e#egir e# nom!re de# archi9o 1 e# #ugar donde guardar#os&
? *ea#ice una a$#icacin %ue inicie una 9entana $rinci$a# MD con un men4 de
sistema +no necesariamente o$erati9o," no sin antes so#icitar un nom!re de usuario
1 contrase@a $ara ingresar& So#icite con<irmacin antes de cerrar #a a$#icacin $or
cua#%uier m'todo&
Luis Edgar Snchez 1,!
UNIDAD *
Acceso a Datos con AD/.NET
1,1
ACTIVIDADES DE ASIMILACIN E!T"ACLASE
Acti#idad *.1$
< )nvestigar acerca de los siguientes temas/
a2 Cu es y como se dise6an las bases de datos
relacionales
b2 Otilizacin del lengua0e de acceso a datos ,CL
c2 On e0emplo de utilizacin de las siguientes instrucciones
,CL/ ,elect, insert, update, delete
d2 #0emplo de ,CL select utilizando las opciones Lhere,
group by, order by
? !ise6ar y crear una base de datos relacional 5en 'CC#,, o
,CL #TP$#,,2 de por lo menos . tablas relacionadas entre
s de forma correcta, luego llenar la base con una cantidad
prudente de datos
1,&
Tema (.1: rogramar con A6$.net
Herramientas de base de datos de "isual Atudio.
Para sim$#i<icar e# desarro##o de a$#icaciones de !ases de datos" Cisua# Studio -AAI 9iene
con a#gunas herramientas 9isua#es" e# ms im$ortante de #os cua#es se descri!en
!re9emente a%u2 1 #uego se discute en #as siguientes secciones(
-3plorador de ser%idores Esta es #a herramienta $rimera 1 ms $rominente& E?$#orador
de ser9idores es #a ca0a de herramientas $ara a$#icaciones de !ase de datos" en e# sentido
de %ue contiene todas #as herramientas !sicas $ara #a cone?in a !ases de datos 1 #a
mani$u#acin de sus o!0etos&
Guer# )uilder Esta es una herramienta $ara crear consu#tas SOL +dec#araciones %ue
recu$eran #os datos %ue %ueremos de una !ase de datos o actua#izar #os datos en #a !ase de
datos,& SOL es un #engua0e en s2 mismo" 1 #o discutiremos ms ade#ante en este ca$2tu#o&
Ouer1 >ui#der $ermite es$eci<icar #as o$eraciones %ue desea rea#izar en #as ta!#as de una
!ase de datos con o$eraciones de $unto 1 hacer c#ic& En e# <ondo" e# =enerador de
consu#tas se !asa #a corres$ondiente sentencia SOL 1 #o e0ecuta #a !ase de datos&
6ise>ador de bases de datos # el 6ise>ador de tablas. Estas herramientas #e $ermiten
tra!a0ar con una !ase de datos o sus ta!#as& Cuando se tra!a0a con #a !ase de datos" $uede
agregar nue9as ta!#as" esta!#ecer re#aciones entre #as ta!#as" 1 as2 sucesi9amente& Cuando
se tra!a0a con ta!#as indi9idua#es" $uede mani$u#ar #a estructura de #as ta!#as" editar sus
datos" 1 agregar restricciones& Usted $uede uti#izar estas herramientas $ara mani$u#ar un
o!0eto com$#icado - #a !ase de datos - con o$eraciones de $unto 1 hacer c#ic&
-3plorador de ser%idores
Su $unto de $artida $ara e# desarro##o de a$#icaciones de !ase de datos con C> -AAI es
e# E?$#orador de ser9idores& Esta ca0a de herramientas es e# $orta# de acceso a #as !ases de
datos en su sistema o red" 1 se $uede uti#izar $ara #oca#izar 1 recu$erar #os cuadros %ue
usted est interesado $u#g Co#o%ue e# $untero so!re #a <icha E?$#orador de ser9idores $ara
am$#iar #a ca0a de herramientas corres$ondiente" %ue ser simi#ar a #a %ue se muestra en #a
Figura -)&L& Los dos o!0etos $rinci$a#es en e# E?$#orador de ser9idores son cone?iones de
datos 1 e# o!0eto Ser9idores& En #a rama Cone?iones de datos" %ue 9ea #as cone?iones a
!ases de datos %ue est en contra de $rogramacin& En #a rama Ser9idores" 9er #os
ser9idores se $uede acceder desde su ordenador 1 9arios o!0etos %ue e?$onen&
En re#acin con e# tema Cone?iones de datos" $uede 9er una o ms cone?iones a !ases de
datos e?istentes +si 1a ha e?$erimentado con #as herramientas de datos 9isua#es de Cisua#
Studio,& Si usted no 9e una cone?in con #a !ase de datos" de!e crear una& Raga c#ic en e#
icono de Cone?iones de datos 1 se#eccione /gregar cone?in en e# men4 conte?tua#& Cada
1,'
nue9a cone?in %ue se agrega $ermanece en #a rama Cone?iones de datos hasta %ue usted
decida %uitar#o" 1 se $uede uti#izar en cua#%uier n4mero de $ro1ectos&
Para a@adir una nue9a cone?in" se#eccione e# comando /gregar cone?in& La $rimera
9ez %ue se crea una cone?in en Cisua# Studio" 9er e# cuadro de di#ogo cam!io de
origen de datos&
Para #os e0em$#os de esta $arte de# Modu#o se 9a a usar !ases de datos SOL Ser9er&
Se#eccione #a entrada de Microso<t SOL Ser9er 1 haga c#ic en /ce$tar&
Des$u's de hacer c#ic en /ce$tar en e# cuadro de di#ogo Fuente de datos modi<icados"
9er e# cuadro de di#ogo /gregar cone?in /%u2 de!e introducir e# nom!re de usuario 1
contrase@a en #os cuadros de te?to a$ro$iados& Si usted +o e# administrador, han $uesto en
marcha SOL Ser9er $ara uti#izar seguridad integrada de NindoEs seguridad" s#o tienes
%ue se#eccionar e# !otn de o$cin Usar autenticacin de NindoEs& Des$#iegue #a #ista en
#a $arte in<erior de# cuadro de di#ogo $ara se#eccionar una de #as !ases de datos de SOL
Ser9er %ue e# e%ui$o $uede accesar& Cer #a !ase de datos #oca# de SOL Ser9er" as2 como
cua#%uier otra !ase de datos SOL Ser9er en #a red& +Si no encuentra #a !ase de datos de
SOL Ser9er tiene %ue uti#izar" aseg4rese de %ue e# ser9idor SOL Ser9er" ;a9egador 1 #os
ser9icios de SOL Ser9er /gent son a #a 9ez iniciadas& & Cuando se sa!e %ue e# ser9idor se
est e0ecutando" tam!i'n $uede escri!ir su nom!re en e# cam$o, Se#eccione e# ser9idor
SOL Ser9er #oca#" o escri!a e# #oca#host cadena en e# cuadro ;om!re de# ser9idor 1" a
continuacin" se#eccione #a !ase de datos ;e$tuno en #a segunda gota hacia a!a0o en #a
#ista e# cuadro de di#ogo&
Luis Edgar Snchez 1,(
Figura -)&L
E# E?$#orador de ser9idores contiene #os o!0etos de !ase de datos
se $uede acceder en su ordenador&
Si tiene /ccess -AAM insta#ado en su sistema" haga c#ic en e# !otn Cam!iar $ara 9er e#
cuadro de di#ogo cam!io de origen de datos" donde se $uede se#eccionar #a !ase de datos
de Microso<t /ccess" a continuacin" !us%ue e# archi9o MDF de #a !ase de datos en e#
disco& En #a <icha Cone?in" haga c#ic en e# !otn Pro!ar cone?in $ara asegurarse de %ue
$uede conectarse a #a !ase de datos& Si no es as2" aseg4rese de %ue SOL Ser9er se est
e0ecutando 1 %ue e# nom!re de usuario 1 #a contrase@a %ue ha es$eci<icado es correcta&
De!emos tomar en cuenta #o siguiente" no $uede mantener una !ase de datos rea# mediante
e0ecucin de sentencias SOL desde dentro de# ser9idor de administracin de SOL de
Cisua# Studio& Usted ncesita tener a$#icaciones es$ecia#es $ara acceder a #a !ase de datos"
9isua#izar#os dentro de NindoEs o <ormu#arios Ne!" 1 en9iar #os cam!ios rea#izados a #a
!ase de datos& Estas a$#icaciones son conocidas como a$#icaciones <ront End" $or%ue
interact4an con e# usuario 1 #a actua#izacin de #os datos de# ser9idor de !ase de datos %ue
tenemos" #a de <ondo %ue a#macena datos se #e ##ama >acH End& Tam!i'n son conocidos
como a$#icaciones de acceso a datos" $or%ue no s#o interact4an con e# usuario" sino con
#a !ase de datos&
En este ca$2tu#o" usted e?$#orar #os mecanismos !sicos de /D:&;ET $ara interactuar
con #a !ase d?e datos& Como 9ern" es !astante senci##o escri!ir unos $ocos comandos C>
1,+ Luis Edgar Snchez
$ara e0ecutar sentencias SOL so!re #a >D" consu#tas con e# <in de recu$erar #o deseado de
#as <i#as se#eccionadas& E# 9erdadero desa<2o es e# dise@o e im$#ementacin de inter<aces
<unciona#es %ue muestran #os datos so#icitados $or e# usuario +#os datos %ue 9a a recu$erar
a tra9's de instrucciones SELECT de #a !ase de datos," $ermite a# usuario na9egar $or a
tra9's de #os datos 1 editar#os" <ina#mente en9iar #os cam!ios a #a !ase de datos&
AtreamF %ersus AetF)ased 6ata Access
/D:&;ET $ro$orciona dos m'todos !sicos de acceso a datos( en !ase a acceso stream"
#os cua#es esta!#ecen una coneccin 3de corrido5 1 recu$eran #os datos desde e# ser9idor"
1 en !ase de con0unto de datos de acceso esta!#ecidos" #o %ue crea una estructura de datos
es$ecia# 1 ##ena En e# c#iente #os datos& Esta es #a estructura de# DataSet" %ue es como
$arte de #a !ase de datos( Contiene una de o m`s DataTa!#e o!0etcs" #o %ue corres$onde a
#as ta!#as 1 se com$onen de o!0etos Data*oE& Estos o!0etos Data*oE tienen #a misma
estructura de #as <i#as en #as ta!#as corres$ondientes& Los con0untos de datos son $o!#ados
o ##enados recu$erando datos de una o ms ta!#as de #a !ase de datos en e# DataTa!#e
corres$ondiente&
Para #a mani$u#acin de #os datos con e# en<o%ue !asado en stream" de!e crear #a
instruccin a$ro$iada ;SE*T 8 UPD/TE 8 DELETE 1 #uego e0ecutar contra #a !ase de
datos&
E# en<o%ue !asado en <#u0o +ST*E/M, se hace con e# o!0eto Data*eader" %ue hace %ue #a
de9o#ucin de datos en #a !ase de datos est' dis$oni!#e $ara su a$#icacin& La a$#icacin
c#iente #ee #os datos de9ue#tos $or un o!0eto Data*eader 1 de!e guardar#os de a#guna
manera en e# c#iente& Con !astante <recuencia #o usamos $ara a#macenar o!0etos de#
negocio de #os datos en e# c#iente&
E# en<o%ue !asado en con0unto de datos +Data Set, uti#iza #os mismos o!0etos %ue e#
en<o%ue !asado en stream detrs de #as escenas" 1 a!strae #a ma1or2a de# tra!a0o en #os
com$onentes necesarios $ara esta!#ecer un 92ncu#o a #a !ase de datos" recu$erar datos" 1
a#macenar#o en #a memoria de #a com$utadora de# c#iente& Por #o tanto" tiene sentido
comenzar $or e?$#orar e# en<o%ue !asado en <#u0o 1 #os o!0etos !sicos $ro$orcionados $or
/D:&;ET $ara acceso a !ases de datos& Des$u's de com$render #a natura#eza de
/D:&;ET 1 cmo usar#o" usted encontrar %ue es <ci# 9er #a a!straccin $resentada $or
e# en<o%ue !asado en DataSet 1 cmo sacar e# m?imo $artido de con0untos de datos&&
Como se 9er en ca$2tu#os siguientes" se $ueden crear con0untos de datos 1 #os o!0etos de
a$o1o con #as herramientas 9isua#es de# DE&
Las clases de acceso a datos b@sicas
Las a$#icaciones de datos de!er2an ser ca$aces de conectarse a una !ase de datos 1 e0ecutar
consu#tas so!re 'stas& Los datos se#eccionados son des$#egados de <orma a$ro$iada donde
e# usuario $uede e?aminar#os 1 editar#os& Por 4#timo" #os datos modi<icados se actua#izan a
#a !ase de datos& Este es e# cic#o de una a$#icacin !asada en #os datos(
)& *ecu$erar #os datos de #a !ase de datos&
Luis Edgar Snchez 1,,
-& Presentar datos a# usuario&
3& Permite a# usuario editar #os datos&
.& =ra!ar #os cam!ios en #a !ase de datos&
Por su$uesto" ha1 muchas cosas %ue no son e9identes en #as sa#idas de este es%uema&
Dise@o de #a inter<az a$ro$iada $ara #a na9egacin-consumo a tra9's de #os datos $uede
ser una& E# desarro##o de una inter<az <unciona# $ara #a edicin de #os datos en e# #ado de#
c#iente $uede ser un reto" es$ecia#mente si #as ta!#as re#acionadas in9o#ucradas son 9arias&
De!emos tener en cuenta %ue ha1 otros usuarios accediendo igua#mente a #a !ase de
datos&XOu' ocurrir si e# $roducto %ue est editando se ha aretirado $or otro usuarioY X:
%u' si un usuario ha editado e# mismo desde %ue #os datos de c#ientes de nuestra a$#icacin
<ueron #e2dosY De!emos so!rescri!ir #os cam!ios rea#izados $or e# otro usuario" o
*echazamos o ace$tamos #a edicin de# usuario %ue ha $resentado #a 4#tima edicin
Para conectarse a una !ase de datos" de!e crear un o!0eto Connection" inicia#izar" 1 #uego
##amar a su m'todo :$en $ara esta!#ecer una cone?in con #a !ase de datos& E# o!0eto
Connection es e# cana# entre #a a$#icacin 1 #a !ase de datos" cada comando %ue desea
e0ecutar en #a misma !ase de datos de!e uti#izar este o!0eto Connection&
Cuando ha1a terminado" usted de!e cerrar #a cone?in ##amando a# m'todo C#ose& De!ido
a %ue /D:&;ET mantiene un con0unto de o!0etos de cone?in %ue se 9ue#9en a uti#izar
cuando sea necesario" es im$rescindi!#e %ue usted mantenga cone?iones a!iertas durante e#
menor tiem$o $osi!#e&
E# o!0eto %ue en rea#idad e0ecutar e# comando en #a !ase de datos es e# o!0eto Command"
%ue de!e con<igurar con #a dec#aracin de %ue desea e0ecutar 1 asociarse con un o!0eto de
cone?in& Para e0ecutar #a sentencia" $uede ##amar a uno de #os m'todos de# o!0eto
Command& E# m'todo E?ecute*eader de9ue#9e un o!0eto Data*eader %ue #e $ermite #eer
#os datos de9ue#tos $or #a consu#ta de se#eccin& Para e0ecutar un comando %ue actua#ice
una ta!#a de !ase de datos $ero no de9ue#9e un con0unto de <i#as" se uti#iza #a DT:
E?ecute;onOuer1" #a cua# e0ecuta e# comando es$eci<icado 1 de9ue#9e un n4mero entero"
%ue es e# n4mero de <i#as a<ectadas $or #a dec#aracin&
En resumen" /D:&;ET o<rece tres c#ases $rinci$a#es de acceso a !ases de datos( #a
cone?in" Comando" 1 #as c#ases Data*eader& Ra1 ms c#ases de datos re#acionados con e#
acceso" $ero estn todas !asadas en estas tres c#ases !sicas& Des$u's de com$render cmo
interactuar con una !ase de datos mediante e# uso de estas c#ases" usted encontrar %ue es
<ci# de entender #as c#ases adiciona#es" as2 como e# cdigo generado $or #as herramientas
de datos 9isua#es %ue 9ienen con Cisua# Studio&
La clase connection
La c#ase de cone?in es una a!straccin" 1 no se $uede uti#izar directamente& En su #ugar"
de!e uti#izar una de #as c#ases %ue se deri9an de #a c#ase de cone?in& En #a actua#idad" ha1
Luis Edgar Snchez
1,7
tres c#ases deri9adas( S%#Connection :rac#eConnection 1 :#eD!Connection& De# mismo
modo" #a c#ase command tam!i'n es una c#ase a!stracta con tres c#ases deri9adas(
S%#Command" :rac#eCommand 1 :#eD!Command&
Las c#ases S%#Connection 1 S%#Command $ertenecen a# es$acio de nom!res S%#C#ient" %ue
de!e im$ortar en su $ro1ecto a tra9's de #a siguiente dec#aracin(
m$orts S1stem&Data&S%#C#ient
Para conectar #a a$#icacin a una !ase de datos" e# o!0eto de cone?in de!e conocer e#
nom!re de# ser9idor en e# %ue reside #a !ase de datos" e# nom!re de #a $ro$ia !ase de datos
1 #as credencia#es %ue #e $ermitir esta!#ecer una cone?in con #a !ase de datos& Estas
credencia#es necesitan o un nom!re de usuario 1 una contrase@a o una cuenta de NindoEs
en #a %ue se han concedido derechos a #a !ase de datos& Usted" e9identemente" de!e sa!er
%u' ti$o de D>MS 9a a conectar" $ara %ue $ueda se#eccionar #a c#ase a$ro$iada de
cone?in& E# m'todo ms com4n de #a inicia#izacin de un o!0eto de cone?in en e# cdigo
es e# siguiente(
Dim C; /s ;eE S%#Connection +aData Source \ #oca#hostF nitia# Cata#og \ ;e$tunoF
UD \ nom!re de usuario" contrase@a \ contrase@a de# usuarioa,
#oca#host es un nom!re uni9ersa# $ara e# e%ui$o #oca#" ;e$tuno es e# nom!re de #a !ase de
datos" 1 e# nom!re de usuario 1 contrase@a de usuario es e# nom!re de usuario 1 #a
contrase@a de una cuenta con<igurada $or e# administrador de !ase de datos& La !ase de
datos ;e$tuno no se insta#a 0unto con SOL Ser9er
-AAI" $ero se $uede descargar desde MSD; e insta#ar#o t4 mismo&& Esto1 asumiendo %ue
usted est uti#izando e# mismo e%ui$o tanto $ara SOL Ser9er 1 $ara escri!ir sus
a$#icaciones Cisua# >asic& Si SOL Ser9er reside en un e%ui$o di<erente en #a red" uti#ice e#
nom!re de# e%ui$o ser9idor +o direccin P, en #ugar de# nom!re de host #oca#& Si SOL
Ser9er se e0ecuta en otra m%uina en #a red" uti#izar una con<iguracin como #a siguiente
$ara #a c#a9e de# origen de datos(
Data Source \ b b PoEerSer9er
Si #a !ase de datos se e0ecuta en un e%ui$o remoto" uti#ice #a direccin P de #a m%uina
remota& Si est tra!a0ando desde su casa" $or e0em$#o" $uede esta!#ecer una cone?in con
e# ser9idor de su com$a@2a con una cadena de cone?in como #a siguiente(
Data Source \ -)3&)L&)MI&)AAF nitia# Cata#og \ >ooHsD>F uid \ ???" $assEord \ ???
Las tec#as de uid 1 contrase@a son #os de una cuenta creada $or e# administrador de !ase de
datos" 1 no una cuenta de NindoEs& Si desea conectarse a #a !ase de datos mediante #as
credencia#es de cada usuario de NindoEs" usted de!e omitir #as ##a9es uid 1 contrase@a 1
uti#izar #a c#a9e de seguridad integrada en su #ugar& Si #a red se !asa en un contro#ador de
dominio" de!e uti#izar #a seguridad integrada $ara %ue #os usuarios $ueden iniciar sesin en
Luis Edgar Snchez 1,8
SOL Ser9er con su cuenta de NindoEs& De esta manera usted no tendr %ue a#macenar #as
contrase@as en e# cdigo" o inc#uso un archi9o au?i#iar con #a con<iguracin de #a
a$#icacin&
Si est uti#izando una direccin P $ara es$eci<icar e# ser9idor de !ase de datos" es $osi!#e
%ue tam!i'n tiene %ue inc#uir e# $uerto de SOL Ser9er mediante #a es$eci<icacin de una
direccin como -)3&)L&)MI&)AA" ).33& E# $uerto $or de<ecto
$ara SOL Ser9er ).33" 1 se $uede omitir& Si e# administrador ha cam!iado e# $uerto $or
de<ecto" o se ocu#ta #a direccin P de# ser9idor %ue est detrs de otra direccin P $ara
<ines de seguridad" de!e entrar en contacto con e# administrador $ara o!tener #a direccin
de# ser9idor& Si se conecta a una red #oca#" no de!er2an tener %ue uti#izar una direccin P&
Si desea conectar con e# ser9idor de #a em$resa de <orma remota"
$ro!a!#emente tendr %ue so#icitar #a direccin P de# ser9idor 1 #as credencia#es
a$ro$iadas de# ser9idor de administrador&
La $ro$iedad !sica de# o!0eto de cone?in es #a $ro$iedad ConnectionString" %ue es una
cadena se$arada $or comas de c#a9e-9a#or 1 es$eci<ica #a in<ormacin necesaria $ara
esta!#ecer una cone?in a #a !ase de datos deseada& Es !sicamente #a misma in<ormacin
%ue da en di9ersos ca0as de registro cuando se a!re e# SOL Ser9er Management Studio 1
se#eccionar una !ase de datos $ara tra!a0ar&
Un m'todo a#ternati9o $ara #a creacin de un o!0eto Connection es esta!#ecer #a $ro$iedad
ConnectionString(
Dim C; /s ;eE S%#Connection C;&ConnectionString \ ^
5Data Source \ #oca#hostF nitia# Cata#og \ ;e$tunoFntegrated Securit1 \ True5
Una de #as $ro$iedades de #a c#ase de cone?in es #a $ro$iedad State" %ue de9ue#9e e#
estado de una cone?in" 1 su 9a#or es un miem!ro de #a enumeracin ConnectionState(
Connecting" :$en" E?e- cuting" Fetching" >roHen and C#osed& Si se ##ama a# m'todo C#ose
en un o!0eto de cone?in %ue 1a est cerrado" o e# m'todo :$en en una cone?in %ue 1a
est a!ierta" una e?ce$cin ser #anzada& Para e9itar #a e?ce$cin" de!e e?aminar #a
$ro$iedad de #a cone?in Estado 1 actuar en consecuencia&
E# segmento de cdigo siguiente se descri!e e# $roceso de a!rir una cone?in a una !ase
de datos(
!im C+string 's ,tring V Y!ata ,ourceVlocalhost3)nitial Y Z [
YCatalogV+orthLind3)ntegrated ,ecurityV-rueY
C+string V )nputFo"5Y)ngrese la cadena de cone"inY, YC%++#C-)%+ ,-$)+&Y,
C+string2 )f C+string-rim V YY -hen #"it ,ub
!im C+ 's ,qlConnection
-ry
C+ V +eL ,qlConnection5C+string2
C+%pen52
)f C+,tate V Connection,tate%pen -hen
(sgFo"5Y#stacin Y Z C+@orPstation)d Z [
Y conectada Y Z C+!atabase Z [
Y en el servidorY Z C+!ata,ource2
#nd )f
1,9 Luis Edgar Snchez
Catch e" 's #"ception
(sgFo"5Y+% ,# PO!% 'F$)$ L' F',# !# !'-%, P%$ #L ,)&O)#+-# #$$%$Y Z [
vbCrLf Z e"(essage2
#nd -ry
)f C+,tate V Connection,tate%pen -hen C+Close52
La clase command
E# segundo com$onente $rinci$a# de /D:&;ET es #a c#ase de command" %ue #e $ermiten
e0ecutar sentencias SOL contra #a !ase de datos-& Los dos $armetros !sicos de# o!0eto
Command son un o!0eto Connection %ue es$ec2<ica donde e# comando se e0ecutar" 1 e#
comando SOL& Para e0ecutar una instruccin SOL contra una !ase de datos" de!e
inicia#izar un o!0eto Command 1 #a $ro$iedad de cone?in a# o!0eto de cone?in
adecuado& Es e# o!0eto de cone?in %uien sa!en cmo conectarse a #a !ase de datos" e#
o!0eto Command Sim$#emente es #a instruccin SOL %ue se $resenta a #a !ase de datos 1
recu$era #os resu#tados&
Los o!0etos command <i0an e# n4mero de m'todos $ara #a e0ecucin de instrucciones SOL
contra #a !ase de datos" de$endiendo e# ti$o de dec#aracin %ue se desea e0ecutarE# mctodo
E?ecute;onOuer1 e0ecuta #os comandos ;SE*T 8 DELETE 8 UPD/TE %ue no retornan
ningna <i#a" so#o un 9a#or entero %ue re$resenta e# n4mero de <i#as a<ectadas $or #a
consu#ta& E# m'todo E?ecuteSca#ar de9ue#9e un so#o 9a#or" %ue sue#e ser e# resu#tado de
una <uncin de agreagado" como e# recuento de #as <i#as %ue cum$#en #os criterios" #a suma
o $romedio de una co#umna de ms de un n4mero de <i#as" 1 as2 sucesi9amente&
Por 4#timo" e# m'todo E?ecute*eader se uti#iza con #as sentencias SELECT %ue de9ue#9en
<i#asde una o ms ta!#as&
Para e0ecutar una instruccin UPD/TE" $or e0em$#o" de!e crear un nue9o o!0eto
command 1 asociar #a instruccin SOL a$ro$iada con este& Una de #as <ormas
so!recargadas de# constructor de# o!0eto Command #e $ermiten es$eci<icar #a instruccin
%ue se e0ecuta en #a !ase de datos" as2 como e# o!0eto Connection %ue a$unta a #a !ase de
datos deseada como argumentos(
!im C(! 's +eL ,qlCommand5YOP!'-# Products ,#- OnitPrice V OnitPrice \ <9= Y Z
[ Y@S#$# Category)! V .Y, C+2
C+%pen52
!im roLs 's )nteger
roLs V C(!#"ecute+onCuery
)f roLs V < -hen
(sgFo"5Y-abla productos actualizadaY2
#lse
(sgFo"5Y+o se puedo actualizarY2
#nd )f
)f C+,tate V Connection,tate%pen -hen C+Close52
Luis Edgar Snchez
17!
E# m'todo E?ecute;onOuer1 de9ue#9e e# n4mero de <i#as a<ectadas $or #a consu#ta" 1 es e#
mismo 9a#or %ue a$arece en #a 9entana de resu#tados de# administrador de SOL Ser9er
Studio Cuando se e0ecuta una consu#ta de accin& Las dec#araciones anteriores aumentan e#
$recio de todos #os $roductos categor2a de Con<ecciones en un M $or ciento& Usted $uede
uti#izar #a misma estructura 1 #a e0ecucin de comandos ;SE*T 1 DELETEF todo #o %ue
tienen %ue cam!iar es #a instruccin SOL de# o!0eto S%#Command %ue ha1 en e#
constructor& Tam!ien $uede crear 1 con<igurar un o!0eto command esta!#eciendo sus
$ro$iedades(
Command&Connection \ Connection
Command&CommandTe?t \ 5SELECT C:U;T+W, F*:M Customers5
Des$u's de %ue ha1as terminado con e# o!0eto command" se de!e acerrar e# o!0eto
Connection5& / $esar de %ue $ueda inicia#izar un o!0eto conection de cua#%uier $arte de#
cdigo" de!e ##amar a# m'todo o$en tan tarde como sea $osi!#e +es decir" 0usto antes de
e0ecutar una instruccin, 1 su m'todo C#ose tan $ronto como sea $osi!#e +es decir" tan
$ronto como se ha1a recu$erado #os resu#tados de# comando e0ecutado,&
E# m'todo E?ecuteSca#ar e0ecuta #a instruccin SOL asociada con e# o!0eto de comando 1
de9ue#9e un 9a#or 4nico" e# cua# es e# $rimer 9a#or %ue esa instruccin SOL im$rime en #a
9entana *esu#tados de SOL Ser9er Studio& Las dec#araciones siguientes #een e# n4mero de
<i#as en #os c#ientes de #a ta!#a de !ase de datos ;e$tuno 1 a#macenan e# resu#tado en #a
9aria!#e de recuento(
!im C(! 's +eL ,qlCommand5Y,#L#C- C%O+-5\2 4$%( CustomersY, C+2
!im count 's )nteger
C+%pen52
count V C(!#"ecute,calar52
)f C+,tate V Connection,tate%pen -hen C+Close52
Si #o %ue desea es e0ecutar un SELECT %ue de9ue#9e m4#ti$#es <i#as" se de!e uti#izar e#
m'todo E?ecute*eader method de# o!0eto command" como se 9e a continuacin(
Dim CMD /s ;eE S%#Command+5SELECT W F*:M Customers5" C;,
C;&:$en
Dim *eader /s S%#Data*eader *eader \ CMD&E?ecute*eader
Nhi#e *eader&*ead+,
K $rocesar #a <i#a actua#
End Nhi#e
< C;&State \ ConnectionState&:$en Then C;&C#ose
-jecutar procedimientos almacenados
E# comando %ue se e0ecutar a tra9's de# o!0eto de comando no es siem$re una sentencia
SOL" sino %ue $odr2a ser e# nom!re de un $rocedimiento a#macenado o e# nom!re de una
ta!#a" en cu1o caso se recu$era todas #as <i#as de #a ta!#a& Usted $uede es$eci<icar e# ti$o de
instruccin %ue desea e0ecutar con #a $ro$iedad CommandT1$e" cu1o 9a#or es un miem!ro
de #a enumeracin CommandT1$e( Te?to +$or #as sentencias de SOL," StoredProcedure
+$ara $rocedimientos a#macenados," 1 Ta!#eDirect +$ara una ta!#a,& Usted no tiene %ue
Luis Edgar Snchez 171
es$eci<icar e# ti$o de comando %ue desea e0ecutar" $ero entonces e# o!0eto Command #o
tiene %ue entender" es un $roceso %ue tomar unos momentos" 1 usted $uede e9itar
este retraso innecesario& La !ase de datos ;orthEind+;e$tuno, 9iene con e# $rocedimiento
a#macenado de #os diez $roductos ms !aratos& Para e0ecutar este $rocedimiento
a#macenado" de!e crear un o!0eto de comando con #as siguientes instrucciones(
Dim CMD /s ;eE S%#Command
CMD&Connection \ C;
CMD&CommandTe?t \ 5ZTen Most E?$ensi9e Products[5
CMD&CommandT1$e \ CommandT1$e&StoredProcedure
Por 4#timo" $uede recu$erar todas #as <i#as de #a ta!#a de c#ientes mediante #a creacin de
un o!0eto de comando como e# siguiente(
Dim CMD /s ;eE S%#Command CMD&Connection \ C;
CMD&CommandTe?t \ 5Customers5
CMD&CommandT1$e \
CommandT1$e&Ta!#eDirect
-jecutar consultas de seleccin
Las sentencias SOL ms comunes" #as instrucciones SELECT" recu$eran un con0unto de
<i#as de una o ms ta!#as com!inadas" e# con0unto resu#tado& Estas dec#araciones se
e0ecutan con e# m'todo E?ecute*eader" %ue de9ue#9e un o!0eto Data*eader - un o!0eto
S%#Data*eader de instrucciones e0ecutadas en !ases de datos SOL Ser9er& La c#ase
Data*eader $ro$orciona #a #ectura de #os resu#tados de #a consu#ta en
#a <orma 3s#o hacia de#ante5& La cone?in $ermanece a!ierta mientras usted #ee #as <i#as
de9ue#tas $or #a consu#ta" $or #o %ue es im$rescindi!#e #eer #as <i#as 1 a#macenar#as en una
estructura en #a memoria de #a com$utadora de# c#iente tan $ronto como sea $osi!#e" a
continuacin" cerrar #a cone?in& E# o!0eto Data*eader es de s#o #ectura +no se $uede
uti#izar $ara actua#izar #as <i#as su!1acentes," as2 %ue no ha1 razn $ara mantener#o a!ierto
durante #argos $eriodos& Camos a e0ecutar #a siguiente instruccin +em$#eados, de #a !ase
de datos ;orthEind+;e$tuno,(
SELECT Last;ame 7 d d 7 First;ame /S ;ame" Tit#e" E?tension" RomePhone
F*:M Em$#o1ees
/%u2 estn #as dec#araciones de C> con e# o!0eto Command adecuado 1 su recu$eracin
con e# o!0eto SOL-Data*eader(
!im C(! 's +eL ,qlCommand
C(!Connection V C+
C(!Command-e"t V Y,#L#C- Last+ame M ] ] M 4irst+ame ', +ame, -itle, Y Z [
Y#"tension, SomePhone 4$%( #mployeesY
C+%pen52
!im $eader 's ,ql!ata$eader
$eader V C(!#"ecute$eader
!im str 's ,tring V YY, count 's )nteger V 9
@hile $eader$ead
,tr ZV Convert-o,tring5$eader)tem5Y+ameY22 Z vb-ab
,tr ZV Convert-o,tring5$eader)tem5Y-itleY22 Z vb-ab
,tr ZV Convert-o,tring5$eader)tem5Y#"tensionY22 Z vb-ab
,tr ZV Convert-o,tring5$eader)tem5YSomePhoneY22 Z vb-ab
17& Luis Edgar Snchez
str ZV vbCrLf
count MV <
#nd @hile
Console@riteLine5vbCrLf Z vbCrLf Z YLedos Y Z count-o,tring Z [
Y roLs/Y Z vbCrLf Z vbCrLf Z str2
C+Close52
La c#ase Data*eader $ro$orciona e# m'todo de #ectura" %ue a9anza e# $untero actua# a #a
siguiente <i#a en e# con0unto de resu#tados& Para #eer #as co#umnas indi9idua#es de #a <i#a
actua#" se uti#iza #a $ro$iedad tem" %ue #e $ermite es$eci<icar #a co#umna $or su nom!re 1
de9ue#9e una 9aria!#e de o!0eto& Es su res$onsa!i#idad con9ertir e# o!0eto de9ue#to $or #a
$ro$iedad de# art2cu#o en e# ti$o adecuado& nicia#mente" e# Data*eader se co#oca de#ante
de #a $rimera #2nea de# con0unto de resu#tados" 1 de!e ##amar a su m'todo de #ectura a
a9anzar a #a $rimera <i#a& Si #a consu#ta no de9ue#9e ninguna <i#a" e# m'todo *ead
de9o#9er Fa#se 1 e# !uc#e Nhi#e no se e0ecutar en a!so#uto& En e# cdigo de e0em$#o
anterior" #os cam$os de cada <i#a se concatenan $ara <ormar #a cadena str" %ue se im$rime
en #a 9entana nmediato" se 9e a#go como esto(
Da9o#io ;anc1 Sa#es *e$resentati9e J.LM +-AL, JJJ-PIJM
Fu##er /ndreE Cice President" Sa#es 3.JM +-AL, JJJ-P.I-
Le9er#ing Banet Sa#es *e$resentati9e 33JJ +-AL, JJJ-3.)-
/so de los comandos con par@metros
La ma1or2a de #as sentencias SOL 1 $rocedimientos a#macenados ace$tar $armetros" 1
usted de!e $asar #os 9a#ores $ara cada $armetro antes de e0ecutar #a consu#ta& Considere
#a $osi!i#idad de una sim$#e dec#aracin %ue recu$era #os c#ientes de un $a2s es$ec2<ico"
cu1o nom!re se $asa como un argumento(
SELECT W F*:M Customers NRE*E Countr1 \
e $ a i s
E# $armetro e $ais se de!e esta!#ecer en un 9a#or o una e?ce$cin se $roduce a medida
%ue intenta e0ecutar esta instruccin& Los $rocedimientos a#macenados tam!i'n ace$tan
$armetros& Las 9entas $or /@o es un $rocedimiento a#macenado de #a !ase de datos
;orthEind+;e$tuno," $or e0em$#o" es$era dos 9a#ores de <echa 1 de9ue#9e #as 9entas entre
#as dos <echas& Para acomodar e# $aso de $armetros a una consu#ta con $armetros o un
$rocedimiento a#macenado" e# o!0eto Command e?$one #a $ro$iedad Parameters" %ue es
una co#eccin de o!0etos de $armetros& Para $asar 9a#ores de $armetro $ara un comando"
de!e con<igurar un o!0eto de ti$o $armetro $ara cada $armetro" esta!#ezca su nom!re"
ti$o 1 9a#or" 1 #uego agregar e# o!0eto de $armetro a #a co#eccin Parameters de# o!0eto
Command& Las siguientes dec#araciones crea un o!0eto de comando con un $armetro de
ti$o 9archar con un tama@o m?imo de )J caracteres(
Dim Command As New SqlCommand
Command.CommandText = "SELECT * FROM Customers WHERE Country = @pais"
Command.Parameters.Add("@pais" , SqlDbType.VarChar, 15)
Command.Parameters("@pais" ).Value = "Italy"
17' Luis Edgar Snchez
En este $unto" usted est #isto $ara e0ecutar #a instruccin SELECT con e# m'todo
E?ecute*eader 1 recu$erar #os c#ientes de ta#ia& Tam!i'n $uede con<igurar e# o!0eto como
$armetro en su constructor(
Dim $aram /s ;eE S%#Parameter+$aram;ame" $aramT1$e" $aramSize,
Este es e# constructor de# $armetro e $a2s de# e0em$#o anterior(
Dim param As New SqlParameter("@pais", SqlDbType.VarChar, 15)
param.Value = "Italy"
CMD.Parameters.Add(param)
Por 4#timo" se $ueden com!inar todas estas dec#araciones en una so#a(
CMD.Parameters.Add("@country", SqlDbType.VarChar, 15).Value = "Italy"
Fuente( PET*:US:S" E9ange#us V 3Mastering Cisua# >asic -AAI5
Taller *.1$
< Uti#izando SOL E?$ress cree una !ase de datos con una ta!#a +cua#%uiera,&
? *ea#ice una a$#icacin de conso#a uti#izando acceso a datos mediante m'todos
stream %ue $ermita(
a0 nsertar nue9os registro en #a ta!#a&
10 Cisua#izar todos #os registros en #a conso#a&
c0 Cisua#izar s#o #os registros %ue cum$#an un criterio" $ara #o cua# se so#icitar
un $armetro&
d0 E#iminar un registro de acuerdo a# cam$o ##a9e $rimaria&
Luis Edgar Snchez
17(
Tema (.&: .onjuntos de datos H I6ataAetJ
Almacenamiento de datos en conjuntos de datos
E# $roceso de construccin de a$#icaciones !asadas en datos no es com$#icado 1" en gran
medida es a!stra2do $or #a cone?in" Comando" 1 #as c#ases Data*eader& Ustedes han 9isto
a#gunos e0em$#os de interaccin de estas c#ases 1 de!er2a estar #isto $ara su uso en sus
a$#icaciones& E# $ro!#ema con estas c#ases es %ue no o<recen un m'todo consistente $ara
a#macenar #os datos en e# c#iente& E# en<o%ue de con9ertir #os datos en o!0etos de negocio 1
de tra!a0o con #as c#ases est !ien" $ero tienes %ue 9enir con un mecanismo de
a#macenamiento de datos en e# c#iente& Puede a#macenar #os datos en un contro# List>o?&
Tam!i'n $uede crear un /rra1List de o!0etos $ersona#izados& E# $ro!#ema de a#macenar
datos en e# c#iente no est cuando #a a$#icacin c#iente se conecta a #a !ase de datos 1 todas
#as actua#izaciones tienen #ugar en tiem$o rea#& Tan $ronto como e# usuario modi<ica una
<i#a" #a <i#a se $resenta a #a !ase de datos 1 ninguna cosa se $ierde&
En a#gunas situaciones" sin em!argo" e# c#iente no est conectado en todo momento& De
hecho" ha1 una c#ase de a$#icaciones ##amadas conectadas o desconectadas de 9ez en
cuando" 1 #as t'cnicas $resentadas hasta e# momento no tienen en cuenta #as necesidades
de estas a$#icaciones& Las a$#icaciones desconectadas #een a#gunos datos cuando est'
dis$oni!#e #a cone?in 1 #uego se desconectan de# ser9idor& Los usuarios $ueden
interactuar con #os datos en e# c#iente" $ero tra!a0an con una cach' #oca# de #os datos" 1a
%ue $ueden insertar nue9as <i#as" editar #as 1a e?istentes" 1 e#iminar #as <i#as se#eccionadas&
Los cam!ios" sin em!argo" no se en92an inmediatamente a# ser9idor& Es im$erati9o %ue #os
datos se conser9en en e# c#iente& +;o %ueremos %ue #os usuarios $ierdan sus ediciones
de!ido a %ue su $ortti# se %ued sin $i#as o de!ido a un error en #a a$#icacin&, Cuando
una cone?in 9ue#9e a estar dis$oni!#e" #a a$#icacin de!e ser ca$az de a9eriguar #as <i#as
%ue han sido modi<icados 1 guardar #os cam!ios a$ro$iados en e# ser9idor& Para sim$#i<icar
e# a#macenamiento de datos en e# c#iente" /D:&;ET o<rece un mecanismo de gran
a#cance" e# con0unto de datos 3DataSet5&
Usted $uede $ensar en e# DataSet como una $e%ue@a !ase de datos %ue 9i9e en #a
memoria& ;o es en rea#idad una !ase de datos" $ero est hecha de ta!#as re#acionadas %ue
tienen #a misma estructura %ue #as ta!#as de !ase de datos& Las simi#itudes terminan ah2" sin
em!argo" de!ido a %ue e# con0unto de datos no im$one todo ti$o de #imitaciones 1 no
$uede e?$#otar sus datos con sentencias SOL& Se com$one de o!0etos 6ataTable" 1 cada
ta!#a de datos en e# con0unto de datos corres$onde a una consulta independiente& /# igua#
%ue #as ta!#as de !ase de datos" #os o!0etos DataTa!#e se com$one de o!0etos 6ata.olumn
# 6ata5o<& Los o!0etos DataCo#umn es$eci<icar #a estructura de #a ta!#a" 1 #os o!0etos
Data*oE %ue contienen #as <i#as de #a ta!#a& Tam!i'n $uede esta!#ecer re#aciones entre #as
ta!#as en e# DataSet" 1 estas re#aciones se re$resentan con o!0etos 6ata5elation& Como se
$uede dar cuenta" e# con0unto de datos #e $ermite co$iar una $e%ue@a seccin de #a !ase de
datos en e# c#iente" tra!a0ar con '#" 1 #uego en9iar #os cam!ios rea#izados en e# c#iente de
nue9o a #a !ase de datos&
E# $oder rea# de# con0unto de datos es %ue rea#iza un seguimiento de #os cam!ios
rea#izados en sus datos& Se sa!e %ue #as <i#as se han modi<icado" a@adido o e#iminado" 1
17+
Luis Edgar Snchez
$ro$orciona un mecanismo $ara #a $resentacin de #os cam!ios de <orma automtica& En
rea#idad" no es e# con0unto de datos %ue en92a #os cam!ios" sino una c#ase %ue se uti#iza en
con0unto con e# con0unto de datos( #a c#ase 6ataAdapter& Por otra $arte" #a c#ase DataSet
$ro$orciona #os m'todos Nrite6m# 1 *ead6m#" %ue #e $ermiten guardar sus datos en un
archi9o #oca#& Tenga en cuenta %ue estos m'todos de guardar #os datos en un archi9o #oca#
son $ara %ue $ueda 9o#9er a cargar e# con0unto de datos ms ade#ante" $ero %ue no
$resentan #os datos a #a !ase de datos&
Llenado conjuntos de datos
Los con0untos de datos se ##enan con Data/da$ters" 1 ha1 dos maneras de crear un
con0unto de datos( Puede uti#izar #as herramientas 9isua#es de Cisua# Studio o crear un
con0unto de datos $or com$#eto dentro de su cdigo& Los con0untos de datos creados en
tiem$o de e0ecucin no son ti$ados" $or%ue e# com$i#ador no sa!e %u' ti$o de in<ormacin
es #a %ue 9a a a#macenar en e##os& Los con0untos de datos creados en tiem$o de dise@o con
#as herramientas 9isua#es son de ti$os in<#e?i!#es" 1a %ue e# com$i#ador sa!e %u' ti$o de
in<ormacin ser a#macenada en e##os&
Las dec#araciones siguientes muestran #a di<erencia entre #os con0untos de datos sin ti$o 1
ti$ados&
Para acceso a #a co#umna Product;ame de #a $rimera <i#a de #a ta!#a Productos en un
con0unto de datos sin ti$o" se ha!r2a de uti#izar una e?$resin como #a siguiente(
Products)&Products&*oEs+A,&tem+5Product;ame5,
Si e# DataSet Products) es ti$ado+con ti$o," se $uede crear un o!0eto de# ti$o
Products&Products*oE con #a siguiente sentencia(
Dim $roduct*oE /s Products&Products*oE \ Products)&Products&*oEs+A,
Entonces se $uede usar #a 9aria!#e $roduct*oE $ara accesar a #as co#umnas de #a <i#a
corres$ondiente((
$roduct*oE&Product;ame
$roduct*oE&UnitPrice
Como se $uede entender" #as herramientas 9isua#es generan una serie de c#ases so!re #a
marcha" como #a c#ase Products*oE" 1 nos $ermiten e?$oner#as en nuestro cdigo& Tan
$ronto como usted entra en #a cadena demetodos de $roduct*oE 1 e# $er2odo siguiente en
#a 9entana de cdigo" $odrs 9er #os miem!ros de #a c#ase Products*oE" %ue inc#u1en #os
nom!res de #as co#umnas de #a ta!#a corres$ondiente& En este tema" se ana#izan con0untos
de datos sin ti$o& En e# tema siguiente" se 9a a discutir en deta##e con0untos de datos con
ti$o 1 cmo usar#os en #a construccin de a$#icaciones de datos conso#idados&
La clase 6ataAdapter
Para uti#izar con0untos de datos en #a a$#icacin" $rimero de!e crear un o!0eto
17, Luis Edgar Snchez
Data/da$ter" %ue es #a t'cnica $re<erida de $o!#ar e# DataSet& E# Data/da$ter no es ms
%ue una co#eccin de o!0etos de comandos %ue se necesitan $ara e0ecutar #os distintos
comandos contra #a !ase de datos& Como usted recuerda de nuestra temtica anterior" en
%ue interactuamos con #a !ase de datos uti#izando cuatro di<erentes o!0etos de comandos(
uno $ara se#eccionar #os datos 1 cargar#os en e# e%ui$o c#iente con #a a1uda de un o!0eto
Data*eader +un o!0eto de comandos con #a instruccin SELECT," 1 tres ms %ue $resente
a #a !ase de datos de #as nue9as <i#as +un o!0eto de comandos con #a instruccin ;SE*T,"
actua#izacin de #as <i#as e?istentes +un o!0eto de comandos con #a instruccin UPD/TE, 1
e#iminar #as <i#as e?istentes +un o!0eto de comandos con #a instruccin DELETE,& Un
Data/da$ter es un contenedor $ara #os o!0etos Connection 1 Command& Si se dec#ara un
o!0eto S%#Data/da$ter con una dec#aracin como #a siguiente(
Dim D/ /s ;eE S%#Data/da$ter
Cer %ue este muestra #as siguientes $ro$iedades(
InsertCommand Un objeto Command que inserta una nueva fla
UpdateCommand
Un objeto Command que actualiza flas
DeleteCommand Un objeto Command que elimina filas
SelectCommand Un objeto Command que devuelve flas
Cada una de estas $ro$iedades es un o!0eto 1 tiene #a $ro$iedad de cone?in $ro$ia"
$or%ue cada uno $uede no actuar so!re #a misma !ase de datos +$or mu1 $oco $ro!a!#e
%ue sea,& Estas $ro$iedades tam!i'n $oseen su co#eccin de $armetros $ro$ios" %ue de!e
re##enar en consecuencia antes de e0ecutar un comando&
La c#ase Data/da$ter rea#iza #as dos tareas !sicas de una a$#icacin !asada en datos(
Se recu$era datos de #a !ase de datos $ara re##enar un con0unto de datos" 1 actua#iza #os
cam!ios en #a !ase de datos&
Para re##enar un DataSet" uti#ice e# m'todo 0ill" %ue ##ena un o!0eto DataTa!#e es$ec2<ico&
Ra1 un Data/da$ter $or o!0eto DataTa!#e en e# DataSet" 1 usted de!e ##amar a#
corres$ondiente m'todo Fi## $ara ##enar cada DataTa!#e& Para en9iar #os cam!ios a #a !ase
de datos" uti#ice e# m'todo UPD/TE $ara e# corres$ondiente o!0eto Data/da$ter&
E# m'todo U$date est so!recargado" 1 $uede uti#izar#o $ara actua#izar una so#a <i#a a #a
!ase de datos o todas #as <i#as editadas en un DataTa!#e& E# m'todo de actua#izacin
uti#iza e# o!0eto de comando corres$ondiente $ara interactuar con #a !ase de datos&
asar par@metros a tra%Ks del 6ataAdapter
Camos a construir un con0unto de datos en nuestro cdigo $ara demostrar e# uso de #os
o!0etos Data/da$ter& Para em$ezar" se dec#ara una 9aria!#e de con0unto de datos(
Dim DS As New DataSet
177 Luis Edgar Snchez
Luego creamos #os comandos adecuados $ara interactuar con #a !ase de datos(
Dim cmdSelectCustomers As String = "SELECT * FROM Customers " & _
"WHERE Customers.Country=@country"
Dim cmdDeleteCustomer As String = "DELETE Customers WHERE CustomerID=@CustomerID"
Dim cmdEditCustomer As String = "UPDATE Customers " & _
"SET CustomerID = @CustomerID, CompanyName = @CompanyName, " & _
"ContactName = @ContactName, ContactTitle = @ContactTitle " & _
"WHERE CustomerID = @CustID"
Dim cmdInsertCustomer As String = "INSERT Customers " & _
"(CustomerID, CompanyName, ContactName, ContactTitle) " & _
"VALUES(@CustomerID, @CompanyName, @ContactName, @ContactTitle) "
Re inc#uido s#o unas $ocas co#umnas en #os e0em$#os $ara mantener #os comandos
razona!#emente cortos& Se usa 9arios comandos consu#tas con $armetros $ara interactuar
con #a !ase de datos" 1 ha1 %ue a@adir #os $armetros adecuados $ara cada o!0eto
command& Des$u's de #as instrucciones SOL se encuentran en e# #ugar" $odemos construir
#as cuatro $ro$iedades de comandos de# o!0eto Data/da$ter& Para em$ezar" se dec#ara un
o!0eto Data/da$ter(
Dim D/Customers /s ;eE S%#Data/da$ter+,
De!ido a %ue todas #as $ro$iedades de comandos de# o!0eto Data/da$ter actuarn so!re #a
misma !ase de datos" $odemos crear un o!0eto Connection 1 reuti#izar#a cuando sea
necesario(
Dim C; /s ;eE S%#Connection+ConnString,
La 9aria!#e C:;;ST*;= es una cadena con #a cadena de cone?in adecuada& /hora
$odemos crear #as cuatro $ro$iedades de comandos de# o!0eto Data/da$ter D/Customers&
Camos a em$ezar con #a $ro$iedad Se#ectCommand de# o!0eto Data/da$ter& Las
siguientes dec#araciones 9an a crear un nue9o o!0eto de comando !asado en #a instruccin
SELECT anterior 1 #uego crear un o!0eto de $armetro $ara e# $armetro e$ a 2s de #a
instruccin SELECT(
Dim DACustomers As New SqlDataAdapter()
Dim CN As New SqlConnection(ConnString)
DACustomers.SelectCommand = New SqlClient.SqlCommand(cmdSelectCustomers)
DACustomers.SelectCommand.Connection = CN
Dim param As New SqlParameter
param.ParameterName = "@Country"
param.SqlDbType = SqlDbType.VarChar
param.Size = 15
param.Direction = ParameterDirection.Input
param.IsNullable = False
param.Value = "Germany"
DACustomers.SelectCommand.Parameters.Add(param)
178
Luis Edgar Snchez
Este es e# modo ms <ci#" $ero deta##ado" de #a es$eci<icacin de un o!0eto Parameter&
Usted est <ami#iarizado con #as $ro$iedades de# o!0eto Parameter 1 1a sa!e cmo
con<igurar 1 a@adir #os $armetros a un o!0eto de comando a tra9's de un 4nico comando&
Como un recordatorio" una <orma so!recargada de# m'todo /dd #e $ermite con<igurar 1
ad0untar un o!0eto de $armetro a #a co#eccin de un o!0eto Command de $armetros con
una so#a" $ero e?tensa dec#aracin(
DA.SelectCommand.Parameters.Add _
(New System.Data.SqlClient.sqlParameter _
(paramName, ParamType,paramSize, paramDirection, paramNullable,_
paramPrecision, paramScale, columnName, rowversion, paramValue)
E# $aramPrecision $aramSca#e 1 argumentos se a$#ican a #os $armetros num'ricos" 1 se
$ueden esta!#ecer a A $ara #os $armetros de cadena& E# argumento $aram;u##a!#e
determina si e# $armetro $uede su$oner un 9a#or nu#o& E# argumento co#umn;ame es e#
nom!re de #a co#umna de #a ta!#a a #a %ue ser e# $armetro coincidente& +;ecesitamos esta
in<ormacin $ara #os comandos ;SE*T 1 UPD/TE&, E# argumento roE9ersion
determina %u' 9ersin de# cam$o en e# con0unto de datos se uti#izar - en otras $a#a!ras" si
e# Data/da$ter $asar a# $armetro o!0eto de #a 9ersin actua# +Data*oECersion&Current,
o #a 9ersin origina# +Data*oECersion&:rigina#, de# cam$o&
E# 4#timo argumento" $aramCa#ue" es e# 9a#or de# $armetro& Usted $uede es$eci<icar un
9a#or como #o hicimos en e# e0em$#o de #as $ro$iedades Se#ectCommand" o esta!#ecer este
argumento $ara nada 1 de0ar a# o!0eto Data/da$ter asignar e# 9a#or adecuado a cada
$armetro& Por 4#timo" $uede a!rir #a cone?in con #a !ase de datos 1 #uego ##amar a L#ene
e# Data/da$ter m'todo $ara re##enar un o!0eto DataTa!#e en e# DataSet(
CN.Open()
DA.Fill(DS, "Clientes")
CN.Close()
E# m'todo Fi## ace$ta como argumentos un o!0eto DataSet 1 e# nom!re de #a DataTa!#e
%ue se re##ena& E# D/Customers Data/da$ter se asocia con un 4nico DataTa!#e 1 sa!e
cmo $o!#ar#o" as2 como #a <orma de $resentar #os cam!ios a #a !ase de datos& E# nom!re
de #a DataTa!#e es ar!itraria 1 no necesita coincidir con e# nom!re de #a ta!#a de !ase de
datos donde #os datos se origina& Las cuatro o$eraciones !sicas de Data/da$ter +%ue no
son otros %ue #as cuatro o$eraciones !sicas de acceso a datos de una a$#icacin c#iente,
tam!i'n se conocen como o$eraciones C*UD( Crear 8 *ecu$erar 8 actua#izar 8 e#iminar&
Acceso a las tablas del dataset.
E# con0unto de datos se com$one de cuadros" %ue estn re$resentados $or #a c#ase
DataTa!#e& Cada DataTa!#e en e# con0unto de datos $uede corres$onder a una ta!#a en #a
!ase de datos o una 9ista& Cuando se e0ecuta una consu#ta %ue recu$era #os cam$os de
9arias ta!#as" todas #as co#umnas se#eccionadas se terminan en un 4nico DataTa!#e de#
179 Luis Edgar Snchez
DataSet& Usted $uede se#eccionar cua#%uier o!0eto DataTa!#e en e# con0unto de datos $or
su 2ndice o su nom!re(
DS&Ta!#es+A, DS&Ta!#es+5Customers5,
Cada ta!#a contiene #as co#umnas" %ue se $uede acceder a tra9's de #a co#eccin Co#umns&
La co#eccin est <ormada $or co#umnas de o!0etos DataCo#umn" un o!0eto DataCo#umn
$ara cada co#umna de #a ta!#a corres$ondiente& La co#eccin de co#umnas es e# es%uema
de# o!0eto DataTa!#e" 1 #a c#ase DataCo#umn e?$one $ro$iedades %ue descri!en una
co#umna& Co#umn;ame es e# nom!re de #a co#umna" Ti$o de datos es e# ti$o de #a
co#umna" Ma?Length es e# tama@o m?imo de co#umnas de te?to" 1 as2 sucesi9amente&
La $ro$iedad /utoncrement es cierto $ara #as co#umnas de identidad" 1 #a $ro$iedad
/##oED>;u## determina si #a co#umna admite 9a#ores nu#os& En resumen" todas #as
$ro$iedades %ue $uede esta!#ecer 9isua#mente como a dise@ar una ta!#a tam!i'n estn
dis$oni!#es $ara e# cdigo a tra9's de #a co#eccin Co#umns de# o!0eto DataTa!#e& Puede
uti#izar #as $ro$iedades de #a c#ase DataCo#umn $ara a9eriguar #a estructura de #a ta!#a o
$ara crear una nue9a ta!#a& Para agregar una ta!#a a un con0unto de datos" $uede crear un
o!0eto DataTa!#e nue9o& / continuacin" cree un o!0eto DataCo#umn de cada co#umna"
esta!#ezca sus $ro$iedades" 1 a@adir #os o!0etos DataCo#umn a #a co#eccin de# DataTa!#e
co#umnas& Por 4#timo" agregue e# DataTa!#e a# DataSet&
Trabajar con 0ilas
En cuanto a datos se re<iere" cada DataTa!#e se com$one de o!0etos Data*oE& Todos #os
o!0etos Data*oE de un DataTa!#e tienen #a misma estructura 1 se $uede acceder a tra9's
de un 2ndice" %ue es e# orden de #a <i#a en #a ta!#a& Para acceder a #as <i#as de #a ta!#a de
c#ientes" uti#izar una e?$resin como #a siguiente(
DS&Customers&*oEs+i*oE,
Donde i*oE es un 9a#or desde cero +#a $rimera <i#a en #a ta!#a, hasta DS&Customers&
*oEs&Count - ) +#a 4#tima <i#a de #a ta!#a,& Para acceder a #os cam$os indi9idua#es de un
o!0eto Data*oE" uti#ice #a $ro$iedad de# art2cu#o& Esta $ro$iedad de9ue#9e e# 9a#or de una
co#umna en #a <i#a actua# $or su 2ndice o !ien su nom!re(
DS&Customers&*oEs+A,&tem+A,
o
DS&Customers&*oEs+A,&tem+5CustomerD5,
Para recorrer #as <i#as de un con0unto de datos" $uede crear un && Para & >uc#e siguiente
como e# siguiente(
Dim iRow As Integer
For iRow = 0 To DSProducts1.Products.Rows.Count - 1
' procesar fila: DSProducts.Products.Rows(iRow)
Next
18!
Luis Edgar Snchez
/#ternati9amente" $uede uti#izar un For Each && & >uc#e For ;e?t $ara recorrer en iteracin
#as <i#as de #a DataTa!#e(
Dim product As DataRow
For Each product In DSProducts1.Products.Rows
' procesar fila prodRow :
' product.Item(ProductName),
' product.Item(UnitPrice), y asi
Next
Para editar una <i#a es$ec2<ica" sim$#emente ha1 %ue asignar nue9os 9a#ores a sus
co#umnas& Para cam!iar e# 9a#or de #a co#umna Contact;ame de una <i#a es$ec2<ica en un
o!0eto DataTa!#e %ue contiene #os c#ientes de #a !ase de datos ;orthEind" uti#ice una
instruccin como #a siguiente(
DS&Customers+3,&tem+5Contact;ame5, \ 5neE contact name5
Los nue9os 9a#ores son genera#mente introducidos $or un usuario en #a inter<az a$ro$iada"
1 en su cdigo #o ms $ro!a!#e %ue se 9a ha hacer es asignar #a $ro$iedad de un contro# a
#a co#umna de una <i#a con dec#araciones como #as siguientes(
If txtName.Text.Trim <> "" Then
DS.Customers(3).Item("ContactName") = txtName.Text
Else
DS.Customers(3).Item("ContactName") = DBNull.Value
End If
E# segmento de cdigo se su$one %ue cuando e# usuario no $ro$orciona un 9a#or $ara una
co#umna" esta co#umna se esta!#ece en nu#o +si #a co#umna es anu#a!#e" $or su$uesto,& Si e#
contro# contiene un 9a#or" este 9a#or se #e asigna a #a co#umna Contact;ame de #a cuarta
<i#a en #a ta!#a de datos Customers de# DataSet DS&
A>adir # eliminar 0ilas
Para agregar una nue9a <i#a a un DataTa!#e" $rimero de!e crear un o!0eto Data*oE"
esta!#ecer sus 9a#ores de co#umna" 1 #uego ##amar a# m'todo /dd de #a co#eccin *oEs de#
o!0eto DataTa!#e a# %ue $ertenece #a nue9a <i#a" $asando #a nue9a <i#a como un argumento&
Si e# con0unto de datos DS contiene #a ta!#a de datos Customers" #as siguientes
dec#araciones son $ara a@adir una nue9a <i#a $ara #a ta!#a Customers(
Dim newRow As New DataRow = dataTable.NewRow
newRow.Item("CompanyName") = "new company name"
newRow.Item("CustomerName") = "new customername"
newRow.Item("ContactName") = "new contact name"
DS.Customers.Rows.Add(newRow)
Tenga en cuenta %ue no es necesario esta!#ecer #a co#umna CustomerD& / esta co#umna
de identidad se #e asigna un nue9o 9a#or de <orma automtica $or e# con0unto de datos& Por
su$uesto" cuando #a <i#a se actua#iza a #a !ase de datos" e# identi<icador asignado a# nue9o
181
c#iente $or e# con0unto de datos 1a se $uede tomar& SOL Ser9er asigna un 9a#or 4nico
nue9o en esta co#umna cuando se inserta en #a ta!#a& Se recomienda %ue se esta!#ezca #a
$ro$iedad /utoncrementSeed de una co#umna de identidad a A" 1 e# /utoncrement a -)"
de modo %ue #as nue9as <i#as se asignan identi<icadores consecuti9os negati9os en e#
con0unto de datos& Presumi!#emente" #as co#umnas corres$ondientes en #a !ase de datos
tienen un 9a#or /utoncrement $ositi9o" as2 %ue cuando estas <i#as se en92a a #a !ase de
datos" se #es asigna e# siguiente 9a#or de identidad automticamente& Si usted est
dise@ando una nue9a !ase de datos" uti#ice #os identi<icadores 4nicos g#o!a#es +=UD, en
#ugar de 9a#ores de identidad-UES& Un =UD se $uede crear en e# c#iente 1 es 4nico& E#
mismo =UD %ue sern generados $or e# c#iente tam!i'n se insertar en #a ta!#a" cuando #a
<i#a se ha com$rometido& Para crear =UD" ##ame a# m'todo ;eE=uid de #a c#ase =uid(
neE*oE&tem+5CustomerD5, \ =uid&;eE=uid
Para e#iminar una <i#a" $uede e#iminar#o de #a co#eccin de <i#as a tra9's de #os m'todos de
%uitar o *emo9e/t de #a co#eccin de <i#as" o ##amar a# m'todo De#ete de# o!0eto Data*oE
%ue re$resenta #a <i#a& E# m'todo *emo9e ace$ta como argumento un o!0eto Data*oE 1 #o
e#imina de #a co#eccin(
Dim customerRow As DS.CustomerRow
customerRow = DS.Customers.Rows(2)
DS.Customers.Remove(customerRow)
E# m'todo *emo9e/t ace$ta como argumento e# 2ndice de #a <i#a %ue desea e#iminar en #a
co#eccin *oEs& Por 4#timo" e# m'todo De#ete es un m'todo de #a c#ase Data*oE" 1 de!e
a$#icarse a un o!0eto Data*oE %ue re$resenta #a <i#a %ue desea e#iminar(
customer*oE&De#ete
-liminacin 0rente a remocin de ;ilas
E# m'todo *emo9e %uita una <i#a de# con0unto de datos como si nunca se hu!iera #e2do
cuando e# con0unto de datos se ##en& Las <i#as e#iminadas no siem$re se %uitan de#
con0unto de datos" 1a %ue e# con0unto de datos mantiene su estado& Si #a <i#a se ha
e#iminado e?iste en #a ta!#a su!1acente +es decir" si se trata de una <i#a %ue se #e1 en e#
con0unto de datos cuando se ##ena," #a <i#a se marca como e#iminado" $ero no se e#iminar
de# DataSet& Si se trata de una <i#a %ue se ha a@adido a# con0unto de datos des$u's de %ue
se #ee de #a !ase de datos" #a <i#a e#iminada se e#iminan de #a co#eccin *oEs&
Usted $uede e#iminar <2sicamente #as <i#as e#iminadas de# con0unto de datos ##amando a#
m'todo /cce$tChanges de# DataSet& Sin em!argo" des$u's de ha!er ace$tado #os cam!ios
en e# con0unto de datos" 1a no se $uede en9iar #as actua#izaciones a #a !ase de datos& Si se
##ama a# m'todo de# DataSet *e0ectChanges" #as <i#as e#iminadas se restaurarn en e#
con0unto de datos&
18&
:a%egando a tra%Ks de un conjunto de datos
Las ta!#as de datos %ue com$onen un con0unto de datos $ueden estar re#acionadas" 1 #o
estn $or #o genera#& Ra1 m'todos %ue #e $ermiten des$#azarse de ta!#a en ta!#a a tra9's de
#as re#aciones entre sus <i#as& Por e0em$#o" usted $uede comenzar con una <i#a de #a ta!#a de
datos Customers" recu$erar sus <i#as secundarias de #a DataTa!#e rdenes +#os $edidos $or
e# c#iente se#eccionado," 1 #uego $ro<undizar en #os deta##es de cada uno de #os $edidos
se#eccionados&
Las re#aciones de un con0unto de datos son o!0etos Data*e#ation 1 se a#macenan en #a
$ro$iedad *e#ations de# DataSet& Cada re#acin se identi<ica $or un nom!re" #as dos ta!#as
se re<iere" 1 #os cam$os de #as ta!#as en #as %ue #a re#acin se !asa&
Es $osi!#e crear re#aciones en e# cdigo" 1 e# $roceso es mu1 senci##o& Camos a considerar
un con0unto de datos %ue contiene #as ta!#as Categor2as 1 Productos& Para esta!#ecer una
re#acin entre #as dos ta!#as" crear dos instancias de# o!0eto DataTa!#e $ara hacer
re<erencia a #as dos ta!#as(
Dim tblCategories As DataTable = DS.Categories
Dim tblProducts As DataTable = DS.Products
/ continuacin" cree dos o!0etos DataCo#umn $ara hacer re<erencia a #as co#umnas en %ue
se !asa #a re#acin& Son #as co#umnas Categor1D de am!as ta!#as(
Dim colCatCategoryID As DataColumn =blCategories.Columns("CategoryID")
Dim colProdCategoryID As DataColumn = blProducts.Columns("CategoryID")
Y" $or 4#timo" crear un o!0eto Data*e#ation nue9o 1 agregar#o a# con0unto de datos(
Dim DR As DataRelation
DR = New DataRelation("Categories2Products", colCatCategoryID, _
colProdCategoryID)
Tenga en cuenta %ue tenemos %ue es$eci<icar s#o #as co#umnas %ue $artici$an en #a
re#acin" 1 no a #as ta!#as %ue estn re#acionadas& La in<ormacin acerca de #as ta!#as se
deri9a de #os o!0etos DataCo#umn& E# $rimer argumento de# constructor Data*e#ation es e#
nom!re de #a re#acin& Si #a re#acin consiste en 9arias co#umnas" #os argumentos segundo
1 tercero" e# constructor usa #as matrices de o!0etos DataCo#umn&
Para na9egar $or #as ta!#as re#acionadas" e# o!0eto Data*oE $ro$orciona e# m'todo
=etChi#d*oEs" %ue de9ue#9e #as <i#as de #a <i#a actua# de# hi0o como una matriz de o!0etos
Data*oE 1 =etParent #a Fi#a 8 =etParent*oEs m'todos" %ue de9ue#9en #a <i#a de #a <i#a
actua# de $adre +s,& =etParent*oE de9ue#9e un o!0eto Data*oE indi9idua#" 1 de9ue#9e
=etParent*oEs una matriz de o!0etos Data*oE& De!ido a %ue
DataTa!#e $uede estar re#acionado con m4#ti$#es ta!#as de datos" tam!i'n de!e es$eci<icar
e# nom!re de #a re#acin& Considere un con0unto de datos con #os $roductos" categor2as 1
ta!#as de Pro9eedores& Cada <i#a de #os Productos
$uede tener dos <i#as $rimarias" en <uncin de #a re#acin %ue desea seguir& Para recu$erar
#a categor2a de $roducto" uti#ice una dec#aracin como #a siguiente(
Luis Edgar Snchez
18'
DS&Products+i*oE,&=etParent*oE+5CategoriesProducts5,
E# $ro9eedor de# $roducto 9iene dada $or #a siguiente e?$resin(
DS&Products+i*oE,&=etParent*oE+5Su$$#iersProducts5,
Si usted comienza con una categor2a" $uedes encontrar #os $roductos re#acionados con e#
m'todo =etChi#d*oEs" %ue ace$ta como argumento e# nom!re de un o!0eto de *e#acin(
DS&Categories+i*oE,&=etChi#d*oEs+5CategoriesProducts5,
Para recorrer #os $roductos de una categor2a es$ec2<ica +en otras $a#a!ras" #as <i#as de #a
ta!#a de $roductos %ue $ertenecen a una categor2a," crear un !uc#e como e# siguiente(
Dim product As DataRow
For Each product In _
DS.Categories(iRow).GetChildRows("CategoriesProducts")
' procesar producto
Next
ActualiDacin de $peraciones
Uno de #os temas ms im$ortantes en #a $rogramacin de !ase de datos es #a <orma de
$resentar cam!ios a #a !ase de datos& Ra1 !sicamente dos modos de <uncionamiento(
actua#izaciones de una so#a 1 9arias actua#izaciones& Una a$#icacin c#iente %ue se e0ecuta
en una red de rea #oca# como e# ser9idor de !ase de datos $uede +1 de!e, $resentar
cam!ios tan $ronto como se $roduzcan& Si #a a$#icacin c#iente no est conectada a#
ser9idor de !ase de datos en todo momento" #os cam!ios se $ueden acumu#ar en e# c#iente
1 se $ueden actua#izar en e# modo de $roceso $or #otes cuando una cone?in con e#
ser9idor est' dis$oni!#e&
Desde e# $unto de 9ista de# desarro##ador" #a di<erencia entre #os dos modos es #a <orma de
contro#ar #os errores de actua#izacin& Si usted $resenta <i#as indi9idua#es de #a !ase de
datos 1 no #a o$eracin de actua#izacin" $uede mostrar una ad9ertencia 1 $ermitir a#
usuario modi<icar #os datos de nue9o& Puede escri!ir cdigo $ara restaurar #a <i#a a su
estado origina#" o no& En cua#%uier caso" es !astante <ci# de contro#ar #os errores ais#ados&
Si #a so#icitud $resenta una docena de <i#as de #a !ase de datos" 9arias de estas <i#as $ueden
de0ar de actua#izar #a ta!#a su!1acente 1 %ue tendr %ue mane0ar #os errores de
actua#izacin dentro de su cdigo& Como m2nimo" de!e 9a#idar #os datos de #a me0or
manera $osi!#e en e# c#iente antes de $resentar#os a #a !ase de datos&
;o im$orta #o !ien %ue 9a#ide sus datos" sin em!argo" no se $uede estar seguro de %ue ser
insertado en #a !ase de datos con '?ito&
:tro <actor %ue de!e considerar es #a natura#eza de #os datos a tra!a0ar& Camos a #a
a$#icacin" considere %ue mantiene una !ase de datos de #i!ros 1 una a$#icacin %ue reci!e
#os $edidos& La a$#icacin de mantenimiento #i!ro mane0a editores" autores" traductores 1
otros datos& Si dos usuarios docena de entrada 1 #a correccin de #os t2tu#os" todos e##os
tra!a0an con #os mismos autores& Si se #es $ermite tra!a0ar en modo desconectado" e#
18( Luis Edgar Snchez
nom!re mismo autor $uede entrar 9arias 9eces" 1a %ue ning4n usuario $uede 9er #os
cam!ios rea#izados $or otros usuarios& Esta so#icitud se de!e conectar( Cada 9ez %ue un
usuario a@ade un nue9o autor" #a ta!#a con #os nom!res de #os autores en #a !ase de datos
de!e ser actua#izado" $or #o %ue otros usuarios $uedan 9er e# nue9o autor& Lo mismo
ocurre con #os editores" traductores" temas" etc& Una a$#icacin desconectada de este ti$o
de!e inc#uir tam!i'n #os ser9icios $4!#icos $ara conso#idar 9arios autores 1 #os nom!res de
editor&
Una a$#icacin $ara #a toma de <orma segura $uede tra!a0ar en modo desconectado" 1a %ue
#as rdenes ingresadas $or un usuario no son conscientes 1 no inter<erir con #as rdenes
<ormu#adas $or otro usuario& Usted $uede insta#ar #a a$#icacin c#iente en #os $ortati#es de
9arios 9endedores $ara %ue $uedan tomar #os $edidos en cua#%uier #ugar 1 su!ir#os des$u's
de esta!#ecer una cone?in entre e# $ortti# 1 e# ser9idor de !ase de datos +%ue inc#uso
$uede ocurrir cuando e# regreso a #as o<icinas de #os 9endedores de #a em$resa,&
ActualiDacin de la base de datos con el 6ataAdapter
E# m'todo ms sim$#e de $resentar cam!ios en #a !ase de datos es uti#izar cada m'todo de
actua#izacin de Data/da$ter&
E# o!0eto DataTa!#e $ro$orciona a #os miem!ros %ue usted necesita $ara recu$erar #as <i#as
%ue no $ara actua#izar #a !ase de datos" as2 como #os mensa0es de9ue#tos $or e# ser9idor de
!ase de datos" 1 9ers cmo estos miem!ros se uti#izan en esta seccin& E# m'todo de
actua#izacin no se han actua#izado todas #as <i#as de #as ta!#as su!1acentes& Si un $roducto
se retir en e# 2nterin de #a ta!#a Productos en #a !ase de datos" U$dateCommand de
Data/da$ter no ser ca$az de $resentar #as modi<icaciones introducidas en e# $roducto
es$ec2<ico& Un $roducto con un 9a#or negati9o mu1 !ien $uede e?istir en e# c#iente" $ero #a
!ase de datos 9a a rechazar esta <i#a" 1a %ue 9io#a una de #as #imitaciones de #a ta!#a
Productos&
Si #a !ase de datos de9ue#9e ning4n error durante e# $roceso de actua#izacin" #a $ro$iedad
RasErrors de# o!0eto DataSet se esta!#ece en True& Puede recu$erar #as <i#as de error de
cada ta!#a con e# m'todo =etErrors de #a c#ase DataTa!#e& Este m'todo de9ue#9e una
matriz de o!0etos Data*oE" 1 usted $uede $rocesar de #a manera %ue estimen con9eniente&
E# cdigo %ue se muestra en e# #istado --&. recorre #as <i#as de #a ta!#a de #as categor2as %ue
estn en un error 1 se im$rime #a descri$cin de# error en #a 9entana de resu#tados&
*ecu$erar 1 mostrar #os errores de actua#izacin(
If Products1.HasErrors Then
If Products1.Categories.GetErrors.Length = 0 Then
Console.WriteLine("Errors in the Categories DataTable")
Else
Dim RowsInError() As Products.CategoriesRow
RowsInError = Products1.Categories.GetErrors
Dim row As Products.CategoriesRow
Console.WriteLine("Errors in the Categories table")
For Each row In RowsInError
Console.WriteLine(vbTab & row.CategoryID _
& vbTab & row.RowError)
18+
Luis Edgar Snchez
Next
End If
End If
Manejo de columnas de identidad
Una cuestin %ue merece es$ecia# atencin en #a codi<icacin de a$#icaciones !asadas en
datos es e# tratamiento de #as co#umnas de identidad& Las co#umnas de identidad se uti#izan
como c#a9es $rinci$a#es" 1 cada <i#a es #a garant2a de tener un 9a#or de identidad 4nico
$or%ue este 9a#or es asignado $or #a !ase de datos de# momento en %ue se inserta #a <i#a en
su ta!#a& La a$#icacin c#iente $uede" /:T generar 9a#ores 4nicos& Cuando se agregan
nue9as <i#as a un DataSet" %ue" /ore asignan 9a#ores de identidad" $ero estos 9a#ores son
4nicos en e# conte?to de# con0unto de datos #oca#es& Cuando una <i#a se $resenta a #a !ase
de datos" una co#umna de identidad se #e asignar e# 9a#or <ina# de #a !ase de datos& E#
9a#or de identidad tem$ora#es asignados $or e# con0unto de datos tam!i'n se uti#iza como
un 9a#or de c#a9e e?terna de #as <i#as re#acionadas" 1 de!emos asegurarnos de %ue cada 9ez
%ue un 9a#or de identidad se cam!ia" e# cam!io se $ro$agar a #as ta!#as re#acionadas&
Mane0o de 9a#ores de identidad es un tema im$ortante" 1 a%u2" e# /M $or %u'( Considere
#a $osi!i#idad de una so#icitud de registro de $edidos o <acturas& Cada $edido tiene una
ca!ecera 1 una serie de #2neas de deta##e" %ue estn re#acionados con una <i#a de
enca!ezado a #a co#umna :rderD& Esta co#umna es #a c#a9e $rinci$a# de #a ta!#a Pedidos 1
es #a c#a9e e?terna en #a ta!#a Deta##es de $edidos& Si #a c#a9e $rinci$a# de #a ca!ecera se
cam!ia" #as c#a9es e?ternas de #as <i#as re#acionadas de!en cam!iar tam!i'n&
E# truco en e# mane0o de #as co#umnas de identidad es $ara asegurarse de %ue #os 9a#ores
generados $or e# con0unto de datos ser sustituido $or #a !ase de datos& Lo hacemos
mediante #a es$eci<icacin de %ue #a co#umna de identidad" e# /M 9a#or inicia#
es decir" /) 1 su autoincrement es" /)& La $rimera identi<icacin generado $or e#
con0unto de datos ser" E/)" e# segundo uno ser" /-" 1 as2 sucesi9amente& Los 9a#ores
negati9os de identidad ser rechazada $or #a !ase de datos" 1a %ue e#
$ro$iedades /utoncrement en e# es%uema de !ase de datos son $ositi9os& Mediante #a
$resentacin de #a identidad negati9a 9a#ores a SOL Ser9er" nos aseguramos de %ue #os
nue9os 9a#ores" $ositi9o ser generado 1 uti#izado $or SOL Ser9idor&
Tam!i'n de!e asegurarse de %ue #os nue9os 9a#ores reem$#azarn a #os antiguos en #as
<i#as re#acionadas& En otras $a#a!ras" %ueremos %ue estos 9a#ores se $ro$aguen a todos #os
registros re#acionados& E# con0unto de datos %ue $ermite $ara es$eci<icar %ue #os cam!ios
en #a c#a9e $rinci$a# se $ro$agan a tra9's de #as <i#as re#acionadas con #a
U$date*u#e caracter2stica de #a $ro$iedad *e#ation&Chi#dSe1Constraint& Cada re#acin
e?$one #a $ro$iedad Chi#dSe1Constraint" %ue determina cmo #os cam!ios en #a c#a9e
$rinci$a# de una re#acin a<ectar #as <i#as secundarias& Esta $ro$iedad es un o!0eto %ue
e?$one a#gunas caracter2sticas $ro$ias& Las dos $ro$iedades %ue" /ore interesados son
U$date*u#e 1 De#ete*u#e +#o %ue ocurre con #as <i#as secundarias cuando #a <i#a de #os
$adres" c#a9e /: $rinci$a# se cam!ia" o cuando #a c#a9e $rinci$a# es e#iminado,& Puede
uti#izar una de #as siguientes reg#as(
.ascade: Las c#a9es e?ternas en #as <i#as re#acionadas con e# cam!io cada 9ez %ue e#
18, Luis Edgar Snchez
$rinci$a# 9a#or cam!ios c#a9e" $or #o %ue" $ermanecen siem$re re#acionados con su #2nea
$rinci$a#&
:one: La c#a9e e?terna en #a #2nea corres$ondiente +s, no se 9e a<ectada&
Aet6e0ault: La c#a9e e?terna en #a #2nea corres$ondiente +s, se esta!#ece en #a $ro$iedad
De<au#tCa#ue de #a misma co#umna&
Aet:ull La c#a9e e?terna en #as <i#as re#acionadas se esta!#ece en nu##&
Como se $uede entender" esta!#ecer #a $ro$iedad U$date*u#e a otra cosa %ue en cascada se
rom$a #a re#acin& Si e# doesn de !ase de datos" /:T hacer cum$#ir #a re#acin" $uede ser
ca$az de rom$er#o& Si #a re#acin es <orzada" sin em!argo" U$date*u#e se de!e esta!#ecer
en *u#e&Cascade" o #a !ase de datos no ace$tar cam!ios %ue 9io#an #a integridad
re<erencia#&
Si esta!#ece U$date*u#e en ;inguno" es $osi!#e %ue $ueda $resentar #a orden de #a !ase de
datos& Sin em!argo" #as <i#as de deta##e $uede re<erirse a un orden di<erente& Esto suceder
cuando e# identi<icador de #a ca!ecera se cam!ia $or e# 9a#or tem$ora# 1a se tiene& Las <i#as
de deta##e se inserta con #a c#a9e tem$ora# 1 se a@ade a #os deta##es de otro orden& Tenga en
cuenta %ue no es una e?ce$cin en tiem$o de e0ecucin ser #anzado" 1 #a 4nica manera de
atra$ar a este ti$o de error es mediante e# e?amen de #os datos insertados en #a !ase de
datos de #a a$#icacin& Mediante e# uso de 9a#ores negati9os en e# con0unto de datos" nos
aseguramos de %ue e# D de am!os de #a ca!ecera 1 todas #as <i#as de deta##e ser
rechazada $or e# Data!ase&
Fuente( PET*:US:S" E9ange#us V 3Mastering Cisua# >asic -AAI5
Taller *.%$
< *ea#ice una a$#icacin NindoEs uti#izando acceso a datos mediante m'todos
$ro$orcionados $or datasets %ue $ermita(
a0 nsertar nue9os registro en #a ta!#a&
10 Cisua#izar todos #os registros en #a conso#a&
c0 Modi<icar #os datos de un registro&
d0 Des$#azarce entre #os registros&
e0 E#iminar un registro de acuerdo a# cam$o ##a9e $rimaria&
187
Tema (.': .onstruir Aplicaciones enlaDadas a adatos.
Luis Edgar Snchez
Almacenamiento de datos en conjuntos de datos
En e# ca$2tu#o anterior" a$rendi acerca de #as dos c#ases !sicas $ara interactuar con !ases
de datos( La c#ase Connection $ro$orciona a #os miem!ros %ue usted necesita $ara
conectarse a #a !ase de datos" 1 #a c#ase de comandos $ro$orciona a #os miem!ros %ue
usted necesita $ara e0ecutar comandos en #a !ase de datos&
Una a$#icacin !asada en datos tam!i'n tiene %ue a#macenar #os datos en e# c#iente" 1 usted
sa!e cmo usar un Data*eader $ara tomar #os datos de #a !ase de datos" 1 un Data/da$ter
$ara re##enar un con0unto de datos en e# c#iente&
/dems de #os con0untos de datos %ue hemos creado en e# ca$2tu#o anterior" Cisua# Studio
tam!i'n #e $ermite crear con0untos de datos con ti$o+ti$ados,& Un DataSet con ti$o est
dise@ado con herramientas 9isua#es en tiem$o de dise@o 1 su estructura es conocida $or e#
com$i#ador" %ue $uede generar cdigo mu1 e<iciente $ara e# ti$o es$ec2<ico de datos %ue
est mani$u#ando en su a$#icacin& :tra 9enta0a de con0untos de datos con ti$o es %ue se
$uede en#azar a #os contro#es de NindoEs en un <ormu#ario& Cuando un cam$o est
en#azado a un contro# de NindoEs" cada 9ez %ue se tras#ada a otra <i#a en #a ta!#a" e#
contro# se actua#iza $ara re<#e0ar e# 9a#or actua# de# cam$o& Cuando e# usuario modi<ica e#
contro# en e# <ormu#ario" e# nue9o 9a#or reem$#aza e# 9a#or origina# de# cam$o en e#
con0unto de datos& Se dice %ue e# <ormu#ario est #igado a# origen de datos" %ue
norma#mente es un con0unto de datos Dataset&
E# en#ace de datos es un $roceso $ara #a creacin de a$#icaciones orientadas a datos con
herramientas 9isua#es( /signar #as co#umnas de una ta!#a con #os contro#es en e#
<ormu#ario" 1 Cisua# Studio genera e# cdigo $ara mostrar #os datos en #os contro#es
en#azados" as2 como #a actua#izacin de# con0unto de datos cuando e# usuario modi<ica e#
9a#or de un contro# en#azado& Estas a$#icaciones se denominan datos en#azados" 1 son
simi#ares a #as a$#icaciones dise@adas en e# ca$2tu#o anterior& La di<erencia es %ue Cisua#
Studio genera e# cdigo necesario $ara usted&
En este ca$2tu#o" usted a$render cmo hacer #o siguiente(
Dise@o 1 uso de con0untos de datos con ti$o
En#azar NindoEs <orms a con0untos de datos con
ti$o
Trabajar con conjuntos de datos con tipo
Los con0untos de datos %ue e?$#oran en e# ca$2tu#o anterior <ueron sin ti$o( Su estructura
e?acta se determina en tiem$o de e0ecucin" cuando <ueron $o!#adas a tra9's de #a
Data/da$ters a$ro$iado&
En este ca$2tu#o" 9o1 a discutir en deta##e #os con0untos de datos con ti$o& Un con0unto de
E
188
Luis Edgar Snchez
datos con ti$o es un con0unto de datos de estructura conocida" $or%ue es creado en tiem$o
de dise@o con herramientas 9isua#es& E# com$i#ador conoce #a estructura de# con0unto de
datos +es decir" #a %ue contiene ta!#as de datos 1 #a estructura de cada DataTa!#e, 1 genera
cdigo %ue es es$ec2<ico $ara #os datos en #a mano&
La caracter2stica ms im$ortante de #os con0untos de datos con ti$o es %ue te $ermiten
escri!ir cdigo in<#e?i!#e de ti$os 1 $rcticamente e#iminan #as $osi!i#idades de
e?ce$ciones" de!ido a errores de sinta?is& Considerando %ue" en un con0unto de datos sin
ti$o %ue tu9o %ue acceder a sus ta!#as de datos $or su nom!re con una e?$resin como
ds&Ta!#es +aProductosa," e# e%ui9a#ente DataSet e?$one e# nom!re de #a ta!#a como una
$ro$iedad( DS&Products& Para sa!er si un cam$o es$ec2<ico de un con0unto de datos sin
ti$o es nu#o" de!e uti#izar una e?$resin como #a siguiente(
DS&Ta!#es +5Products5,&*o
s+A,&tem+5UnitPrice5,&s;u##
Con un DataSet ti$ado" se $uede dec#arar una 9aria!#e %ue re$resenta una <i#a de #a ta!#a
Productos como este(
Dim $rod /s ;orthEindDataSet&Products*oE \ DS&Products&*oEs+A,
/ continuacin" $uede acceder a #os cam$os de #a <i#a como $ro$iedades" con e?$resiones
como esta( $rod& Product;ame $rod&UnitPrice" 1 as2 sucesi9amente& Para sa!er si e# cam$o
PrecioUnidad es nu#o" ##ame a #a $rod&sUnitPrice;u## m'todo&
Tam!i'n $uede esta!#ecer un cam$o en ;u## con una ##amada a# m'todo(
$rod&SetUnitPrice;u##& Como se $uede adi9inar" des$u's de #a estructura de# con0unto de
datos es conocido" e# editor $uede generar una c#ase con muchos miem!ros %ue
sim$#i<icar enormemente #a codi<icacin de #a a$#icacin con e# con0unto de datos con
ti$o& E# DataSet es una c#ase %ue se genera $or un asistente en #a marcha" 1 se con9ierte en
$arte de su so#ucin&
Comencemos $or mirar e# $roceso de generacin de con0untos de datos con ti$o con #as
herramientas de datos 9isua#es& Entonces 9ers cmo en#azar #os contro#es de NindoEs
$ara con0untos de datos con ti$o 1 generar inter<aces <unciona#es con #as o$eraciones de
a$untar 1 hacer c#ic&
Eenerar un 6ataAet con tipo
En esta seccin" 9amos a crear un DataSet con ti$o con #as tres ta!#as !sicas de #a !ase de
datos ;orthEind( $roductos" categor2as 1 $ro9eedores& Crear un nue9o $ro1ecto" e#
$ro1ecto DataSet:$erations& +Este es e# nom!re de# $ro1ecto de e0em$#o inc#uido en e#
ca$2tu#o&, / continuacin" a!ra e# men4 Datos 1 se#eccione e# comando /gregar origen de
datos& Cer e# /sistente $ara con<iguracin de or2genes de datos" %ue #e ##e9ar a tra9's de
#os $asos de #a construccin de un con0unto de datos en tiem$o de dise@o& En e# $rimer
cuadro de di#ogo de# asistente" se #e $edir %ue se#eccione e# ti$o de <uente de datos" %ue
$uede ser una !ase de datos" un ser9icio +$or e0em$#o" como un ser9icio Ee!," o un o!0eto"
como en #a <igura -3&)& Se#eccione e# icono de #a !ase de datos 1 haga c#ic en e# !otn
Siguiente&
189
La o$cin de ser9icio en e# cuadro de di#ogo de #a <igura -3&) se crear un con0unto de
datos %ue recu$era sus datos de un ser9icio +$or #o genera# un ser9icio Ee!,& La o$cin de
o!0etos %ue $ermite crear un con0unto de datos de una co#eccin de o!0etos $ersona#izados&
En e# siguiente cuadro de di#ogo de# asistente" e# cuadro E#i0a #a cone?in de datos cuadro
de di#ogo %ue se muestra en #a Figura -3&-" de!e es$eci<icar una cadena de cone?in $ara
#a !ase de datos %ue desea uti#izar& Raga c#ic en #a ;ue9a Cone?in !otn $ara crear una
nue9a cone?in s#o si no ha1 cone?in $ara #a !ase de datos %ue desea uti#izar& Si usted
ha e?$erimentado 1a con #as herramientas 9isua#es de Cisua# >asic" es $osi!#e %ue 1a
tenga una cone?in e?istente" en cu1o caso sim$#emente se#eccione de #a #ista des$#ega!#e&
Para crear una nue9a cone?in" de!e es$eci<icar sus credencia#es( si 9as a conectarte con
un nom!re de usuario 1 contrase@a o uti#izar #a autenticacin de NindoEs& Una 9ez
conectado a# ser9idor" $uede se#eccione #a !ase de datos %ue desee de un contro#
Com!o>o?& Si hace c#ic en e# !otn ;ue9a cone?in $ara crear una nue9a cone?in a #a
!ase de datos ;orthEind" $odrs 9er e# cuadro de di#ogo /gregar cone?in" como se
muestra en #a Figura -3&3& Este cuadro de di#ogo no es nue9o $ara usted" es e# mismo
cuadro de di#ogo %ue se uti#iza $ara crear una nue9a cone?in de datos en e# E?$#orador
de ser9idores& Si no has creado una cone?in con #a !ase de datos ;orthEind" hga#o
ahora& De #o contrario" se#eccione #a cone?in e?istente&
;igura &'.1
La e#eccin de #a <uente
de datos ti$o en e# origen de
datos& /sistente $ara #a
con<iguracin&
Luis Edgar Snchez
19!
;igura &'.&
La E#eccin de #os datos
Cone?in de #a ca0a de di#ogo
de# /sistente $ara
con<iguracin de or2genes de
datos
;igura &'.'
Use #a o$cin /gregar
cone?in
cuadro de di#ogo $ara
es$eci<icar una nue9a cone?in
a #a !ase de datos ;orthEind
Se recomienda %ue uti#ice #a autenticacin de NindoEs $ara conectarse a #a !ase de
datos& Si esto no es $osi!#e" $or%ue e# ser9idor de !ase de datos se e0ecuta en un e%ui$o
191 Luis Edgar Snchez
remoto" de!e es$eci<icar un nom!re de usuario 1 contrase@a en #os cuadros se muestra
en #a Figura -3&3& En este caso" e# asistente #e $reguntar si desea a#macenar
in<ormacin con<idencia# +contrase@a de #a cuenta, a #a cadena de cone?in& Usted
$uede o$tar $or inc#uir o #a contrase@a en #a cadena de cone?in +no es un m'todo mu1
seguro, o e# suministro desde dentro de# cdigo& Siem$re se $uede esta!#ecer #a
$ro$iedad PassEord de un o!0eto de cone?in en e# cdigo& Para asegurar #a contrase@a"
$uede so#icitar a# usuario una contrase@a cuando se inicia #a a$#icacin 1 guardar#o en
una 9aria!#e de a$#icacin& La contrase@a no se a#macena en cua#%uier #ugar&
/#ternati9amente" usted $uede a#macenar una 9ersin ci<rada de #a contrase@a 1
desci<rar 1 uti#izar dentro de su cdigo& E# me0or en<o%ue $ara una red #oca# es uti#izar
#a autenticacin de NindoEs&
Raga c#ic en e# !otn /ce$tar $ara cerrar e# cuadro de di#ogo /gregar cone?in 1
#uego haga c#ic en Siguiente de nue9o 1 9er un cuadro de di#ogo con e# nom!re de #a
cone?in $or de<ecto( ;orthEindConnectionString& Este es e# nom!re de un
esta!#ecimiento de nue9a a$#icacin %ue a#macenar #a in<ormacin de cone?in& Puede
editar este" as2 como #a con<iguracin de otra a$#icacin" en #a <icha Con<iguracin de
$ginas Pro$iedades de# $ro1ecto& +Para 9er #as $ginas de# $ro1ecto Pro$iedades"
se#eccione Pro$iedades de# $ro1ecto en e# men4 Pro1ecto&,
Raga c#ic en Siguiente de nue9o 1 $odrs 9er #as E#ige tu !ase de datos de o!0etos de
cuadro de di#ogo" %ue se muestra en #a Figura -3&." donde $uede se#eccionar #as ta!#as
1 co#umnas %ue desee cargar en e# DataSet& Tenga en cuenta %ue no se $uede uti#izar
una instruccin SELECT $ara se#eccionar #os datos %ue desee de una ta!#a( Usted de!e
se#eccionar toda #a ta!#a& Por su$uesto" usted $uede escri!ir un $rocedimiento
a#macenado $ara #imitar su se#eccin a continuacin" se#eccione en e# cuadro de
di#ogo& Si se#ecciona 9arias ta!#as 1 estn re#acionados" #a re#acin entre e##os tam!i'n
se im$ortarn $ara usted +no es necesario crear un o!0eto Data*e#ation $ara cada
re#acin entre #as ta!#as de# DataSet,& Para este e0em$#o" se#eccione #as categor2as"
$ro9eedores" 1 #as ta!#as de Productos de #a !ase de datos ;orthEind& Se#eccione todas
#as co#umnas de #as ta!#as de $roductos 1 categor2as" a e?ce$cin de #a co#umna magen
de #a ta!#a Categor2as& De #a ta!#a Pro9eedores" se#eccione #as co#umnas dPro9eedor 1
Com$an1;ame&
Luis Edgar Snchez 19&
;igura &'.(
Se#eccin de #as ta!#as 1
co#umnas %ue desea inc#uir en
e# DataSet&
En #a $arte in<erior de# cuadro de di#ogo de #a <igura -3&." se $uede es$eci<icar e#
nom!re de# con0unto de datos %ue se generar $ara usted& Co1 a usar e# nom!re
$redeterminado" ;orthEindDataSet& Raga c#ic en Fina#izar $ara cerrar e# asistente 1
crear e# con0unto de datos" %ue se a@adirn automticamente a #a 9entana de#
E?$#orador de so#uciones&
En #a 9entana :r2genes de datos" %ue se muestra en #a Figura -3&J" $odrs 9er un r!o#
%ue re$resenta #as ta!#as en e# DataSet& E# con0unto de datos contiene tres ta!#as de
datos" 1 cada DataTa!#e se hace de #as co#umnas se#eccionadas en e# asistente& Este
con0unto de datos se escri!e" $or%ue conoce #a estructura de #os datos %ue 9amos a
a#macenar en '#& La $arte interesante de este r!o# es %ue contiene #a ta!#a Productos en
dos ocasiones( en e# $rimer ni9e# 0unto a #a ta!#a de #as categor2as" 1 una 9ez ms en #as
Categor2as 1 #a ta!#a Pro9eedores& +Se de!e am$#iar cua#%uiera de #as ta!#as $ara 9er"
como en #a <igura -3&J&, Considerando %ue #a ta!#a Productos en e# $rimer ni9e#
re$resenta toda #a ta!#a" #os anidados re$resentan #os $roductos 9incu#ados a sus
categor2as 1 sus $ro9eedores" res$ecti9amente& Usted 9er ms ade#ante en e# ca$2tu#o
de cmo uti#izar #a DataTa!#es m4#ti$#es $roductos&
Luis Edgar Snchez
19'
;igura &'.+
E# con0unto de datos ;orthEind
creado $or e# /sistente $ara
con<iguracin de or2genes de
datos
E# con0unto de datos con ti$o es en rea#idad una c#ase" %ue se genera so!re #a marcha&
Ya no es un con0unto de datos gen'ricos %ue se re##enar en tiem$o de e0ecucin con #a
mesa %ue desea a tra9's de un Data/da$ter" es un o!0eto es$ec2<ico %ue se $uede
re##enar s#o con #as ta!#as %ue se es$eci<ica en su dise@o& Si desea 9er e# cdigo de #a
c#ase generada $or e# asistente" haga c#ic en e# !otn Mostrar todos #os archi9os en e#
E?$#orador de so#uciones 1 haga do!#e c#ic en e# e#emento
;orthEindDataSet&Designer&9! en e# marco de# con0unto de datos ;orthEind& Usted no
de!e modi<icar e# cdigo" $or%ue si usted decide modi<icar e# con0unto de datos +se 9er
cmo se $uede editar con herramientas 9isua#es," e# asistente crear una nue9a c#ase 1
sus cam!ios se $erdern& Si desea a@adir a#gunos miem!ros $ersona#izados a #a c#ase
;e$tuno" crear una nue9a c#ase $arcia# con #os miem!ros de #a costum!re 1 e# nom!re
;orthEindDataSet&9!&
-3plorando el 6ataAet con tipo
Camos a e0ercer #os miem!ros de #a DataSet un $oco 1 9er en %u' se di<erencia de #os
e%ui9a#entes sin ti$o DataSet& Las o$eraciones 9amos a rea#izar son simi#ares a #os %ue se
rea#iz en e# ca$2tu#o anterior con un con0unto de datos sin ti$o" as2 %ue de!er2a centrarse
en #a sinta?is di<erente& E# cdigo %ue se muestra en esta seccin $ertenece a# $ro1ecto de
e0em$#o DataSet:$erations& Este $ro1ecto consta de tres <ormas" 1 usted tendr %ue
cam!iar e# o!0eto de# $ro1ecto de inicio $ara 9er cada uno de e##os&
La <igura -3&L muestra Form) de# $ro1ecto" #o %ue demuestra #as o$eraciones !sicas en
t
h
19(
Luis Edgar Snchez
un DataSet( cmo re##enar" editar a#gunos de sus cuadros" 1 $resentar #os cam!ios a #a !ase
de datos& Son !sicamente #as mismas o$eraciones %ue desee rea#izar con un con0unto de
datos sin ti$o" $ero 9ers %ue es mucho ms senci##o tra!a0ar con con0untos de datos con
ti$o&
;igura &'.,
Form) de #a
$ro1ecto DataSet:$erations
muestra #as o$eraciones !sicas
en un DataSet&
Para ##enar #as tres ta!#as de datos de# con0unto de datos" necesitamos tres o!0etos
Data/da$ter& En #ugar de #a gen'rica Data/da$ter" #a c#ase generada $or e# asistente ha
creado una c#ase Ta!#e/da$ter $ara cada DataTa!#e( #as c#ases CategoriesTa!#e/da$ter"
Su$$#iersTa!#e/da$ter 1 ProductsTa!#e/da$ter& Dec#are tres o!0etos de# ti$o
corres$ondiente a ni9e# de# <ormu#ario(
Dim CategoriesT/ /s ;eE ;orthEindDataSetTa!#e/da$ters&CategoriesTa!#e/da$ter
Dim Su$$#iersT/ /s ;eE ;orthEindDataSetTa!#e/da$ters&Su$$#iersTa!#e/da$ter
Dim ProductsT/ /s ;eE ;ort
EindDataSetTa!#e/da$ters&ProductsTa!#e/da$ter
Las c#ases de crear #os tres o!0etos %ue recu$erar #os datos de
#a !ase de datos 1
$resentar #as <i#as editado de nue9o a #a !ase de datos de #as instrucciones SELECT %ue
es$eci<ica con o$eraciones de $unto 1 hacer c#ic& Estos o!0etos se deri9an de #a c#ase
Ta!#e/da$ter" %ue a su 9ez se !asa en #a c#ase Data/da$ter& Si e?amina e# cdigo de #a
c#ase ;e$tuno" se encuentra e# cdigo %ue crea #as instrucciones SOL $ara consu#tar 1
actua#izar #as tres ta!#as 1 cmo estos estados se uti#izan $ara crear un o!0eto
Data/da$ter& E# cdigo es simi#ar a# cdigo %ue usamos en e# ca$2tu#o anterior $ara
crear Data/da$ters desde dentro de nuestro cdigo&
Tam!i'n de!e crear un o!0eto DataSet $ara a#macenar #os datos& Esta 9ez" sin em!argo"
$odemos uti#izar un determinado ti$o %ue se descri!e #a estructura de #os datos %ue 9a a
Luis Edgar Snchez
19+
guardar en e# c#iente" 1 no un con0unto de datos gen'ricos&
nserte #a siguiente dec#aracin a ni9e# de# <ormu#ario(
Dim DS /s ;eE ;orthEindDataSet
/hora co#o%ue e# !otn *e##enar ta!#as en e# <ormu#ario e insertar e# cdigo %ue a$arece en
e# #istado -3&) en su contro#ador de e9entos C#icH&
Listado &'.1:
L#enar un DataSet con ti$o con e# Ta!#e/da$ters adecuado
Private Sub bttnPopulate Click(...) Handles bttnPopulate.Click
Dim categories As Integer = CategoriesTA.Fill(DS.Categories)
Dim suppliers As Integer = SuppliersTA.Fill(DS.Suppliers)
Dim products As Integer = ProductsTA.Fill(DS.Products)
Como $uede 9er" e# m'todo Fi## no ace$ta ninguna DataTa!#e como un argumento" sino
%ue e# ti$o de su argumento est determinada $or e# o!0eto Ta!#e/da$ter a# %ue se
a$#ica& E# m'todo Fi## de# Ta!#e/da$ter ProductsT/ ace$ta como argumento un o!0eto
de# ti$o ProductsData Mesa& E# contro#ador de e9entos de# $ro1ecto muestra inc#u1e
a#gunas dec#araciones ms %ue im$rimen e# n4mero de <i#as en cada una de #as tres
ta!#as&
Para $asar $or #as <i#as de #a ta!#a Productos" escri!ir un !uc#e senci##o como #o
siguiente(
Dim prod As NorthwindDataSet.ProductsRow
For Each prod In DS.Products.Rows
TextBox1.AppendText(prod.ProductName & vbTab & _
prod.UnitPrice.ToString("#,###.00") & vbCrLf)
Next
Como $uede 9er" #os nom!res de #os cam$os son $ro$iedades de #a c#ase Products*oE&
/#gunos $roductos $ueden no tienen $recio +un 9a#or nu#o en #a !ase de datos,& Si se
intenta acceder a #a $ro$iedad PrecioUnidad de #a c#ase Products*oE" una e?ce$cin
;u##*e<erenceE?ce$tion ser #anzado& Para e9itar#o" $uede asegurarse de %ue e# cam$o
no es nu#o desde e# cdigo" con una estructura i< como #a siguiente(
If prod.IsUnitPriceNull Then
TextBox1.AppendText("Not for sale!")
Else
TextBox1.AppendText(prod.UnitPrice.ToString("#,###.00"))
End If
Para #eer #os datos de #as ta!#as 9incu#adas de una manera 0err%uica" no es necesario
es$eci<icar #a re#acin entre #as ta!#as como #o hizo con con0untos de datos sin ti$o"
$or%ue e# ti$o DataTa!#es e?$oner #os m'todos a$ro$iados&
/hora co#o%ue otro !otn en e# <ormu#ario" e# !otn Leer $roductos $or $ro9eedor" 1 en
su insercin Raga c#ic en e# contro#ador de cdigo %ue se muestra en e# #istado -3&-
19,
Luis Edgar Snchez
$ara iterar a tra9's de $ro9eedores 1 $roductos re#acionados& :!ser9e %ue #a c#ase
Su$$#iers*oE e?$one e# m'todo =etProducts*oEs" %ue recu$era #as <i#as de #os
$roductos %ue se asocian con e# $ro9eedor actua#& E# m'todo =etProducts*oEs es
e%ui9a#ente a #a =etChi#d*oEs de un con0unto de datos sin ti$o" s#o con este 4#timo
tiene %ue $ro$orcionar un nom!re de re#acin como un argumento& Por otra $arte" e#
m'todo de9ue#9e =etProducts*oEs una matriz de o!0etos Products*oE no o!0etos
gen'ricos Data*oE&
Listado -3&-( terando DataTa!#es re#acionadas
TextBox1.Clear()
Dim supp As NorthwindDataSet.SuppliersRow
For Each supp In DS.Suppliers.Rows
TextBox1.AppendText(supp.CompanyName & vbCrLf)
Dim prod As NorthwindDataSet.ProductsRow
For Each prod In supp.GetProductsRows
TextBox1.AppendText(vbTab & prod.ProductName & vbTab & _
prod.UnitPrice.ToString("#,###.00") & vbCrLf)
Next
Next
E# o!0eto Products*oE e?$one #os m'todos Su$$#iers*oE 1 Categories*oE" %ue
de9ue#9en <i#as e# $roducto actua# de #os $adres en #os $ro9eedores 1 ta!#as de datos #as
categor2as&
E# m'todo ms 4ti# de #a DataTa!#e con ti$o es e# m'todo Find>1D" %ue #oca#iza una
<i#a $or su identi<icacin en e# DataTa!#e& Para #oca#izar un $roducto mediante su
identi<icacin" ##ame a# m'todo Find>1ProductD $asar un identi<icador de $roducto
como argumento& E# m'todo de9ue#9e un o!0eto Products*oE %ue re$resenta e#
$roducto se $ongan en 9enta& E# m'todo de 9a#or de retorno no es una co$ia de #a <i#a"
$ero s2 una re<erencia a #a <i#a actua# en e# o!0eto DataTa!#e" 1 se $uede editar& E#
cdigo detrs de# !otn de actua#izacin de $roductos" %ue se muestra en e# #istado
-3&3" se#ecciona un $roducto a# azar $or su D 1 so#icita a# usuario un nue9o $recio&
Luego se esta!#ece e# cam$o PrecioUnidad a# 9a#or suministrado $or e# usuario&
Listado de -3&3( /ctua#izacin de una <i#a de una DataTa!#e con ti$o
Dim selProduct As NorthwindDataSet.ProductsRow
Dim RND As New System.Random
selProduct = DS.Products.FindByProductID(RND.Next(1, 77))
Dim newPrice As Decimal
newPrice = Convert.ToDecimal(InputBox( _
"Enter product's new price", selProduct.ProductName,
selProduct.UnitPrice.ToString))
selProduct.UnitPrice = newPrice
Como $uede 9er" mani$u#ar #as <i#as de ta!#as de datos con ti$o es mucho ms sim$#e %ue
#as o$eraciones con con0untos de datos sin ti$o e%ui9a#ente" $or%ue #os cam$os se e?$onen
como $ro$iedades de #a c#ase a$ro$iada +#a c#ase Products*oE $ara #as <i#as de #a
197 Luis Edgar Snchez
DataTa!#e $roductos" #a c#ase Categories*oE $ara #as <i#as de #as categor2as de DataTa!#e"
1 as2 sucesi9amente,&
Ceamos e# cdigo $ara actua#izar #a !ase de datos& E# $rimer $aso es recu$erar #as <i#as
editado con e# m'todo =etChanges" %ue de9ue#9e un o!0eto de ti$o DataTa!#e"
de$endiendo de #a DataTa!#e a# %ue se a$#ic& Para recu$erar #as <i#as modi<icadas de #os
$roductos o!0eto DataTa!#e" uti#ice #as instrucciones siguientes(
Dim DT /s
;orthEindDataSet&ProductsDataTa!#e
DT \ DS&Products&=etChanges
Puede $asar un argumento de# ti$o Data*oEState a# m'todo =etChanges $ara recu$erar e#
insertado" modi<icado o e#iminado <i#as& De!ido a %ue este es un DataSet con ti$o" $uede
escri!ir un !uc#e For Each $ara recorrer sus <i#as +%ue son todos de# ti$o Products*oE, 1
descu!rir #os cam!ios& Una de #as caracter2sticas %ue usted es$erar2a encontrar en un
DataTa!#e con ti$o es un m'todo $ara recu$erar #as 9ersiones origina#es de una <i#a $or su
nom!re& Por desgracia" #a c#ase generada $or e# asistente no inc#u1e este m'todo" de!e
uti#izar #a $ro$iedad tem" $asando como argumento e# nom!re de #a <i#a& 9ersiones
origina#es Una <i#a de cam$o estn dados $or #a e?$resin(
$rod&tem+5UnitPrice5" Data*oECersion&:rigina#,
To su!mit the edited roEs to the data!ase" 1ou can ca## the a$$ro$riate Ta!#e/da$terds
U$date method& The code !ehind the Su!mit Edits !utton does e?act#1 that" and itds shoEn
in Listing -3&.&
Listing -3&.( Su!mitting the Edited *oEs o< a T1$ed DataTa!#e to the Data!ase
Private Sub bttnSubmit Click(...) Handles bttnSubmit.Click
If DS.HasChanges Then
Dim DT As NorthwindDataSet.ProductsDataTable
DT = DS.Products.GetChanges
If DT IsNot Nothing Then
Try
ProductsTA.Update(DT)
Catch ex As Exception
MsgBox(ex.Message)
Exit Sub
End Try
MsgBox(DT.Rows.Count.ToString & _
" rows updated successfully.")
End If
End If
Con0untos de datos con ti$o es mu1 con9eniente cuando se trata de #a codi<icacin& La
9enta0a rea# de #os con0untos de datos con ti$o es %ue se $uede sim$#i<icar enormemente #a
generacin de <ormu#arios en#azados a datos" %ue es e# tema $rinci$a# de este ca$2tu#o&
Luis Edgar Snchez
198
-nlace de datos
E# en#ace de datos es e# $roceso de 9incu#ar e# contenido de un cam$o a un contro# en e#
<ormu#ario& Cada 9ez %ue #a a$#icacin modi<ica e# 9a#or de# cam$o" e# contro# se actua#iza
automticamente& De# mismo modo" cada 9ez %ue e# usuario modi<ica e# 9a#or de# contro#
en e# <ormu#ario" e# cam$o !ase en e# con0unto de datos tam!i'n se actua#iza& E# con0unto
de datos rea#iza un seguimiento de #os cam!ios +e# de modi<icar" a@adir 1 e#iminar <i#as,"
inde$endientemente de #a <orma en %ue se cam!iaron& En resumen" a#i9ia e# en#ace de
datos de tener %ue #os 9a#ores de cam$o de# ma$a con #os contro#es en e# <ormu#ario
cuando se se#ecciona una <i#a 1 mo9iendo #os 9a#ores de #os contro#es de nue9o a# con0unto
de datos cuando una <i#a se haeditado&
/dems de en#azar contro#es senci##os" ta#es como contro#es Te?t>o? a un so#o cam$o"
$uede o!#igar a toda una co#umna de DataTa!#e a un contro# de #ista" como e# List>o? o e#
contro# Com!o>o?& Y" $or su$uesto" $uede en#azar un DataTa!#e com$#eta a un contro#
es$ecia#" e# contro# Data=ridCieE& Usted $uede construir una !ase de datos de na9egacin
1 #a a$#icacin de edicin de datos mediante #a unin de #a DataTa!#e $roductos a un
contro# Data=ridCieE sin una so#a #2nea de cdigo&
Para e?$#orar #os conce$tos !sicos de en#ace de datos" agregue un segundo <ormu#ario a#
$ro1ecto 1 #o con9ierten en e# $ro1ecto o!0eto de inicio& La nue9a <orma de #a Form-
DataSet:$erations" se muestra en #a Figura -3&M&
;igura &'.7
Ciendo todo un
DataTa!#e en un contro#
Data=ridCieE en#azado a datos
/ continuacin" co#ocar un contro# Data=ridCieE en e# <ormu#ario 1 esta!#ezca #a
$ro$iedad DataSource de# contro# de o!#igar a #a DataTa!#e Productos& Se#eccione e#
contro# Data=ridCieE en e# <ormu#ario donde $odr u!icar e#
DataSource $ro$iedad en #a 9entana Pro$iedades& E?$anda #a $ro$iedad DataSource 1
$odrs 9er #as <uentes de datos de# $ro1ecto& E# <ormu#ario contiene ninguna <uente de
datos $or e# momento" $or #o %ue todas #as <uentes de datos son inc#uidos en otros or2genes
de datos& E?$andir este e#emento de# r!o# $ara 9er e# $ro1ecto de $artida de datos
199
Luis Edgar Snchez
Fuentes" %ue a su 9ez contiene #a <uente de datos ;orthEindDataSet +o #o %ue han ##amado
e# DataSet,& E?$andir este art2cu#o 1 usted 9er #os nom!res de #as ta!#as de datos en e#
con0unto de datos" como se muestra en #a Figura -3&I& Se#eccione #os $roductos %ue
DataTa!#e&
;igura &'.7
Ciendo todo un
DataTa!#e en un contro#
Data=ridCieE en#azado a datos
E# editor re##enar e# contro# Data=ridCieE con co#umnas de #a ta!#a( 9a a asignar cada
co#umna en e# DataTa!#e $roductos a una co#umna en e# contro# Data=ridCieE& Todas #as
co#umnas tienen #a misma anchura 1 se muestran como cuadros de te?to" a e?ce$cin de #a
co#umna descata#ogados" %ue se asigna a un contro# ChecH>o?& +Esta es #a 4#tima co#umna
de #os contro#es" 1 usted #o 9er en tiem$o de e0ecucin" $or%ue no se $uede des$#azar e#
contro# en tiem$o de dise@o&, E# contro# de #as co#umnas <ueron nom!rados des$u's de #as
co#umnas de #a DataTa!#e" $ero 9amos a cam!iar e# as$ecto de #a red en !re9e& Presione
FJ $ara e0ecutar #a a$#icacin" 1 #a <orma se 9an a $#antear $o!#adas con #as <i#as de #os
$roductosf :!9iamente" e# editor ha generado a#g4n cdigo $ara nosotros $ara re##enar e#
contro#& E# cdigo generado $or e# editor es una dec#aracin 4nica en e# contro#ador de
e9entos Load de# <ormu#ario(
Me&ProductsTa!#e/da$ter&Fi##+Me&;orthEindDataSet&Products,
En cuanto a na9egar $or #os datos" estamos #istos& Todo #o %ue tenemos %ue hacer es
a0ustar e# as$ecto de# contro# Data=ridCieE con o$eraciones de $unto 1 hacer c#ic&
Tam!i'n $uede editar #as <i#as" $ero no ha1 ning4n cdigo $ara en9iar #as
modi<icaciones a #a !ase de datos& Presentacin de #os cam!ios a #a !ase de datos no
de!er2a ser un $ro!#ema $ara usted" sim$#emente co$ia e# cdigo corres$ondiente
dec#aracin de Form) de# $ro1ecto& Co#o%ue e# !otn En9iar ediciones en e# <ormu#ario"
1 en su insercin contro#ador Raga c#ic en #as siguientes dec#araciones(
If NorthwindDataSet.HasChanges Then
&!!
Luis Edgar Snchez
Dim DT As NorthwindDataSet.ProductsDataTable
DT = NorthwindDataSet.Products.GetChanges
If DT IsNot Nothing Then
Try
ProductsTableAdapter.Update(DT)
Catch ex As Exception
MsgBox(ex.Message)
Exit Sub
End Try
MsgBox(DT.Rows.Count.ToString & _
" rows updated successfully.")
End If
End If
/so de la clase )indingAource
Para com$render #a <unciona#idad de #a c#ase >indingSource" !uscar sus miem!ros&
Escri!a su nom!re 1 e# $er2odo siguiente en #a 9entana de cdigo 1 $odrs 9er una #ista
de #os miem!ros& La $ro$iedad Posicin #ee +o 0uegos, e# 2ndice de# e#emento actua# en
#a DataTa!#e su!1acente& E# contro# Data=ridCieE no mantiene e# orden de #as <i#as de
#a ta!#a su!1acente" adems" $uede ordenar #as <i#as de# contro# Data=ridCieE en modo
a#guno %ue te gusta" $ero #as <i#as de #a DataTa!#e no ser ordenados& Uti#ice #a
$ro$iedad Posicin $ara a9eriguar e# 2ndice de #a <i#a se#eccionada en e# DataTa!#e& E#
Mo9eFirst" Mo9ePre9ious" Mo9e;e?t" Mo9eLast 1 m'todos son sim$#es herramientas
de na9egacin %ue $ro$orciona #a c#ase >indingSource& Puede co#ocar cuatro !otones
en e# <ormu#ario e insertar una ##amada a estos m'todos $ara $asar a #as $rimeras <i#as"
anterior" siguiente" 1 4#timo" res$ecti9amente& Los cuatro !otones de na9egacin en #a
es%uina in<erior iz%uierda de# <ormu#ario se muestra en #a Figura -3&M ##amar a estos
m'todos $ara se#eccionar otra <i#a de #a $arri##a&
Los dos miem!ros ms interesantes de #a c#ase >indingSource son e# m'todo Find 1 #a
$ro$iedad Fi#ter& La $ro$iedad Fi#ter se esta!#ece en una e?$resin simi#ar a #a c#usu#a
NRE*E de una instruccin SOL $ara <i#trar #os datos en #a red& Co#o%ue un nue9o
!otn en e# <ormu#ario" esta!#ezca su t2tu#o a <i#tro 1 su nom!re a !ttnFi#ter" e inserte #as
siguientes dec#araciones en su Raga c#ic inc#uso contro#ador $ara <i#trar #as <i#as de #a
$arri##a con su nom!re de $roducto(
Private Sub bttnFilter Click(...) Handles bttnFilter.Click
Dim filter As String
filter = InputBox("Enter product name, or part of it")
ProductsBindingSource.Filter = "ProductName LIKE '%" & _
filter.Trim & "%'"
End Sub
E0ecutar #a a$#icacin" 1 haga c#ic en e# !otn Fi#tro $ara #imitar #as <i#as %ue a$arecen
en #a red $or su nom!re de# $roducto& Si usted est !uscando $ara #os $roductos %ue
contienen #a sa#sa de cadena en su nom!re" #a $ro$iedad Fi#ter #2mites de #a se#eccin
como si se hu!iera so#icitado #os $roductos con e# siguiente c#usu#a NRE*E +e# signo
de $orcenta0e es un comod2n de SOL %ue coincide con cua#%uier cadena,(
NRE*E Product;ame LSE d]sauce]d
Para restaurar #a se#eccin origina#" esta!#ecer #a e?$resin de <i#tro a una cadena en
&!1
Luis Edgar Snchez
!#anco& Usted $uede dise@ar un <ormu#ario de au?i#iar en #a %ue #os usuarios $ueden
introducir m4#ti$#es criterios de <i#tro 1 $roductos $or su $recio o de# materia#" su
$ro9eedor" 1 as2 sucesi9amente& Con un $oco de es<uerzo de $rogramacin" se $ueden
a$#icar 9arios criterios" ta#es como $roductos de una categor2a es$ec2<ica %ue se
encuentran en orden" <uera de e?istencias de $roductos de un $ro9eedor es$ec2<ico" 1
as2 sucesi9amente&
E# m'todo Find !usca un 9a#or en una co#umna es$ec2<ica& Tanto e# nom!re de #a
co#umna 1 e# argumento de !4s%ueda se es$eci<ican como argumentos a# m'todo" 1 e#
9a#or de retorno es #a $osicin de #a <i#a de #a DataTa!#e& Para se#eccionar #a <i#a"
esta!#ezca #a $ro$iedad de# o!0eto >indingSource de $osicin $ara e# 9a#or de9ue#to $or
e# m'todo Find& E# cdigo detrs de# !otn >uscar en e# $ro1ecto de #a muestra es #a
siguiente(
CT1$e+Products>indingSource&Current" Data*oECieE,&*oE
Esta e?$resin de9ue#9e un o!0eto Data*oE" %ue $uede con9ertir a un ti$o
Products*oE&
Manejo de columnas de identidad
Si intenta agregar una <i#a a# contro# Data=ridCieE" identi<icador de #a nue9a <i#a ser -
) +u otro 9a#or negati9o si se han a@adido 9arias <i#as,& Este es un 9a#or 9#ido $ara una
co#umna de identidad" siem$re 1 cuando su $ro$iedad /utoncrement se esta!#ece en -
)& Pero #a co#umna ProductD de #a !ase de datos tiene un 9a#or /utoncrement de ) -
$or %u' es di<erente en e# con0unto de datosY Cuando e# editor cre e# con0unto de
datos" cam!i este a0uste $ara e9itar con<#ictos durante #as actua#izaciones& Si #os
nue9os $roductos se #es asign identi<icaciones 9#idas +9a#ores $ositi9os des$u's de #a
identi<icacin $or 4#tima 9ez en e# con0unto de datos, en e# c#iente" tenga en cuenta #o
%ue $uede ocurrir cuando #as modi<icaciones se $resentaron a #a !ase de datos& Los
identi<icadores $ro$orcionados $or e# con0unto de datos $uede ser tomada en #a !ase de
datos" 1 #a o$eracin de insercin no #o har2a& Para e9itar este con<#icto" e# con0unto de
datos uti#iza #os 9a#ores negati9os de identidad& Cuando estas <i#as se en92a a #a !ase de
datos" se #es asigna un nue9o identi<icador de #a !ase de datos" %ue es un 9a#or $ositi9o&
Sin em!argo" sigue siendo un $ro!#ema& E# D de nue9o no se trans<iere a# c#iente" 1 e#
con0unto de datos muestra #a identi<icacin negati9a& Una so#ucin consiste en re##enar
e# DataSet de nue9o" sin em!argo" ha1 mucho ms %ue a$render so!re e# en92o de
registros modi<icados con #a !ase de datos" 1 9amos a 9o#9er so!re este tema en #a
seccin de en#ace de #os cuadros 0err%uicosUU"UUms ade#ante en este ca$2tu#o&
Usted $uede e?$erimentar con este ti$o de $ro1ecto DataSet:$erations mediante #a
edicin de #os $roductos" a@adiendo otras nue9as" 1 e#iminar <i#as& Si intenta agregar
una nue9a <i#a" reci!ir un mensa0e de error %ue indica %ue #a co#umna Discontinued no
ace$ta 9a#ores nu#os& E# 9a#or $redeterminado de #a casi##a de 9eri<icacin en e# contro#
Data=rid no es ni 9erdadero ni <a#so +es nu#o," 1 de!emos 9a#idar su 9a#or& La so#ucin
&!&
Luis Edgar Snchez
ms senci##a a# $ro!#ema es a$#icar un 9a#or $redeterminado a #a co#umna
interrum$idas" 1 #a siguiente seccin se descri!e cmo modi<icar #as $ro$iedades de#
con0unto de datos&
Ajuste del conjunto de datos
Para a0ustar #as $ro$iedades de# con0unto de datos" haga c#ic en e# con0unto de datos en
#a 9entana :r2genes de datos 1 e#i0a Editar DataSet con e# Dise@ador en e# men4
conte?tua#& La 9entana de# Dise@ador de DataSet a$arecer" como se muestra en #a
Figura -3&P&
;igura &'.9
Edicin de# con0unto de datos
con
herramientas 9isua#es
Raga c#ic derecho en e# enca!ezado de #a co#umna Discontinued de #a ta!#a Productos 1
se#eccione Pro$iedades $ara 9er #as $ro$iedades de# o!0eto DataCo#umn& Uno de e##os
es #a $ro$iedad De<au#tCa#ue" %ue se <i0a $or de<ecto a nu##& Cam!iar a A o Fa#so $ara
im$oner un 9a#or $redeterminado $ara esta co#umna& En este dise@ador" se $uede
e?aminar #os ti$os de datos de #as co#umnas de cada cuadro" gota o crear nue9as
re#aciones entre #as ta!#as" 1 esta!#ecer otras $ro$iedades interesantes" ta#es como #a
$ro$iedad Ca$tion de una co#umna" %ue se uti#izar $ara e# nom!re de #a co#umna de #a
o!#igado contro# Data=ridCieE" o #a $ro$iedad ;u##Ca#ue" %ue determina cmo e#
con0unto de datos se encargar de 9a#ores nu#os& E# 9a#or $redeterminado de #a
$ro$iedad ;u##Ca#ue es #anzar una e?ce$cin& Cada 9ez %ue #a a$#icacin so#icita e#
9a#or de un cam$o nu#o" una e?ce$cin en tiem$o de e0ecucin se $roduce& Usted $uede
con<igurar#o $ara %ue ninguna $arte +en este caso una cadena 9ac2a se de9ue#9e, o nada
+en cu1o caso e# 9a#or no se de9ue#9e nada,& Tam!i'n $uede con<igurar #os 9a#ores
autoincrement de co#umnas de identidad a%u2& Si se#ecciona #a co#umna ProductD de #a
ta!#a Productos" 9er %ue e# asistente ha creado /utoncrementSeed de #a co#umna 1
/uto-ncrementSte$ a -)" $or #as razones e?$#icadas 1a&
Mientras est' en e# Dise@ador de DataSet" haga c#ic en un DataTa!#e 1 e#i0a Con<igurar&
Esto inicia e# /sistente $ara #a con<iguracin de Ta!#e/da$ter& E# $rimer cuadro de
di#ogo de# asistente" %ue se muestra en #a Figura -3&)A" muestra #a instruccin SOL
%ue e# /sistente $ara con<iguracin de or2genes de datos generados mientras esta!a
se#eccionando #as co#umnas %ue %uer2a inc#uir en e# con0unto de datos& Puede modi<icar
&!' Luis Edgar Snchez
esta dec#aracin mediante #a adicin de 9arias co#umnas" una c#usu#a NRE*E $ara
#imitar e# n4mero de <i#as $ara ser se#eccionados" 1 una c#usu#a :*DE* >Y& Para
modi<icar #a instruccin SELECT" de modi<icar #a derecha de# cuadro de di#ogo de #a
<igura -3&)A" o haga c#ic en e# !otn =enerador de consu#tas $ara 9er e# cuadro de
di#ogo =enerador de consu#tas %ue $ermite es$eci<icar consu#tas com$#icado con
herramientas 9isua#es&
;igura &'.1!
Edicin de #a instruccin
SELECT
dec#aracin %ue re##ena e#
Productos DataTa!#e con e#
/sistente $ara #a con<iguracin
de Ta!#e/da$ter
Si hace c#ic en e# !otn :$ciones a9anzadas" $odr 9er e# cuadro de di#ogo :$ciones
a9anzadas" %ue se muestra en #a Figura -3&))& /%u2 ha1 %ue es$eci<icar %ue #as
dec#araciones de!en ser generados $or e# asistente& Si est desarro##ando una a$#icacin de
e?$#orador" desacti9e #a casi##a de 9eri<icacin $rimera( =enerar instrucciones nsert"
U$date 1 De#ete& Si desacti9a esta o$cin" #as otras dos o$ciones se desacti9ar&
E# uso de concurrencia o$timista o$cin a<ecta a #as sentencias UPD/TE 1 DELETE
generadas $or e# asistente& Si esta casi##a est se#eccionada" #as dos dec#araciones no
actua#izar o e#iminar una <i#a si ha sido editado $or otro usuario desde %ue se #e1& E#
asistente generar dos #argas dec#araciones %ue tengan en cuenta #os 9a#ores o!tenidos de
#a !ase de datos en e# con0unto de datos en e# c#iente +#os 9a#ores origina#es de #a <i#a," 1 si
cua#%uiera de #as co#umnas de #a <i#a en #a !ase de datos son di<erentes de #a 9ersin
origina# de #a misma <i#a en e# con0unto de datos" no actua#izar o e#iminar #a <i#a& Mediante
e# uso de #a concurrencia o$timista" ests asumiendo %ue es $oco $ro!a!#e %ue dos
usuarios $odrn actua#izar #a misma <i#a" a# mismo tiem$o& Si #a <i#a se actua#iza 1a ha sido
modi<icado $or otro usuario" #a o$eracin de actua#izacin <a##a& Si desacti9a esta o$cin"
e# UPD/TE 8 DELETE tener en cuenta #a c#a9e $rinci$a# de #a <i#a 1 se e0ecutan" inc#uso si
#a <i#a se ha modi<icado desde %ue se #e1& En e<ecto" e# 4#timo usuario $ara actua#izar una
<i#a so!rescri!e #os cam!ios rea#izados $or otros usuarios&
Luis Edgar Snchez
&!(
;igura &'.11
Las o$ciones a9anzadas
cuadro de di#ogo #e $ermite
sa!er cmo e# Ta!#e/da$ter
$resentar #as actua#izaciones a
#as ta!#as su!1acentes
La 4#tima o$cin de# cuadro de di#ogo :$ciones a9anzadas es$eci<ica si e#
Ta!#e/da$ter #ee e# insertados o <i#as actua#izadas& Usted de!e de0ar esta casi##a de
9eri<icacin" de modo %ue #os 9a#ores de identidad asignado $or #a !ase de datos $ara
nue9as <i#as se 9ue#9e a #eer 1 actua#izar e# con0unto de datos&
La aplicacin de concurrencia optimista
Curiosidad $or #as dec#araciones %ue tengan en cuenta #os 9a#ores origina#es de #a <i#a
%ue se actua#izaY /%u2 est #a instruccin DELETE $ara #a <i#a de #os $roductos %ue
uti#iza #a concurrencia o$timista(
DELETE F*:M Zd!o[&ZProducts[
NRE*E ++ZProductD[ \ e: ri g i na # P roductD, /;D +ZProduct;ame[ \ e : r ig i n a # Product;ame, /;D
++ e s; u ## S u$$#ierD \ ) /;D ZSu$$#ierD[ S ;ULL,
:* +ZSu$$#ierD[ \ e:rig i na# Su$$#ierD,, /;D ++ es ; u # # C ategor1D \ )
/;D ZCategor1D[ S ;ULL, :* +ZCategor1D[ \ e : r i g i na # C ategor1D,, /;D
++ e s; u # # O uantit1PerUnit \ ) /;D ZOuantit1PerUnit[ S ;ULL,
:* +ZOuantit1PerUnit[ \ e :ri g ina# Ouantit1PerUnit,, /;D ++ e s; u # # U nitPrice \ )
/;D ZUnitPrice[ S ;ULL, :* +ZUnitPrice[ \ e : r igin a # UnitPrice,,
/;D ++ e s; u # # U nitsnStocH \ )
/;D ZUnitsnStocH[ S ;ULL, :* +ZUnitsnStocH[ \ e :r igin a # U nitsnStocH,,
/;D ++ es ; u # # U nits:n:rder \ ) /;D ZUnits:n:rder[ S ;ULL,
:* +ZUnits:n:rder[ \ e : ri g i n a # U nits:n:rder,, /;D ++ e s; u ## *eorderLe9e# \ )
/;D Z*eorderLe9e#[ S ;ULL, :* +Z*eorderLe9e#[ \ e :r ig ina # *eorderLe9e#,, /;D
+ZDiscontinued[ \ e : r i g in a # Discontinued,,
La misma dec#aracin con #a simu#taneidad o$timista <uera es !astante corto(
DELETE F*:M Zd!o[&ZProducts[
NRE*E +ZProductD[ \ e : ri g i na# P roductD,
E?amine #a #arga dec#aracin de entender cmo se mane0a #a simu#taneidad o$timista& E#
$rimer t'rmino en #a c#usu#a NRE*E #oca#iza una so#a <i#a so!re #a !ase de #a
&!+ Luis Edgar Snchez
identi<icacin de# $roducto" %ue es 4nico& Esta es #a <i#a %ue de!e ser e#iminado +o
actua#izacin de #a instruccin UPD/TE,& Sin em!argo" #a dec#aracin no se se#eccione #a
<i#a si cua#%uiera de sus cam$os han sido modi<icados desde %ue #o #ee de #a !ase de datos&
Si otro usuario ha cam!iado e# $recio de un $roducto es$ec2<ico" #a e?$resin siguiente se
e9a#uar como <a#sa 1 #a c#usu#a NRE*E de9o#9er ninguna <i#a %ue desea e#iminar&
/# 9o#9er a# asistente de con<iguracin" haga c#ic en Siguiente 1 9er e# cuadro de di#ogo
%ue se muestra en #a <igura -3&)-" donde $uede es$eci<icar #os m'todos %ue e# asistente
generar $ara usted& E# m'todo Fi## re##ena una DataTa!#e 1 e# m'todo =etData de9ue#9e
un o!0eto DataTa!#e con #os mismos datos" #a 4#tima o$cin en e# cuadro de di#ogo
es$eci<ica si e# con0unto de datos se e?$onen m'todos $ara insertar 8 actua#izar 8 e#iminar
<i#as directamente contra #a !ase de datos&
;igura &'.1&
Se#eccin de #os m'todos
%ue se generen $or e# /sistente
$ara #a con<iguracin de
Ta!#e/da$ter
Raga c#ic en Siguiente de nue9o" 1 e# asistente regenerar #a c#ase ;orthEindDataSet"
teniendo en cuenta #as o$ciones %ue ha es$eci<icado en #os $asos de# asistente&
En #a siguiente seccin" nosotros" 9amos a de0ar %ue e# editor constru1a a$#icaciones
senci##as !asadas en datos $ara nosotros& Usted" /ore 9a a 9er #a <orma de en#azar
contro#es a otros con0untos de datos con ti$o 1 cmo $ersona#izar e# contro#
Data=ridCieE&
Dise@o de inter<aces !asadas en datos de #a manera ms <ci#
En #ugar de en#azar e# contro# Data=ridCieE a tra9's de sus $ro$iedades" $uede de0ar %ue
Cisua# Studio rea#izar e# en#ace $ara usted(
)& /@adir una tercera <orma $ara e# $ro1ecto de e0em$#o DataSet:$erations" #a <orma
Form3" 1 #o con9ierten en e# $ro1ecto" e# /M :!0eto inicia#&
&!, Luis Edgar Snchez
-& Para mostrar #as <i#as de #a ta!#a Productos en un contro# Data=ridCieE" a!rir #a 9entana
:r2genes de datos 1 se#eccione #a ta!#a Productos& Tan $ronto como usted #o se#eccione"
a$arecer una <#echa 0unto a su nom!re& Raga c#ic en esta <#echa $ara a!rir una #ista
des$#ega!#e con #as o$ciones de en#ace $ara e# o!0eto DataTa!#e& E# DataTa!#e se $ueden
en#azar a #os siguientes(
Un contro# Data=ridCieE" %ue muestra todas #as <i#as 1 #as co#umnas de #a ta!#a
Un contro# List>o? o Com!o>o?" %ue muestra una so#a co#umna de todas #as <i#as&
Una serie de contro#es Te?t>o? +#a o$cin de Datos," una $ara cada co#umna
3& Se#eccione #a o$cin Data=ridCieE 1 #uego de0ar caer e# o!0eto DataTa!#e $roductos en
e# <ormu#ario& E# editor crear un contro# Data=ridCieE 1 se unen a #a DataTa!#e
Productos& /dems" se crear una !arra de herramientas en #a $arte su$erior de# <ormu#ario
con unos $ocos !otones de na9egacin 1 edicin" como se muestra en #a <igura -3&)3 +%ue
se muestra en tiem$o de dise@o $ara %ue $ueda 9er #os com$onentes generados $or e#
editor,& :!ser9e %ue #a !arra de herramientas contiene un !otn $ara !orrar <i#as +e# !otn
con e# icono 6, 1 un !otn de $resentacin de #as modi<icaciones a #a !ase de datos +e#
!otn con e# icono de# disco,&
E# <i#tro" >uscar 1 !otones /ctua#izar datos no <ueron generados $or e# editor" 1 he a@adido
a #a !arra de herramientas 1 se inserta e# cdigo a$ro$iado en sus contro#adores de e9entos
C#icH& Usted" 1a ha 9isto e# cdigo %ue im$#ementa #as tres o$eraciones&
E# dise@ador tam!i'n generar #os siguientes com$onentes" %ue se $u!#icar en e#
Com$onentes de #a !ande0a(
:ort*<ind6ataAet E# DataSet con ti$o de #os datos es$eci<icados en e# origen de datos
/sistente $ara #a con<iguracin&
roduct)indingAource Un o!0eto >indingSource de #a ta!#a Productos&
roductsTableAdapter un enri%uecido Data/da$ter %ue e?$one #os m'todos $ara #eer
#os datos de #a !ase de datos 1 $resentacin de #os cam!ios rea#izados en e# c#iente de
nue9o a #a !ase de datos& La c#ase Ta!#e/da$ter se di<erencia de #a c#ase Data/da$ter en
%ue su m'todo Fi## ace$ta como argumento un o!0eto de# ti$o de $roductos" 1 no gen'rica
con0unto de datos 1 o!0etos DataTa!#e& Los m'todos de# Ta!#e/da$ter o!0eto de sa!er
cmo mane0ar #as <i#as de# ti$o es$ec2<ico" 1 no cua#%uier o!0eto Data*oE&
TableAdapterManager Esto enca$su#a #a <unciona#idad de todos #os o!0etos
Ta!#e/da$ter en e# <ormu#ario& Si se #e cae ta!#as adiciona#es en #a <orma" e# editor crear
e# Ta!#e/da$ter corres$ondiente $ara cada uno& E# Ta!#e/da$terManager enca$su#a #a
<unciona#idad de todos #os o!0etos indi9idua#es de Ta!#e/da$ter 1 e?$one e# m'todo
U$date/##" %ue $resenta e# con0unto de datos com$#eto a #a !ase de datos& E# m'todo de #a
U$date/## Ta!#e/da$terManager ##ama a# m'todo U$date de Ta!#e/da$ter cada indi9iduo
en e# orden correcto&
Luis Edgar Snchez
&!7
;igura &'.1'
En#azar un <ormu#ario a un
DataTa!#e
roducts)inding:a%igator Este com$onente re$resenta #a !arra de herramientas agrega
a# <ormu#ario& La !arra de herramientas es un contro# Too#Stri$ con e#ementos
$ersona#izados 1 e# cdigo a$ro$iado& Las herramientas de na9egacin generados $or e#
editor son ms !ien $rimiti9o" 1 se $ueden %uitar desde e# contro#& Remos de tener e#
cdigo $ara e# !otn =uardar" %ue usted necesitar si su a$#icacin $ermite #a edicin de
#os datos&
En cuanto a# cdigo generado $or e# editor" a%u2 est(
Private Sub ProductsBindingNavigatorSaveItem Click(...) _
Handles ProductsBindingNavigatorSaveItem.Click
Me.Validate()
Me.ProductsBindingSource.EndEdit()
Me.TableAdapterManager.UpdateAll(Me.DSProducts)
End Sub
Private Sub Form2 Load(...) Handles MyBase.Load
Me.ProductsTableAdapter.Fill(Me.DSProducts.Products)
End Sub
En e# <ormu#ario" cargamos contro#ador de e9entos" #a DataTa!#e $roductos se ##ena con
una ##amada a #a c#ase Productos Ta!#e/da$ter" e# m'todo Fi##& E# contro#ador de otro
e9ento corres$onde a# e9ento C#icH de# !otn =uardar de #a !arra de herramientas" 1
##ama a #a c#ase Ta!#e/da$terManager" e# m'todo U$date/##& Esto es todo #o %ue se
necesita $ara en9iar #os cam!ios rea#izados en #os datos en e# c#iente&
Camos a 9er hasta %u' $unto esta so#icitud generada automticamente nos ##e9ar&
E0ecute #a a$#icacin 1 modi<icar a#gunos #os $roductos& Cam!io a#gunos nom!res"
a0ustar un $ar de #os $recios a 9a#ores negati9os" 0uego de un $roducto" #a categor2a de
&!8 Luis Edgar Snchez
o<icia#es administrati9os un identi<icador de categor2a no 9#ido +cua#%uier 9a#or
su$erior a M no es 9#ido" a menos %ue ha1a agregado nue9as categor2as,"
a@adir un $ar de nue9os $roductos +%ue se #e asignar identi<icadores negati9o" como
era de es$erar," 1 e#iminar a#gunos $roductos& Como se $uede adi9inar" X$uede"
e#iminar #as <i#as de #a ta!#a $roductos" $or%ue" todos #os %ue hace re<erencia #a ta!#a
Deta##es de $edidos" $ero este ta!#a no e?isten en e# con0unto de datos" $or #o %ue" est
$er<ectamente #ega# $ara e#iminar #os $roductos de #a conte?to de# con0unto de datos&
Cuando #as modi<icaciones se en92a a #a !ase de datos" #as su$resiones se rechaz" $or
su$uesto&
Camos a 9er cmo e# !otn =uardar de #a !arra de herramientas se encarga de #a
actua#izacin& Raga c#ic en e# !otn =uardar de #a !arra de herramientas 1 usted
reci!ir un mensa0e de error %ue indica %ue una <i#a ha 9io#ado una restriccin de
re<erencia o de 9eri<icacin" de$endiendo de# orden en e# %ue #as <i#as se $resentaron a
#a !ase de datos& E# m'todo U$date/## de# o!0eto ProductsTa!#e/da$ter dar des$u's
de# $rimer <racaso&
Como recordarn" #a c#ase Data/da$ter" en %ue se !asa #a c#ase Ta!#e/da$ter" e?$one
#a $ro$iedad ContinueU$date:nError& Por desgracia" #a c#ase Ta!#e/da$ter" no e?$one
esta #a $ro$iedad& Sin em!argo" $uede acceder a #a Data/da$ter su!1acente mediante #a
$ro$iedad /da$ter 1 esta!#ezca #a $ro$iedad ContinueU$date:nError en True& nserte
e# siguiente m'todo <rente a #a
dec#aracin %ue ##ama a# m'todo U$date/##(
Me&Ta!#e/da$terManager&ProductsTa!#e/da$ter&/da$ter&ContinueU$date:nError \ True
E0ecutar #a a$#icacin de nue9o" editar #os datos en #a red" 1 en9iar #os cam!ios a #a
!ase de datos& Esta 9ez" #a a$#icacin no se cho%ue con un mensa0e de error& En cam!io"
#as <i#as %ue no $udo actua#izar #a ta!#a su!1acente en #a !ase de datos se marcarn con
un icono de signo de e?c#amacin en #a ca!ecera de #a <i#a" como se muestra en #a
Figura -3&).& ;os #as arreg#amos $ara $resentar todas #as <i#as de #a !ase de datos"
inde$endientemente de si se ha actua#izado #a ta!#a Productos" a tra9's de# o!0eto
ProductsTa!#e/da$ter& E# m'todo U$date/## recu$erado #os mensa0es de error de9ue#to
$or e# D>MS 1 #os %ue a$arecen en e# contro#& Para 9er #a razn $or #a cua# cada <i#a no
$udo actua#izar #a ta!#a Productos" $ase e# $untero so!re e# icono de error 1 $odrs 9er
#a descri$cin de# error en un cuadro de in<ormacin so!re herramientas&
Luis Edgar Snchez &!9
;igura &'.1(
Ciendo #a actua#izacin
errores en #a
E# contro# Data=ridCieE
Tam!i'n $uede crear una #ista de #as <i#as %ue no $udo actua#izar su ta!#a su!1acente" 0unto
con e# mensa0e de error de9ue#to $or #a !ase de datos& E# cdigo $ara recorrer en iteracin
#as <i#as de una ta!#a 1 e# e?amen de #a $ro$iedad *oEError se $resent en e# ca$2tu#o
anterior& Usted $uede agregar un !otn e?tra en #a !arra de herramientas 1 uti#izar#o $ara
mostrar una <orma au?i#iar con #os errores de actua#izacin&
Por cierto" #os mensa0es de error %ue a$arecen en e# contro# Data=ridCieE son #os
de9ue#tos $or e# S=>D +SOL Ser9er en nuestro caso,& Si #o desea" $uede esta!#ecer #a
$ro$iedad de cada <i#a *oEError a una descri$cin di<erente 1 ms signi<icati9a&
-nlaDar Tablas jer@rLuicas
En esta seccin" usted crear una inter<az $ara mostrar #as categor2as 1 $roductos en dos
contro#es Data=ridCieE" como se muestra en #a Figura -3&)J& E# a#to ni9e# de contro#
Data=ridCieE se en#aza a #a DataTa!#e #as categor2as 1 muestra todas #as <i#as de #a
categor2a& Cuanto ms !a0o e# contro# Data=ridCieE muestra #os $roductos de #a categor2a
se#eccionada en e# contro# de arri!a& En e<ecto" 9amos a crear dos contro#es Data=ridCieE
unidos entre s2&
&1!
Luis Edgar Snchez
;igura &'.1+
Ciendo #os datos
re#acionados con e#
dos contro#es
Data=ridCieE con #a
a$#icacin
LinHedDataTa!#es
Siga estos $asos(
1. nicie un nue9o $ro1ecto +como e# $ro1ecto LinHedDataTa!#es," 1 crear un nue9o
DataSet %ue contiene #os $roductos" categor2as" 1 #as ta!#as de Pro9eedores& ;om!re de
#a DS&
&. En #a 9entana :r2genes de datos" se#eccionar cada ta!#a 1 esta!#ezca #a o$cin de
unirse a Data=ridCieE&
'. E#iminar #a ta!#a de categor2as en e# <ormu#ario& E# editor se co#o%ue una instancia
de# contro# Data=rid-CieE so!re #a <orma 1 se unir a #a mesa de #as categor2as&
Tam!i'n crear un o!0eto >inding;a9igator" %ue nosotros no" /:T rea#mente necesita"
as2 %ue usted $uede e#iminar& /# co#ocar 9arias ta!#as en un <ormu#ario" e# editor genera
una so#a !arra de herramientas& Los !otones de na9egacin se a$#ican a# $rimer contro#
Data=ridCieE" $ero en e# !otn =uardar sostiene #os cam!ios rea#izados en todas #as
ta!#as de datos&
(. >us%ue #a ta!#a Productos en #a ta!#a Categor2as en #a 9entana :r2genes de datos 1
co#%ue#o en e# <ormu#ario& Si se #e cae #a ta!#a Productos de# con0unto de datos origina#
en #a <orma" 9amos a terminar con dos re0i##as %ue son inde$endientes e# uno de# otro&
Para un ma1or sentido inter<az" %ue de!e en#azar #as dos redes" de modo %ue cuando e#
usuario se#ecciona una categor2a en #a $arte su$erior
#a red" #as ta!#as corres$ondientes se muestran automticamente en #a re0i##a in<erior&
Los Productos %ue <iguran en #a ta!#a Categor2as en e# origen de datos re$resenta #as
<i#as de #a ta!#a Productos %ue estn re#acionados con cada <i#a de #a ta!#a Categor2as&
&11
Luis Edgar Snchez
/hora $uede e0ecutar #a a$#icacin 1 9er cmo se com$orta& Cada 9ez %ue se#eccione
una categor2a" #a categor2a se#eccionada" #os $roductos o<icia#es administrati9os
a$arecen en #a re0i##a in<erior& Si cam!ia e# cam$o d& de categor2a de un $roducto" %ue
desa$arece de #a $arri##a" como se es$era!a& Usted de!e se#eccionar su nue9a categor2a
$ara 9er#o&
E?$erimente con #a nue9a inter<az& Em$ezar a editar #as dos ta!#as en e# <ormu#ario&
/@adir nue9as categor2as" a continuacin" agregue #os $roductos %ue $ertenecen a esta
categor2a& Si intenta e#iminar una categor2a" Data=ridCieE <e#iz e#iminar #a <i#a de su
ta!#a& Pero" X;o" 9a e# DataSet a tomar #as re#aciones de #a de<inicin de #a !ase de
datosY /hora %ue am!os cuadros se encuentran en e# c#iente como ta!#as de datos con
una re#acin entre e##os" no de!er2a e# con0unto de datos rechazar esta o$eracinY
Camos a echar un 9istazo a #as $ro$iedades de #a re#acin entre #as dos ta!#as& Raga c#ic
en #a DS Con0unto de datos en #a 9entana :r2genes de datos 1 en e# men4 conte?tua#"
se#eccione Editar DataSet con e# Dise@ador $ara 9er #a 9entana de# Dise@ador de
DataSet& Raga c#ic en #a #2nea %ue conecta #os $roductos 1 categor2as
ta!#as +esta #2nea re$resenta #a re#acin entre #as dos ta!#as, 1 se#eccione Editar re#acin
$ara a!rir e# cuadro de di#ogo *e#aciones" %ue se muestra en #a Figura -3&)L&
Figura -3&)L
Marco re#acin
$ro$iedades
E# FS Productos re#acin con #as categor2as se marca como 4nica re#acin& En #a !ase de
datos" se trata de una re#acin 1 una restriccin de c#a9e e?terna& La re#acin s#o se
re#aciona #as dos ta!#as si sus cam$os dCategor2a $artido& Lo ms im$ortante" #a
restriccin no #e $ermitir insertar un $roducto %ue a$unta a una categor2a ine?istente" o
e#iminar una categor2a %ue se ha re#acionado con #as <i#as de #a ta!#a Productos& Ceri<ica en
e# !otn de radio Tanto *e#acin Y restriccin de c#a9e e?terna" a continuacin" cierre e#
cuadro de di#ogo&
&1& Luis Edgar Snchez
Las *estricciones de c#a9es <orneas estn su0etas a tres reg#as( #a actua#izacin"
e#iminacin 1 /ce$tar 8 *echazar #as normas"
como se muestra en #a Figura -3&)L& Estas reg#as determinan #o %ue de!e suceder cuando
una <i#a de #os $adres es retirado de su mesa +E#iminar #a reg#a," cuando un identi<icador de
#os $adres se modi<ica +#areg#a de actua#izacin," 1 cuando #os
usuarios ace$tar o rechazar #os cam!ios en e# con0unto de datos +#a 4#tima reg#a,& Una
reg#a se $uede esta!#ecer en ;inguno +sin se toman medidas" #o %ue signi<ica %ue una
e?ce$cin en tiem$o de e0ecucin ser #anzado," Cascade +#as <i#as secundarias son
actua#izado o su$rimido," Set;u## +#as c#a9es e?ternas de #as <i#as corres$ondientes
<iguran en nu##," 1 setDe<au#t +Las c#a9es e?ternas de #as <i#as corres$ondientes <iguran a su
9a#or $or de<ecto,&
Por #o genera#" no cam!ian #as reg#as de una re#acin en e# con0unto de datos" a menos %ue
usted ha uti#izado en #as normas #a !ase de datos& De0ar#os en ;inguno 1 e0ecutar de nue9o
#a a$#icacin& Usted de!e a0ustar e# E#iminar normas 1 actua#izacin a Cascade" 1a %ue esto
$uede conducir a errores irrecu$era!#es& Si e#imina una categor2a" $or e0em$#o" %ue se
##e9ar con e##a #os $roductos re#acionados" 1 cada $roducto e#iminado tomar con '# #as
<i#as re#acionadas en #a ta!#a Deta##es de $edidos& Un sim$#e error $uede arruinar #a !ase de
datos&
Ra1 otras situaciones" %ue no son tan comunes" %ue #a norma en cascada $uede ser
uti#izado con seguridad&
Cuando se e#imina un #i!ro en #a !ase de datos $u!s" $or e0em$#o" desea %ue #as entradas
de# #i!ro en e# ta!#a tit#eauthors ser e#iminados& ;o ha1 <i#as en #a ta!#a /uthors ser
e#iminado" 1a %ue son $rimarios" 1 e?tran0eros no" c#a9es en #a re#acin entre e# tit#eauthors
1 mesas autores&
Co#9amos a nuestra inter<az de edicin de $roductos 1 categor2as& ntentar de nue9o $ara
e#iminar una categor2a& Esta 9ez" o!tendr un mensa0e de error #arga %ue termina con #a
siguiente sugerencia(
Para reem$#azar este cuadro de di#ogo $redeterminado $or <a9or contro#en e# e9ento
DataError&
Camos a hacer e?actamente eso $ara e9itar %ue muestra un mensa0e tota#mente de sentido
$ara nuestros usuarios& /!ra e# DataError contro#ador de e9entos $ara #os contro#es e
insertar #a siguiente instruccin(
Msg>o? +e&E?ce$tion&Message,
E0ecute de nue9o #a a$#icacin 1 e#iminar una categor2a& Esta 9ez" 9er e# siguiente
mensa0e de error" 1 e# $rograma no 9a a %uitar #a categor2a en e# Data=ridCieE" $or%ue no
$uede sacar#o de su con0unto de datos(
&1' Luis Edgar Snchez
;o se $uede e#iminar esta <i#a $or%ue #as restricciones se a$#ican en re#acin con #as
categor2as Productos FL" 1 e#iminar esta <i#a #2nea de <i#as secundarias&
Toda92a se $uede e#iminar $roductos 1 <i0ar sus $recios a 9a#ores negati9os& Estas dos
o$eraciones no son 9#idos en e# conte?to de #a !ase de datos" $ero mu1 9#ido en e#
con0unto de datos de# c#iente&
Fuente( PET*:US:S" E9ange#us V 3Mastering Cisua# >asic -AAI5
Taller *.%$
< *ea#ice un <ormu#ario %ue $ermita mostrar #os datos de una ta!#a +de cardina#idad )
en una re#acin, dentro de un contro# Data=ridCieE" $ersona#izando su
$resentacin 1 con contro#es %ue $ermitan( /@adir registros" e#iminar registros"
editar#os" actua#izar #os datos 1 gra!ar #os cam!ios en #a !ase de datos&
? *ea#ice una a$#icacin NindoEs uti#izando acceso a datos mediante m'todos
$ro$orcionados $or datasets ti$ados 1 contro#es en#azados donde se mane0e dos
ta!#as re#acionadas de ) a 9arios con #as siguientes caracteristicas(
a0 Un enca!ezado con contro#es $ara #os datos de #a ta!#a $rinci$a#&
10 Un Data=ridCieE %ue muestre #a ta!#a secundaria re#acionada&
c0 >otones %ue $ermitan rea#izar #as o$eraciones !sicas so!re am!as ta!#as"
actua#izando 1 o!teniendo datos desde 1 hacia #a !ase de datos&
d0 /segurarse de %ue se mantenga #a integridad de #os datos 1 #as re#aciones&

Vous aimerez peut-être aussi