Curso de Visual Basic Avanzado
Curso de Visual Basic Avanzado
SEPTIEMBRE 1999
INTRODUCCIN AL MANUAL..............................................................................................................7 1. FORMULARIOS Y EVENTOS.............................................................................................................8 INTRODUCCIN...........................................................................................................................................8 CONOCIMIENTOS TERICOS........................................................................................................................9 Formularios, controles y eventos..........................................................................................................9 Ciclo de vida de un formulario..............................................................................................................9 La ventana Debug................................................................................................................................10 EJEMPLO PROPUESTO................................................................................................................................11 EJEMPLO RESUELTO..................................................................................................................................12 Formulario 1........................................................................................................................................12 Formulario 2........................................................................................................................................13 2. IDENTIFICACIN DE OBJETOS (CONTROLES) EN UN FORMULARIO..............................14 INTRODUCCIN.........................................................................................................................................14 CONOCIMIENTOS TERICOS......................................................................................................................15 Cmo utili ar controles! eventos y "ro"iedades.................................................................................1# Controles comunes! Label, $e%t&o%, Command&utton, C'ec(&o%.....................................................1) *dentificar el ti"o de un control...........................................................................................................1+ Coleccin Controls de un formulario..................................................................................................1+ EJEMPLO PROPUESTO................................................................................................................................18 EJEMPLO RESUELTO..................................................................................................................................19 3. CLASES Y OBJETOS (I).....................................................................................................................20 INTRODUCCIN.........................................................................................................................................20 CONOCIMIENTOS TERICOS......................................................................................................................21 Los ob,etos en -isual &asic.................................................................................................................21 Conce"to de enca"sulacin ./ublic v.s. /rivate0................................................................................22 1tili acin de variables de ob,eto.......................................................................................................22 *nstruccin /ro"erty............................................................................................................................23 -ariables est2ticas...............................................................................................................................23 EJEMPLO PROPUESTO................................................................................................................................25 EJEMPLO RESUELTO..................................................................................................................................26 Formulario...........................................................................................................................................2) Clase Fic'a..........................................................................................................................................2) 4. CLASES Y OBJETOS (II)....................................................................................................................28 INTRODUCCIN.........................................................................................................................................28 CONOCIMIENTOS TERICOS......................................................................................................................29 Cmo crear colecciones de ob,etos! la clase Collection.....................................................................29 /ro"iedades y m3todos del ob,eto Collection.....................................................................................29 Cmo acceder a los elementos de una coleccin! claves e 4ndices.....................................................30 5gregar elementos a una coleccin.....................................................................................................31 6liminacin de elementos de una coleccin........................................................................................31 7ecu"eracin de elementos de una coleccin.....................................................................................32 Control 89croll&ar.............................................................................................................................33 :2s conce"tos de clases! eventos *nitiali e y $erminate....................................................................3; EJEMPLO PROPUESTO................................................................................................................................35 <b,etivo...............................................................................................................................................3# Desarrollo del e,em"lo........................................................................................................................3) EJEMPLO RESUELTO.................................................................................................................................38 Formulario...........................................................................................................................................3= Clase 5genda.......................................................................................................................................;1 5. TECNOLO !A ACTIVE"...................................................................................................................43 INTRODUCCIN.........................................................................................................................................43
Curso de Visual Basic Avanzado CONOCIMIENTOS TERICOS......................................................................................................................44 >u3 es un com"onente 5ctive?...........................................................................................................;; $i"os de com"onentes 5ctive?............................................................................................................;; Creacin din2mica de matrices...........................................................................................................;# /reservar el contenido de las matrices din2micas..............................................................................;# :atrices de controles..........................................................................................................................;) /ublicar un control 5ctive? en un "2gina @eb..................................................................................;) EJEMPLO PROPUESTO................................................................................................................................48 <b,etivo...............................................................................................................................................;= Desarrollo del e,em"lo........................................................................................................................;= EJEMPLO RESUELTO..................................................................................................................................50 #. ACCESO A BASES DE DATOS (DAO Y JET).................................................................................52 INTRODUCCIN.........................................................................................................................................52 CONOCIMIENTOS TERICOS......................................................................................................................53 D5< y Aet.............................................................................................................................................#3 6structura de una a"licacin de bases de datos en -isual basic con D5< y Aet...............................#3 6l modelo de ob,etos D5<..................................................................................................................#; /rogramacin con D5< y Aet.............................................................................................................#; EJEMPLO PROPUESTO................................................................................................................................58 <b,etivo...............................................................................................................................................#= Desarrollo del e,em"lo........................................................................................................................#9 EJEMPLO RESUELTO..................................................................................................................................61 :odDefiniciones..................................................................................................................................)1 Frm5genda..........................................................................................................................................)1 Cla5genda...........................................................................................................................................); ClaD5<BAet.........................................................................................................................................)# 7. ACCESO A BASES DE DATOS (DAO Y ODBCDIRECT).............................................................70 INTRODUCCIN.........................................................................................................................................70 CONOCIMIENTOS TERICOS......................................................................................................................71 <"ciones de utili acin de <D&C con D5<.......................................................................................+1 6structura de una a"licacin de bases de datos en -isual basic con D5< y <D&CDirect...............+1 /rogramacin con D5< y <D&CDirect.............................................................................................+1 EJEMPLO PROPUESTO................................................................................................................................73 <b,etivo...............................................................................................................................................+3 Desarrollo del e,em"lo........................................................................................................................+3 EJEMPLO RESUELTO..................................................................................................................................74 ClaD5<B<D&CDirect........................................................................................................................+; 8. ACCESO A BASES DE DATOS (RDO).............................................................................................78 INTRODUCCIN.........................................................................................................................................78 CONOCIMIENTOS TERICOS......................................................................................................................79 6l modelo de ob,etos 7D<..................................................................................................................+9 6structura de una a"licacin de bases de datos en -isual basic con 7D<........................................+9 /rogramacin con 7D<......................................................................................................................=0 EJEMPLO PROPUESTO................................................................................................................................82 <b,etivo...............................................................................................................................................=2 Desarrollo del e,em"lo........................................................................................................................=2 EJEMPLO RESUELTO..................................................................................................................................83 Cla7D<...............................................................................................................................................=3 $. EL RE ISTRO DE %INDO%S..........................................................................................................87 INTRODUCCIN.........................................................................................................................................87 CONOCIMIENTOS TERICOS......................................................................................................................88 >u3 es el registro de @indoCs............................................................................................................== Cmo acceder al registro de @indoCs................................................................................................== 6structura del registro de @indoCs....................................................................................................== Cmo utili ar el 5/* de @indoCs........................................................................................................=9 EJEMPLO PROPUESTO................................................................................................................................93
Curso de Visual Basic Avanzado <b,etivo...............................................................................................................................................93 Desarrollo del e,em"lo........................................................................................................................93 EJEMPLO RESUELTO..................................................................................................................................95 Frm/resentacion.................................................................................................................................9# Frm7egistro.........................................................................................................................................9+ :od7egistro........................................................................................................................................9+ A&'NDICE A( ES&ECIFICACIONES) LIMITACIONES Y FORMATOS DE ARC*IVOS DE VISUAL BASIC.......................................................................................................................................101 REQUISITOS DEL SISTEMA PARA APLICACIONES DE VISUAL BASIC.......................................................101 LIMITACIONES DE LOS PRO ECTOS........................................................................................................101 LIMITACIONES DE CONTROLES...............................................................................................................101 DEmero total de controles.................................................................................................................101 Limitaciones "ara determinados controles ......................................................................................102 LIMITACIONES DE CDI!O......................................................................................................................102 /rocedimientos, ti"os y variables......................................................................................................102 $abla de entradas de mdulo............................................................................................................102 LIMITACIONES DE LOS DATOS................................................................................................................103 Datos de formulario, mdulos est2ndar y mdulos de clase.............................................................103 /rocedimientos, ti"os y variables......................................................................................................103 $i"os definidos "or el usuario...........................................................................................................103 6s"acio de "ila..................................................................................................................................103 Limitaciones de los recursos del sistema..........................................................................................103 7ecursos de @indoCs........................................................................................................................103 "ORMATOS DE ARC#IVOS DE PRO ECTO................................................................................................104 6%tensiones de arc'ivos de "royecto.................................................................................................10; 5rc'ivos varios y de tiem"o de diseFo..............................................................................................10; 5rc'ivos de tiem"o de e,ecucin.......................................................................................................10# 6structuras de formularios................................................................................................................10# DEmero de versin.............................................................................................................................10# Descri"cin del formulario...............................................................................................................10) &loGues de control.............................................................................................................................10) <rden de los bloGues de control........................................................................................................10) &loGues de control incrustados.........................................................................................................10+ Controles de menE.............................................................................................................................10+ $eclas de m3todo abreviado..............................................................................................................10= Comentarios en la descri"cin del formulario..................................................................................10= /ro"iedades de la descri"cin de un formulario.............................................................................10= 9inta%is...............................................................................................................................................10= -alores binarios de "ro"iedades.......................................................................................................10= /ro"iedad *con..................................................................................................................................109 /ro"iedad $ab*nde%..........................................................................................................................109 1nidades de medida..........................................................................................................................109 -alores de colores.............................................................................................................................109 <b,etos de "ro"iedades.....................................................................................................................110 Cdigo de &asic.................................................................................................................................110 6rrores al cargar arc'ivos de formulario.........................................................................................110 :ensa,es de registro de error en la carga de un formulario............................................................110 Formato del arc'ivo de "royecto ..vb"0............................................................................................112 A&'NDICE B( CONVENCIONES DE CODIFICACIN..................................................................114 $POR QU% E&ISTEN LAS CONVENCIONES DE CODI"ICACIN'.................................................................114 CONVENCIONES DE CODI"ICACIN M(NIMAS..........................................................................................114 CONVENCIONES DE NOMBRES DE OBJETOS.............................................................................................114 PRE"IJOS SU!ERIDOS PARA CONTROLES.................................................................................................115 PRE"IJOS SU!ERIDOS PARA LOS OBJETOS DE ACCESO A DATOS )DAO*.................................................116 PRE"IJOS SU!ERIDOS PARA MEN+S........................................................................................................116 SELECCIN DE PRE"IJOS PARA OTROS CONTROLES................................................................................117 CONVENCIONES DE NOMBRES DE CONSTANTES VARIABLES...............................................................117 /refi,os de alcance de variables........................................................................................................11=
Curso de Visual Basic Avanzado Constantes.........................................................................................................................................11= -ariables............................................................................................................................................11= $i"os de datos de variables...............................................................................................................119 Dombres descri"tivos de variables y "rocedimientos.......................................................................119 $i"os definidos "or el usuario...........................................................................................................119 CONVENCIONES DE CODI"ICACIN ESTRUCTURADA..............................................................................119 Convenciones de comentarios al cdigo...........................................................................................119 Dar formato al cdigo.......................................................................................................................120 5gru"acin de constantes .................................................................................................................121 <"eradores H y I..............................................................................................................................121 Crear cadenas "ara :sg&o%, *n"ut&o% y consultas 9>L.................................................................121
Introduccin al manual
Visual Basic se a convertido en un im!ortante entorno de desarrollo "ue cu#re todos los as!ectos de la !rogramaci$n !ro%esional& desde las a!licaciones %inancieras a la construcci$n de com!onentes !ara 'nternet( )n la actualidad !uede considerarse como la erramienta !or e*celencia !ara la !rogramaci$n en entornos +indo,s& gracias a su !otencia& com!ara#le a la de lengua-es tradicionalmente considerados su!eriores como . o .//& !ero %undamentalmente !or su sencille0 y %acilidad de uso( )ste manual est dirigido a a"uellas !ersonas "ue& teniendo nociones #sicas de Visual Basic& deseen ad"uirir conocimientos s$lidos de los !rinci!ios y t1cnicas involucradas en el desarrollo de a!licaciones con este entorno de desarrollo( )n concreto& en este curso se darn las #ases !ara ad"uirir conocimientos en2 .lases y o#-etos 3ecnologa active 4 5cceso a #ases de datos 675O& J)3& O7B.87'9).3& 97O: )l registro de +indo,s
;i #ien en todos los ca!tulos se e*!ondrn los conocimientos te$ricos "ue los autores emos estimado su%icientes !ara desenvolverse con soltura en cada tema !ro!uesto& este manual no !retende ser un li#ro de re%erencia de Visual Basic 6!ara eso e*isten multitud de li#ros t1cnicos& o la !ro!ia ayuda de Visual Basic:( Los autores emos !re%erido limitar en la medida de lo !osi#le la carga te$rica del manual& !otenciando el as!ecto !rctico con la inclusi$n de e-em!los !ro!uestos y resueltos& totalmente %uncionales& "ue ayudarn al lector en la com!rensi$n de los contenidos del curso( 3odos los ca!tulos de este manual siguen la misma estructura2 <na introducci$n en la "ue se e*!ondrn los temas a tratar y el o#-etivo del ca!tulo( .onocimientos te$ricos del ca!tulo( <n e-em!lo en el "ue se !onen en !rctica los conocimientos reci1n ad"uiridos = !or su!uesto& una soluci$n al e-em!lo !ro!uesto(
Visual Basic !ro!orciona una gran cantidad de elementos "ue !ermiten aumentar la !otencia de nuestras a!licaciones considera#lemente( 5un"ue el estudio individual de dic os o#-etos se esca!a al !ro!$sito de este curso& en los e-em!los iremos !ro!oniendo el uso de di%erentes ti!os de o#-etos !ara ir aumentando nuestro vocabulario en Visual Basic(
>
1. ormularios ! eventos
Introduccin
)l !rimer !aso !ara crear una a!licaci$n con Visual Basic es crear la inter%a0& la !arte visual de la a!licaci$n con la "ue va a interactuar el usuario( Los %ormularios y controles son los elementos de desarrollo #sicos "ue se usan !ara crear la inter%a0? son los o#-etos con los "ue se tra#a-a !ara desarrollar la a!licaci$n( Los %ormularios son o#-etos "ue e*!onen las !ro!iedades "ue de%inen su a!ariencia& los m1todos "ue de%inen su com!ortamiento y los eventos "ue de%inen la %orma en "ue interact@an con el usuario( Aediante el esta#lecimiento de las !ro!iedades del %ormulario y la escritura de c$digo de Visual Basic !ara res!onder a sus eventos se !ersonali0a el o#-eto !ara cu#rir las necesidades de la a!licaci$n( 3odos los lengua-es de !rogramaci$n !ara +indo,s com!arten la misma caracterstica2 la orientaci$n a eventos( Las a!licaciones creadas !ara +indo,s no siguen una estructura de e-ecuci$n lineal( )sto im!lica "ue un !rograma no va a seguir una secuencia %i-a de instrucciones& e-ecutndose lnea a lnea& sino "ue de#e res!onder a las acciones "ue el usuario& el sistema o!erativo u otras a!licaciones reali0an so#re 1l? estas acciones se conocen en Visual Basic como eventos( 3odos los elementos "ue !odemos utili0ar en la construcci$n de una a!licaci$n en Visual Basic 6%ormularios& controles 5ctive4& etc: reci#en unos eventos !redeterminados como "etFocus& #ostFocus o Activate( Bodemos controlar estos eventos introduciendo el c$digo "ue deseemos en la corres!ondiente su#rutina de atenci$n al evento( )l o#-etivo de este ca!tulo es recordar los conocimientos #sicos& !ero im!rescindi#les& !ara el mane-o de %ormularios en Visual Basic( Caremos inca!i1 en el conce!to de %ormulario como o#-eto& con sus !ro!iedades& m1todos y eventos( ;e com!ro#ar "ue un %ormulario s$lo se elimina de memoria cuando se eliminan todas las re%erencias al mismo& e*ctamente igual "ue cual"uier o#-eto( .omentaremos es!ecialmente los eventos "ue !uede reci#ir un %ormulario& tanto en el !roceso de carga como en la e-ecuci$n de la a!licaci$n y en el !roceso de descarga del mismo(
Curso de Visual Basic Avanzado Car'ado& ya !odemos acceder a los controles del %ormulario& !ero 1ste no es visi#le( <n %ormulario se encuentra en este estado en el !roceso de carga& cuando se oculta o cuando se esta#lece a False su !ro!iedad Visible( .uando se inicia el !roceso de carga de un %ormulario& se genera el evento Load( Mostrado& el estado normal de un %ormulario( Bodemos acceder a todos los elementos "ue lo com!onen y !odemos actuar so#re ellos& !ues el %ormulario es visi#le( 7urante este estado& cada ve0 "ue ay "ue re!intar el %ormulario 6!or e-em!lo& cuando una ventana "ue se a situado so#re 1ste desa!arece: se genera el evento Paint( 5dems& si el %ormulario recu!era el %oco des!u1s de a#erlo !erdido 6!or e-em!lo& al cam#iar a otra a!licaci$n con 5lt/3a# y volver des!u1s al %ormulario:& se genera el evento Activate( (escar'ado& una ve0 terminado este !roceso el %ormulario no es visi#le& y sus com!onentes no son accesi#les( )l !roceso de descarga se !roduce cuando se cierra el %ormulario 6!ulsando el #ot$n & e-ecutando el m1todo Unload del %ormulario& etc:( )l !roceso de descarga de un %ormulario& a su ve0& generar dos eventos2 uer!"nload y "nload 6en este orden:( )n los dos eventos !odemos detener el !roceso de descarga esta#leciendo el valor del !armetro Cancel a cual"uier n@mero distinto de G( )n general& a!rovec aremos estos eventos !ara li#erar la memoria ocu!ada !or los elementos "ue !ertenecen al %ormulario antes de "ue este se cierre& salvar el tra#a-o "ue est1 !endiente de guardado& etc( Eliminado& aun"ue un %ormulario est1 descargado& mientras e*iste cual"uier re%erencia al mismo no ser eliminado totalmente de memoria( .uando se !roduce esta circunstancia 6el %ormulario est descargado y nadie ace re%erencia a 1l: se genera el evento Terminate& y el %ormulario desa!arece de memoria(
#a ventana (e)u'
;i #ien este elemento del entorno de desarrollo de Visual Basic no tiene una relaci$n directa con el tema "ue se trata en este ca!tulo& "ueremos recordar su %uncionalidad& !uesto "ue !ara el !rogramador es una erramienta im!ortante en el !roceso de desarrollo de una a!licaci$n( )n dic o !roceso es necesario dis!oner de un elemento donde !oder mostrar mensa-es& valores de varia#les& etc( "ue nos ayuden en la de!uraci$n de los !rogramas( )l o#-eto Debu# de Visual Basic nos !ermite escri#ir en la !antalla 'nmediato 6 Debu# Inmediate $indow: utili0ando el m1todo Print( 3am#i1n !odemos com!ro#ar el valor de una varia#le si utili0amos la sentencia ?nombre_variable en la ventana 'nmediato& o esta#lecer dic o valor con la sentencia nombre_variable=valor
1G
%&em'lo 'ro'uesto
.on este e-em!lo veremos los estados !or los "ue !asa un %ormulario durante su ciclo de vida( 5dems& com!ro#aremos c$mo un %ormulario no se elimina de memoria asta "ue no se li#eran todas las re%erencias al mismo en el !rograma( 1( .rearemos los siguientes %ormularios
2( )n el %ormulario 1& insertaremos c$digo en las su#rutinas 'nitiali0e& Load& 5ctivate& Baint& Huery<nload& <nload y 3erminate& !ara "ue cada ve0 "ue se lance el evento corres!ondiente mostremos en la ventana 7e#ug el %ormulario so#re el "ue se a generado el evento y el nom#re del evento( 3( 5Eadiremos c$digo en el .licI del #ot$n !ara mostrar el %ormulario 2( 3am#i1n mantendremos una re%erencia al %ormulario 2 6!ara evitar "ue se lance su evento 3erminate al cerrarse:( 4( 'nsertaremos c$digo en las su#rutinas Load& <nload y 3erminate del %ormulario 2& !ara mostrar en la !antalla 7e#ug el %ormulario y el evento "ue se !roduce en cada caso(
11
12
ormulario *
JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK J )-em!lo 1 del .urso de Visual Basic 5van0ado J J )l o#-etivo de este e-em!lo es reconocer los eventos "ue un J %ormulario !uede reci#ir& as como el orden en el "ue se J reci#en JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK O!tion )*!licit Brivate ;u# FormKLoad6: 7e#ug(Brint OFormulario22 )vento LoadO )nd ;u# Brivate ;u# FormK3erminate6: 7e#ug(Brint OFormulario22 )vento 3erminateO )nd ;u# Brivate ;u# FormK<nload6.ancel 5s 'nteger: 7e#ug(Brint OFormulario22 )vento <nloadO )nd ;u#
13
14
15
Los ti!os de eventos reconocidos !or un o#-eto varan& !ero muc os ti!os son comunes a la mayora de los controles( Bor e-em!lo& la mayora de los o#-etos reconocen el evento Clic(2 si un usuario ace clic en un %ormulario& se e-ecuta el c$digo del !rocedimiento de evento Clic( del %ormulario? si un usuario ace clic en un #ot$n de comando& se e-ecuta el c$digo del !rocedimiento de evento Clic( del #ot$n( )l c$digo en cada caso ser di%erente( Las !ro!iedades de los controles determinan su as!ecto& c$mo se mostrar al usuario( )stas !ro!iedades de%inen sus atri#utos2 color& tamaEo& %orma& etc( 5l igual "ue en el caso de los eventos& los o#-etos de Visual Basic com!arten una serie de !ro!iedades comunes& como )ame o Visible& y otras es!ec%icas de su ti!o(
16
1>
%&em'lo 'ro'uesto
)n este e-em!lo distinguiremos los ti!os de o#-etos "ue tiene un %ormulario& accediendo a las !ro!iedades del o#-eto en el "ue nos encontremos durante el recorrido de la colecci$n de o#-etos( 1( .rearemos el siguiente %ormulario2
2( )n el Load del %ormulario& insertaremos c$digo !ara "ue una ve0 cargado el %ormulario tengamos en la ventana de 7e#ug el nom#re y el ti!o de todos los o#-etos "ue se an cargado( 3( )n %unci$n del ti!o de o#-eto& cam#iaremos su color de %ondo2 1 La#el2 ro-o . ecIBo*2 verde 3e*tBo*2 a0ul .ommandButton2 amarillo
Lota2 !ara !oder cam#iar el color de %ondo de un .ommandButton& es necesario esta#lecer a 1 6Mra! ical: su !ro!iedad ;tyle( 1999 Jorge Ordovs Oromenda y Vicente Lema Osca 1D
%&em'lo resuelto
JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK J )-em!lo 2 del .urso de Visual Basic 5van0ado J J )l o#-etivo de este e-em!lo es identi%icar los o#-etos contenidos J en un %ormulario y o!erar con ellos en %unci$n de su ti!o( JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK O!tion )*!licit Brivate ;u# FormKLoad6: 7im O#-.ontrol 5s O#-ect J 9ecorremos todos los controles del %ormulario For )ac O#-.ontrol 'n Ae(.ontrols J )n %unci$n del ti!o de control& cam#iaremos su color de J %ondo ;elect .ase 3y!eLame6O#-.ontrol: .ase OLa#elO O#-.ontrol(BacI.olor N v#9ed .ase O3e*tBo*O O#-.ontrol(BacI.olor N v#Blue .ase O. ecIBo*O O#-.ontrol(BacI.olor N v#Mreen .ase O.ommandButtonO O#-.ontrol(BacI.olor N v#=ello, )nd ;elect J ;acaremos su nom#re y ti!o de o#-eto a la !antalla J 7e#ug 7e#ug(Brint 3y!eLame6O#-.ontrol: P O2 O P O#-.ontrol(Lame Le*t O#-.ontrol )nd ;u#
19
2G
21
5l con-unto de !ro!iedades y m1todos se le llama interfaz. La inter%a0 !redeterminada de un o#-eto de Visual Basic es una interfaz dual "ue admite las %ormas de enlace anteriormente mencionadas( ;i una varia#le de o#-eto est correctamente definida 6es decir& (im 5 As nombre_clase:& utili0ar la %orma ms r!ida de enlace( 5dems de su inter%a0 !redeterminada& los o#-etos de Visual Basic !ueden im!lementar inter%aces adicionales !ara !ro!orcionar polimorfismo( )l !olimor%ismo le !ermite mani!ular muc os ti!os de%erentes de o#-etos sin !reocu!arse de su ti!o( Las interfaces m"ltiples son una caracterstica del Aodelo de o#-etos com!onentes 6.OA:? !ermiten "ue los !rogramas evolucionen con el tiem!o& agregando nueva %uncionalidad sin a%ectar al c$digo e*istente(
Conce.to de enca.sulacin ,Pu)lic v.s. Private<na de las caractersticas ms im!ortantes de la !rogramaci$n orientada a o#-etos es el conce!to de enca.sulacin2 un o#-eto #ien desarrollado es a"uel "ue !uede ser utili0ado !or otros elementos de %orma e%iciente& !ero sin "ue 1stos cono0can c$mo %unciona internamente( )sto nos !ermite cam#iar la %orma en "ue un o#-eto funciona sin "ue los elementos "ue utili0an el o#-eto noten dic o cam#io( )n Visual Basic& las !ro!iedades y m1todos de una clase !ueden ser de dos ti!os2 Pu)lic& accesi#les !or cual"uier elemento del !royecto( Private& accesi#les s$lo !or los elementos de la clase donde estn de%inidos(
22
Curso de Visual Basic Avanzado m"uina en la "ue tengamos& !or e-em!lo& 5 instancias de +ord al mismo tiem!o(((:( Bara li#erar la memoria y los recursos "ue consume un o#-eto utili0aremos la sentencia2 Set varia#le N 6ot0in'
Instruccin Pro'ert!
.omo se mencion$ anteriormente& es desea#le "ue un elemento e*terno a un o#-eto no !ueda acceder de %orma incontrolada a sus !ro!iedades( Bodemos controlar esto creando todas las !ro!iedades de ti!o Private& !ero((( Qy si "ueremos "ue sean accesi#les !or los elementos "ue utilicen el o#-eto& !ero sin arriesgarnos a "ue 1stos realicen acciones no !ermitidasR( Bor e-em!lo& !odemos necesitar "ue el 3BV 63erminal Bunto de Venta: de una tienda !ueda modi%icar el saldo de una tar-eta 6lo "ue se corres!ondera con la com!ra de un cliente:? sin em#argo& no tiene sentido "ue dic o 3BV !ermita al vendedor com!ro#ar el saldo de la cuenta del cliente& o acer una trans%erencia a su !ro!ia cuenta( Visual Basic !ermite acceder y modi%icar el valor de una !ro!iedad !rivada a trav1s de los procedimientos de propiedad o Pro'ert!( ;e !ro!orcionan tres ti!os de !rocedimientos2 Procedimiento Pro.ert! "et Pro.ert! #et Pro.ert! Set Pro.sito 7evuelve el valor de una !ro!iedad )sta#lece el valor de una !ro!iedad )sta#lece el valor de una !ro!iedad de o#-eto 6es decir& una !ro!iedad "ue contiene una re%erencia a un o#-eto:
Lormalmente se de%ine una !are-a Pro'ert! -et.Pro'ert! Let !or cada !ro!iedad !rivada de una clase( Pro'ert! -et nos !ermite acceder al valor almacenado en dic a !ro!iedad& mientras "ue Pro'ert! Let nos !osi#ilita asignarle un valor( Pro'ert! Set tam#i1n !ermite esta#lecer el valor de una !ro!iedad !rivada( La di%erencia entre este !rocedimiento y Pro'ert! Let es el modo en el "ue se asigna valor a la !ro!iedad( Visual Basic llama a Pro.ert! Set si se utili0a la instrucci$n Set y a Pro.ert! #et en caso contrario( )sta !ro!iedad se utili0a !ara matener el estndar de los o#-etos& ya "ue !ara asignarles un valor se usa la !ala#ra reservada Set.
Varia)les est8ticas
5un"ue este tema no est directamente relacionado con el tema del ca!tulo& "ueremos recordar este conce!to !ara !oder a!licarlo en el e-em!lo !ro!uesto( La vida de una varia#le est directamente relacionada con la %orma y el lugar donde se declara( )l valor de las varia#les declaradas a nivel de m$dulo y !@#licas se !reserva durante todo el tiem!o de e-ecuci$n( ;in em#argo& las varia#les locales declaradas con (im s$lo e*isten mientras se e-ecuta el !rocedimiento en el cual se an declarado( La !r$*ima ve0 "ue se e-ecute el !rocedimiento se reiniciali0arn todas sus varia#les locales( ;in em#argo es !osi#le !reservar el valor de una varia#le local si se declara como est#tica, utili0ando la !ala#ra clave Static2 Static nombre_variable as tipo_dato
23
24
%&em'lo 'ro'uesto
)l o#-etivo de este e-em!lo es conocer el !roceso de creaci$n e instanciaci$n de una clase en Visual Basic( 3am#i1n se !retende "ue el lector se %amiliarice con el ciclo de vida de un o#-eto y la necesidad de li#erar la memoria asociada con cada uno de los o#-etos creados( Bara !racticar estos conce!tos crearemos una agenda tele%$nica #sica( 1( 7iseEaremos el siguiente %ormulario2
2( 7e%iniremos una clase Fic a con cinco !ro!iedades2 nombre, apellidos, direccin, telfono y n"mero( Bara cada una de las !ro!iedades crearemos sus corres!ondientes m1todos de !ro!iedad Pro'ert! -et y Pro'ert! Let( 3( 'm!lementaremos tam#i1n un m1todo $uestra%& "ue muestre mediante un ms#bo* el valor de las !ro!iedades de un o#-eto Fic a creado !reviamente( 4( )n el %ormulario& una ve0 esta#lecidas las !ro!iedades de la %ic a 6nom#re& a!ellidos(((: se !ulsar el #ot$n !ara crear una nueva %ic a( ;er necesario crear un nuevo o#-eto de la clase Fic a y esta#lecer sus !ro!iedades( 5( Bara esta#lecer la !ro!iedad n@mero de la %ic a& crearemos una varia#le esttica "ue incrementaremos en una unidad cada ve0 "ue se !ulse el #ot$n& de %orma "ue nunca creemos dos %ic as con el mismo n@mero( 6( <na ve0 creada la nueva %ic a& llamaremos a su m1todo Auestra6:& !ara "ue nos enseEe el valor de sus !ro!iedades( >( Bor @ltimo& no !odemos olvidarnos de destruir el o)+eto creado igualndolo a )othin#(
25
Clase ic0a
JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK J )-em!lo 3 del .urso de Visual Basic 5van0ado J J 7e%inici$n de la clase F'.C5& todos los o#-etos %ic as tendrn esta inter%ace( JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK O!tion )*!licit J Bro!iedades de la clase .laFic a Brivate Var'ntLumero 5s 'nteger Brivate Var;trLom#re 5s ;tring Brivate Var;tr5!ellidos 5s ;tring Brivate Var;tr7ireccion 5s ;tring
26
Curso de Visual Basic Avanzado Brivate Var;tr3ele%ono 5s ;tring J A1todos !ara acceder a la !ro!iedad Var'ntLumero Bu#lic Bro!erty Met 'ntLumero6: 5s ;tring 'ntLumero N Var'ntLumero )nd Bro!erty Bu#lic Bro!erty Let 'ntLumero6Bar'ntLumero 5s ;tring: Var'ntLumero N Bar'ntLumero )nd Bro!erty J A1todos !ara acceder a la !ro!iedad Var;trLom#re Bu#lic Bro!erty Met ;trLom#re6: 5s ;tring ;trLom#re N Var;trLom#re )nd Bro!erty Bu#lic Bro!erty Let ;trLom#re6Bar;trLom#re 5s ;tring: Var;trLom#re N Bar;trLom#re )nd Bro!erty J A1todos !ara acceder a la !ro!iedad Var;tr5!ellidos Bu#lic Bro!erty Met ;tr5!ellidos6: 5s ;tring ;tr5!ellidos N Var;tr5!ellidos )nd Bro!erty Bu#lic Bro!erty Let ;tr5!ellidos6Bar;tr5!ellidos 5s ;tring: Var;tr5!ellidos N Bar;tr5!ellidos )nd Bro!erty J A1todos !ara acceder a la !ro!iedad Var;tr7ireccion Bu#lic Bro!erty Met ;tr7ireccion6: 5s ;tring ;tr7ireccion N Var;tr7ireccion )nd Bro!erty Bu#lic Bro!erty Let ;tr7ireccion6;tr7ireccion 5s ;tring: Var;tr7ireccion N ;tr7ireccion )nd Bro!erty J A1todos !ara acceder a la !ro!iedad Var;tr3ele%ono Bu#lic Bro!erty Met ;tr3ele%ono6: 5s ;tring ;tr3ele%ono N Var;tr3ele%ono )nd Bro!erty Bu#lic Bro!erty Let ;tr3ele%ono6Bar;tr3ele%ono 5s ;tring: Var;tr3ele%ono N Bar;tr3ele%ono )nd Bro!erty J A1todo !ara mostrar los datos de una %ic a Bu#lic ;u# AetAostrar6: AsgBo* OL@mero2 O P Var'ntLumero P v#.rL% P K OLom#re2 O P Var;trLom#re P v#.rL% P K O5!ellidos2 O P Var;tr5!ellidos P v#.rL% P K O7irecci$n2 O P Var;tr7ireccion P v#.rL% P K O3el1%ono2 O P Var;tr3ele%ono& & OFic aO )nd ;u#
2>
2D
As e*actamente& una varia#le Variant ocu!a siem!re 16 #ytes incluso si los datos se encuentran almacenados en cual'uier otra parte. Bor e-em!lo& si asignamos una cadena o una matri0 a una varia#le de ti!o Variant& 1sta contiene un !untero a una co!ia de la cadena o de los datos de la matri0( )n los sistemas de 32 #its s$lo se utili0an como !untero 4 #ytes de la varia#le Variant y realmente no ay ning@n dato en ella( ;i almacenamos un o#-eto& la varia#le de ti!o Variant contiene la re%erencia de o#-eto& como si %uera una varia#le de o#-eto( 'gual "ue ocurre con las cadenas y las matrices& solamente se utili0an 4 #ytes( Los ti!os de datos num1ricos se almacenan ocu!ando siem!re los 16 #ytes( 1999 Jorge Ordovs Oromenda y Vicente Lema Osca 29
<na colecci$n !uede tener base cero o base uno& de!endiendo de su ndice inicial 6lo !rimero "uiere decir "ue el ndice del !rimer elemento de la colecci$n es cero y lo segundo "uiere decir "ue es uno:( )-em!los de colecciones con #ase cero son las colecciones Forms y Controls( )l o#-eto Collection es un e-em!lo de colecci$n con #ase uno( Las colecciones ms antiguas de Visual Basic suelen tener #ase cero& mientras "ue las ms recientes suelen tener #ase uno( )s ms intuitivo utili0ar las colecciones con #ase uno& ya "ue su ndice va desde uno a Count& donde Count es la !ro!iedad "ue devuelve el n@mero de elementos de una colecci$n( Bor otra !arte& el ndice de una colecci$n con #ase cero va desde cero al valor de la !ro!iedad Count menos uno(
3G
Bodemos utili0ar el ndice !ara recorrer los elementos de una colecci$n( Bor e-em!lo& si insertamos el c$digo siguiente en el Load de un %ormulario a!arecera en la !antalla Debu# el nom#re de los controles "ue estn !egados en 1l2 7im 'nt.ontador as 'nteger For 'nt.ontador N G 3o .ontrols(.ount 8 1 7e#ug(Brint .ontrols6'nt.ontador:(Lame P v#.rL% Le*t )*iste otra %orma de acceder a los elementos de una colecci$n "ue !ro!orciona un mayor rendimiento2 utili0ar la sentencia For %ach( )sta o!ci$n es nota#lemente ms r!ida "ue la iteraci$n mediante ndice& aun"ue esto no es cierto en todas las im!lementaciones de colecciones2 de!ende de c$mo almacena la colecci$n los datos internamente( Bodemos codi%icar de nuevo el e-em!lo anterior utili0ando esta sentencia2 7im Var7ato as Variant For )ac Var7ato 'n .ontrols 7e#ug(Brint Var7ato(Lame P v#.rL% Le*t Var7ato
31
Curso de Visual Basic Avanzado coleccin(Remove (ndice )l argumento (ndice !uede ser la !osici$n del elemento "ue desea eliminar o su clave( ;i la clave del tercer elemento de la colecci$n de !ersonas es O123456>+O& !odemos utili0ar cual"uiera de estas dos instrucciones !ara eliminarlo2 .olBersonas(9emove 3 o #ien .olBersonas(9emove O123456>+O
Lo es conveniente !ermitir "ue los o#-etos Collection decidan si el valor "ue estn reci#iendo es un ndice o una clave( ;i deseamos "ue un valor se inter!rete como clave y la varia#le "ue contiene el valor no es de ti!o Strin#& de#emos utili0ar CStr !ara convertirla( ;i deseamos "ue un valor se inter!rete como ndice y la varia#le "ue contiene el valor no es de un ti!o de datos num1ricos& de#emos utili0ar CLn# !ara convertirla(
32
Control >ScrollBar
Las #arras de des!la0amiento !ro!orcionan un medio sencillo de recorrer largas listas de elementos o grandes cantidades de in%ormaci$n al des!la0arse ori0ontal o verticalmente dentro de una a!licaci$n o de un control( Las #arras de des!la0amiento son un elemento com@n de la inter%a0 de +indo,s 95 y de +indo,s L3( Barra de des!la0amiento ori0ontal 6/Scroll0ar: Barra de des!la0amiento vertical 6VScroll0ar: Los controles >ScrollBar y VScrollBar no son igual "ue las #arras de des!la0amiento incor!oradas "ue se !ueden encontrar en +indo,s o "ue las ad-untas a los cuadros de te*to& los cuadros de lista& los cuadros com#inados o los %ormularios A7' de Visual Basic( 7ic as #arras de des!la0amiento a!arecen automticamente cuando la a!licaci$n o el control contiene ms in%ormaci$n de la "ue se !uede !resentar con el tamaEo actual de la ventana 6o #ien& en el caso de los cuadros de te*to y los %ormularios A7'& cuando la !ro!iedad ScrollBars est esta#lecida a True:(
33
)n las versiones anteriores de Visual Basic& las #arras de des!la0amiento se solan utili0ar como dis!ositivos de entrada( ;in em#argo& las recomendaciones de la inter%a0 de +indo,s sugieren a ora "ue se utilicen como dis!ositivos de entrada los controles Slider en lugar de los controles ScrollBar( )l control Slider de +indo,s 95 se incluye en la )dici$n Bro%esional y la )dici$n )m!resarial de Visual Basic( Los controles Scroll0ar siguen siendo @tiles en Visual Basic !or"ue !ro!orcionan ca!acidad de des!la0amiento a las a!licaciones o a los controles "ue no la !ro!orcionan de %orma automtica( Los controles Scroll0ar utili0an los eventos Scroll y Chan#e !ara su!ervisar el movimiento del cuadro de des!la0amiento a lo largo de la #arra de des!la0amiento( Evento . ange ;croll (escri.cin Ocurre des!u1s de mover el cuadro de des!la0amiento( Ocurre al mover el cuadro de des!la0amiento( Lo ocurre si se ace clic en las %lec as o en la #arra de des!la0amiento(
)l evento Scroll !ro!orciona acceso al valor de la #arra de des!la0amiento cuando 1sta se arrastra( )l evento Chan#e se !roduce des!u1s de li#erar el cuadro de des!la0amiento o cuando se ace clic en la #arra o en las %lec as de des!la0amiento( La !ro!iedad Value 6"ue de %orma !redeterminada es G: es un valor entero "ue se corres!onde con la !osici$n del cuadro de des!la0amiento dentro de la #arra de des!la0amiento( .uando la !osici$n del cuadro de des!la0amiento tiene el valor mnimo& 1ste se mueve a la !osici$n situada ms a la i0"uierda 6en las #arras de des!la0amiento ori0ontal: o a la !osici$n ms alta 6en las #arras de des!la0amiento vertical:( .uando el cuadro de des!la0amiento tiene el valor m*imo& se mueve a la !osici$n situada ms a la derec a o a la ms #a-a( 7e %orma similar& un valor a medio camino entre los lmites del intervalo coloca el cuadro de des!la0amiento en la mitad de la #arra de des!la0amiento( 5dems de utili0ar los clics del rat$n !ara cam#iar el valor de la #arra de des!la0amiento& el usuario tam#i1n !uede arrastrar el cuadro de des!la0amiento a cual"uier !osici$n de la #arra( )l valor resultante de!ende de la !osici$n del cuadro de des!la0amiento& !ero siem!re se encuentra dentro del intervalo de%inido !or las !ro!iedades 1in y 1a* esta#lecidas !or el usuario(
34
35
2( .rearemos una clase 5genda con una !ro!iedad !rivada .olFic as de ti!o Collection& "ue no tendr m1todos Pro'ert! asociados( .rearemos un m1todo Pro'ert! -et llamado Int6um ic0as "ue nos devuelva el n@mero de %ic as de la colecci$n .olFic as( 3( 'm!lementaremos un m1todo !@#lico .rearFic a "ue reci#e como argumentos el nom#re& a!ellido& direcci$n y tel1%ono y crea una %ic a nueva 6utili0aremos la clase Fic a de%inida en el e-em!lo 3:& asignndole un n@mero 6este n@mero ser una es!ecie de Tcam!o autonum1ricoU& "ue generaremos incrementalmente:( 5dems de crear la nueva %ic a& la introduce en la colecci$n .olFic as& !oniendo como clave el n@mero de la %ic a 6como la clave tiene "ue ser una cadena& ay "ue acer la conversi$n a string de dic o n@mero:( 4( 'm!lementaremos tam#i1n un m1todo !@#lico BorrarFic a& "ue reci#e como argumento la clave de la %ic a "ue "ueremos eliminar( )ste m1todo elimina la %ic a de memoria y tam#i1n de la colecci$n( 5( 3am#i1n crearemos un m1todo !@#lico Fic a& "ue reci#e como argumento el ndice de la %ic a dentro de la colecci$n .olFic as y devuelve la %ic a corres!ondiente( 6( .omo @ltimo elemento de la clase& en el evento Terminate li#eraremos todo el es!acio de memoria "ue !odamos tener reservado !ara las %ic as y la colecci$n( >( )n el %ormulario crearemos un o#-eto de la clase 5genda& y una varia#le 'ntLumFic a5ctual "ue indicar el n@mero de la %ic a cuyos datos a!arecen en el %ormulario( .omo estas varia#les van a ser utili0adas en todas las %unciones del %ormulario& las crearemos como varia#les glo#ales del %ormulario( D( 5l !ulsar el #ot$n TLueva %ic aU& de#emos aumentar la !ro!iedad 1a* de la #arra de scroll& !osicionarnos en el @ltimo elemento y lim!iar los datos 6nom#re& a!ellidos& direcci$n y tel1%ono:& !re!arando el %ormulario !ara insertar una nueva %ic a( 6 A?+oB& !ara la !rimera %ic a& no es necesario incrementar el lmite m*imo de la #arra de scroll& ni lim!iar el %ormulario:(
36
Curso de Visual Basic Avanzado 9( <na ve0 insertados los datos de la nueva %ic a& !ulsaremos el #ot$n T.rear %ic aU& donde llamaremos al m1todo .rearFic a del o#-eto 5genda y actuali0aremos el ttulo del %rame& donde !ondr TFic a LU 6siendo L el n@mero de la nueva %ic a& "ue o#tendremos como valor de retorno del m1todo .rearFic a:( 1G( .ada ve0 "ue cam#ie la #arra de scroll 6evento Chan#e: de#emos actuali0ar los datos del %ormulario& mostrando la in%ormaci$n de la %ic a corres!ondiente en la colecci$n .olFic as del o#-eto 5genda( .rearemos una %unci$n 5ctuali0arBarra;croll "ue se encargar de ello 6A?+oB2 la %unci$n de#e com!ro#ar si ay %ic as en la colecci$n& y tam#i1n si estamos insertando una %ic a nueva& en cuyo caso en lugar de actuali0ar los datos del %ormulario& los lim!iar(:( 3am#i1n tenemos "ue o#tener el n@mero de la %ic a actual( 11( .uando !ulsemos el #ot$n TBorrar %ic aU llamaremos al m1todo BorrarFic a del o#-eto 5genda !asndole el n@mero de la %ic a actual( <na ve0 #orrada& decrementaremos el valor m*imo de la #arra de scroll 6A?+oB2 cuidado cuando #orramos la @ltima %ic a: y actuali0aremos los datos del %ormulario llamando a la %unci$n 5ctuali0arBarra;croll( 12( Bara terminar& s$lo nos %alta controlar cuando estn a#ilitados los cuadros de te*to& los #otones y dems elementos !ara "ue "uede lo ms co erente !osi#le(
3>
3D
Curso de Visual Basic Avanzado )nd ;u# Brivate ;u# ButLuevaFic aK.licI6: J 5ctuali0amos la #arra de scroll '% O#-5genda('ntLumFic as N G 3 en J .on la !rimera %ic a creada& a#ilitamos J la #arra de scroll C;croll1()na#led N 3rue Frame1()na#led N 3rue )lse J 'ncrementamos el n@mero de elementos de J la #arra de scroll C;croll1(Aa* N C;croll1(Aa* / 1 C;croll1(Value N C;croll1(Aa* )nd '% J Ca#ilitamos el #ot$n de crear %ic a y el %rame But.rearFic a()na#led N 3rue Frame1()na#led N 3rue J 7es a#ilitamos los #otones de nueva %ic a y #orrar J %ic a& as como la #arra de scroll ButLuevaFic a()na#led N False ButBorrarFic a()na#led N False C;croll1()na#led N False )nd ;u# Brivate ;u# FormKLoad6: J 7es a#ilitamos el %rame& la #arra de scroll& J el #ot$n de crear %ic a y el #ot$n de #orrar %ic a Frame1()na#led N False C;croll1()na#led N False But.rearFic a()na#led N False ButBorrarFic a()na#led N False J )sta#lecemos los lmites de la #arra de scroll C;croll1(Aa* N G )nd ;u# Brivate ;u# FormK<nload6.ancel 5s 'nteger: J )liminamos la agenda ;et O#-5genda N Lot ing )nd ;u# Brivate ;u# C;croll1K. ange6: J 5ctuali0amos la #arra de scroll 5ctuali0arBarra;croll )nd ;u# Brivate Function 5ctuali0arBarra;croll6: 7im O#-Fic a 5s .laFic a J .om!ro#amos si no ay %ic as o estamos creando una %ic a nueva '% C;croll1(Aa* N O#-5genda('ntLumFic as 3 en J Lim!iamos los datos del %rame 3*tLom#re N v#Lull;tring 3*t5!ellidos N v#Lull;tring 3*t7ireccion N v#Lull;tring 3*t3ele%ono N v#Lull;tring
39
J 5ctuali0amos el ttulo del %rame Frame1(.a!tion N v#Lull;tring J 7es a#ilitamos el #ot$n de #orrado ButBorrarFic a()na#led N False )lse J O#tenemos la %ic a corres!ondiente de la agenda J 6#uscamos !or ndice& no !or c$digo de %ic a: ;et O#-Fic a N O#-5genda(Fic a6C;croll1(Value / 1: J ;acamos los datos de la %ic a 3*tLom#re N O#-Fic a(;trLom#re 3*t5!ellidos N O#-Fic a(;tr5!ellidos 3*t7ireccion N O#-Fic a(;tr7ireccion 3*t3ele%ono N O#-Fic a(;tr3ele%ono J 5ctuali0amos el c$digo de la %ic a actual 'ntLumFic a5ctual N O#-Fic a('ntLumFic a J 5ctuali0amos el %rame Frame1(.a!tion N OFic a O P 'ntLumFic a5ctual )nd '% )nd Function
4G
Clase A'enda
JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK J )-em!lo 4 del .urso de Visual Basic 5van0ado J J 7e%inici$n de la clase 5M)L75& a"u estarn los datos de cada agenda y los m1todos J !ara actuar con ellos( JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
J A1todo !ara o#tener el n@mero de %ic as de la agenda Bu#lic Bro!erty Met 'ntLumFic as6: 5s 'nteger 'ntLumFic as N .olFic as(.ount )nd Bro!erty J A1todo !ara crear una %ic a nueva en la agenda Bu#lic Function .rearFic a6ByVal ;trLom#re 5s ;tring& K ByVal ;tr5!ellidos 5s ;tring& ByVal ;tr7ireccion 5s ;tring& K ByVal ;tr3ele%ono 5s ;tring: 5s 'nteger ;tatic 'ntLum3otalFic as 5s 'nteger 7im O#-Fic a 5s .laFic a J 'ncrementamos el Ocam!o auton@mericoO 'ntLum3otalFic as 'ntLum3otalFic as N 'ntLum3otalFic as / 1 J .reamos un nuevo o#-eto de la clase %ic a ;et O#-Fic a N Le, .laFic a J )sta#lecemos las !ro!iedades de la nueva %ic a O#-Fic a(;trLom#re N ;trLom#re O#-Fic a(;tr5!ellidos N ;tr5!ellidos O#-Fic a(;tr7ireccion N ;tr7ireccion O#-Fic a(;tr3ele%ono N ;tr3ele%ono O#-Fic a('ntLumFic a N 'ntLum3otalFic as J 'nsertamos la nueva %ic a en la colecci$n de %ic as& !oniendo J como Iey el c$digo de la %ic a& !ara !oder #uscarla des!u1s J !or c$digo 6convertimos a string el c$digo !or"ue el Iey J tiene "ue ser un string: .olFic as(5dd O#-Fic a& .;tr6O#-Fic a('ntLumFic a: J 7evolvemos el c$digo de la %ic a creada .rearFic a N 'ntLum3otalFic as )nd Function J A1todo !ara #orrar una %ic a de la agenda Bu#lic Function BorrarFic a6ByVal 'ntLumFic a 5s 'nteger: 7im O#-Fic a 5s .laFic a J O#tenemos la %ic a corres!ondiente de la colecci$n J de %ic as 6!ara !oder #uscar !or Iey& tenemos "ue J convertir el n@mero a string& !ues en caso contrario J #uscamos !or ndice:
41
Curso de Visual Basic Avanzado ;et O#-Fic a N .olFic as('tem6.;tr6'ntLumFic a:: J )liminamos la %ic a de la colecci$n .olFic as(9emove 6.;tr6'ntLumFic a:: J )liminamos la %ic a ;et O#-Fic a N Lot ing )nd Function J A1todo !ara eliminar todas las %ic as de una agenda cuando J 1ste es eliminada Brivate ;u# .lassK3erminate6: 7im O#-Fic a 5s .laFic a J )liminamos todas las %ic as de la colecci$n For )ac O#-Fic a 'n .olFic as ;et O#-Fic a N Lot ing Le*t O#-Fic a )nd ;u# J A1todo !ara o#tener una %ic a es!ec%ica de la agenda 6no #usca J !or Iey sino !or ndice: Bu#lic Function Fic a6ByVal 'nt'ndice 5s 'nteger: 5s .laFic a ;et Fic a N .olFic as('tem6'nt'ndice: )nd Function
42
C. Tecnolo'3a ActiveD
Introduccin
)l o#-etivo de este ca!tulo es mostrar al lector el !roceso de creaci$n de com!onentes 5ctive4& y su utili0aci$n en un !royecto( 3am#i1n se !retende "ue el lector se %amiliarice con el !roceso de !u#licaci$n de un control 5ctive4 en una !gina +e#& como muestra de la versatilidad de este ti!o de com!onentes( .on este ca!tulo se ace una introducci$n al curso )ctive *, "ue es la continuaci$n de los cursos Visual Basic 5(G 6#sico y avan0ado:(
43
44
Curso de Visual Basic Avanzado ActiveD (## ,li)rer3as-& Los com!onentes 5ctive4 !ro!orciona c$digo "ue se !uede volver a utili0ar en %orma de o#-etos( <na a!licaci$n 6 cliente: !uede crear un o#-eto a !artir de un com!onente 5ctive4 6servidor: y utili0ar sus !ro!iedades y m1todos( Los com!onentes 5ctive4 7LL se e-ecutan dentro del es!acio de direcciones del !rograma "ue los utili0a( ActiveD EDE& <n com!onente 5ctive4 )4) es muy similar a un com!onente 5ctive4 7LL( La @nica di%erencia es "ue un com!onente 5ctive4 )4) se e-ecuta en su !ro!io es!acio de direcciones& lo "ue !ermite "ue el cliente !uede e-ecutar un m1todo del com!onente y continuar con su e-ecuci$n mientras el com!onente reali0a el tra#a-o& manteniendo el control de la e-ecuci$n del !rograma !rinci!al si se "uedara #lo"ueada la llamada a una %unci$n del 5ctive 4( La !ega es "ue gasta mas recursos& !ues la comunicaci$n entre el cliente y el servidor es ms com!le-a(
45
Curso de Visual Basic Avanzado Variant:& a cero 6en matrices num1ricas:& a una cadena de longitud cero 6en matrices de cadenas: o a 6ot0in' 6en matrices de o#-etos:( )sto resulta muy @til cuando deseemos !re!arar la matri0 !ara contener datos nuevos o cuando deseemos reducir el tamaEo de la matri0 !ara "ue ocu!e menos memoria( Buede "ue a veces nos interese cam#iar el tamaEo de la matri0 sin !erder los datos de la misma( Bara ello !odemos utili0ar ReDim con la !ala#ra clave Preserve( Bor e-em!lo& !odemos am!liar una matri0 en un elemento sin !erder los valores de los elementos e*istentes mediante la %unci$n "0ound !ara acer re%erencia al lmite su!erior2 9e7im Breserve 'ntAatri06<Bound6'ntAatri0: / 1: ;$lo se !uede cam#iar el lmite su!erior de la @ltima dimensi$n de una matri0 multidimensional cuando se utili0a la !ala#ra clave Preserve? si cam#iamos alguna otra dimensi$n o el lmite in%erior de la @ltima dimensi$n& se !roducir un error en tiem!o de e-ecuci$n( 5s !ues& !odemos utili0ar un c$digo como el siguiente2 9e7im Breserve 'ntAatri061G& <Bound6'ntAatri0& 2: / 1: Bero no !odemos utili0ar este c$digo2 9e7im Breserve 'ntAatri06<Bound6'ntAatri0& 1: / 1& 1G:
Matrices de controles
Visual Basic !ermite crear matrices de controles dinmicamente y situar los nuevos controles a voluntad en un %ormulario( ;u!ongamos "ue tenemos un control llamado Ai.tl 6!or e-em!lo& un ,ommand-utton:( Bara crear un nuevo control& utili0aramos la sentencia2 Load Ai.tl6L: donde L es el ndice del nuevo control( <na ve0 creado& !odemos situar el nuevo control en la !osici$n "ue deseemos esta#leciendo a!ro!iadamente su !ro!iedad To' y Le,t& y acerlo visi#le esta#leciendo a True la !ro!iedad Visible(
46
)l asistente nos crear !rinci!almente dos arc ivos con el nom#re del control 5ctive4& uno con e*tensi$n (.5B "ue contiene el !ro!io control 6y otros elementos utili0ados !or 1l& si !rocede: y otro con e*tensi$n (C3A en el "ue se muestra un e-em!lo de !gina C3AL "ue utili0a el control 5ctive4(
4>
Pro.iedades2 StrTurno2 almacena el carcter corres!ondiente al turno actual 6TOU o T4U: Int6umeroHu'adas& recoge el n@mero de movimientos reali0ados M:todos2 Su) 2serControl@Initialize2 a !artir de un @nico #ot$n creado en tiem!o de diseEo en el control 5ctive4& generar una matr0 ordenada de 3*3 #otones 6ndices de G a D:( Su) Inicializar ormulario& iniciali0ar el ca!tion de los #otones& el turno y el n@mero de -ugadas( unction >a!TresEnRa!a,- As Boolean2 com!ro#ar cuando ay tres en raya& en %unci$n del ca!tion de los #otones "ue es donde nos indica el -ugador "ue lo eligi$ 6O o 4:( Su) ButCelda@Clic1,Inde/ As Inte'er-& reali0ar todo el !roceso del -uego 6com!ro#ar si ay tres en raya& com!ro#ar si el #ot$n ya a sido !ulsado& y en caso contrario cam#iar el ca!tion del mismo& com!ro#ar si se an marcado ya todas las casillas& incrementar el n@mero de -ugadas reali0adas(((: 2: <na ve0 creado el control& a#riremos un .ro!ecto nuevo 6de ti!o )4) estndar: en el "ue aEadiremos un %ormulario en #lanco ! nuestro .ro!ecto TresEnRa!a( Begaremos el control 3res)n9aya& "ue a!arecer en la ca-a de erramientas& y de!uraremos el control a#ierto como !royecto& ya "ue si no tendramos "ue de!urarlo e-ecutndolo directamente& y !ara solucionar
4D
Curso de Visual Basic Avanzado un !osi#le error volvernos al VB !ara reali0ar la modi%icaci$n& recom!ilar y acer el e-ecuta#le& mientras "ue de esta %orma con reescri#ir y e-ecutar tenemos el !ro#lema resuelto( 3: .uando el control %uncione #ien& a#riremos el !royecto inicial& generaremos el arc ivo 3res)n9aya(oc*& 'uardaremos el .ro!ecto y cerraremos Visual Basic( 4: )-ecutaremos el 5sistente !ara instalar a!licaciones y crearemos los %ic eros necesarios !ara !u#licar nuestro control en una !gina +e#(
49
%&em'lo resuelto
JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK J )-em!lo 5 del .urso de Visual Basic 5van0ado J J .$digo del control de 39); )L 95=5& %unciones necesarias !ara el control de la !artida J y control de movimientos de los -ugadores( JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
O!tion )*!licit 7im ;tr3urno 5s ;tring 7im 'ntLumeroJugadas 5s 'nteger Brivate ;u# But.eldaK.licI6'nde* 5s 'nteger: '% But.elda6'nde*:(.a!tion N v#Lull;tring 3 en J Bintamos la marca en la But.elda corres!ondiente But.elda6'nde*:(.a!tion N ;tr3urno J .om!ro#amos si ay 3 en lnea '% Cay3res)n9aya6: 3 en AsgBo* OXCas ganadoYO& v#OZOnly Or v#)*clamation& O3res en 9ayaO 'niciali0arFormulario )*it ;u# )nd '% J .am#iamos de ;tr3urno '% ;tr3urno N OOO 3 en ;tr3urno N O4O )lse ;tr3urno N OOO )nd '% J .om!ro#amos si se an reali0ado todos los movimientos J !osi#les '% 'ntLumeroJugadas N 9 3 en '% AsgBo*6OCa a#ido un em!ate( QHuieres -ugar otra ve0RO& v#=esLo Or v#Huestion& O3res en 9ayaO: N v#=es 3 en 'niciali0arFormulario )nd '% )nd '% J 'ncrementamos el n@mero de movimientos reali0ados 'ntLumeroJugadas N 'ntLumeroJugadas / 1 )nd '% )nd ;u# Brivate Function Cay3res)n9aya6: 5s Boolean 7im 'nt'& 'ntJ 5s 'nteger J Filas ori0ontales For 'nt' N G 3o 2 '% But.elda63 [ 'nt':(.a!tion \V v#Lull;tring 5nd K But.elda63 [ 'nt':(.a!tion N But.elda63 [ 'nt' / 1:(.a!tion 5nd K But.elda63 [ 'nt':(.a!tion N But.elda63 [ 'nt' / 2:(.a!tion 3 en Cay3res)n9aya N 3rue )*it Function )nd '% Le*t J Filas verticales For 'nt' N G 3o 2 '% But.elda6'nt':(.a!tion \V v#Lull;tring 5nd K
5G
51
52
Estructura de una a.licacin de )ases de datos en Visual )asic con (A? ! Het
<na a!licaci$n de #ases de datos en Visual Basic "ue utili0a 75O y Jet consta de tres !artes& como se muestra en la siguiente %igura2
)l inter%a0 de usuario es lo "ue el usuario ve y con lo "ue interact@a con la #ase de datos( .omo se ve en la %igura& todo acceso a la #ase de datos se reali0a a trav1s del motor de #ase de datos 6Jet: ya "ue es a"u donde estn los m1todos y %unciones de acceso a #ase de datos( )l motor de #ase de datos es un intermediario entre el inter%a0 de usuario y el almac1n de datos& lo "ue !ermite a#straer a la a!licaci$n de la #ase de datos utili0ada& %acilitando la reutili0aci$n del c$digo(
53
54
Curso de Visual Basic Avanzado A.ertura de la )ase de datos& )l o#-eto D0%n#ine contiene y controla todos los otros o#-etos en la -erar"ua de los o#-etos de 75O( )s @nico !or a!licaci$n 6no !ueden crearse otros o#-etos 7B)ngine:( <tili0aremos el $or(s'ace 6es!acio de tra#a-o: !or de%ecto de este o#-eto !ara a#rir la #ase de datos& es!eci%icando el path com!leto del arc ivo2 7im VarB7 as 7ata#ase ;et VarB7 N 7B)ngine(+orIs!aces6G:(O!en7ata#ase6Tc2]#d]AiB7(md#U: 2tilizacin de Recordsets& <n o#-eto Recordset re!resenta los registros de una ta#la o los registros "ue resultan de e-ecutar una consulta( )s anlogo a los cursores utili0ados en otros lengua-es( )*isten varios ti!os& cada uno de los cuales tiene sus venta-as e inconvenientes2 db+'enTable& tiene acceso a la #ase de datos directamente& es decir& "ue tiene acceso a la ta#la directamente( Las #@s"uedas son ms r!idas "ue con otros ti!os de Recordset& !ero no !ermite uniones ni !uede ser utili0ado con otros modelos de acceso a datos como 97O( db+'enSna'shot& contiene una co!ia %i-a de los datos tal y como e*isten en el momento en el "ue se accedi$( .onsume menos recursos "ue otros Recordset 6db+'enTable& db+'enD!naset:& !or lo "ue !uede e-ecutar consultas y devolver datos ms r!idamente& so#re todo si utili0a O7B.( Lo es actuali0a#le& !or lo "ue no recoge los cam#ios "ue !uedan reali0arse en la #ase de datos mientras se utili0a& es $!timo !ara usos de lectura de datos( db+'enD!naset6 es un con-unto de re%erencias a los registros de una o ms ta#las( Los cam#ios reali0ados en la #ase de datos son automticamente actuali0ados en un Recordset de este ti!o( ;in em#argo& las #@s"uedas son ms lentas ya "ue las acciones "ue se acen no solo se e-ecutan en la memoria& si no "ue se re%le-an a la ve0 en la #ase de datos( db+'enForward+nl!6 es un ti!o de Sna'shot en el "ue s$lo se !ermite el des!la0amiento acia delante so#re el con-unto de resultados o#tenido en una consulta( )s el Recordset "ue menos %uncionalidad !ro!orciona& con la venta-a de "ue es el ms r!ido( )n el siguiente cuadro se recogen los ti!os de Recordset "ue de#en utili0arse !ara reali0ar las acciones ms comunes& de %orma "ue se ma*imice en la medida de lo !osi#le el rendimiento de la a!licaci$n2 Accin .onsultar los datos contenidos en una sola ta#la 'nsertar un registro nuevo en una ta#la 9ecorrer un Recordset utili0ando 1ove)e*t Buscar un registro utili0ando Find Buscar un registro con Find y #orrarlo con Delete Recordset recomendado db+'enTable db+'enTable db+'enForward+nl! db+'enSna'shot db+'enD!naset
Siem.re ay "ue cerrar los Recordsets a#iertos una ve0 de-en de ser @tiles utili0ando el m1todo Close( Lo cerrar un Recordset a#ierto !uede su!oner estar tra#a-ando con datos no actuali0ados& no !oder a#rir o cerrar transacciones& etc( )n las siguientes lneas se e*!onen varios e-em!los de uso de Recordsets utili0ando en muc os casos sentencias es.ec3%icas de 75O !ara acceder a #ases de datos Jet( )ste ti!o de sentencias estn !ensadas !ara el acceso a #ases de datos locales a trav1s del motor Jet& y no de)en ser utili0adas !ara acceder a servidores de #ases de datos no locali0ados en el cliente 6es ms& en ocasiones no !ueden ser utili0adas %uera de este conte*to:( ;u utili0aci$n en este ti!o de entornos !uede su!oner una im!ortante #a-ada en el rendimiento de la a!licaci$n& siendo !re%eri#le el uso de 75O con O7B.7irect o 97O& como veremos en los siguientes e-em!los(
55
Curso de Visual Basic Avanzado E+em.los de utilizacin de Recordsets& Bara insertar un registro nuevo 67L'NU123456>DU& Lom#reNU5nastasioU& 5!ellidosNUB1re0 AartnU: en la ta#la JAi3a#laJ2 7im 9set3a#la as 9ecordset ;et 9set3a#la N VarB7(O!en9ecordset6TAi3a#laU&d#O!en3a#le: +it 9set3a#la (5ddLe, Y7L' N T123456>DU YLom#re N T5nastasioU Y5!ellidos N TB1re0 AartnU (<!date )nd +it Bara contar el n@mero de elementos en la ta#la Ai3a#la utili0aremos la !ro!iedad RecordCount del Recordset2 7im 9set3a#la as 9ecordset 7im Lum)lementos as integer ;et 9set3a#la N VarB7(O!en9ecordset6TAi3a#laU&d#O!en3a#le: Lum)lementos N 9set3a#la(9ecord.ount Bara mostrar en la !antalla Debu# los datos de cada registro de la ta#la TAi3a#laU utili0aremos el m1todo 1ove)e*t del Recordset& "ue o#tiene el siguiente registro del con-unto( 5ccederemos a los cam!os del registro utili0ando la sinta*is Recordset7Abierto8 )ombre7del7cam'o( La !ro!iedad %+F del Recordset nos indicar cuando se a llegado al %inal del con-unto de registros2 7im 9set3a#la as 9ecordset ;et 9set3a#la N VarB7(O!en9ecordset6TAi3a#laU&d#O!enFor,ardOnly: +it 9set3a#la 7o <ntil ()OF 7e#ug(Brint T7L'2 U P Y7L' P v#.9LF P K TLom#re2 T P YLom#re P v#.9LF P K T5!ellidos2 T P Y5!ellidos (AoveLe*t Loo! )nd +it Bara #uscar los datos del registro con 7L'NU123456>DU utili0aremos el m1todo FindFirst del Recordset& "ue o#tiene el .rimer re'istro del con-unto de registros del Recordset "ue cum!le una cierta condici$n& una ve0 encontrado el registro mostraremos los datos en el de)u'( <tili0aremos la !ro!iedad )o1atch !ara sa#er si se a encontrado el registro #uscado& ya "ue ser true si se a llegado al %inal del recorset sin encontrar un regostro con los datos es!eci%icados2 7im 9set3a#la as 9ecordset ;et 9set3a#la N VarB7(O!en9ecordset6TAi3a#laU&d#O!en;na!s ot: +it 9set3a#la (FindFirst T7L'N123456>DU '% (LoAatc 3 en 7e#ug(Brint T9egistro no encontradoU )lse 7e#ug(Brint T7L'2 U P Y7L' P v#.9LF P K TLom#re2 T P YLom#re P v#.9LF P K
56
Curso de Visual Basic Avanzado T5!ellidos2 T P Y5!ellidos )nd '% )nd +it Bara #orrar el registro con 7L'NU123456>DU utili0aremos el m1todo FindFirst y el m1todo Delete del Recordset& "ue elimina el registro actual del con-unto de registros2 7im 9set3a#la as 9ecordset ;et 9set3a#la N VarB7(O!en9ecordset6TAi3a#laU&d#O!en;na!s ot: +it 9set3a#la (AoveLast (FindFirst T7L'N123456>DU '% Lot (LoAatc 3 en (7elete )nd +it Cemos visto los m1todos de acceso a registros& a ora veremos los m1todos de movimiento dentro del recodset& el uso es similar a los de acceso a los registros& !or eso s$lo los enunciaremos2 Move istr& )l cursor se sit@a en el !rimer registro( Move#ast& )l registro en el "ue nos situamos es el @ltimo del recordset( Move6e/t& Los vamos al siguiente registro al "ue nos encontremos( MovePrevious& 9etrocedemos un registro en el recordset( Move Jn& 5van0amos n registros a !artir de la !osici$n actual( )s im!ortante controlar la situaci$n en la "ue nos encontremos en el recordset a la ora de des!la0arnos& ya "ue el acceso a una !osici$n "ue no est1 dentro del recordset !roducira un error en tiem!o de e-ecuci$n(
5>
)l o#-etivo es aislar cada ca!a de la im!lementaci$n de las dems& de %orma "ue las ca!as in%eriores !uedan ser cam#iadas sin "ue las modi%icaciones re!ercutan en las ca!as su!eriores( )n !articular& el o#-etivo "ue se !retende en este e-em!lo y los dos siguientes es crear una ca!a de acceso a la #ase de datos di%erente en cada e-em!lo& !ero utili0ando el mismo inter%a0 de usuario y la misma agenda(
)sta inde!endencia entre las di%erentes ca!as es lo "ue con%iere su !otencia al modelo de desarrollo estructurado en ca!as& !ermitiendo una gran %le*i#ilidad en el desarrollo y mantenimiento de las a!licaciones( 1999 Jorge Ordovs Oromenda y Vicente Lema Osca 5D
)l lector utili0ar los siguientes elementos2 ,laFicha2 ya de%inida en anteriores e-em!los( $od1efiniciones2 m$dulo con las de%iniciones utili0adas en la a!licaci$n( Frm)4enda2 %ormulario corres!ondiente a la ca!a de inter%a0( 7esarrollaremos la clase corres!ondiente a la ca!a de agenda 6.la5genda:( .ontendr un o#-eto !rivado O#-5ccesoB7& de ti!o .la75OKJet& a trav1s del cual !odr interactuar con la #ase de datos( )sta clase !ro!orcionar los siguientes m1todos2 Pu)lic Pro.ert! "et Int6um ic0as,- As Inte'er 2 A1todo !ara o#tener el n@mero de %ic as de la agenda( Llamar al m1todo LumFic as del o#-eto O#-5ccesoBd( Pu)lic unction Crear ic0a,B!Val Str6om)re As Strin'$ B!Val StrA.ellidos As Strin'$ B!Val Str(ireccion As Strin'$ B!Val StrTele%ono As Strin'- As Inte'er 2 A1todo !ara crear una %ic a nueva en la agenda( .rear un o#-eto de la clase .laFic a y se lo !asar al m1todo MuardarFic a del o#-eto O#-5ccesoB7( Pu)lic unction Borrar ic0a,B!Val Int6um ic0a As Inte'er-2 A1todo !ara #orrar una %ic a de la agenda( <tili0ar el m1todo BorrarFic a del o#-eto O#-5ccesoB7( Pu)lic unction ic0a,?.tional B!Val IntIndice As Inte'er$ ?.tional B!Val Int6um ic0a As Inte'er- As Cla ic0a2 A1todo !ara o#tener una %ic a es!ec%ica de la agenda& ya sea !or ndice o !or n@mero de %ic a( <tili0ar el m1todo O#tenerFic a del o#-eto O#-5ccesoB7( Private Su) Class@Terminate,-2 5l eliminar la agenda es necesario cerrar la #ase de datos y eliminar el o#-eto O#-5ccesoB7( 7esarrollaremos tam#i1n la clase corres!ondiente a la ca!a de acceso a la #ase de datos& "ue utili0ar 75O y Jet 6.la75OKJet:( )sta ca!a !ro!orcionar los siguientes m1todos2 Pu)lic Pro.ert! "et 6um ic0as,- As Inte'er 2 A1todo !ara o#tener el n@mero de %ic as de la ta#la 5genda( Pu)lic unction A)rirA'enda,- As Codi'oRetorno2 A1todo !ara a#rir la #ase de datos( Pu)lic datos( unction CerrarA'enda,- As Codi'oRetorno 2 A1todo !ara cerrar la #ase de
;e recomienda al lector& !ara %acilitar la com!rensi$n de estos ca!tulos dedicados al acceso a #ases de datos desde Visual Basic& "ue utilice los c$digos !ro!orcionados en el manual !ara estos tres elementos& y desarrolle !ersonalmente las clases "ue im!lementan las dems ca!as( 1999 Jorge Ordovs Oromenda y Vicente Lema Osca 59
Curso de Visual Basic Avanzado Pu)lic unction "uardar ic0a,B!Val ?)+ ic0a As Cla ic0a$ ?.tional B!Re% Int6um ic0a As Inte'er- As Codi'oRetorno2 A1todo !ara guardar una %ic a( 7evuelve el n@mero de %ic a asignado !or la #ase de datos como cam!o autonum1rico( Pu)lic unction ?)tener ic0a,B!Re% ?)+ ic0a As Cla ic0a$ ?.tional B!Val IntIndice As Inte'er$ ?.tional B!Val Int6um ic0a As Inte'er- As Codi'oRetorno 2 A1todo !ara o#tener una %ic a es!ec%ica de la ta#la 5genda( Bermite #uscar !or ndice o !or n@mero de %ic a( Pu)lic unction Borrar ic0a,B!Val Int6um ic0a- As Codi'oRetorno 2 A1todo !ara #orrar una %ic a de la ta#la 5genda( Private Su) Class@Initialize,-2 5l crear un o#-eto de esta clase& de#e de llamarse automticamente a su corres!ondiente m1todo 5#rir5genda( ;eguiremos unas normas sencillas -unto con unos comentarios #reves& claros y concisos "ue %acilitarn la !osterior com!rensi$n del !rograma( 3odos los m1todos de la clase de acceso a la #ase de datos incluirn al comien0o la sentencia +n error #oto TratamientoError& con su corres!ondiente secci$n de tratamiento de error& !ara interce!tar los !osi#les errores del motor de la #ase de datos( 5dems& todas las %unciones devolvern un c$digo de retorno es!eci%icado !or el ti!o Cdi'oRetorno de%inido en el m$dulo Aod7e%iniciones& "ue determinar si an !odido reali0ar correctamente su %unci$n( Los m1todos de la clase de acceso a la #ase de datos utili0arn el motor Jet !ara acceder a la #ase de datos& a trav1s de las %unciones "ue 75O !ro!orciona(
6G
%&em'lo resuelto
<tili0aremos la clase Cla ic0a ya de%inida(
Mod(e%iniciones
JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK J )-em!lo 6 del .urso de Visual Basic 5van0ado J J 5rc ivo con el estndar de devoluci$n de las %unciones( JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK O!tion )*!licit Bu#lic )num .odigo9etorno )rror N G OI N 1 )nd )num
rmA'enda
JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK J )-em!lo 6 del .urso de Visual Basic 5van0ado J J 'nter%a0 del usuario con la #ase de datos& a"u estn los m1todos de mantenimiento de J la #ase de datos( JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK O!tion )*!licit 7im O#-5genda 5s Le, .la5genda 7im 'ntLumFic a5ctual 5s 'nteger Brivate ;u# ButBorrarFic aK.licI6: J .on%irmamos el #orrado '% AsgBo*6OQ7esea eliminar la %ic a actualRO& v#=esLo& OBorrado de %ic aO: N v#Lo 3 en )*it ;u# )nd '% J Borramos la %ic a actual O#-5genda(BorrarFic a 'ntLumFic a5ctual J 5ctuali0amos el n@mero de elementos de la #arra de scroll '% O#-5genda('ntLumFic as V G 3 en C;croll1(Aa* N O#-5genda('ntLumFic as 8 1 )lse C;croll1(Aa* N G )nd '% J 5ctuali0amos la #arra de scroll 5ctuali0arFormulario )nd ;u# Brivate ;u# But.rearFic aK.licI6:
61
Curso de Visual Basic Avanzado J .reamos una nueva %ic a con los datos introducidos !or el J usuario& y o#tenemos el c$digo de la %ic a creada 'ntLumFic a5ctual N O#-5genda(.rearFic a63*tLom#re& 3*t5!ellidos& 3*t7ireccion& K 3*t3ele%ono: J .om!ro#amos si no a !odido insertar una nueva %ic a& lo "ue J suceder si 'ntLumFic a5ctualNG '% 'ntLumFic a5ctual N G 3 en J 7ecrementamos el n@mero de elementos de la #arra de J scroll C;croll1(Aa* N C;croll1(Aa* 8 1 J 5ctuali0amos el %ormulario 5ctuali0arFormulario )*it ;u# )nd '% J 5ctuali0amos el ttulo del %rame Frame1(.a!tion N OFic a O P 'ntLumFic a5ctual J 7es a#ilitamos el #ot$n de crear %ic a y el %rame But.rearFic a()na#led N False Frame1()na#led N False J Ca#ilitamos los #otones de nueva %ic a y #orrar J %ic a& as como la #arra de scroll ButLuevaFic a()na#led N 3rue ButBorrarFic a()na#led N 3rue C;croll1()na#led N 3rue )nd ;u# Brivate ;u# ButLuevaFic aK.licI6: 7im 'ntLumFic as 5s 'nteger J 5ctuali0amos la #arra de scroll 'ntLumFic as N O#-5genda('ntLumFic as '% 'ntLumFic as N G 3 en J .on la !rimera %ic a creada& a#ilitamos J la #arra de scroll C;croll1()na#led N 3rue Frame1()na#led N 3rue )lse J )sta#lecemos el n@mero de elementos de J la #arra de scroll C;croll1(Aa* N C;croll1(Aa* / 1 C;croll1(Value N C;croll1(Aa* )nd '% J Ca#ilitamos el #ot$n de crear %ic a y el %rame But.rearFic a()na#led N 3rue Frame1()na#led N 3rue J 7es a#ilitamos los #otones de nueva %ic a y #orrar J %ic a& as como la #arra de scroll ButLuevaFic a()na#led N False ButBorrarFic a()na#led N False C;croll1()na#led N False )nd ;u# Brivate ;u# FormKLoad6:
62
Curso de Visual Basic Avanzado 7im 'ntLumFic as 5s 'nteger J .om!ro#amos si no ay datos en la agenda !ara J des a#ilitar las o!ciones 'ntLumFic as N O#-5genda('ntLumFic as '% 'ntLumFic as N G 3 en J 7es a#ilitamos el %rame& la #arra de scroll& J el #ot$n de crear %ic a y el #ot$n de #orrar %ic a Frame1()na#led N False C;croll1()na#led N False But.rearFic a()na#led N False ButBorrarFic a()na#led N False J )sta#lecemos los lmites de la #arra de scroll C;croll1(Aa* N G )lse J )sta#lecemos el m*imo de la #arra de scroll C;croll1(Aa* N 'ntLumFic as 8 1 J 5ctuali0amos el %ormulario 5ctuali0arFormulario )nd '% )nd ;u# Brivate ;u# FormK<nload6.ancel 5s 'nteger: J )liminamos la agenda ;et O#-5genda N Lot ing )nd ;u# Brivate ;u# C;croll1K. ange6: J 5ctuali0amos la #arra de scroll 5ctuali0arFormulario )nd ;u# Brivate Function 5ctuali0arFormulario6: 7im O#-Fic a 5s .laFic a J .om!ro#amos si no ay %ic as o estamos creando una %ic a nueva '% C;croll1(Aa* N O#-5genda('ntLumFic as 3 en J Lim!iamos los datos del %rame 3*tLom#re N v#Lull;tring 3*t5!ellidos N v#Lull;tring 3*t7ireccion N v#Lull;tring 3*t3ele%ono N v#Lull;tring J 5ctuali0amos el ttulo del %rame Frame1(.a!tion N v#Lull;tring J 7es a#ilitamos el #ot$n de #orrado ButBorrarFic a()na#led N False )lse J O#tenemos la %ic a corres!ondiente de la agenda J 6#uscamos !or ndice& no !or c$digo de %ic a: ;et O#-Fic a N Le, .laFic a ;et O#-Fic a N O#-5genda(Fic a6C;croll1(Value / 1: J ;acamos los datos de la %ic a '% Lot O#-Fic a 's Lot ing 3 en 3*tLom#re N O#-Fic a(;trLom#re 3*t5!ellidos N O#-Fic a(;tr5!ellidos
63
Curso de Visual Basic Avanzado 3*t7ireccion N O#-Fic a(;tr7ireccion 3*t3ele%ono N O#-Fic a(;tr3ele%ono J 5ctuali0amos el c$digo de la %ic a actual 'ntLumFic a5ctual N O#-Fic a('ntLumFic a J )liminamos el o#-eto %ic a creado ;et O#-Fic a N Lot ing J 5ctuali0amos el %rame Frame1(.a!tion N OFic a O P 'ntLumFic a5ctual )nd '% )nd '% )nd Function
ClaA'enda
JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK J )-em!lo 6 del .urso de Visual Basic 5van0ado J J A1todos !ara acceder a los m1todos de la clase& "ue sern los "ue tienen acceso a la J #ase de datos( JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK O!tion )*!licit Brivate O#-5ccesoB7 5s Le, .la75OKJet JO#-eto de acceso a la #ase de datos J A1todo !ara o#tener el n@mero de %ic as de la agenda Bu#lic Bro!erty Met 'ntLumFic as6: 5s 'nteger 'ntLumFic as N O#-5ccesoB7(LumFic as )nd Bro!erty J A1todo !ara crear una %ic a nueva en la agenda Bu#lic Function .rearFic a6ByVal ;trLom#re 5s ;tring& K ByVal ;tr5!ellidos 5s ;tring& ByVal ;tr7ireccion 5s ;tring& K ByVal ;tr3ele%ono 5s ;tring: 5s 'nteger ;tatic 'ntLumFic a 5s 'nteger 7im O#-Fic a 5s .laFic a J .reamos un nuevo o#-eto de la clase %ic a ;et O#-Fic a N Le, .laFic a J )sta#lecemos las !ro!iedades de la nueva %ic a O#-Fic a(;trLom#re N ;trLom#re O#-Fic a(;tr5!ellidos N ;tr5!ellidos O#-Fic a(;tr7ireccion N ;tr7ireccion O#-Fic a(;tr3ele%ono N ;tr3ele%ono J 'nsertamos la nueva %ic a en la #ase de datos '% O#-5ccesoB7(MuardarFic a6O#-Fic a& 'ntLumFic a: N OI 3 en J 7evolvemos el c$digo de la %ic a creada .rearFic a N 'ntLumFic a )lse J 7evolvemos G& !or"ue es un valor "ue nunca a!arecer J en un cam!o autonum1rico .rearFic a N G AsgBo* O'm!osi#le agregar una nueva %ic aO )nd '%
64
J )liminamos el o#-eto Fic a creado ;et O#-Fic a N Lot ing )nd Function J A1todo !ara #orrar una %ic a de la agenda Bu#lic Function BorrarFic a6ByVal 'ntLumFic a 5s 'nteger: 7im O#-Fic a 5s .laFic a '% O#-5ccesoB7(BorrarFic a6'ntLumFic a: N )rror 3 en AsgBo* O'm!osi#le #orrar la %ic a n^ O P 'ntLumFic a )nd '% )nd Function J 5l eliminar la agenda& cerraremos la #ase de datos y J eliminaremos el o#-eto de acceso a la #ase de datos Brivate ;u# .lassK3erminate6: '% O#-5ccesoB7(.errar5genda6: N )rror 3 en AsgBo* O'm!osi#le cerrar la agendaO )nd '% ;et O#-5ccesoB7 N Lot ing )nd ;u# J A1todo !ara o#tener una %ic a es!ec%ica de la agenda& ya sea J !or ndice o !or n@mero de %ic a J J LO352 la %unci$n crea un nuevo o#-eto Fic a& "ue a#r "ue J eliminar en la %unci$n de llamada Bu#lic Function Fic a6O!tional ByVal 'nt'ndice 5s 'nteger& K O!tional ByVal 'ntLumFic a 5s 'nteger: 5s .laFic a 7im O#-Fic a 5s Le, .laFic a J .om!ro#amos si se #usca !or ndice '% Lot 'sAissing6'nt'ndice: 3 en '% O#-5ccesoB7(O#tenerFic a6O#-Fic a& 'nt'ndice: N )rror 3 en AsgBo* O'm!osi#le o#tener la %ic a de la !osici$n n^ O P 'nt'ndice )*it Function )nd '% )lse'% Lot 'sAissing6'ntLumFic a: 3 en '% O#-5ccesoB7(O#tenerFic a6O#-Fic a& & 'ntLumFic a: N )rror 3 en AsgBo* O'm!osi#le o#tener la %ic a n^ O P 'ntLumFic a )*it Function )nd '% )nd '% ;et Fic a N O#-Fic a ;et O#-Fic a N Lot ing )nd Function
Cla(A?@Het
JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK J )-em!lo 6 del .urso de Visual Basic 5van0ado J J .lase de acceso a #ases de datos utili0ando 75O y J %unciones )4.L<;'V5; de Jet JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
65
Curso de Visual Basic Avanzado O!tion )*!licit Brivate VarB7 5s 7ata#ase Brivate VarBat B7 5s ;tring Brivate .onst .onLom#re3a#la N O5gendaO Bu#lic Bro!erty Met LumFic as6: 5s 'nteger On )rror Mo3o 3ratamiento)rror 7im 9set3a#la 5s 9ecordset J 5#rimos un recordset de ti!o d#O!enta#le ;et 9set3a#la N VarB7(O!en9ecordset6.onLom#re3a#la& d#O!en3a#le: J O#tenemos el n@mero de elementos LumFic as N 9set3a#la(9ecord.ount J .erramos el 9ecordset 9set3a#la(.lose )*it Bro!erty 3ratamiento)rror2 LumFic as N 81 )nd Bro!erty Bu#lic Function 5#rir5genda6: 5s .odigo9etorno On )rror Mo3o 3ratamiento)rror J 5#rimos la #ase de datos& utili0ando el +orIs!ace J !or de%ecto ;et VarB7 N 7B)ngine(+orIs!aces6G:(O!en7ata#ase6VarBat B7: 5#rir5genda N OI )*it Function 3ratamiento)rror2 5#rir5genda N )rror )nd Function Bu#lic Function .errar5genda6: 5s .odigo9etorno On )rror Mo3o 3ratamiento)rror J .erramos la #ase de datos VarB7(.lose .errar5genda N OI )*it Function 3ratamiento)rror2 .errar5genda N )rror )nd Function Bu#lic Function MuardarFic a6ByVal O#-Fic a 5s .laFic a& K O!tional By9e% 'ntLumFic a 5s 'nteger: 5s .odigo9etorno On )rror Mo3o 3ratamiento)rror 7im 9set3a#la 5s 9ecordset J 5#rimos un recordset de ti!o d#O!en3a#le 6s$lo %unciona J en Jet: ;et 9set3a#la N VarB7(O!en9ecordset6.onLom#re3a#la& d#O!en3a#le:
66
+it 9set3a#la J 5Eadimos una nueva %ic a (5ddLe, YLom#re N O#-Fic a(;trLom#re Y5!ellidos N O#-Fic a(;tr5!ellidos Y7ireccion N O#-Fic a(;tr7ireccion Y3ele%ono N O#-Fic a(;tr3ele%ono J O#tenemos el cam!o LumFic a 'ntLumFic a N YLumFic a (<!date )nd +it J .erramos el recordset 9set3a#la(.lose MuardarFic a N OI )*it Function 3ratamiento)rror2 MuardarFic a N )rror )nd Function Bu#lic Function O#tenerFic a6By9e% O#-Fic a 5s .laFic a& K O!tional ByVal 'nt'ndice 5s 'nteger& K O!tional ByVal 'ntLumFic a 5s 'nteger: 5s .odigo9etorno On )rror Mo3o 3ratamiento)rror 7im 9set3a#la 5s 9ecordset J .om!ro#amos si ay "ue #uscar !or ndice '% Lot 'sAissing6'nt'ndice: 3 en J 5#rimos un recordset de ti!o d#O!enFor,ardOnly& !ara !oder J movernos con AoveLe*t 6lo a#rimos For,ardOnly !or"ue s$lo J necesitamos des!la0arnos acia delante: ;et 9set3a#la N VarB7(O!en9ecordset6.onLom#re3a#la& d#O!enFor,ardOnly: J 9ecorremos el 9ecordset asta encontrar la %ic a indicada +it 9set3a#la 7o <ntil ()OF '% (9ecord.ount N 'nt'ndice 3 en )*it 7o )nd '% (AoveLe*t Loo! )nd +it J .om!ro#amos si ay "ue #uscar !or n@mero de %ic a )lse'% Lot 'sAissing6'ntLumFic a: 3 en J 5#rimos un recordset de ti!o d#O!en;na!s ot& !ara !oder J #uscar con FindFirst ;et 9set3a#la N VarB7(O!en9ecordset6.onLom#re3a#la& d#O!en;na!s ot: +it 9set3a#la J Llenamos el 9ecordset (AoveLast J )ncontramos el !rimer registro con ese n@mero (FindFirst OLumFic aNO P 'ntLumFic a )nd +it )nd '%
6>
Curso de Visual Basic Avanzado J .om!ro#amos si la emos encontrado& o emos llegado al J %inal del 9ecordset sin encontrarla +it 9set3a#la '% ()OF Or (LoAatc N 3rue 3 en O#tenerFic a N )rror )lse J Muardamos los datos o#tenidos O#-Fic a(;trLom#re N YLom#re O#-Fic a(;tr5!ellidos N Y5!ellidos O#-Fic a(;tr7ireccion N Y7ireccion O#-Fic a(;tr3ele%ono N Y3ele%ono O#-Fic a('ntLumFic a N YLumFic a O#tenerFic a N OI )nd '% )nd +it J .erramos el 9ecordset 9set3a#la(.lose )*it Function 3ratamiento)rror2 O#tenerFic a N )rror )nd Function Bu#lic Function BorrarFic a6ByVal 'ntLumFic a: 5s .odigo9etorno On )rror Mo3o 3ratamiento)rror 7im 9set3a#la 5s 9ecordset J 5#rimos un recordset de ti!o d#O!en7ynaset& !ara !oder J #uscar con FindFirst y #orrar con 7elete ;et 9set3a#la N VarB7(O!en9ecordset6.onLom#re3a#la& d#O!en7ynaset: J Buscamos la %ic a corres!ondiente +it 9set3a#la J Llenamos el 9ecordset (AoveLast J )ncontramos el !rimer registro con ese n@mero (FindFirst OLumFic aNO P 'ntLumFic a J .om!ro#amos si emos encontrado alg@n registro '% (LoAatc 3 en BorrarFic a N )rror )lse J Borramos la %ic a o#tenida (7elete BorrarFic a N OI )nd '% J .erramos el 9ecordset (.lose )nd +it BorrarFic a N OI )*it Function 3ratamiento)rror2 BorrarFic a N )rror
6D
Curso de Visual Basic Avanzado )nd Function Brivate ;u# .lassK'nitiali0e6: J )sta#lecemos el !at donde est el arc ivo de J la #ase de datos VarBat B7 N 5!!(Bat P O]#d5genda(md#O J 5#rirmos la #ase de datos 5#rir5genda )nd ;u#
69
Lormalmente se utili0a el modelo cliente8servidor !ara acceder a #ases de datos locali0adas en un servidor& ya "ue a!orta #astantes venta-as2 O!eraciones ms %ia#les y ro#ustas& !uesto "ue e*iste un @nico servidor de #ase de datos "ue interact@a con todos los clientes( Lota#le aumento del rendimiento de algunas o!eraciones& es!ecialmente cuando las estaciones de tra#a-o de los usuarios son e"ui!os de gama #a-a( 9educci$n del tr%ico de la red gracias a una transmisi$n de datos ms e%iciente( ;$lo se trans%ieren los datos "ue la a!licaci$n necesita( .aractersticas crticas como los registros de transacciones& las ca!acidades de co!ia de seguridad com!le-as& las matrices de discos redundantes y las erramientas de recu!eraci$n de %allos( La %orma ms com@n de acceder a un servidor de #ases de datos es a trav1s de O7B.( O7B. es una ca!a intermedia entre las a!licaciones "ue se e-ecutan en el cliente y el servidor de #ases de datos( )l controlador O7B. del cliente reci#e !eticiones de la a!licaci$n& las traduce a !eticiones O7B. y las enva al servidor( )l servidor res!onde al controlador O7B. del cliente& y 1ste !asa la res!uesta a la a!licaci$n( La venta-a de usar O7B. es la inde!endencia del ;MB7 6;istema Mestor de Bases de 7atos: utili0ado& !udiendo cam#iar 1ste reali0ando cam#ios mnimos en el c$digo de la a!licaci$n(
>G
Estructura de una a.licacin de )ases de datos en Visual )asic con (A? ! ?(BC(irect
<na a!licaci$n de #ases de datos en Visual Basic "ue utili0a 75O y O7B.7irect se comunica con el ;MB7 a trav1s del controlador O7B. corres!ondiente& como se muestra en la %igura2
>1
7im Var+Is 5s +orIs!ace 7im Var.one*ion 5s .onnection 7im .onst .on.adena.one*ion N OO7B.?7535B5;)NAiB7?<'7N?B+7N?7;LNAi7;LO Cone/in con el S"B(& Brimero necesitamos crear un es!acio de tra#a-o es!ec%ico !ara O7B. utili0ando la sentencia Create$or(s'ace( <na ve0 creado& esta#leceremos la cone*i$n con el ;MB7 utili0ando el m1todo +'enConnection de dic o es!acio de tra#a-o( ;et Var+Is N .reate+orIs!ace6OO& OO& OO& d#<seO7B.: ;et Var.one*ion N Var+Is(O!en.onnection6OO& & & .on.adena.one*ion: 2tilizacin de Recordsets& Los Recordsets creados con O7B.7irect son& en realidad& Resultsets de 97O( La %orma de tra#a-ar con estos Recordsets ser crear la consulta ;HL "ue genere el con-unto de registros #uscado y !asrsela al m1todo +'enRecordset de la cone*i$n creada( E+em.los de utilizacin de Recordsets& Bara sacar en la !antalla Debu# los datos de cada registro de la ta#la TAi3a#laU utili0aremos el m1todo +'enRecordset de la cone*i$n& !asndole la consulta ;HL "ue o#tiene todos los datos de la ta#la( Bara acceder a cada uno de los cam!os del registro actual& utili0aremos la colecci$n Fields del Recordset& "ue contiene todos los cam!os del registro actual( 7im 9set7atos 5s 9ecordset ;et 9set7atos N Var.one*ion(O!en9ecordset6Oselect [ %rom Ai3a#laO: +it 9set7atos 7o + ile Lot ()OF 7e#ug(Brint T7L'2 U P (Fields6G:(Value P v#.9LF P K TLom#re2 T P (Fields61:(Value P v#.9LF P K T5!ellidos2 T P (Fields62:(Value (AoveLe*t Loo! )nd +it Sentencias Mue no devuelven datos& .uando "ueremos reali0ar una acci$n so#re la #ase de datos "ue no devuelve ning@n con-unto de registros 6insert& u!date& delete& etc: utili0aremos el m1todo %*ecute de la cone*i$n& !asndole la sentencia ;HL a e-ecutar( Bara determinar si la acci$n se a reali0ado correctamente& consultaremos la !ro!iedad RowsA,ected de la cone*i$n( E+em.los de e+ecucin de sentencias Mue no devuelven datos& Bor e-em!lo& si "ueremos eliminar el registro con 7L'NU123456>DU2 Var.one*ion()*ecute Odelete %rom Ai3a#la , ere 7L'N_123456>D_U '% Var.one*ion(9ecords5%%ected N 1 3 en AsgBo* T9egistro #orradoU )lse AsgBo* T)rror al #orrar el registroU )nd '%
>2
>3
%&em'lo resuelto
<tili0aremos el %ormulario rmA'enda& el m$dulo Mod(e%iniciones y las clase Cla ic0a y ClaA'enda 6con la modi%icaci$n comentada:(
Cla(A?@?(BC(irect
JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK J )-em!lo > del .urso de Visual Basic 5van0ado J J .lase de acceso a #ases de datos utili0ando 75OKO7B.7irect JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK J .lase de acceso a #ases de datos utili0ando 75O y J O7B.7irect O!tion )*!licit Brivate Var+Is 5s +orIs!ace Brivate Var.one*ion 5s .onnection Brivate .onst .on.adena.one*ion N OO7B.?7535B5;)N5genda?<'7N?B+7N?7;LN5gendaO Bu#lic Bro!erty Met LumFic as6: 5s 'nteger On )rror Mo3o 3ratamiento)rror 7im 9set7atos 5s 9ecordset 7im .adena.one*ion 5s ;tring J .onstruimos la sentencia ;HL .adena.one*ion N Oselect count6[: %rom agendaO J )-ecutamos la consulta ;et 9set7atos N Var.one*ion(O!en9ecordset6.adena.one*ion: J O#tenemos el n@mero de %ic as LumFic as N 9set7atos(Fields6G:(Value J .erramos el 9ecordset 9set7atos(.lose )*it Bro!erty 3ratamiento)rror2 LumFic as N 81 )nd Bro!erty Bu#lic Function 5#rir5genda6: 5s .odigo9etorno On )rror Mo3o 3ratamiento)rror J .reamos el o#-eto +orIs!ace de O7B.7irect ;et Var+Is N .reate+orIs!ace6OO& K OO& OO& d#<seO7B.: J 5#rimos la cone*i$n utili0ando la cadena J de cone*i$n !rede%inida ;et Var.one*ion N Var+Is(O!en.onnection6OO& & & K .on.adena.one*ion:
>4
Curso de Visual Basic Avanzado 5#rir5genda N OI )*it Function 3ratamiento)rror2 5#rir5genda N )rror )nd Function Bu#lic Function .errar5genda6: 5s .odigo9etorno On )rror Mo3o 3ratamiento)rror J .erramos la #ase de datos Var.one*ion(.lose J .erramos el +orIs!ace Var+Is(.lose .errar5genda N OI )*it Function 3ratamiento)rror2 .errar5genda N )rror )nd Function Bu#lic Function MuardarFic a6ByVal O#-Fic a 5s .laFic a& K O!tional By9e% 'ntLumFic a 5s 'nteger: 5s .odigo9etorno On )rror Mo3o 3ratamiento)rror 7im 9set7atos 5s 9ecordset 7im .adena;HL 5s ;tring J .onstruimos la sentencia ;HL .adena;HL N Oinsert into agenda O P K O6Lom#re& 5!ellidos& 7ireccion& 3ele%ono: O P K Ovalues 6O P K OJO P O#-Fic a(;trLom#re P OJ&O P K OJO P O#-Fic a(;tr5!ellidos P OJ&O P K OJO P O#-Fic a(;tr7ireccion P OJ&O P K OJO P O#-Fic a(;tr3ele%ono P OJ:O J )-ecutamos la consulta Var.one*ion()*ecute .adena;HL J .om!ro#amos si se a reali0ado la inserci$n '% Var.one*ion(9ecords5%%ected \V 1 3 en MuardarFic a N )rror )*it Function )nd '% J O#tenemos el n@mero de %ic a asignado !or el servidor J LO352 en realidad& dado "ue el cam!o clave es el n@mero J de %ic a& este sentencia !uede devolver ms de un J registro& !ero no lo tendremos en cuenta .adena;HL N Oselect num%ic a %rom agenda O P K O, ere O P K OLom#reNJO P O#-Fic a(;trLom#re P OJ 5L7 O P K O5!ellidosNJO P O#-Fic a(;tr5!ellidos P OJ 5L7 O P K O7ireccionNJO P O#-Fic a(;tr7ireccion P OJ 5L7 O P K O3ele%onoNJO P O#-Fic a(;tr3ele%ono P OJO ;et 9set7atos N Var.one*ion(O!en9ecordset6.adena;HL:
>5
Curso de Visual Basic Avanzado '% Lot 9set7atos()OF 3 en J O#tenemos el c$digo de la nueva %ic a creada 'ntLumFic a N 9set7atos(Fields6G:(Value MuardarFic a N OI )lse MuardarFic a N )rror )nd '% J .erramos el 9ecordset 9set7atos(.lose )*it Function 3ratamiento)rror2 MuardarFic a N )rror )nd Function Bu#lic Function O#tenerFic a6By9e% O#-Fic a 5s .laFic a& K O!tional ByVal 'nt'ndice 5s 'nteger& K O!tional ByVal 'ntLumFic a 5s 'nteger: 5s .odigo9etorno On )rror Mo3o 3ratamiento)rror 7im 9set7atos 5s 9ecordset 7im .adena.one*ion 5s ;tring 7im 'ntFic a5ctual 5s 'nteger J .om!ro#amos si ay "ue #uscar !or ndice '% Lot 'sAissing6'nt'ndice: 3 en J 5#rimos un recordset seleccionando todos los J registros de la ta#la .adena.one*ion N Oselect [ %rom agenda order #y num%ic aO ;et 9set7atos N Var.one*ion(O!en9ecordset6.adena.one*ion: J 9ecorremos el 9ecordset asta encontrar la %ic a indicada +it 9set7atos 7o + ile Lot ()OF 'ntFic a5ctual N 'ntFic a5ctual / 1 '% 'ntFic a5ctual N 'nt'ndice 3 en )*it 7o )nd '% (AoveLe*t Loo! )nd +it J .om!ro#amos si ay "ue #uscar !or n@mero de %ic a )lse'% Lot 'sAissing6'ntLumFic a: 3 en J 5#rimos un recordset seleccionando el registro J directamente .adena.one*ion N Oselect [ %rom agenda O P K O, ere num%ic aNO P 'ntLumFic a P K Oorder #y num%ic aO ;et 9set7atos N Var.one*ion(O!en9ecordset6.adena.one*ion: )nd '% J .om!ro#amos si la emos encontrado& o emos llegado al J %inal del 9ecordset sin encontrarla +it 9set7atos '% ()OF 3 en O#tenerFic a N )rror )lse J Muardamos los datos o#tenidos O#-Fic a('ntLumFic a N (Fields6G:(Value O#-Fic a(;trLom#re N (Fields61:(Value
>6
Curso de Visual Basic Avanzado O#-Fic a(;tr5!ellidos N (Fields62:(Value O#-Fic a(;tr7ireccion N (Fields63:(Value O#-Fic a(;tr3ele%ono N (Fields64:(Value O#tenerFic a N OI )nd '% )nd +it J .erramos el 9ecordset 9set7atos(.lose )*it Function 3ratamiento)rror2 O#tenerFic a N )rror )nd Function Bu#lic Function BorrarFic a6ByVal 'ntLumFic a: 5s .odigo9etorno On )rror Mo3o 3ratamiento)rror 7im .adena;HL 5s ;tring J .onstruimos la sentencia ;HL .adena;HL N Odelete %rom agenda O P K O, ere num%ic aNO P 'ntLumFic a J )-ecutamos la sentencia ;HL Var.one*ion()*ecute .adena;HL J .om!ro#amos cuantas %ilas an sido a%ectadas '% Var.one*ion(9ecords5%%ected N 1 3 en BorrarFic a N OI )lse BorrarFic a N )rror )nd '% )*it Function 3ratamiento)rror2 BorrarFic a N )rror )nd Function Brivate ;u# .lassK'nitiali0e6: J .onectamos con la #ase de datos 5#rir5genda )nd ;u#
>>
>D
3i!o ta#le 3i!o 7ynaset 3i!o ;na!s ot 6sSl: 6ninguno: 3i!o %or,ard8only 6ninguno:
>9
DG
Curso de Visual Basic Avanzado TLom#re2 T P ( rdo.olumns61:(Value P v#.9LF P K T5!ellidos2 T P ( rdo.olumns62:(Value (AoveLe*t Loo! )nd +it Sentencias Mue no devuelven datos& La %orma de e-ecutar sentencias "ue no devuelven datos en 97O es id1ntica a la "ue ya emos visto con O7B.7irect(
D1
D2
%&em'lo resuelto
<tili0aremos el %ormulario rmA'enda& el m$dulo Mod(e%iniciones y las clase Cla ic0a y ClaA'enda 6con la modi%icaci$n comentada:(
ClaR(?
JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK J )-em!lo D del .urso de Visual Basic 5van0ado J J .lase de acceso a #ases de datos utili0ando 97O JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK O!tion )*!licit Brivate Var.one*ion 5s Le, rdo.onnection Brivate .onst .on.adena.one*ion N OO7B.?7535B5;)N5genda?<'7N?B+7N?7;LN5gendaO Bu#lic Bro!erty Met LumFic as6: 5s 'nteger On )rror Mo3o 3ratamiento)rror 7im 9set7atos 5s rdo9esultset 7im .adena.one*ion 5s ;tring J .onstruimos la sentencia ;HL .adena.one*ion N Oselect count6[: %rom agendaO J )-ecutamos la consulta ;et 9set7atos N Var.one*ion(O!en9esultset6.adena.one*ion: J O#tenemos el n@mero de %ic as LumFic as N 9set7atos(rdo.olumns6G:(Value J .erramos el rdoresultset 9set7atos(.lose )*it Bro!erty 3ratamiento)rror2 LumFic as N 81 )nd Bro!erty Bu#lic Function 5#rir5genda6: 5s .odigo9etorno On )rror Mo3o 3ratamiento)rror J 5#rimos la cone*i$n utili0ando la cadena J de cone*i$n !rede%inida +it Var.one*ion (.ursor7river N rd<seOd#c (.onnect N .on.adena.one*ion ()sta#lis .onnection rd7riverLoBrom!t )nd +it 5#rir5genda N OI )*it Function 3ratamiento)rror2 5#rir5genda N )rror )nd Function
D3
Curso de Visual Basic Avanzado Bu#lic Function .errar5genda6: 5s .odigo9etorno On )rror Mo3o 3ratamiento)rror J .erramos la #ase de datos Var.one*ion(.lose .errar5genda N OI )*it Function 3ratamiento)rror2 .errar5genda N )rror )nd Function Bu#lic Function MuardarFic a6ByVal O#-Fic a 5s .laFic a& K O!tional By9e% 'ntLumFic a 5s 'nteger: 5s .odigo9etorno On )rror Mo3o 3ratamiento)rror 7im 9set7atos 5s rdo9esultset 7im .adena;HL 5s ;tring J .onstruimos la sentencia ;HL .adena;HL N Oinsert into agenda O P K O6Lom#re& 5!ellidos& 7ireccion& 3ele%ono: O P K Ovalues 6O P K OJO P O#-Fic a(;trLom#re P OJ&O P K OJO P O#-Fic a(;tr5!ellidos P OJ&O P K OJO P O#-Fic a(;tr7ireccion P OJ&O P K OJO P O#-Fic a(;tr3ele%ono P OJ:O J )-ecutamos la consulta Var.one*ion()*ecute .adena;HL J .om!ro#amos si se a reali0ado la inserci$n '% Var.one*ion(9o,s5%%ected \V 1 3 en MuardarFic a N )rror )*it Function )nd '% J O#tenemos el n@mero de %ic a asignado !or el servidor J LO352 en realidad& dado "ue el cam!o clave es el n@mero J de %ic a& este sentencia !uede devolver ms de un J registro& !ero no lo tendremos en cuenta .adena;HL N Oselect num%ic a %rom agenda O P K O, ere O P K OLom#reNJO P O#-Fic a(;trLom#re P OJ 5L7 O P K O5!ellidosNJO P O#-Fic a(;tr5!ellidos P OJ 5L7 O P K O7ireccionNJO P O#-Fic a(;tr7ireccion P OJ 5L7 O P K O3ele%onoNJO P O#-Fic a(;tr3ele%ono P OJO ;et 9set7atos N Var.one*ion(O!en9esultset6.adena;HL: '% Lot 9set7atos()OF 3 en J O#tenemos el c$digo de la nueva %ic a creada 'ntLumFic a N 9set7atos(rdo.olumns6G:(Value MuardarFic a N OI )lse MuardarFic a N )rror )nd '% J .erramos el rdoresultset 9set7atos(.lose
D4
Curso de Visual Basic Avanzado )*it Function 3ratamiento)rror2 MuardarFic a N )rror )nd Function Bu#lic Function O#tenerFic a6By9e% O#-Fic a 5s .laFic a& K O!tional ByVal 'nt'ndice 5s 'nteger& K O!tional ByVal 'ntLumFic a 5s 'nteger: 5s .odigo9etorno On )rror Mo3o 3ratamiento)rror 7im 9set7atos 5s rdo9esultset 7im .adena.one*ion 5s ;tring 7im 'ntFic a5ctual 5s 'nteger J .om!ro#amos si ay "ue #uscar !or ndice '% Lot 'sAissing6'nt'ndice: 3 en J 5#rimos un rdoresultset seleccionando todos los J registros de la ta#la .adena.one*ion N Oselect [ %rom agenda order #y num%ic aO ;et 9set7atos N Var.one*ion(O!en9esultset6.adena.one*ion: J 9ecorremos el rdoresultset asta encontrar la %ic a indicada +it 9set7atos 7o + ile Lot ()OF 'ntFic a5ctual N 'ntFic a5ctual / 1 '% 'ntFic a5ctual N 'nt'ndice 3 en )*it 7o )nd '% (AoveLe*t Loo! )nd +it J .om!ro#amos si ay "ue #uscar !or n@mero de %ic a )lse'% Lot 'sAissing6'ntLumFic a: 3 en J 5#rimos un rdoresultset seleccionando el registro J directamente .adena.one*ion N Oselect [ %rom agenda O P K O, ere num%ic aNO P 'ntLumFic a P K Oorder #y num%ic aO ;et 9set7atos N Var.one*ion(O!en9esultset6.adena.one*ion: )nd '% J .om!ro#amos si la emos encontrado& o emos llegado al J %inal del rdoresultset sin encontrarla +it 9set7atos '% ()OF 3 en O#tenerFic a N )rror )lse J Muardamos los datos o#tenidos O#-Fic a('ntLumFic a N (rdo.olumns6G:(Value O#-Fic a(;trLom#re N (rdo.olumns61:(Value O#-Fic a(;tr5!ellidos N (rdo.olumns62:(Value O#-Fic a(;tr7ireccion N (rdo.olumns63:(Value O#-Fic a(;tr3ele%ono N (rdo.olumns64:(Value O#tenerFic a N OI )nd '% )nd +it J .erramos el rdoresultset 9set7atos(.lose
D5
Curso de Visual Basic Avanzado )*it Function 3ratamiento)rror2 O#tenerFic a N )rror )nd Function Bu#lic Function BorrarFic a6ByVal 'ntLumFic a: 5s .odigo9etorno On )rror Mo3o 3ratamiento)rror 7im .adena;HL 5s ;tring J .onstruimos la sentencia ;HL .adena;HL N Odelete %rom agenda O P K O, ere num%ic aNO P 'ntLumFic a J )-ecutamos la sentencia ;HL Var.one*ion()*ecute .adena;HL J .om!ro#amos cuantas %ilas an sido a%ectadas '% Var.one*ion(9o,s5%%ected N 1 3 en BorrarFic a N OI )lse BorrarFic a N )rror )nd '% )*it Function 3ratamiento)rror2 BorrarFic a N )rror )nd Function Brivate ;u# .lassK'nitiali0e6: J .onectamos con la #ase de datos 5#rir5genda )nd ;u#
D6
9. El re'istro de Findo7s
Introduccin
)l o#-etivo de este ca!tulo es introducir al lector en un tema com!le-o como es el tratamiento del registro de +indo,s( ;e e*!licar c$mo se estructura el registro de +indo,s& c$mo !odemos o#tener valores almacenados en 1l y c$mo crear nuevas claves y valores de di%erentes ti!os( Bero todos los accesos al registro de)en ser controlados& ya "ue del registro de!ende el correcto %uncionamiento del ;(O(& !or lo "ue cual"uier cam#io !odra re!ercutir en el %uncionamiento correcto del sistema( )l acceso al registro de +indo,s im!lica la utili0aci$n de las corres!ondientes %unciones "ue !ro!orciona el 5B' de +indo,s& !or lo "ue en este ca!tulo se e*!licar someramente "u1 es y c$mo se utili0a dic o 5B' 65!!lication Brogramming 'nter%ace& o 'nter%a0 !ara la Brogramaci$n de 5!licaciones:(
D>
3am#i1n !odemos acceder al registro de +indo,s desde Visual Basic utili0ando las %unciones "ue !ro!orciona el 5B' de +indo,s "ue veremos mas adelante& !ero antes !ro%undi0aremos en la de%inici$n del re4istro(
DD
Bero el !ro#lema "ue tienen los visores 5B' es "ue no !ro!orcionan una #reve e*!licaci$n del contenido de el 5B' seleccionada& !or lo "ue muc as veces ay "ue usar la intuici$n !ara encontrar una "ue nos solucione el !ro#lema( )n el siguiente cuadro se muestran algunas de las %unciones "ue !ro!orciona el 5B' de +indo,s !ara acceso al registro y su corres!ondiente declaraci$n2 uncin 9egO!enZey 9eg.loseZey (escri.cin 5#re una e*istente (eclaracin clave 7eclare Function O;9egO!enZey Li# Oadva!i32O 5lias O9egO!enZey5O 6ByVal Zey 5s Long& ByVal l!s0;u#Zey 5s ;tring& ! I9esult 5s Long: 5s Long .ierra una clave a#ierta 7eclare Function O;9eg.loseZey Li# Oadva!i32O con 9egO!enZey 5lias O9eg.loseZeyO 6ByVal Zey 5s Long: 5s Long
D9
O#tiene el valor de una clave& es!eci%icando tam#i1n su ti!o )sta#lece el valor de una clave
9eg;etValue)*
7eclare Function O;9eg.reateZey Li# Oadva!i32O 5lias O9eg.reateZey5O 6ByVal Zey 5s Long& ByVal l!s0;u#Zey 5s ;tring& ! I9esult 5s Long: 5s Long 7eclare Function O;9eg7eleteZey Li# Oadva!i32O 5lias O9eg7eleteZey5O 6ByVal Zey 5s Long& ByVal l!s0;u#Zey 5s ;tring: 5s Long 7eclare Function O;9egHueryValue)* Li# Oadva!i32O 5lias O9egHueryValue)*5O 6ByVal Zey 5s Long& ByVal l!s0ValueLame 5s ;tring& ByVal d,9eserved 5s Long& l!d,3y!e 5s Long& l!#7ata 5s 5ny& c#7ata 5s Long: 5s Long 7eclare Function O;9eg;etValue)* Li# Oadva!i32O 5lias O9eg;etValue)*5O 6ByVal Zey 5s Long& ByVal l!s0ValueLame 5s ;tring& ByVal d,9eserved 5s Long& ByVal %d,3y!e 5s Long& l!#7ata 5s 5ny& ByVal c#7ata 5s Long: 5s Long
Bara !oder utili0ar estas %unciones es necesario declarar tam#i1n varias constantes& "ue se es!eci%ican en el siguiente cuadro2 Constante Mlo#al .onst CZ)=K.L5;;);K9OO3 N PCDGGGGGGG Mlo#al .onst CZ)=K.<99)L3K<;)9 N PCDGGGGGG1 Mlo#al .onst CZ)=KLO.5LKA5.C'L) N PCDGGGGGG2 Mlo#al .onst CZ)=K<;)9; N PCDGGGGGG3 .onst )99O9K;<..);; N GP .onst 9)MK;` N 1 .onst 9)MKB'L59= N 3 .onst 9)MK7+O97 N 4 A.ertura de una clave e/istente& Bara a#rir una clave e*istente de#emos es!eci%icar la rama donde se encuentra 6CZ)=K.L5;;);K9OO3& etc: y el :path; restante de la clave "ue "ueremos a#rir( <na ve0 a#ierta& nos devolver un valor de ti!o long "ue identi%ica a esa clave& y nos !ermitir tra#a-ar con ella( <tili0aremos la %unci$n Re#+'en;e!& controlando si el valor de retorno es %RR+R7S"CC%SS& lo "ue indicara "ue todo a ido #ien( Bor e-em!lo& si "ueremos a#rir la clave CZ)=KLO.5LKA5.C'L)];OF3+59)]Aicroso%t utili0aramos el siguiente c$digo2 7im Zey 5s Long '% O;9egO!enZey6CZ)=KLO.5LKA5.C'L)& T;OF3+59)]Aicroso%tU& Zey: N )99O9K;<..);; 3 en AsgBo* T.lave a#iertaU )lse AsgBo* T)rror al a#rir la claveU )nd '% (escri.cin 7e%ine la rama CZ)=K.L5;;);K9OO3 7e%ine la rama CZ)=K.<99)L3K<;)9 7e%ine la rama CZ)=KLO.5LKA5.C'L) 7e%ine la rama CZ)=K<;)9; Valor de error 3i!o de dato ;tring 3i!o de dato #inario 3i!o de dato 7+O97
)*isten ms constantes de este ti!o& !ero s$lo mencionamos las necesarias !ara el desarrollo del e-em!lo corres!ondiente a este ca!tulo 1999 Jorge Ordovs Oromenda y Vicente Lema Osca 9G
Curso de Visual Basic Avanzado Cerrado de una clave a)ierta& Bara cerrar una clave a#ierta& utili0aremos la %unci$n Re#Close;e!& !asndole el identi%icador de la clave a#ierta( 3am#i1n en este caso de#emos com!ro#ar si el valor devuelto !or la %unci$n es )99O9K;<..);;( Bor e-em!lo& !ara cerrar la clave a#ierta en el e-em!lo anterior& utili0aramos el siguiente %ragmento de c$digo2 '% O;9eg.loseZey6 Zey: N )99O9K;<..);; 3 en AsgBo* T.lave cerradaU )lse AsgBo* T)rror al cerrar la claveU )nd '% Creacin de una clave nueva& Bara crear una clave nueva en el registro utili0aremos la %unci$n Re#Create;e!( )sta %unci$n crear la clave nueva 6o la a#rir& si e*iste: y nos !ro!orcionar el identi%icador de la clave reci1n credaSa#ierta( .omo en los casos anteriores& emos de com!ro#ar si devuelve )99O9K;<..);;( Bor e-em!lo& !ara crear la clave CZ)=KLO.5LKA5.C'L)];OF3+59)]Ai.lave utili0aramos la siguiente sentencia2 '% O;9eg.reateZey6CZ)=KLO.5LKA5.C'L)& O;OF3+59)]Ai.laveO& ZeyLueva: N )99O9K;<..);; t en AsgBo* T.lave creadaU )lse AsgBo* T)rror al crear la claveU )nd '% Esta)lecimiento del valor de una clave Bara esta#lecer el valor de una clave e*istente utili0aremos la %unci$n Re#SetValue%*& a la "ue !asaremos el identi%icador de la clave a#ierta& el nom#re "ue vamos a darle a ese valor 6si no se es!eci%ica& se entender "ue es el valor !or de%ecto de dic a clave: y el !ro!io valor( )s necesario concretar "u1 ti!o de valor es 6una cadena 69)MK;`:& un valor #inario 69)MKB'L59=: o un valor num1rico 69)MK7+O97:: y "u1 longitud tiene( Bor e-em!lo& una ve0 creada la clave anterior& crearemos un valor nuevo dentro de ella "ue se llamar AiValor y contendr la cadena T)sto es una !rue#aU2 '% O;9eg;etValue)*6 ZeyLueva& TAiValorU& GP& 9)MK;`& T)sto es una !rue#aU& Len6T)sto es una !rue#aU: / 1: N )99O9K;<..);; t en AsgBo* TValor creadoU )lse AsgBo* T)rror al crear el valorU )nd '% 7entro de la misma clave& crearemos un nuevo valor llamado AiLuevoValor& "ue contendr el n@mero 1> 6como vamos a crearlo como 9)MK7+O97& el tamaEo es 4:2 '% O;9eg;etValue)*6 ZeyLueva& TAiLuevoValorU& GP& 9)MK7+O97& 1>& 4: N )99O9K;<..);; t en AsgBo* TValor creadoU )lse AsgBo* T)rror al crear el valorU )nd '%
91
Curso de Visual Basic Avanzado ?)tencin de al'uno de los valores de una clave& Bara o#tener alguno de los valores asociados a una clave utili0aremos la %unci$n Re# uer!Value%*& a la "ue !asaremos el identi%icador de la clave a#ierta& el nom#re del valor "ue "ueremos o#tener 6si no se es!eci%ica& se entender "ue es el valor !or de%ecto de dic a clave:& una varia#le donde se guardar el ti!o del valor recogido& un buffer donde se guardar el valor recogido y una varia#le donde se guardar el tamaEo del valor recogido( .omo es !osi#le o#tener valores de ti!os y tamaEos di%erentes& esta %unci$n se llamar dos veces2 la !rimera con un buffer vaco 6GP: !ara o#tener el ti!o y el tamaEo del valor? la segunda con el buffer corres!ondiente a este ti!o y de tamaEo correcto 6XOJOY2 en el caso de R%-7S< de#emos reservar e*!resamente es!acio de memoria:( <na ve0 o#tenido el valor& ay "ue coger s$lo el tamaEo es!eci%icado del valor( Bor e-em!lo& si "ueremos o#tener el valor AiValor de la clave anterior& utili0aremos la siguiente sentencia 6XOJOY2 el 0!Val es im!ortante: 7im lValue3y!e as Long 7im ;trBu% 5s ;tring 7im l7ataBu%;i0e 5s Long '% O;9egHueryValue)*6 ZeyLueva& TAiValorU& GP& lValue3y!e& ByVal GP& l7ataBu%;i0e: N )99O9K;<..);; 3 en '% lValue3y!e N 9)MK;` 3 en ;trBu% N ;tring6l7ataBu%;i0e& O O: '% O;9egHueryValue)*6 Zey& strValueLame& GP& GP& ByVal ;trBu%& l7ataBu%;i0e: N )99O9K;<..);; 3 en 9egHuery;tringValue N 3rue ;tr7ata N Le%t6;trBu%& l7ataBu%;i0e 8 1: )nd '% )nd '% )nd '% ;i "ueremos o#tener el valor AiLuevoValor de la clave anterior& utili0aremos la sentencia2 7im lValue3y!e 5s Long 7im lBu% 5s Long 7im l7ataBu%;i0e 5s Long l7ataBu%;i0e N 4 '% O;9egHueryValue)*6 ZeyLueva& TAiLuevoValorU& GP& lValue3y!e& lBu%& l7ataBu%;i0e: N )99O9K;<..);; 3 en '% lValue3y!e N 9)MK7+O97 3 en l7ata N lBu% )nd '% )nd '% Borrado de una clave& Bara #orrar una clave e*istente utili0aremos la %uncion Re#Delete;e!& a la "ue !asaremos el identi%icador de la clave a#ierta y la su#clave "ue "ueremos #orrar( Bor e-em!lo& !ara #orrar la clave CZ)=KLO.5LKA5.C'L)];OF3+59)]Ai.lave y todo lo "ue a !artir de ella emos creado& utili0aramos la sentencia2 '% O;9egO!enZey6CZ)=KLO.5LKA5.C'L)& T;OF3+59)U& Zey: N )99O9K;<..);; 3 en '% O;9eg7eleteZey6 Zey& OAi.laveO: N )99O9K;<..);; t en AsgBo* T.lave #orradaU )nd '% )nd '%
92
)stas %unciones utili0aran sus corres!ondientes %unciones del 5B' de +indo,s& tal y como se a e*!licado antes en este ca!tulo( .rearemos un %ormulario FrmBresentacion de inicio de la a!licaci$n como el "ue a!arece en la siguiente %igura2
93
.ada ve0 "ue se e-ecute la a!licaci$n se lan0arara este %ormulario 6!ara este e-em!lo no a#r a!licaci$n "ue lan0ar2 tanto si la a!licaci$n se registra como si es est en !erodo de !rue#a o se su!era 1ste& el %ormulario se descargar y nada ms:( La !rimera ve0 "ue se e-ecute la a!licaci$n& este %ormulario crear una clave CZ)=KLO.5LKA5.C'L)];OF3+59)]5genda en el registro& y en esta clave dos valores2 Aa*'ntentosN1G y Lum'ntentosN1( 5ctuali0ar el ca!tion del la#el in%erior !ara mostrar el n@mero m*imo de e-ecuciones !ermitidas y el n@mero actual de e-ecuciones( .ada ve0 "ue se e-ecute la a!licaci$n se incrementar Lum'ntentos y se com!ro#ar si es menor "ue Aa*'ntentos& de %orma "ue si se llega al n@mero m*imo de intentos no se !ermita la e-ecuci$n del !rograma( )n cada caso se actuali0ar el ca!tion( )n todo momento se !ermitir registrar la a!licaci$n& en cuyo caso se lan0ar un %ormulario como el siguiente2
5l !ulsar el #ot$n ace!tar& crearemos un nuevo valor 7atos9egistro en nuestra clave& "ue contendr el nom#re y clave de registro se!arados !or un gui$n( La a!licaci$n de#e com!ro#ar cada ve0 "ue se e-ecuta si e*iste el valor 7atos9egistro& en cuyo caso se su!one "ue est registrada y no se tomar en cuenta el valor de Lum'ntentos y Aa*'ntentos del registro& !ermitiendo siem!re lan0ar la a!licaci$n 6en nuestro caso siem!re se descargar el %ormulario:(
94
95
Curso de Visual Basic Avanzado J .om!ro#amos si est registrado ;tr.lave N O7atos9egistroO '% 9egHuery;tringValue6 Iey)*istente& ;tr.lave& ;tr.adena9egistro: 3 en La#3e*toBresentacion(.a!tion N OVersi$n registrada& com!letamenta o!eracional(O P v#.rL% P OXX7is%r@telaYYO 9eg.loseZey Iey)*istente But9egistrar()na#led N False )*it ;u# )nd '% J .omo no est registrado& o#tenemos el n@mero m*imo de intentos ;tr.lave N OAa*'ntentosO '% 9egHueryLumericValue6 Iey)*istente& ;tr.lave& LngAa*'ntentos: 3 en J .om!ro#amos cuntos intentos van ;tr.lave N OLum'ntentosO '% 9egHueryLumericValue6 Iey)*istente& ;tr.lave& LngLum'ntentos: 3 en J .om!ro#amos si se a llegado al n@mero m*imo de intentos '% LngLum'ntentos \ LngAa*'ntentos 3 en J 'ncrementamos el n@mero de usos y lo guardamos en el registro LngLum'ntentos N LngLum'ntentos / 1 9eg;etLumericValue Iey)*istente& OLum'ntentosO& LngLum'ntentos J 5ctuali0amos el %ormulario La#Lum<sos(.a!tion N OLa agenda a sido utili0ada O P LngLum'ntentos P O veces 6m*imo O P LngAa*'ntentos P O:O )lse La#Lum<sos(.a!tion N OLa agenda a sido utili0ada O P LngLum'ntentos P O veces 6m*imo O P LngAa*'ntentos P O:( 9egistre la versi$n antes de continuar(O )nd '% )nd '% )nd '% 9eg.loseZey Iey)*istente )lse J .omo no e*iste& la creamos '% 9eg.reateZey6CZ)=KLO.5LKA5.C'L)& O;OF3+59)]5gendaO& Zey: 3 en J L@mero m*imo de intentos 9eg;etLumericValue Zey& OAa*'ntentosO& .onAa*'ntentos J L@mero de intentos reali0ado 9eg;etLumericValue Zey& OLum'ntentosO& 1 9eg.loseZey Zey J 5ctuali0amos el %ormulario La#Lum<sos(.a!tion N OLa agenda .onAa*'ntentos P O:O )nd '% )nd '% )nd ;u# a sido utili0ada 1 ve0 6m*imo O P
96
rmRe'istro
JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK J )-em!lo 9 del .urso de Visual Basic 5van0ado J J Formulario !ara introducir los datos del registro de la a!licaci$n( JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK O!tion )*!licit Brivate ;u# But5ce!tarK.licI6: 7im Iey)*istente 5s Long 7im ;tr.lave 5s ;tring 7im ;tr.adena9egistro 5s ;tring J 9egistramos la a!licaci$n 6!odramos com!ro#ar si es aut1ntico: '% 9egO!enZey6CZ)=KLO.5LKA5.C'L)& O;OF3+59)]5gendaO& Iey)*istente: 3 en J Lo registramos ;tr.adena9egistro N 3e*t1(3e*t P O8O P 3e*t2(3e*t ;tr.lave N O7atos9egistroO '% 9eg;et;tringValue6 Iey)*istente& ;tr.lave& ;tr.adena9egistro: 3 en AsgBo* OLa a!licaci$n a sido registrada con 1*ito(O& & O9egistroO <nload Ae )nd '% )nd '% )nd ;u# Brivate ;u# But9egistrarK.licI6: <nload Ae )nd ;u#
ModRe'istro
JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK J )-em!lo D del .urso de Visual Basic 5van0ado J J A$dulo donde estn las %unciones de acceso al registro y las declaraciones de las 5B'( JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK O!tion )*!licit J 5B' de mani!ulaci$n del regi;tro 632 #its: 7eclare Function O;9eg.loseZey Li# Oadva!i32O 5lias O9eg.loseZeyO 6ByVal Zey 5s Long: 5s Long 7eclare Function O;9eg.reateZey Li# Oadva!i32O 5lias O9eg.reateZey5O 6ByVal Zey 5s Long& ByVal l!s0;u#Zey 5s ;tring& ! I9esult 5s Long: 5s Long 7eclare Function O;9eg7eleteZey Li# Oadva!i32O 5lias O9eg7eleteZey5O 6ByVal Zey 5s Long& ByVal l!s0;u#Zey 5s ;tring: 5s Long 7eclare Function O;9egO!enZey Li# Oadva!i32O 5lias O9egO!enZey5O 6ByVal Zey 5s Long& ByVal l!s0;u#Zey 5s ;tring& ! I9esult 5s Long: 5s Long 7eclare Function O;9egHueryValue)* Li# Oadva!i32O 5lias O9egHueryValue)*5O 6ByVal Zey 5s Long& ByVal l!s0ValueLame 5s ;tring& ByVal d,9eserved 5s Long& l!d,3y!e 5s Long& l!#7ata 5s 5ny& c#7ata 5s Long: 5s Long 7eclare Function O;9eg;etValue)* Li# Oadva!i32O 5lias O9eg;etValue)*5O 6ByVal Zey 5s Long& ByVal l!s0ValueLame 5s ;tring& ByVal d,9eserved 5s Long& ByVal %d,3y!e 5s Long& l!#7ata 5s 5ny& ByVal c#7ata 5s Long: 5s Long Mlo#al .onst CZ)=K.L5;;);K9OO3 N PCDGGGGGGG
9>
Curso de Visual Basic Avanzado Mlo#al .onst CZ)=K.<99)L3K<;)9 N PCDGGGGGG1 Mlo#al .onst CZ)=KLO.5LKA5.C'L) N PCDGGGGGG2 Mlo#al .onst CZ)=K<;)9; N PCDGGGGGG3 .onst )99O9K;<..);; N GP .onst 9)MK;` N 1 .onst 9)MKB'L59= N 3 .onst 9)MK7+O97 N 4 J .rea 6o a#re si ya e*iste: una clave en el registro del sistema Function 9eg.reateZey6ByVal Zey 5s Long& ByVal l!s0Zey 5s ;tring& ! I9esult 5s Long: 5s Boolean On )rror Mo3o G '% O;9eg.reateZey6 Zey& l!s0Zey& ! I9esult: N )99O9K;<..);; 3 en 9eg.reateZey N 3rue )lse 9eg.reateZey N False )nd '% )nd Function J 5socia un valor con nom#re 6;trValueLame N nom#re: o sin nom#re 6;trValueLame N OO: J con una clave del regi;tro( Function 9eg;et;tringValue6ByVal Zey 5s Long& ByVal strValueLame 5s ;tring& ByVal ;tr7ata 5s ;tring: 5s Boolean On )rror Mo3o G '% Zey N G 3 en )*it Function '% O;9eg;etValue)*6 Zey& strValueLame& GP& 9)MK;`& ByVal ;tr7ata& K Len6;tr7ata: / 1: N )99O9K;<..);; 3 en 9eg;et;tringValue N 3rue )lse 9eg;et;tringValue N False )nd '% )nd Function J 5socia un valor con nom#re 6strValueLame N nom#re: o sin nom#re 6strValueLame N OO: J con una clave del registro( Function 9eg;etLumericValue6ByVal Zey 5s Long& ByVal strValueLame 5s ;tring& ByVal l7ata 5s Long& O!tional ByVal %Log: 5s Boolean On )rror Mo3o G '% O;9eg;etValue)*6 Zey& )99O9K;<..);; 3 en 9eg;etLumericValue N 3rue )lse 9eg;etLumericValue N False )nd '% )nd Function strValueLame& GP& 9)MK7+O97& l7ata& 4: N
J 5#re una clave e*istente en el registro del sistema( Function 9egO!enZey6ByVal Zey 5s Long& ByVal l!s0;u#Zey 5s ;tring& ! I9esult 5s Long: 5s Boolean On )rror Mo3o G '% O;9egO!enZey6 Zey& l!s0;u#Zey& ! I9esult: N )99O9K;<..);; 3 en 9egO!enZey N 3rue )lse 9egO!enZey N False
9D
Curso de Visual Basic Avanzado )nd '% )nd Function J )limina una clave e*istente del regi;tro del sistema( Function 9eg7eleteZey6ByVal Zey 5s Long& ByVal l!s0;u#Zey 5s ;tring: 5s Boolean On )rror Mo3o G '% O;9eg7eleteZey6 Zey& l!s0;u#Zey: N )99O9K;<..);; 3 en 9eg7eleteZey N 3rue )lse 9eg7eleteZey N False )nd '% )nd Function J .ierra una clave a#ierta del registro Function 9eg.loseZey6ByVal Zey 5s Long: 5s Boolean On )rror Mo3o G '% O;9eg.loseZey6 Zey: N )99O9K;<..);; 3 en 9eg.loseZey N 3rue )lse 9eg.loseZey N False )nd '% )nd Function J 9ecu!era los datos de cadena !ara un valor con nom#re J 6;trValueLame N nom#re: o sin nom#re 6;trValueLame N OO: J dentro de una clave del regi;tro( ;i el valor con J nom#re e*iste& !ero sus datos no son una cadena& esta J %unci$n %allar( Function 9egHuery;tringValue6ByVal Zey 5s Long& ByVal strValueLame 5s ;tring& ;tr7ata 5s ;tring: 5s Boolean On )rror Mo3o G 7im lValue3y!e 5s Long 7im ;trBu% 5s ;tring 7im l7ataBu%;i0e 5s Long 9egHuery;tringValue N False J O#tiene el ti!o y longitud de los datos '% O;9egHueryValue)*6 Zey& strValueLame& GP& lValue3y!e& ByVal GP& l7ataBu%;i0e: N )99O9K;<..);; 3 en '% lValue3y!e N 9)MK;` 3 en ;trBu% N ;tring6l7ataBu%;i0e& O O: '% O;9egHueryValue)*6 Zey& strValueLame& GP& GP& ByVal ;trBu%& l7ataBu%;i0e: N )99O9K;<..);; 3 en ;tr7ata N Le%t6;trBu%& l7ataBu%;i0e 8 1: 9egHuery;tringValue N 3rue )nd '% )nd '% )nd '% )nd Function J 9ecu!era los datos enteros !ara un valor con nom#re J 6;trValueLame N nom#re: o sin nom#re 6;trValueLame N OO: J dentro de una clave del regi;tro( ;i el valor con nom#re J e*iste& !ero sus datos no son de ti!o 9)MK7+O97& esta J %unci$n %allar( Function 9egHueryLumericValue6ByVal Zey 5s Long& ByVal strValueLame 5s ;tring& l7ata 5s Long: 5s Boolean
99
Curso de Visual Basic Avanzado On )rror Mo3o G 7im lValue3y!e 5s Long 7im lBu% 5s Long 7im l7ataBu%;i0e 5s Long 9egHueryLumericValue N False J O#tiene el ti!o y longitud de los datos l7ataBu%;i0e N 4 '% O;9egHueryValue)*6 Zey& strValueLame& GP& lValue3y!e& lBu%& l7ataBu%;i0e: N )99O9K;<..);; 3 en '% lValue3y!e N 9)MK7+O97 3 en l7ata N lBu% 9egHueryLumericValue N 3rue )nd '% )nd '% )nd Function
1GG
Limitaciones de controles
.ada control no gr%ico 6todos los controles e*ce!to Sha'e& Line, Ima#e y Label: utili0a una ventana( .ada ventana utili0a recursos del sistema& limitando el n@mero total de ventanas "ue !ueden e*istir al mismo tiem!o( )l lmite e*acto de!ende de los recursos del sistema dis!oni#les y el ti!o de controles "ue se utilicen( Bara reducir el consumo de recursos& utilice controles Sha'e, Line, Label e Ima#e en ve0 de los controles Picture0o* !ara crear o !resentar gr%icos(
1G1
Ta# )ame
Limitaciones de cdi#o
La cantidad de c$digo "ue se !uede cargar en un %ormulario& clase o m$dulo estndar est limitada a 65(534 lneas( <na @nica lnea de c$digo !uede constar de 1(G23 #ytes como m*imo( Buede a#er asta 256 es!acios en #lanco delante del te*to en una @nica lnea y no se !ueden incluir ms de veinticinco caracteres de continuaci$n de lnea 6 K: en una @nica lnea l$gica(
1G2
Es.acio de .ila
Los argumentos y las varia#les locales en los !rocedimientos ocu!an es!acio de !ila en tiem!o de e-ecuci$n( Las varia#les estticas y a nivel de m$dulo no ocu!an es!acio de !ila !or"ue se encuentran en el segmento de datos !ara los %ormularios o los m$dulos( 3odos los !rocedimientos de 7LL a los "ue se llame utili0an esta !ila mientras se estn e-ecutando( Visual Basic utili0a !arte de la !ila !ara sus !ro!ios usos& como el almacenamiento de valores intermedios al evaluar e*!resiones(
Recursos de Findo7s
.ada ventana a#ierta usa recursos del sistema 6reas de datos utili0adas !or Aicroso%t +indo,s:( ;i se agotan los recursos del sistema& se !roducir un error en tiem!o de e-ecuci$n( Buede com!ro#ar el !orcenta-e de recursos del sistema "ue "uedan si elige Acerca de en el men@ A!uda del 5dministrador de !rogramas o del 5dministrador de arc ivos en +indo,s L3
1G3
Curso de Visual Basic Avanzado 3(51 o& en +indo,s 95 y +indo,s L3 4(G& si elige Acerca de en el men@ A!uda del )*!lorador de +indo,s( Las a!licaciones tam#i1n !ueden llamar a la %unci$n MetFree;ystem9esources de el 5B' de +indo,s !ara reclamar recursos del sistema& cerrar ventanas 6como %ormularios a#iertos y ventanas de c$digo& as como ventanas de otras a!licaciones: y %inali0ar la e-ecuci$n de a!licaciones(
1G4
Curso de Visual Basic Avanzado (v#r (v#, (v#0 5rc ivo de registro de 5utomati0aci$n remota 5rc ivo de es!acio de tra#a-o de !royecto de Visual Basic 5rc ivo de inicio del 5sistente
Estructuras de %ormularios
5 !esar de "ue muc os de los arc ivos de un t!ico !royecto de Visual Basic estn en %ormato #inario y s$lo los !ueden leer determinados !rocesos y %unciones de Visual Basic o de su a!licaci$n& los arc ivos de %ormulario 6(%rm: y de !royecto 6(v#!: se guardan como te*to 5;.''( )stos arc ivos se !ueden leer en un visor de te*to 6!or e-em!lo& el Bloc de notas:( )n las siguientes secciones se descri#en los arc ivos de tiem!o diseEo y de tiem!o de e-ecuci$n en un !royecto t!ico de Visual Basic y el %ormato de los arc ivos de %ormulario 6(%rm: y de !royecto 6(v#!:( Los arc ivos de %ormulario de Visual Basic 6(%rm: se crean y se guardan en %ormato 5;.''( La estructura de un %ormulario consiste en lo siguiente2 )l n@mero de versi$n del %ormato de arc ivo( <n #lo"ue de te*to "ue contiene la descri!ci$n del %ormulario( <n con-unto de atri#utos del %ormulario( )l c$digo Basic del %ormulario( La descri!ci$n del %ormulario contiene los valores de las !ro!iedades del %ormulario( Los #lo"ues de te*to "ue de%inen las !ro!iedades de los controles del %ormulario estn anidados en el %ormulario( Los controles contenidos en otros controles tienen sus !ro!iedades anidadas en el te*to del contenedor( La %igura 5(1 ilustra la estructura de la descri!ci$n del %ormulario(
6Qmero de versin
)l n@mero de versi$n !ara los %ormularios creados con Visual Basic 5(G !ara +indo,s es 5(GG( ;i en un %ormulario se omite el n@mero de versi$n& se generar un error( 5l cargar una a!licaci$n de Visual Basic "ue tiene un n@mero de versi$n menor "ue 5(GG& a!arece un cuadro de dilogo de advertencia !ara in%ormar "ue el arc ivo se guardar en el nuevo %ormato(
1G5
BloMues de control
<n blo'ue de control consta del te*to de la descri!ci$n del %ormulario "ue de%ine las !ro!iedades de un control individual( 5l igual "ue la descri!ci$n del %ormulario& los #lo"ues de control em!ie0an con una instrucci$n Be'in y terminan con una instrucci$n End( La sinta*is !ara una instrucci$n Be'in de un #lo"ue de control es la siguiente2 Be'in clase_control(tipo_control nombre_control Las !ro!iedades !ara el control a!arecen entre la instrucci$n Be'in y la instrucci$n End(
1G6
Curso de Visual Basic Avanzado 0( Los controles "ue a!arecen !osteriormente en la descri!ci$n del %ormulario estn ms arri#a en el orden 0 y& !or tanto& sola!an a los "ue estn ms a#a-o en dic o orden(
Controles de menQ
Los controles de men@ de#en a!arecer -untos al %inal de la descri!ci$n del %ormulario& -usto antes de "ue em!iece la secci$n de atri#utos( .uando Visual Basic encuentra un control de men@ durante la carga de un %ormulario 5;.''& es!era encontrar todos los controles de men@ -untos( <na ve0 "ue detecta un control "ue no es de men@ a continuaci$n de uno o ms
1G>
Curso de Visual Basic Avanzado controles de men@& su!one "ue no ay ms controles de men@ en el %ormulario y !asa !or alto cual"uier control de men@ "ue encuentre durante la carga de ese %ormulario(
Sinta/is
<se esta sinta*is !ara de%inir las !ro!iedades en la descri!ci$n del %ormulario2 propiedad = valor Los valores de !ro!iedad de te*to de#en a!arecer entre comillas do#les( Las !ro!iedades #ooleanas tienen un valor f 1 !ara True y G !ara alse( Visual Basic inter!reta todos los valores distintos de f 1 o G como True( Las !ro!iedades con valores enumerados incluyen sus valores num1ricos con la descri!ci$n del valor incluida como comentario( Bor e-em!lo& la !ro!iedad BorderSt!le a!arece as2 Border;tyle N G J Linguno
Curso de Visual Basic Avanzado Las !ro!iedades "ue tengan datos #inarios como valores a!arecen en el %ormulario como una re%erencia a un des!la0amiento de #yte en el arc ivo de datos #inario( Bor e-em!lo& el valor de una !ro!iedad Picture a!arece de la siguiente manera en la descri!ci$n de un %ormulario2 Begin VB('mage img7emo Bicture N OAi%orm(%r*O2G2)B )nd La enumeraci$n de la !ro!iedad signi%ica "ue los datos #inarios "ue de%inen la !ro!iedad Picture de este control em!ie0an en el #yte 2)B 6 e*: del arc ivo Ai%orm(%r*(
Pro.iedad Icon
)l valor de la !ro!iedad Icon de un %ormulario de!ende de "u1 icono se utilice !ara el %ormulario( La siguiente ta#la muestra los valores de la !ro!iedad Icon y la manera en "ue esas !ro!iedades a!arecen en un %ormulario( Valor de .ro.iedad Icon )l icono !redeterminado 6Linguno: .ual"uier icono distinto del icono !redeterminado Contenido del %ormulario ASCII Lo ace re%erencia a la !ro!iedad Icon 'con N G 9e%erencia de des!la0amiento de #yte al arc ivo de datos #inario( Bor e-em!lo2 'con N OAi%orm(%r*O2GGGG
Pro.iedad Ta)Inde/
;i no se es!eci%ica la !ro!iedad Ta)Inde/& Visual Basic asigna el control a la !rimera u#icaci$n !osi#le en el orden de ta#ulaci$n una ve0 "ue est1n cargados todos los dems controles(
2nidades de medida
)l tamaEo de los controles& las coordenadas * e y& as como otros valores de !ro!iedades "ue utilicen unidades de medida se e*!resan en t,i!s( .uando un control usa un modo de escala di%erente a los t,i!s y Visual Basic carga el %ormulario& convierte los valores en t,i!s del %ormulario 5;.'' a las unidades de medida es!eci%icadas !or la !ro!iedad ScaleMode(
Valores de colores
Los valores de colores a!arecen como valores 9MB 6ro-o& verde y a0ul:( Bor e-em!lo& la !ro!iedad oreColor a!arece de esta manera2 Fore.olor N PCGGFFGGGGP Visual Basic tam#i1n !uede leer valores de EBColor& convirti1ndolos a 9MB cuando carga el %ormulario( Los %ormularios 5;.'' "ue utilicen valores de EBColor de#en usar esta sinta*is2 oreColor = EBColor6'bcolor: donde 'bcolor es un valor de G a 15( O#serve "ue el argumento 'bcolor corres!onde a los valores de color utili0ados !or las instrucciones gr%icas en otras versiones de Basic& como Visual Basic !ara A;87O;& Aicroso%t HuicIBasic y el ;istema de desarrollo !ro%esional Aicroso%t Basic(
1G9
?)+etos de .ro.iedades
5lgunos o#-etos de !ro!iedades& como !or e-em!lo el o#-eto ont& a!arecen como un #lo"ue distinto y muestran todos los valores de las di%erentes !ro!iedades del o#-eto( )stos #lo"ues estn delimitados !or las instrucciones Be'inPro.ert! y EndPro.ert! de la siguiente %orma2 Be'inPro.ert! nombre_propiedad propiedad< = valor< propiedad= = valor= ( ( ( EndPro.ert!
Cdi'o de Basic
)l c$digo de Basic a!arece en el %ormulario inmediatamente des!u1s de la secci$n de atri#utos& a continuaci$n de la @ltima instrucci$n End en la descri!ci$n del %ormulario( Las instrucciones en la secci$n 7eclaraciones de un %ormulario a!arecen !rimero& seguidas de los !rocedimientos de evento& los !rocedimientos generales y las %unciones(
11G
Curso de Visual Basic Avanzado Im.osi)le esta)lecer la .ro.iedad C0ec1ed en el menQ nombre7men>4 )ste mensa-e a!arece si Visual Basic encuentra un control de men@ de nivel su!erior con su !ro!iedad C0ec1ed esta#lecida a True( Los men@s de nivel su!erior no !ueden tener una marca de veri%icaci$n( Visual Basic carga el control del men@& !ero no esta#lece su !ro!iedad C0ec1ed( Im.osi)le esta)lecer la .ro.iedad S0ortcut en nombre7men>4 )ste mensa-e a!arece si Visual Basic encuentra un control de men@ de nivel su!erior con una tecla de m1todo a#reviado de%inida( Los men@s de nivel su!erior no !ueden tener una tecla de m1todo a#reviado( Visual Basic carga el control del men@& !ero no esta#lece la !ro!iedad S0ortcut( #a clase nombre7clase del control nombre7control no es una clase de control car'ada. )ste mensa-e a!arece si Visual Basic encuentra un nom#re de clase "ue no reconoce( Im.osi)le car'ar el control nombre7control. )ste mensa-e a!arece si Visual Basic encuentra un ti!o de control desconocido en la descri!ci$n del %ormulario( Visual Basic crea un cuadro de imagen !ara re!resentar el control desconocido& dando a ese cuadro de imagen todas las !ro!iedades vlidas de la descri!ci$n del control desconocido( .uando a!arece este mensa-e& es !ro#a#le "ue le sigan varios errores de !ro!iedades no vlidas( El control nombre7control tiene una cadena entre comillas donde de)er3a estar el nom)re de la .ro.iedad. )ste mensa-e a!arece si Visual Basic encuentra te*to entre comillas en ve0 de un nom#re de !ro!iedad "ue no se coloca entre comillas( Bor e-em!lo2 O.a!tionO N O.omen0ar la demostraci$nO )n este caso& el nom#re de !ro!iedad Ca.tion no de#era estar entre comillas( Visual Basic !asa !or alto la lnea de la descri!ci$n del %ormulario "ue !roduce este error( El nom)re de control nombre7control no es v8lido. )ste mensa-e a!arece si el nom#re de un control no es una cadena vlida en Visual Basic( Visual Basic no cargar el control( El nom)re de control es demasiado lar'oS truncado a nombre7control. )ste mensa-e a!arece si Visual Basic encuentra un nom#re de control con ms de 4G caracteres( Visual Basic carga el control& truncando el nom#re( 6o se encontr una .ro.iedad de 3ndice ! el control nombre7control !a e/iste. Im.osi)le crear este control. )ste mensa-e a!arece si Visual Basic encuentra un control sin un ndice "ue tiene el mismo nom#re "ue un control cargado anteriormente( Visual Basic no carga el control( Im.osi)le car'ar el %ormulario nombre7,ormulario. )ste mensa-e a!arece si Visual Basic encuentra ines!eradamente el %inal del arc ivo o si %alta la !rimera instrucci$n Be'in( El nom)re del %ormulario o de M(I orm nombre7,ormulario no es v8lidoS im.osi)le car'ar este %ormulario. )ste mensa-e a!arece si el nom#re de un %ormulario no es una cadena vlida en Visual Basic( Visual Basic no cargar el %ormulario( Las cadenas vlidas de#en em!e0ar con una letra& s$lo !ueden incluir letras& n@meros y signos de su#rayado& y de#en tener como m*imo 4G caracteres( El nom)re nombre7'ro'iedad de la .ro.iedad del control nombre7control no es v8lido. )ste mensa-e a!arece si el nom#re de una !ro!iedad no es una cadena vlida en Visual Basic o tiene ms de 3G caracteres( Visual Basic no esta#lecer la !ro!iedad( Im.osi)le car'ar la .ro.iedad nombre7'ro'iedad del control nombre7control4 )ste mensa-e a!arece si Visual Basic encuentra una !ro!iedad desconocida( Visual Basic !asa !or alto esta !ro!iedad cuando carga el %ormulario(
111
Curso de Visual Basic Avanzado Im.osi)le esta)lecer la .ro.iedad nombre7'ro'iedad del control nombre7control. )ste mensa-e a!arece si Visual Basic no !uede esta#lecer la !ro!iedad del control es!eci%icado como se indica en la descri!ci$n del %ormulario( #a .ro.iedad nombre7'ro'iedad del control nombre7control tiene un valor no v8lido. )ste mensa-e a!arece si Visual Basic encuentra un valor no vlido !ara una !ro!iedad( Visual Basic cam#ia el valor de la !ro!iedad al valor !redeterminado !ara esa !ro!iedad( #a .ro.iedad nombre7'ro'iedad del control nombre7control tiene una re%erencia de arc0ivo no v8lida. )ste mensa-e a!arece si Visual Basic no !udo usar una re%erencia de nom#re de arc ivo( )sto ocurrir si el arc ivo al "ue se re%iere 6!ro#a#lemente un arc ivo de datos #inario !ara el %ormulario: no se encuentra en el directorio es!eci%icado( #a .ro.iedad nombre7'ro'iedad del control nombre7control tiene un 3ndice de .ro.iedad no v8lido. )ste mensa-e a!arece si Visual Basic encuentra un nom#re de !ro!iedad con un ndice de !ro!iedad mayor de 255( Bor e-em!lo2 Bro!3GG N 5436 Visual Basic !asa !or alto la lnea de la descri!ci$n del %ormulario "ue !rodu-o este error( #a .ro.iedad nombre7'ro'iedad del control nombre7control tiene un valor no v8lido. )ste mensa-e a!arece si Visual Basic encuentra una !ro!iedad con un valor "ue no es correcto !ara ese control( Bor e-em!lo2 3o! N .a r622: J )n realidad se desea#a . ar622:( Visual Basic esta#lece la !ro!iedad a su valor !redeterminado( #a .ro.iedad nombre7'ro'iedad del control nombre7control de)e ser una cadena entre comillas. )ste mensa-e a!arece si Visual Basic encuentra un valor de !ro!iedad sin comillas "ue de#era a!arecer entre comillas( Bor e-em!lo2 .a!tion N .omen0ar la demostraci$n Visual Basic !asa !or alto la lnea de la descri!ci$n del %ormulario "ue !rodu-o este error( Error de sinta/is& la .ro.iedad nombre7'ro'iedad del control nombre7control no tiene un T=T. )ste mensa-e a!arece si Visual Basic encuentra un nom#re y un valor de !ro!iedad sin un signo igual entre ellos( Bor e-em!lo2 3e*t O.omen0ar la demostraci$nO Visual Basic no carga la !ro!iedad(
ormato del arc0ivo de .ro!ecto ,.v).Visual Basic siem!re guarda los arc ivos de !royecto 6(v#!: en %ormato 5;.''( )l arc ivo de !royecto contiene entradas "ue re%le-an los valores de su !royecto( )ntre estos se incluyen los %ormularios y m$dulos del !royecto& re%erencias& o!ciones varias "ue a elegido !ara controlar la com!ilaci$n& etc( )sta es la a!ariencia "ue de#e tener un arc ivo (v#!( )ste !royecto incluye m$dulos guardados con los nom#res de clase y de arc ivo "ue se muestran en la siguiente ta#la( Ti.o de mdulo Formulario A7' Formulario A$dulo estndar A$dulo de clase 6om)re de clase 5Form BForm .Aodule 7.lass 6om)re de arc0ivo 5KForm(%rm BKForm(%rm .KAodule(#as 7K.lass(cls
3y!eN)*e FormNBKForm(%rm 9e%erenceN[]MaGGG2G43G8GGGG8GGGG8.GGG8 GGGGGGGGGG46cg2(GgGg((]((]((]+'L7O+;];=;3)A];37OL)2(3LBgOL) 5utomation FormN5KForm(%rm AoduleN.Aodule? .KAodule(#as .lassN7.lass? 7K.lass(cls 112
Curso de Visual Basic Avanzado ;tartu!NOBFormO .ommand32NOO LameNOBro-ect1O Cel!.onte*t'7NOGO .om!ati#leAodeNOGO Aa-orVerN1 AinorVerNG 9evisionVerNG 5uto'ncrementVerNG ;erver;u!!ortFilesNG Version.om!anyLameNOAicroso%tO .om!ilation3y!eNG O!timi0ation3y!eNG FavorBentiumBro6tm:NG .odeVie,7e#ug'n%oNG Lo5liasingNG Bounds. ecING Over%lo,. ecING FlBoint. ecING F7'V. ecING <nroundedFBNG ;tartAodeNG <nattendedNG 3 readBerO#-ectNG Aa*Lum#erO%3 readsN1 ;e agregan entradas al arc ivo (v#! cuando agrega %ormularios& m$dulos& com!onentes& etc( al !royecto( 3am#i1n se agregan entradas cuando esta#lece o!ciones !ara el !royecto( Auc as de estas o!ciones se esta#lecen mediante el cuadro de dilogo Pro.iedades del .ro!ecto(
113
114
dat d#c#o d#grd d#lst dir drv %il %rm %ra gau gra grd s# img Iey l#l lin lst m!m m!s mci mdi mnu msg mst ole out #ed ed inI !ic cl! r!t s ! s!n
datBi#lio d#c#oLengua-e d#grd9esultado.onsulta d#lst3i!o3area dirOrigen drv7estino %ilOrigen %rm)ntrada %raLengua-e gau)stado gra'ngresos grdBrecios s#Volumen img'cono IeyAay@sculas l#lAs-5yuda linVertical lst.$digos7eBoltica m!m)nviarAsm!s;esi$n mciVdeo mdiLota mnu5rc ivo5#rir msg.lientes mstBrimero oleCo-a7e3ra#a-o out7iagrama7eOrg #edLom#re edFirma inIAa!a !icVM5 cl!Barra7eCerramientas r!tManancias3rimestre1 s !.rculo s!nBginas
115
Curso de Visual Basic Avanzado .uadro de te*to .ron$metro 5rri#a8a#a-o Barra de des!la0amiento vertical .ontrol desli0ante Lista de imgenes Vista de r#ol Barra de erramientas 3a#;tri! Barra de estado Lista Barra de !rogreso 9ic 3e*tBo* t*t tmr u!d vs# sld ils tre tl# ta# sta lv, !rg rt% t*t5!ellido tmr5larma u!d7irecci$n vs#Velocidad sld)scala ils3odosLos'conos treOrgani0aci$n tl#5cciones ta#O!ciones staFec aCora lv,)nca#e0ados !rg.argar5rc ivo rt%'n%orme
116
Curso de Visual Basic Avanzado nivel de anidamiento& con el ttulo del men@ %inal en la @ltima !osici$n de cada nom#re( )n la ta#la siguiente ay algunos e-em!los( Secuencia del t3tulo del menQ 5rc ivo 5#rir 5rc ivo )nviar correo 5rc ivo )nviar %a* Formato .arcter 5yuda .ontenido 6om)re del controlador del menQ mnu5rc ivo5#rir mnu5rc ivo)nviar.orreo mnu5rc ivo)nviarFa* mnuFormato.arcter mnu5yuda.ontenido
.uando se usa esta convenci$n de nom#res& todos los miem#ros de un gru!o de men@s determinado se muestran uno -unto a otro en la ventana Bro!iedades de Visual Basic( 5dems& los nom#res del control de men@ documentan claramente los elementos de men@ a los "ue estn ad-untos(
Mlo#al
)n una a!licaci$n de Visual Basic& las varia#les glo#ales se de#en usar s$lo cuando no e*ista ninguna otra %orma c$moda de com!artir datos entre %ormularios( .uando aya "ue usar varia#les glo#ales& es conveniente declararlas todas en un @nico m$dulo agru!adas !or %unciones y dar al m$dulo un nom#re signi%icativo "ue indi"ue su %inalidad& como Bu#lic(#as(
11>
Curso de Visual Basic Avanzado <na !rctica de codi%icaci$n correcta es escri#ir c$digo modular siem!re "ue sea !osi#le( Bor e-em!lo& si la a!licaci$n muestra un cuadro de dilogo& colo"ue todos los controles y el c$digo necesario !ara e-ecutar la tarea del dilogo en un @nico %ormulario( )sto ayuda a tener el c$digo de la a!licaci$n organi0ado en com!onentes @tiles y minimi0a la so#recarga en tiem!o de e-ecuci$n( 5 e*ce!ci$n de las varia#les glo#ales 6"ue no se de#eran !asar:& los !rocedimientos y %unciones de#en o!erar s$lo so#re los o#-etos "ue se les !asan( Las varia#les glo#ales "ue se usan en los !rocedimientos de#en estar identi%icadas en la secci$n 7eclaraciones al !rinci!io del !rocedimiento( 5dems& los argumentos se de#en !asar a los !rocedimientos ;u# y Function mediante B!Val& a menos "ue sea necesario e*!lcitamente cam#iar el valor del argumento "ue se !asa(
<na varia#le tiene alcance glo#al si se declara como Pu)lic en un m$dulo estndar o en un m$dulo de %ormulario( <na varia#le tiene alcance de nivel de mdulo si se declara como Private en un m$dulo estndar o en un m$dulo de %ormulario& res!ectivamente(
Constantes
)l cuer!o del nom#re de las constantes se de#e escri#ir en may@sculas y min@sculas& con la letra inicial de cada !ala#ra en may@sculas( 5un"ue las constantes estndar de Visual Basic no incluyen in%ormaci$n de ti!o de datos y el alcance& los !re%i-os como i& s& g y m !ueden ser muy @tiles !ara entender el valor y el alcance de una constante( Bara los nom#res de constantes& se de#en seguir las mismas normas "ue !ara las varia#les( Bor e-em!lo2 mintA*Lista<suario J Lmite de entradas m*imas !ara J la lista de usuarios 6valor J entero& local del m$dulo: gstrLuevaLnea J .arcter de nueva lnea J6cadena& glo#al de la J a!licaci$n:
Varia)les
7eclarar todas las varia#les a orra tiem!o de !rogramaci$n !or"ue reduce el n@mero de errores de#idos a erratas 6!or e-em!lo& aLom#re<suario3m! %rente a sLom#re<suario3m! %rente a sLom#re<suario3em!:( )n la %ic a Editor del cuadro de dilogo ?.ciones& active la o!ci$n (eclaracin de varia)les reMuerida( La instrucci$n ?.tion E/.licit re"uiere "ue declare todas las varia#les del !rograma de Visual Basic( Las varia#les de#en llevar un !re%i-o !ara indicar su ti!o de datos( O!cionalmente& y en es!ecial !ara !rogramas largos& el !re%i-o se !uede am!liar !ara indicar el alcance de la varia#le(
11D
119
Curso de Visual Basic Avanzado 3odos los !rocedimientos y %unciones de#en comen0ar con un comentario #reve "ue descri#a las caractersticas %uncionales del !rocedimiento 6"u1 ace:( )sta descri!ci$n no de#e descri#ir los detalles de im!lementaci$n 6c$mo lo ace:& !or"ue a veces cam#ian con el tiem!o& dando como resultado un tra#a-o innecesario de mantenimiento de los comentarios o& lo "ue es !eor& comentarios err$neos( )l !ro!io c$digo y los comentarios de lneas necesarios descri#irn la im!lementaci$n( Los argumentos "ue se !asan a un !rocedimiento se de#en descri#ir cuando sus %unciones no sean o#vias y cuando el !rocedimiento es!era "ue los argumentos est1n en un intervalo es!ec%ico( 3am#i1n ay "ue descri#ir& al !rinci!io de cada !rocedimiento& los valores de retorno de %unciones y las varia#les glo#ales "ue modi%ica el !rocedimiento& en es!ecial los modi%icados a trav1s de argumentos de re%erencia( Los #lo"ues del comentario de enca#e0ado del !rocedimiento de#en incluir los siguientes enca#e0ados de secci$n( )n la secci$n siguiente& O7ar %ormato al c$digoO& ay algunos e-em!los( Enca)ezado seccin Finalidad Bremisas )%ectos )ntradas de (escri.cin del comentario Lo "ue ace el !rocedimiento 6no c$mo lo ace:( Lista de cada varia#le e*terna& control& arc ivo a#ierto o cual"uier otro elemento "ue no sea o#vio( Lista de cada varia#le e*terna& control o arc ivo a%ectados y el e%ecto "ue tiene 6s$lo si no es o#vio:( 3odos los argumentos "ue !uedan no ser o#vios( Los argumentos se escri#en en una lnea a!arte con comentarios de lnea( )*!licaci$n de los valores devueltos !or las %unciones(
9esultados
9ecuerde los !untos siguientes2 .ada declaraci$n de varia#le im!ortante de#e incluir un comentario de lnea "ue descri#a el uso de la varia#le "ue se est declarando( Las varia#les& controles y !rocedimientos de#en tener un nom#re #astante claro !ara "ue los comentarios de lnea s$lo sean necesarios en los detalles de im!lementaci$n com!le-os( 5l !rinci!io del m$dulo (#as "ue contiene las declaraciones de constantes gen1ricas de Visual Basic del !royecto& de#e incluir un resumen "ue descri#a la a!licaci$n& enumerando los !rinci!ales o#-etos de datos& !rocedimientos& algoritmos& cuadros de dilogo& #ases de datos y de!endencias del sistema( 5lgunas veces !uede ser @til un !seudoc$digo "ue descri#a el algoritmo(
12G
Curso de Visual Basic Avanzado J[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ J Finalidad2 <#ica el !rimer caso encontrado de un J usuario es!eci%icado en la matri0 J Lista<suario( J )ntradas2 J strLista<suario6:2 lista de usuarios !ara #uscar( J str<suario7est2 nom#re del usuario #uscado( J 9esultados2indice del !rimer caso de rs<suario7est J encontrado en la matri0 rasLista<suario( J ;i no se encuentra el usuario de destino& devuelve 81( J[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ Function intBuscar<suario 6strLista<suario6: 5s ;tring& str<suario7est 5s K ;tring:5s 'nteger 7im i 5s 'nteger J .ontador de #ucle( 7im #ln)ncontrado 5s 'nteger J 'ndicador de J destino encontrado( intBuscar<suario N 81 iNG + ile i \N <#ound6strLista<suario: and Lot #ln)ncontrado '% strLista<suario6i: N str<suario7est 3 en #ln)ncontrado N 3rue intBuscar<suario N i )nd '% +end )nd Function
A'ru.acin de constantes
Las varia#les y constantes de%inidas se de#en agru!ar !or %unciones en lugar de dividirlas en reas aisladas o arc ivos es!eciales( Las constantes gen1ricas de Visual Basic se de#en agru!ar en un @nico m$dulo !ara se!ararlas de las declaraciones es!ec%icas de la a!licaci$n(
?.eradores U ! V
<se siem!re el o!erador U !ara unir cadenas y el o!erador V cuando tra#a-e con valores num1ricos( )l uso del o!erador V !ara concatenar !uede causar !ro#lemas cuando se o!era so#re dos varia#les Variant( Bor e-em!lo2 vntVar1 N O1G(G1O vntVar2 N 11 vnt9esult N vntVar1 / vntVar2 Jvnt9esult N 21(G1 vnt9esult N vntVar1 P vntVar2 Jvnt9esult N 1G(G111
121