Anda di halaman 1dari 65

Curso de Visual Basic (parte I)

Qu es Visual Basic? La palabra "Visual" hace referencia al mtodo que se utilia para
crear la interfa !r"fica de usuario (#$I)% &n lu!ar de escribir numerosas l'neas de c(di!o
para describir la apariencia ) la ubicaci(n de los elementos de la interfa* simplemente
puede arrastrar ) colocar ob+etos prefabricados en su lu!ar dentro de la pantalla% ,i ha
utiliado al!una -e un pro!rama de dibu+o como .aint* )a tiene la ma)or parte de las
habilidades necesarias para crear una interfa de usuario efecti-a%
La palabra "Basic" hace referencia al len!ua+e B/,IC (Be!inners /ll0.urpose ,)mbolic
Instruction Code)* un len!ua+e utiliado por m"s pro!ramadores que nin!1n otro len!ua+e en
la historia de la inform"tica o computaci(n% Visual Basic ha e-olucionado a partir del len!ua+e
B/,IC ori!inal ) ahora contiene centenares de instrucciones* funciones ) palabras cla-e*
muchas de las cuales est"n directamente relacionadas con la interfa !r"fica de 2indo3s%
Los principiantes pueden crear aplicaciones 1tiles con s(lo aprender unas pocas palabras
cla-e* pero* al mismo tiempo* la eficacia del len!ua+e permite a los profesionales acometer
cualquier ob+eti-o que pueda alcanarse mediante cualquier otro len!ua+e de pro!ramaci(n
de 2indo3s%
&l len!ua+e de pro!ramaci(n Visual Basic no es e4clusi-o de Visual Basic% La &dici(n para
aplicaciones del sistema de pro!ramaci(n de Visual Basic* incluida en 5icrosoft &4cel*
5icrosoft /ccess ) muchas otras aplicaciones 2indo3s* utilian el mismo len!ua+e% &l
sistema de pro!ramaci(n de Visual Basic* ,criptin! &dition (VB,cript) para pro!ramar en
Internet es un subcon+unto del len!ua+e Visual Basic% La in-ersi(n realiada en el
aprendia+e de Visual Basic le a)udar" a abarcar estas otras "reas%
,i su ob+eti-o es crear un peque6o pro!rama para su uso personal o para su !rupo de
traba+o* un sistema para una empresa o incluso aplicaciones distribuidas de alcance mundial
a tra-s de Internet* Visual Basic dispone de las herramientas que necesita%
Las caracter'sticas de acceso a datos le permiten crear bases de datos ) aplicaciones
cliente para los formatos de las bases de datos m"s conocidas* incluidos 5icrosoft ,QL
,er-er ) otras bases de datos de "mbito empresarial%
Las tecnolo!'as /cti-e78 le permiten utiliar la funcionalidad proporcionada por otras
aplicaciones* como el procesador de te4tos 5icrosoft 2ord* la ho+a de c"lculo 5icrosoft
&4cel ) otras aplicaciones 2indo3s% .uede incluso automatiar las aplicaciones ) los
ob+etos creados con la &dici(n profesional o la &dici(n empresarial de Visual Basic%
Las capacidades de Internet facilitan el acceso a documentos ) aplicaciones a tra-s de
Internet desde su propia aplicaci(n%
La aplicaci(n terminada es un autntico archi-o %e4e que utilia una biblioteca de
-'nculos din"micos (9LL) de tiempo de e+ecuci(n que puede distribuir con toda libertad%

&diciones de Visual Basic
Visual Basic se encuentra disponible en tres -ersiones* cada una de las cuales est"
orientada a unos requisitos de pro!ramaci(n espec'ficos%
La &dici(n de aprendia+e de Visual Basic permite a los pro!ramadores crear robustas
aplicaciones para 5icrosoft 2indo3s :; ) 2indo3s <=>% Inclu)e todos los controles
intr'nsecos* adem"s de los controles de cuadr'cula* de fichas ) los controles enlaados a
datos% La documentaci(n que se proporciona con esta edici(n inclu)e Learn VB Now (un
C90?@5 multimedia)* un Manual del programador impreso, la /)uda en pantalla ) los
Libros en pantalla de Visual Basic%
La &dici(n profesional proporciona a los profesionales un completo con+unto de
herramientas para desarrollar soluciones para terceros% Inclu)e todas las caracter'sticas
de la &dici(n de aprendia+e* as' como controles /cti-e7 adicionales* incluidos controles
para Internet ) el #enerador de informes de Cr)stal ?eports% La documentaci(n que se
proporciona con la &dici(n profesional inclu)e el Manual del programador* la /)uda en
pantalla* la Gua de herramientas componentes ) el Manual del usuario de Crystal
Reports para Visual Basic.
La &dici(n empresarial permite a los profesionales crear s(lidas aplicaciones
distribuidas en un entorno de equipo% Inclu)e todas las caracter'sticas de la &dici(n
profesional* as( como el /dministrador de automatiaci(n* la #aler'a de ob+etos* las
herramientas de administraci(n de bases de datos* el sistema de control de -ersiones
orientado a pro)ectos 5icrosoft Visual ,ource,afe8* etc% La documentaci(n impresa que
se proporciona con la &dici(n empresarial inclu)e toda la documentaci(n de la &dici(n
profesional* ) la Gua para la creacin de aplicaciones clienteser!idor con Visual Basic )
el Manual del usuario de "ource"a#e%
1- Introduccin:
$.$ %rogramacin orientada a o&'etos.
A%A%A0 @b+etos%

Un objeto es una entidad que tiene asociado un conjunto de mtodos, eventos y propiedades. Ejemplo :
Una caja de texto (TextBox) en la cual podemos escribir cualquier lnea es un objeto.

A%A%B0 .ropiedades%

!on las caractersticas que posee un objeto o un "ormulario (ventana de #indo$s).
Ejemplo : %olor de "ondo del "ormulario, &uente de texto de un TextBox, '.

A%A%C0 5todos%

(os mtodos son "unciones internas de un determinado objeto que permite reali)ar "unciones sobre l o
sobre otro objeto.
Ejemplo : *eseamos poner en la ventana #indo$s de nuestra aplicaci+n ,-ola mundo,, por tanto
pondremos el mtodo ./ 0entana.1rint ,-ola mundo,

A%A%D0 &-entos%

(os eventos son acciones que se pueden reali)ar en cualquier control: clic2, doble clic2, movimiento del
rat+n. 3 estos eventos se les puede asociar c+di4o para que se ejecute al producir el evento.
Un pro4rama 0isual Basic es un 15E (1ro4rama orientado a eventos).
Todo lo que 6acemos en un pro4rama 0isual Basic est7 4enerado por medio de eventos

A%A%;0 &4plicaci(n inte!rada ) e+emplo de @b+etos* .ropiedades* 5todos )
&-entos%

(os "ormularios y controles de 0isual Basic son objetos que exponen sus propios mtodos,
propiedades y eventos. (as propiedades se pueden considerar como atributos de un objeto, los mtodos
como sus acciones y los eventos como sus respuestas.
Un objeto de uso diario como el 4lobo de un ni8o tiene tambin propiedades, mtodos y eventos. Entre
las propiedades de un 4lobo se incluyen atributos visibles como el peso, el di7metro y el color. 5tras
propiedades describen su estado (in"lado o desin"lado) o atributos que no son visibles, como su edad.
1or de"inici+n, todos los 4lobos tienen estas propiedades9 lo que vara de un 4lobo a otros son los
valores de estas propiedades.
Un 4lobo tiene tambin mtodos o acciones in6erentes que puede e"ectuar. Tiene un mtodo in"lar (la
acci+n de llenarlo de 6elio) o un mtodo desin"lar (expeler su contenido) y un mtodo elevarse (si se
deja escapar). *e nuevo, todos los 4lobos pueden e"ectuar estos mtodos.
(os 4lobos tienen adem7s respuestas prede"inidas a ciertos eventos externos. 1or ejemplo, un 4lobo
respondera al evento de pinc6arlo desin"l7ndose o al evento de soltarlo elev7ndose en el aire.
(os objetos tienen propiedades, responden a eventos y ejecutan mtodos:

!i se pudiera pro4ramar un 4lobo, el c+di4o de 0isual Basic podra ser como el si4uiente. 1ara
establecer las propiedades del 4lobo:
:lobo.%olor ; <ojo
:lobo.*i7metro ; =>
:lobo.?n"lado ; True

5bserve la sintaxis del c+di4o: el objeto (:lobo) se4uido de la propiedad (%olor) se4uida de la
asi4naci+n del valor (<ojo). 1odra modi"icar el color del 4lobo desde el c+di4o si repitiera esta
instrucci+n y sustituyera el valor por otro di"erente. (as propiedades tambin se pueden establecer en
la ventana 1ropiedades mientras se est7 dise8ando la aplicaci+n.
(os mtodos de un 4lobo se invocan de esta "orma:
:lobo.?n"lar
:lobo.*esin"lar
:lobo.Elevar @

(a sintaxis es similar a la sintaxis de las propiedades: el objeto (un nombre) se4uido de un mtodo (un
verbo). En el tercer ejemplo 6ay un elemento adicional, llamado argumento, que indica la distancia
que se eleva. 3l4unos mtodos tendr7n uno o m7s ar4umentos para describir m7s a "ondo la acci+n que
se va a ejecutar.
El 4lobo puede responder a un evento como se muestra a continuaci+n:
!ub :loboA1inc6a)o()
:lobo.*esin"lar
:lobo.-acer<uido ,Ban4,
:lobo.?n"lado ; &alse
:lobo.*i7metro ; =
End !ub

En este caso, el c+di4o describe el comportamiento del 4lobo cuando se produce un evento 1inc6a)o:
invoca el mtodo *esin"lar y lue4o invoca el mtodo -acer<uido con un ar4umento BBan4C (el tipo de
ruido que se va a 6acer). %omo el 4lobo ya no est7 in"lado, la propiedad ?n"lado tiene el valor &alse y
la propiedad *i7metro adopta un nuevo valor.
!i bien no puede pro4ramar un 4lobo, s puede pro4ramar un "ormulario o un control de 0isual Basic.
%omo pro4ramador, tiene el control: decide qu propiedades se deben modi"icar, qu mtodos se deben
invocar o a qu eventos 6ay que responder para conse4uir la apariencia y el comportamiento deseados

A%A%E0 9iferencias entre la pro!ramaci(n procedural ) la pro!ramaci(n ba+o
2indo3s%

Un estudio pro"undo del "uncionamiento interno de #indo$s necesitara un libro completo. Do es
necesario tener un pro"undo conocimiento de todos los detalles tcnicos. Una versi+n reducida del
"uncionamiento de #indo$s incluye tres conceptos clave: ventanas, eventos y mensajes.
Una ventana es simplemente una re4i+n rectan4ular con sus propios lmites. 1robablemente ya sabe
que 6ay varios tipos de ventanas: una ventana Explorador en #indo$s E@, una ventana de documento
dentro de su pro4rama de proceso de textos o un cuadro de di7lo4o que emer4e para recordarle una
cita. 3unque stos son los ejemplos m7s comunes, realmente 6ay otros muc6os tipos de ventanas. Un
bot+n de comando es una ventana. (os iconos, cuadros de texto, botones de opci+n y barras de menFs
son todos ventanas.
El sistema operativo Gicroso"t #indo$s administra todas estas ventanas asi4nando a cada una un
Fnico nFmero identi"icador (controlador de ventana o 6#nd). El sistema controla continuamente cada
una de estas ventanas para ver si existen si4nos de actividad o eventos. (os eventos pueden producirse
mediante acciones del usuario, como 6acer clic con el mouse (rat+n) o presionar una tecla, mediante
pro4ramaci+n o incluso como resultado de acciones de otras ventanas.
%ada ve) que se produce un evento se enva un mensaje al sistema operativo. El sistema procesa el
mensaje y lo transmite a las dem7s ventanas. Entonces, cada ventana puede reali)ar la acci+n
apropiada, bas7ndose en sus propias instrucciones para tratar ese mensaje en particular (por ejemplo,
volverse a dibujar cuando otra ventana la 6a dejado al descubierto).
%omo puede ima4inar, tratar todas las combinaciones posibles de ventanas, eventos y mensajes podra
ser interminable. 3"ortunadamente, 0isual Basic le evita tener que tratar con todos los controladores de
mensajes de bajo nivel. Guc6os de los mensajes los controla autom7ticamente 0isual Basic, mientras
que otros se tratan como procedimientos de evento para su comodidad. Esto le permite crear
r7pidamente e"icaces aplicaciones sin tener que tratar detalles innecesarios.
En las aplicaciones tradicionales o ,por procedimientos,, la aplicaci+n es la que controla qu partes de
c+di4o y en qu secuencia se ejecutan. (a ejecuci+n comien)a con la primera lnea de c+di4o y
continFa con una ruta prede"inida a travs de la aplicaci+n, llamando a los procedimientos se4Fn se
necesiten.
En una aplicaci+n controlada por eventos, el c+di4o no si4ue una ruta predeterminada9 ejecuta distintas
secciones de c+di4o como respuesta a los eventos. (os eventos pueden desencadenarse por acciones
del usuario, por mensajes del sistema o de otras aplicaciones, o incluso por la propia aplicaci+n. (a
secuencia de estos eventos determina la secuencia en la que se ejecuta el c+di4o, por lo que la ruta a
travs del c+di4o de la aplicaci+n es di"erente cada ve) que se ejecuta el pro4rama.
1uesto que no puede predecir la secuencia de los eventos, el c+di4o debe establecer ciertos supuestos
acerca del ,estado del mundo, cuando se ejecute. %uando 6a4a suposiciones (por ejemplo, que un
campo de entrada debe contener un valor antes de ejecutar un procedimiento para procesar ese valor),
debe estructurar la aplicaci+n de "orma que ase4ure que esa suposici+n siempre ser7 v7lida (por
ejemplo, des6abilitando el bot+n de comando que inicia el procedimiento 6asta que el campo de
entrada conten4a un valor).
El c+di4o tambin puede desencadenar eventos durante la ejecuci+n. 1or ejemplo, cambiar mediante
pro4ramaci+n el texto de un cuadro de texto 6ace que se produ)ca el evento %6an4e del cuadro de
texto. Esto causara la ejecuci+n del c+di4o (si lo 6ay) contenido en el evento %6an4e. !i supone que
este evento s+lo se desencadenar7 mediante la interacci+n del usuario, podra ver resultados
inesperados. 1or esta ra)+n es importante comprender el modelo controlado por eventos y tenerlo en
cuenta cuando dise8e su aplicaci+n.

$.( %royecto.

A%C%A0 9efinici(n de .ro)ecto en Visual Basic%

1ara crear una aplicaci+n con 0isual Basic se trabaja con proyectos. Un proyecto es una colecci+n de
arc6ivos que se usan para 4enerar una aplicaci+n. Este tema describe c+mo 4enerar y administrar
proyectos.
3l crear una aplicaci+n probablemente crear7 nuevos "ormularios9 tambin puede volver a usar o
modi"icar "ormularios creados en proyectos anteriores. Esto tambin se aplica a otros m+dulos o
arc6ivos que pueda incluir en su proyecto. (os controles 3ctiveH y los objetos de otras aplicaciones
tambin se pueden compartir entre proyectos.
*espus de ensamblar todos los componentes de un proyecto y escribir el c+di4o, puede compilar el
proyecto para crear un arc6ivo ejecutable.


A%C%B0Componentes de un .ro)ecto%

%uando desarrolla un aplicaci+n, trabaja con un arc6ivo de proyecto para administrar todos los
di"erentes arc6ivos que crea. Un proyecto consta de lo si4uiente:
Un arc6ivo de proyecto que reali)a el se4uimiento de todos los componentes (.vbp)
Un arc6ivo para cada "ormulario (."rm).
Un arc6ivo de datos binario para cada "ormulario que conten4a datos sobre propiedades de
controles del "ormulario (."rx). Estos arc6ivos no se pueden modi"icar y los 4enera
autom7ticamente cualquier arc6ivo ."rm que ten4a propiedades en "ormato binario, como Picture
o Icon.
5pcionalmente, un arc6ivo para cada m+dulo de clase (.cls).
5pcionalmente, un arc6ivo para cada m+dulo est7ndar (.bas).
5pcionalmente, uno o m7s arc6ivos con controles 3ctiveH (.ocx).
5pcionalmente, un Fnico arc6ivo de recursos (.res).

El archivo de proyecto es simplemente una lista de todos los arc6ivos y objetos asociados con el
proyecto, as como in"ormaci+n sobre las opciones de entorno establecidas. Esta in"ormaci+n se
actuali)a cada ve) que 4uarda el proyecto. Todos los arc6ivos y objetos tambin se pueden compartir
con otros proyectos.
%uando 6a completado todos los arc6ivos del proyecto puede convertir el proyecto en un arc6ivo
ejecutable (.exe): en el menF Archivo, elija el comando Generar proyecto.exe.

1.3.2.1-Formularios.

Un "ormulario es una ventana. (a ventana #indo$s de cualquier aplicaci+n.
1odemos abrir tantas ventanas como queramos en nuestro proyecto, pero el nombre de las ventanas debe
ser distinto. 1or de"ecto como ya 6emos visto, la ventana que se abre en 0isual Basic tiene el nombre de
&orm=. Ia veremos como cambiar estas ,1ropiedades, m7s adelante.
(os m+dulos de "ormularios (extensi+n de nombre de arc6ivo ."rm) pueden contener descripciones en
"orma de texto del "ormulario y sus controles, incluyendo los valores de sus propiedades. Tambin
pueden contener declaraciones a nivel de "ormulario de constantes, variables y procedimientos
externos, procedimientos de evento y procedimientos 4enerales.

1.3.2.2-Mdulos de clase.

(os m+dulos de clase (extensi+n de nombre de arc6ivo .cls) son similares a los m+dulos de "ormulario,
excepto en que no tiene inter"a) de usuario visible. 1uede usar m+dulos de clase para crear sus propios
objetos, incluyendo c+di4o para mtodos y propiedades.

1.3.2.3-Mdulos estndar.

Un m+dulo es un arc6ivo 0isual Basic donde escribimos parte del c+di4o de nuestro pro4rama, y di4o
parte, porque puede 6aber c+di4o en el "ormulario tambin.
(as rutinas incluidas dentro de los m+dulos pueden ser ejecutadas desde los "ormularios de la aplicaci+n.
(os m+dulos est7ndar (extensi+n de nombre de arc6ivo .bas) pueden contener declaraciones pFblicas o
a nivel de m+dulo de tipos, constantes, variables, procedimientos externos y procedimientos pFblicos.

1.3.2.4-Archivos de Recursos.

(os arc6ivos de recursos (extensi+n de nombre de arc6ivo .res) contienen mapas de bits, cadenas de
texto y otros datos que puede modi"icar sin volver a modi"icar el c+di4o. 1or ejemplo, si piensa
traducir su aplicaci+n a un idioma extranjero, puede 4uardar todas las cadenas de texto de la inter"a)
de usuario y los mapas de bits en un arc6ivo de recursos, y simplemente traducir el arc6ivo de recursos
en ve) de la aplicaci+n completa. Un proyecto s+lo puede contener un arc6ivo de recursos.

1.3.2.-!ontroles Active ".
(os controles 3ctiveH (extensi+n de nombre de arc6ivo .ocx) son controles opcionales que se pueden
a4re4ar al cuadro de 6erramientas y se pueden usar en "ormularios. %uando instala 0isual Basic, los
arc6ivos que contienen los controles incluidos en 0isual Basic se copian a un directorio comFn (el
subdirectorio J#indo$sJ!ystem en #indo$s E@). Existen controles 3ctiveH adicionales disponibles
en diversas "uentes. Tambin puede crear sus propios controles mediante las ediciones 1ro"esional y
Empresarial de 0isual Basic.

1.3.2.#-!ontroles estndar.

(os controles est7ndar los proporciona 0isual Basic. (os controles est7ndar, como %ommandButton
(bot+n de comando) o &rame (marco), siempre est7n incluidos en el cuadro de 6erramientas, al
contrario de lo que ocurre con los controles 3ctiveH y los objetos insertables, que se pueden a4re4ar y
quitar del cuadro de 6erramientas.

$.)*ntorno de +esarrollo.

A%D%A0Barra de men1% ) A%D%B0Barra de Ferramientas%


En la ventana del pro4rama, podemos 6acer todas las "unciones normales que nos permite el compilador
0isual Basic.

A%D%C0Ventana de .ro)ecto%


1ulse ,%trlK<, (0er ./ 1royecto) y se abrir7 la ventana de proyectos (L).
En esta ventana tenemos todos los "ic6eros del proyecto 0isual Basic en el que vamos a trabajar.

A%D%D0 Gormulario%


3l principio y por de"ecto, el pro4rama abre un "ormulario con el nombre &orm= que es la ventana
#indo$s de nuestra aplicaci+n.
A%D%;0 Ventana de .ropiedades%


1ulsando la tecla ,&M,, aparecer7 la ventana de propiedades . Esta ventana es "undamental, ya que
contiene todas las propiedades de cada objeto que insertaremos en nuestro "ormulario, as como las
propiedades del "ormulario en s.

A%D%E0 Ca+a de Ferramientas%


(a ventana caja de 6erramientas contiene todos los objetos que podemos incluir en nuestro "ormulario.
Esta ventana se puede abrir en el menF principal (0er ./ %aja de 6erramientas).


2-Programacin:

,.$ -undamentos de la %rogramacin.

%ada m+dulo de "ormulario contiene procedimientos de evento (secciones de c+di4o donde se colocan
las instrucciones que se ejecutar7n como respuesta a eventos espec"icos). (os "ormularios pueden
contener controles. 1or cada control de un "ormulario, existe el correspondiente conjunto de
procedimientos de evento en el m+dulo de "ormulario. 3dem7s de procedimientos de evento, los
m+dulos de "ormulario pueden contener procedimientos 4enerales que se ejecutan como respuesta a
una llamada desde cualquier procedimiento de evento.
El c+di4o que no est relacionado con un control o un "ormulario espec"ico se puede colocar en un
tipo di"erente de m+dulo, un mdulo estndar (.bas). !e deben colocar en un m+dulo est7ndar los
procedimientos que se puedan utili)ar como respuesta a eventos de diversos objetos, en lu4ar de
duplicar el c+di4o en los procedimientos de evento de cada objeto.

B%A%A0 Como funciona una aplicaci(n controlada por e-entos%

Un evento es una acci+n reconocida por un "ormulario o un control. (as aplicaciones controladas por
eventos ejecutan c+di4o Basic como respuesta a un evento. %ada "ormulario y control de 0isual Basic
tiene un conjunto de eventos prede"inidos. !i se produce uno de dic6os eventos y el procedimiento de
evento asociado tiene c+di4o, 0isual Basic llama a ese c+di4o.
3unque los objetos de 0isual Basic reconocen autom7ticamente un conjunto prede"inido de eventos,
usted decide cu7ndo y c+mo se responder7 a un evento determinado. 3 cada evento le corresponde una
secci+n de c+di4o (un procedimiento de evento). %uando desea que un control responda a un evento,
escribe c+di4o en el procedimiento de ese evento.
(os tipos de eventos reconocidos por un objeto varan, pero muc6os tipos son comunes a la mayora de
los controles. 1or ejemplo, la mayora de los objetos reconocen el evento %lic2: si un usuario 6ace clic
en un "ormulario, se ejecuta el c+di4o del procedimiento de evento %lic2 del "ormulario9 si un usuario
6ace clic en un bot+n de comando, se ejecuta el c+di4o del procedimiento de evento %lic2 del bot+n.
El c+di4o en cada caso ser7 di"erente.
-e aqu una secuencia tpica de eventos en una aplicaci+n controlada por eventos:
1. !e inicia la aplicaci+n y se car4a y muestra un "ormulario.
2. El "ormulario (o un control del "ormulario) recibe un evento. El evento puede estar causado por el
usuario (por ejemplo, por la pulsaci+n de una tecla), por el sistema (por ejemplo, un evento de
cron+metro) o, de "orma indirecta, por el c+di4o (por ejemplo, un evento (oad cuando el c+di4o car4a
un "ormulario).
3. !i 6ay c+di4o en el procedimiento de evento correspondiente, se ejecuta.
4. (a aplicaci+n espera al evento si4uiente.

,., Varia&les.
B%B%A0 /lcance de las -ariables%

El alcance de una variable de"ine qu partes del c+di4o son conscientes de su existencia. %uando
declara una variable en un procedimiento, s+lo el c+di4o de dic6o procedimiento puede tener acceso o
modi"icar el valor de la variable9 tiene un alcance que es local al procedimiento. 3 veces, sin embar4o,
se necesita utili)ar una variable con un alcance m7s 4eneral, como aquella cuyo valor est7 disponible
para todos los procedimientos del mismo m+dulo o incluso para todos los procedimientos de toda la
aplicaci+n. 0isual Basic le permite especi"icar el alcance de una variable cuando la declara.

Establecimiento del alcance de las variables

*ependiendo de c+mo se declara, una variable tiene como alcance un procedimiento (local) o un
m+dulo.
Alcance Privado P$%lico
<i-el de procedimiento Las -ariables son pri-adas del
procedimiento en el que
aparecen%
<o es aplicable% <o puede
declarar -ariables p1blicas
dentro de un procedimiento%
<i-el de m(dulo Las -ariables son pri-adas del
m(dulo en el que aparecen%
Las -ariables est"n disponibles
para todos los m(dulos%

Varia&les utili.adas en un procedimiento

(as variables a nivel de procedimiento s+lo se reconocen en el procedimiento en el que se 6an
declarado. !e las conoce tambin como variables locales. !e declaran mediante las palabras clave &im
o 'tatic. 1or ejemplo:
*im intTemp 3s ?nte4er
N o bien N
!tatic int1ermanent 3s ?nte4er

(os valores de variables locales declaradas con 'tatic existen mientras se ejecuta la aplicaci+n,
mientras que las variables declaradas con &im s+lo existen mientras se ejecuta el procedimiento.
(as variables locales resultan una elecci+n apropiada para c7lculos temporales. 1or ejemplo, puede
crear una docena de procedimientos distintos que conten4an una variable llamada intTemp. %omo cada
intTemp se 6a declarado como una variable local, cada procedimiento s+lo reconoce su propia versi+n
de intTemp. %ualquier procedimiento puede alterar el valor de su intTemp local sin que ello a"ecte a
las variables intTemp de los dem7s procedimientos.

Varia&les utili.adas en un mdulo

*e "orma predeterminada, una variable a nivel de m+dulo est7 disponible para todos los
procedimientos del m+dulo, pero no para el c+di4o de otros m+dulos. %ree variables a nivel de m+dulo
declar7ndolas con la palabra clave Private en la secci+n *eclaraciones al principio del m+dulo. 1or
ejemplo:

1rivate intTemp 3s ?nte4er

3 nivel de m+dulo, no 6ay di"erencia entre Private y &im, pero es pre"erible Private porque contrasta
con Pu%lic y 6ace que el c+di4o sea m7s "7cil de comprender.

Varia&les utili.adas por todos los mdulos
1ara 6acer que una variable a nivel de m+dulo est disponible para otros m+dulos, utilice la palabra
clave Pu%lic para declarar la variable. (os valores de las variables pFblicas est7n disponibles para
todos los procedimientos de la aplicaci+n. 3l i4ual que todas las variables a nivel de m+dulo, las
variables pFblicas se declaran en la secci+n *eclaraciones al principio del m+dulo. 1or ejemplo:
1ublic intTemp 3s ?nte4er

(ota Do puede declarar variables pFblicas en un procedimiento, s+lo en la secci+n *eclaraciones de
un m+dulo.

B%B%B0 9eclaraci(n
(a "orma de declarar las variables es la si4uiente:
&im) Pu%lic) 'tatic nombreAvariable As tipo
&im* 3l declarar una variable con esta palabra estamos diciendo que la variable sea local al
7mbito en que se declara. 1uede ser dentro de un procedimiento o dentro de un "ormulario, de esta "orma
no sera accesible desde los dem7s procedimientos o "ormularios.
Pu%lic: (as variables declaradas ser7n publicas y podr7n estar accesibles desde todos los
"ormularios de la aplicaci+n. 1ara conse4uirlo tendremos que declararlas en un m+dulo de c+di4o, no en
la secci+n declarations de cualquier "ormulario de los que conste la aplicaci+n. 1ara crear un m+dulo de
c+di4o en el menF principal de 0isual Basic marcamos en 1<5IE%T5O?D!ET3< GP*U(5 y
aparecer7 junto a los dem7s "ormularios de la ventana de proyecto aunque con un icono distinto indicando
que se trata de un m+dulo de c+di4o.
'tatic* %on esta "orma de declarar variables conse4uiremos que las variables locales no se creen
y se destruyan al entrar y salir de los procedimientos donde "ueron declaradas sino que se manten4a su
valor durante todo el periodo de ejecuci+n de la aplicaci+n. *e esta "orma a entrar en al4Fn procedimiento
las variables recuerdan el valor que tenan cuando se sali+ de l.
B%B%C0 =ipos de -ariables
1<?03TE+IP, !,M-(+ARI,
B55(E3D !+lo admite Q valores T<UE o &3(!E
BITE admite valores entre > y Q@@
?DTE:E< admite valores entre .LQRST y LQRSR
(5D:
admite valores entre .Q.=MR.MTL.SMT y
Q.=MR.MTL.SMR
!?D:(E
admite valores decimales con precisi+n
simple
*5UB(E
admite valores decimales de doble
precisi+n
%U<<ED%I v7lido para valores de tipo moneda
!T<?D: cadenas de caracteres
*3TE "ec6as, permite operar con ellas

B%B%D0 5atrices
1ara declarar matrices debemos colocar entre parntesis el nFmero de elementos de los que
constar7 a continuaci+n del nombre de la variable:
&im medidas(E) as inte4er
*e esta "orma tenemos una matri) de => elementos identi"icados del > al E
1odemos obli4ar a que el primer elemento de una matri) ten4a el ndice con valor =.
Esto lo 6aremos colocando la instrucci+n option base = en la secci+n declarations de nuestro
"ormulario.
Tambin podemos indicar los lmites in"erior y superior de la matri):
&im medidas(@ to =M) as inte4er
es una matri) de => elementos cuyos indices van del @ al =M
(as matrices multidimensionales se declaran de la si4uiente "orma:
&im medidas(= to =>, = to =>) as inte4er

CONSIDERACIONES
3l trabajar con 0isual Basic es pre"erible que activemos la opci+n que nos obli4ue a declarar
todas las variables que utilicemos, de esta "orma nos a6orraremos errores inesperados como el de trabajar
con una variable ya utili)ada anteriormente producindose un con"licto d"icil de resolver. En cambio si
intentamos declarar Q variables con el mismo nombre, en el mismo "ormulario o procedimiento se
produce un error en tiempo de edici+n avis7ndonos de la situaci+n.
1ara activar esta opci+n debemos ir a la opci+n del menF -erramientas y 5pciones para que
apare)ca un cuadro de dialo4o como este.
1<?03TE
(a opci+n que nos interesa activar es Requerir declaracin de variables que en este caso ya lo
est7. *e esta "orma en cada secci+n declarations de cada "ormulario aparecer7 la sentencia option explicit
5tra opci+n que es interesante activar, es la de Guardar los cambios en la "ic6a entorno, la cual
te 4uarda una copia del c+di4o antes de ejecutarlo por si acaso lue4o no podemos, se bloquea la
aplicaci+n etc... no suele pasar pero nunca se sabe. *e esta "orma te ase4uras que lo Fltimo que 6ayas
ejecutado lo tienes 4uardado en el disco.
(a opci+n Comprobacin automtica de sintais normalmente viene activada por de"ecto, no
conviene desactivarla puesto que te avisa de errores de sintaxis con"orme vas escribiendo el c+di4o: !i te
"alta el t6en despus del i", el do antes del $6ile etc...

,.( %rocedimientos y #unciones.

B%C%A0Introducci(n a los .rocedimientos%

1uede simpli"icar las tareas de pro4ramaci+n si divide los pro4ramas en componentes l+4icos m7s
peque8os. Estos componentes, llamados procedimientos, pueden convertirse en bloques b7sicos que le
permiten mejorar y ampliar 0isual Basic.
(os procedimientos resultan muy Ftiles para condensar las tareas repetitivas o compartidas, como
c7lculos utili)ados "recuentemente, manipulaci+n de texto y controles, y operaciones con bases de
datos.
-ay dos ventajas principales cuando se pro4rama con procedimientos:
(os procedimientos le permiten dividir los pro4ramas en unidades l+4icas discretas, cada una de
las cuales se puede depurar m7s "7cilmente que un pro4rama entero sin procedimientos.
(os procedimientos que se utili)an en un pro4rama pueden actuar como bloques de construcci+n
de otros pro4ramas, normalmente con pocas o nin4una modi"icaci+n.

En 0isual Basic se utili)an varios tipos de procedimientos:
1rocedimientos 'u% que no devuelven un valor.
1rocedimientos Function que devuelven un valor (normalmente conocidos como "unciones).

B%C%B0 .rocedimientos%

Un procedimiento 'u% es un bloque de c+di4o que se ejecuta como respuesta a un evento. 3l dividir el
c+di4o de un m+dulo en procedimientos 'u%, es m7s sencillo encontrar o modi"icar el c+di4o de la
aplicaci+n.
(a sintaxis de un procedimiento 'u% es la si4uiente:
.Private)Pu%lic/.'tatic/'u% nombre_procedimiento (argumentos)
instrucciones
-nd 'u%

%ada ve) que se llama al procedimiento se ejecutan las instrucciones que 6ay entre 'u% y -nd 'u%. !e
pueden colocar los procedimientos 'u% en m+dulos est7ndar, m+dulos de clase y m+dulos de
"ormulario. *e "orma predeterminada, los procedimientos 'u% son Pu%lic en todos los m+dulos, lo
que si4ni"ica que se les puede llamar desde cualquier parte de la aplicaci+n.
(os argumentos de un procedimiento son como las declaraciones de variables9 se declaran valores que
se pasan desde el procedimiento que 6ace la llamada.
<esulta muy Ftil en 0isual Basic distin4uir entre dos tipos de procedimientos 'u%, procedimientos
generales y procedimientos de evento.

%rocedimientos generales

Un procedimiento 4eneral indica a la aplicaci+n c+mo reali)ar una tarea espec"ica. Una ve) que se
de"ine un procedimiento 4eneral, se le debe llamar espec"icamente desde la aplicaci+n. 1or el
contrario, un procedimiento de evento permanece inactivo 6asta que se le llama para responder a
eventos provocados por el usuario o desencadenados por el sistema.
U1or qu crear procedimientos 4eneralesV Una ra)+n es que muc6os procedimientos de evento distintos
pueden necesitar que se lleven a cabo las mismas acciones. Es una buena estrate4ia de pro4ramaci+n
colocar las instrucciones comunes en un procedimiento distinto (un procedimiento 4eneral) y 6acer que
los procedimientos de evento lo llamen. Esto elimina la necesidad de duplicar c+di4o y tambin 6ace que
la aplicaci+n sea m7s "7cil de mantener.

%rocedimientos de e!ento

%uando un objeto en 0isual Basic reconoce que se 6a producido un evento, llama autom7ticamente al
procedimiento de evento utili)ando el nombre correspondiente al evento. %omo el nombre establece
una asociaci+n entre el objeto y el c+di4o, se dice que los procedimientos de evento est7n adjuntos a
"ormularios y controles.
Un procedimiento de evento de un control combina el nombre real del control (especi"icado en la
propiedad (ame), un car7cter de subrayado (A) y el nombre del evento. 1or ejemplo, si desea que
un bot+n de comando llamado cmd1lay llame a un procedimiento de evento cuando se 6a4a clic
en l, utilice el procedimiento cmd1layA%lic2.
Un procedimiento de evento de un "ormulario combina la palabra ,&orm,, un car7cter de
subrayado y el nombre del evento. !i desea que un "ormulario llame a un procedimiento de evento
cuando se 6ace clic en l, utilice el procedimiento &ormA%lic2. (%omo los controles, los
"ormularios tienen nombres Fnicos, pero no se utili)an en los nombres de los procedimientos de
evento.)

Todos los procedimientos de evento utili)an la misma sintaxis 4eneral.

'inta0is de un evento de control 'inta0is de un evento de 1ormulario

Private 'u% nombrecontrol_nombreevento (argumentos )
instrucciones
-nd 'u%

Private 'u% FormAnombreevento (argumentos)
instrucciones
-nd 'u%

3unque puede escribir procedimientos de evento nuevos, es m7s sencillo utili)ar los procedimientos
de c+di4o que "acilita 0isual Basic, que incluyen autom7ticamente los nombres correctos de
procedimiento. 1uede seleccionar una plantilla en la ventana Editor de c+di4o si selecciona un objeto
en el cuadro ,%2eto y selecciona un procedimiento en el cuadro Procedimiento.
Tambin es conveniente establecer la propiedad (ame de los controles antes de empe)ar a escribir los
procedimientos de evento para los mismos. !i cambia el nombre de un control tras vincularle un
procedimiento, deber7 cambiar tambin el nombre del procedimiento para que coincida con el nuevo
nombre del control. *e lo contrario, 0isual Basic no ser7 capa) de 6acer coincidir el control con el
procedimiento. %uando el nombre de un procedimiento no coincide con el nombre de un control, se
convierte en un procedimiento 4eneral.

B%C%C0 Gunciones%

(a sintaxis de un procedimiento Function es la si4uiente:
.Private)Pu%lic/.'tatic/Function nombre_procedimiento (argumentos) WAs tipoX
instrucciones
-nd Function

3l i4ual que un procedimiento 'u%, un procedimiento Function es un procedimiento di"erente que
puede tomar ar4umentos, reali)ar una serie de instrucciones y cambiar el valor de los ar4umentos. 3
di"erencia de los procedimientos 'u%, los procedimientos Function pueden devolver un valor al
procedimiento que reali)a la llamada. -ay tres di"erencias entre los procedimientos 'u% y Function:
:eneralmente, se llama a una "unci+n incluyendo el nombre y los ar4umentos del procedimiento
en la parte derec6a de una instrucci+n o expresi+n mayor (valor_retorno = funcin()).
(os procedimientos Function tienen tipos de datos, al i4ual que las variables. Esto determina el
tipo del valor de retorno. (En ausencia de la cl7usula As, el tipo es el tipo predeterminado
3ariant.)
!e devuelve un valor asi4n7ndole al propio nombre_procedimiento. %uando el procedimiento
Function devuelve un valor, se puede convertir en parte de una expresi+n mayor.

1or ejemplo, podra escribir una "unci+n que calculara el tercer lado, o 6ipotenusa, de un tri7n4ulo
rect7n4ulo, dados los valores de los otros dos lados:
&unction -ipotenusa (3 3s ?nte4er, B 3s ?nte4er) 3s !trin4
-ipotenusa ; !qr(3 Y Q K B Y Q)
End &unction

!e llama a un procedimiento Function de la misma "orma que a las "unciones incorporadas en 0isual
Basic:
(abel=.%aption ; -ipotenusa(%?nt(Text=.Text),%?nt(TextQ.Text))
strH ; -ipotenusa(#idt6, -ei46t)

B%C%D0 Llamadas a .rocedimientos%

Un procedimiento 'u% di"iere de un procedimiento Function en que al procedimiento 'u% no se le
puede llamar mediante su nombre en una expresi+n. (a llamada a un procedimiento 'u% es una
instrucci+n Fnica. 3dem7s, un procedimiento 'u% no devuelve un valor en su nombre como 6ace una
"unci+n. !in embar4o, al i4ual que Function, un procedimiento 'u% puede modi"icar los valores de las
variables que se le pasan.
-ay dos "ormas de llamar a un procedimiento 'u%:
Z 3mbas instrucciones llaman a un !ub denominado Gi1roc.
%all Gi1roc (1rimer3r4umento, !e4undo3r4umento)
Gi1roc 1rimer3r4umento, !e4undo3r4umento

5bserve que cuando utili)a la sintaxis !all, debe poner los ar4umentos entre parntesis. !i omite la
palabra clave !all, deber7 tambin omitir los parntesis alrededor de los ar4umentos.

B%C%;0 Llamadas a Gunciones%

Dormalmente se llama a un procedimiento de "unci+n que se 6a escrito de la misma "orma en que se
llama a una "unci+n intrnseca de 0isual Basic como A%s9 es decir, utili)ando su nombre en una
expresi+n:
Z (as instrucciones si4uientes llamaran a una "unci+n A
Z llamada To*ec.
1rint => [ 3dec
H ; 3dec
?" 3dec ; => T6en *ebu4.1rint ,&uera del intervalo,
H ; 5tra&unci+n(=> [ 3dec)

Tambin es posible llamar a una "unci+n i4ual que se llama a un procedimiento 'u%. (as instrucciones
si4uientes llaman a la misma "unci+n:
%all Iear(Do$)
Iear Do$

%uando llama a una "unci+n de esta manera, 0isual Basic desec6a el valor de retorno.

B%C%E0 .asa+e de ar!umentos a los procedimientos ) funciones%

Dormalmente el c+di4o de un procedimiento necesita cierta in"ormaci+n sobre el estado del pro4rama
para reali)ar su trabajo. Esta in"ormaci+n consiste en variables que se pasan al procedimiento cuando
se le llama. %uando se pasa una variable a un procedimiento, se llama argumento.

/ipos de datos de los argumentos

(os ar4umentos de los procedimientos que escriba tienen el tipo de dato 3ariant de "orma
predeterminada. !in embar4o, puede declarar otros tipos de datos para los ar4umentos. 1or ejemplo, la
"unci+n si4uiente acepta una cadena y un entero:

&unction \u%omer (*a!emana 3s !trin4, -ora 3s ?nte4er) 3s !trin4
Z *evuelve el menF del almuer)o bas7ndose en el da y la 6ora.
?" *a!emana ; ,0iernes, t6en
\u%omer ; ,1escado,
Else
\u%omer ; ,1ollo,
End ?"
?" -ora / M T6en \u%omer ; ,*emasiado tarde,
End &unction

%aso de argumentos por !alor

!+lo se pasa una copia de la variable cuando se pasa un ar4umento por valor. !i el procedimiento
cambia el valor, el cambio a"ecta s+lo a la copia y no a la variable propiamente dic6a. Utilice la
palabra clave 453al para indicar un ar4umento pasado por valor.
1or ejemplo:

!ub %uentas (By0al intDum%uenta as ?nte4er)
.
. Z 1on4a aqu sus instrucciones.
.
End !ub

%aso de argumentos por re#erencia

1asar ar4umentos por re"erencia le da al procedimiento acceso al contenido real de la variable en su
ubicaci+n de direcci+n de memoria. %omo resultado, el procedimiento al que se 6a pasado el valor de
la variable se puede modi"icar de "orma permanente. (a "orma predeterminada de pasar valores en
0isual Basic es por re"erencia.
!i especi"ica el tipo de dato de un ar4umento que se pasa por re"erencia, debe pasar un valor de ese
tipo para el ar4umento. 1uede eludirlo si pasa una expresi+n en ve) de un tipo de dato como
ar4umento. 0isual Basic evalFa la expresi+n y la pasa como el tipo requerido si puede.
(a "orma m7s sencilla de convertir una variable en una expresi+n es ponerla entre parntesis. 1or
ejemplo, para pasar una variable declarada como entero a un procedimiento que espera una cadena
como ar4umento, debera 6acer lo si4uiente:

!ub 1rocedimiento\ue(lama ()
*im intH 3s ?nte4er
intH ; =Q [ L
&oo(intH)
End !ub

!ub &oo(Bar 3s !trin4)
Gs4Box Bar ZEl valor de Bar es la cadena ,LS,.
End !ub

,.) *structuras de Control 0Repeticin y +ecisin1.

B%D%A09o 2hile H Loop I 9o H Loop 2hile%

Utilice el bucle &o para ejecutar un bloque de instrucciones un nFmero inde"inido de veces. -ay
al4unas variantes en la instrucci+n &o...6oo7, pero cada una evalFa una condici+n numrica para
determinar si continFa la ejecuci+n. %omo ocurre con I1...+hen, la condicin debe ser un valor o una
expresi+n que d como resultado False (cero) o +rue (distinto de cero).
En el ejemplo de &o...6oo7 si4uiente, las instrucciones se ejecutan siempre y cuando condicin sea
+rue:

&o 8hile condicin
instrucciones
6oo7

%uando 0isual Basic ejecuta este bucle &o, primero evalFa condicin. !i condicin es False (cero), se
salta todas las instrucciones. !i es +rue (distinto de cero), 0isual Basic ejecuta las instrucciones,
vuelve a la instrucci+n &o 8hile y prueba la condici+n de nuevo.
1or tanto, el bucle se puede ejecutar cualquier nFmero de veces, siempre y cuando condicin sea
distinta de cero o +rue. Dunca se ejecutan las instrucciones si condicin es False inicialmente. 1or
ejemplo, este procedimiento cuenta las veces que se repite una cadena de destino dentro de otra cadena
repitiendo el bucle tantas veces como se encuentre la cadena de destino:

&unction %ontar%adenas (cadenalar4a, destino)
*im posici+n, contador
posici+n ; =
*o #6ile ?n!tr(posici+n, cadenalar4a, destino)
posici+n ; ?n!tr(posici+n, cadenalar4a, destino) K=
contador ; contador K =
(oop
%ontar%adenas ; contador
End &unction

!i la cadena de destino no est7 en la otra cadena, In'tr devuelve > y no se ejecuta el bucle.
5tra variante de la instrucci+n &o...6oo7 ejecuta las instrucciones primero y prueba condicin despus
de cada ejecuci+n. Esta variaci+n 4aranti)a al menos una ejecuci+n de instrucciones:

&o
instrucciones
6oo7 8hile condicin

Hace el bucle cero o ms veces Hace el bucle al menos una vez
Do Until condicin
instrucciones
Loo
Do
instrucciones
Loo Until condicin


B%D%B0 Gor H <e4t%

(os bucles &o "uncionan bien cuando no se sabe cu7ntas veces se necesitar7 ejecutar las instrucciones
del bucle. !in embar4o, cuando se sabe que se van a ejecutar las instrucciones un nFmero determinado
de veces, es mejor ele4ir el bucle For9(e0t. 3 di"erencia del bucle &o, el bucle For utili)a una
variable llamada contador que incrementa o reduce su valor en cada repetici+n del bucle. (a sintaxis es
la si4uiente:

For contador ; iniciar +o finalizar W'te7 incrementoX
instrucciones
(e0t WcontadorX

(os ar4umentos contador, iniciar, finalizar e incremento son todos numricos.
(ota El ar4umento incremento puede ser positivo o ne4ativo. !i incremento es positivo, iniciar debe
ser menor o i4ual que finalizar o no se ejecutar7n las instrucciones del bucle. !i incremento es
ne4ativo, iniciar debe ser mayor o i4ual que finalizar para que se ejecute el cuerpo del bucle. !i no se
establece 'te7, el valor predeterminado de incremento es =.

3l ejecutar el bucle For, 0isual Basic:
1. Establece contador al mismo valor que iniciar.
2. %omprueba si contador es mayor que finalizar. !i lo es, 0isual Basic sale del bucle.
(!i incremento es ne4ativo, 0isual Basic comprueba si contador es menor que finalizar.)
3. Ejecuta instrucciones.
4. ?ncrementa contador en = o en instrucciones, si se especi"ic+.
. <epite los pasos Q a M.

Este c+di4o imprime los nombres de todas las "uentes de pantalla disponibles:

1rivate !ub &ormA%lic2 ()
*im ? 3s ?nte4er
&or i ; > To !creen.&ont%ount
1rint !creen.&onts(i)
Dext
End !ub

En la aplicaci+n de ejemplo 0%<, el procedimiento -i46li46tButton utili)a un bucle For...(e0t para
pasar por la colecci+n de controles del "ormulario 0%< y mostrar el control 'ha7e apropiado:

!ub -i46li46tButton(Gy%ontrol 3s 0ariant)
*im i 3s ?nte4er
&or i ; > To "rm0%<.%ontrols.%ount . =
?" Type5" "rm0%<.%ontrols(i) ?s !6ape T6en
?" "rm0%<.%ontrols(i).Dame ; Gy%ontrol T6en
"rm0%<.%ontrols(i).0isible ; True
Else
"rm0%<.%ontrols(i).0isible ; &alse
End ?"
End ?"
Dext
End !ub

,.).( 2# 3 *lse 3 *nd 2#.

Use la estructura I1...+hen para ejecutar una o m7s instrucciones basadas en una condici+n. 1uede
utili)ar la sintaxis de una lnea o un bloque de varias lneas:

I1 condicin +hen instruccin
I1 condicin +hen
instrucciones
-nd I1

ondicin normalmente es una comparaci+n, pero puede ser cualquier expresi+n que d como
resultado un valor numrico. 0isual Basic interpreta este valor como +rue o False9 un valor numrico
cero es False y se considera +rue cualquier valor numrico distinto de cero. !i condicin es +rue,
0isual Basic ejecuta todas las instrucciones que si4uen a la palabra clave +hen. 1uede utili)ar la
sintaxis de una lnea o de varias lneas para ejecutar una instrucci+n basada en una condici+n (estos
dos ejemplos son equivalentes):
?" cualquier&ec6a ] Do$ T6en cualquier&ec6a ; Do$

?" cualquier&ec6a ] Do$ T6en
cualquier&ec6a ; Do$
End ?"

5bserve que el "ormato de una Fnica lnea de I1...+hen no utili)a la instrucci+n -nd I1. !i desea
ejecutar m7s de una lnea de c+di4o cuando condicin sea +rue, debe utili)ar la sintaxis de bloque de
varias lneas I1...+hen...-nd I1.

?" cualquier&ec6a ] Do$ T6en
cualquier&ec6a ; Do$
Timer=.Enabled ; &alse Z *esactiva el control Timer.
End ?"

2#.../hen...*lse
Utilice un bloque I1...+hen...-lse para de"inir varios bloques de instrucciones, uno de los cuales se
ejecutar7:

I1 condicin! +hen
Wbloque de instrucciones !X
W-lse
Wbloque de instrucciones nXX
-nd I1

0isual Basic evalFa primero condicin!. !i es False, 0isual Basic ejecuta el bloque de instrucciones
correspondientes a -lse y despus ejecuta el c+di4o que si4ue a -nd I1.
1or ejemplo, la aplicaci+n podra reali)ar distintas acciones dependiendo del control en que se 6aya
6ec6o clic de una matri) de controles de menF:

1rivate !ub mnu%utA%lic2 (?ndex 3s ?nte4er)
?" ?ndex ; > T6en Z %omando %ortar.
%opy3ctive%ontrol
%lear3ctive%ontrol
Else Z %omando 1e4ar.
1aste3ctive%ontrol
End ?"
End !ub

B%D%D0 ,elect 0 Case

0isual Basic proporciona la estructura 'elect !ase como alternativa a I1...+hen...-lse para ejecutar
selectivamente un bloque de instrucciones entre varios bloques de instrucciones. (a instrucci+n 'elect
!ase o"rece posibilidades similares a la instrucci+n I1...+hen...-lse, pero 6ace que el c+di4o sea m7s
le4ible cuando 6ay varias opciones.
(a estructura 'elect !ase "unciona con una Fnica expresi+n de prueba que se evalFa una ve)
solamente, al principio de la estructura. 0isual Basic compara el resultado de esta expresi+n con los
valores de cada !ase de la estructura. !i 6ay una coincidencia, ejecuta el bloque de instrucciones
asociado a ese !ase:

'elect !ase expresin_prueba
W!ase lista_expresiones!
Wbloque de instrucciones !XX
W!ase lista_expresiones"
Wbloque de instrucciones "XX
.
.
.
W!ase -lse
Wbloque de instrucciones nXX
-nd 'elect

%ada lista_expresiones es una lista de uno o m7s valores. !i 6ay m7s de un valor en una lista, se
separan los valores con comas. %ada bloque de instrucciones contiene cero o m7s instrucciones. !i
m7s de un !ase coincide con la expresi+n de prueba, s+lo se ejecutar7 el bloque de instrucciones
asociado con la primera coincidencia. 0isual Basic ejecuta las instrucciones de la cl7usula (opcional)
!ase -lse si nin4Fn valor de la lista de expresiones coincide con la expresi+n de prueba.
1or ejemplo, supon4a que a4re4a otro comando al menF -dicin en el ejemplo I1...+hen...-lse. 1odra
a4re4ar otra cl7usula -lseI1 o podra escribir la "unci+n con 'elect !ase:

1rivate !ub mnu%utA%lic2 (?ndex 3s ?nte4er)
!elect %ase ?ndex
%ase > Z %omando %ortar.
%opy3ctive%ontrol Z (lama a procedimientos 4enerales.
%lear3ctive%ontrol
%ase = Z %omando %opiar.
%opy3ctive%ontrol
%ase Q Z %omando Borrar.
%lear3ctive%ontrol
%ase L Z %omando 1e4ar.
1aste3ctive%ontrol
%ase Else
"rm&ind.!6o$ Z Guestra el cuadro de di7lo4o Buscar.
End !elect
End !ub

5bserve que la estructura 'elect !ase evalFa una expresi+n cada ve) al principio de la estructura.

!- "ontroles
(.$ Controles &4sicos
0amos a ver los si4uientes puntos:
Introduccin al uso de controles
Control !et"o#
Control $abel
Control Command"utton
Control Option"utton
Reali%ac&on de una peque'a aplicacin de e(emplo

3ntes de empe)ar a conocer los controles b7sicos veamos cuales son sus caractersticas 4enerales:
Pro7iedades:Todos los controles disponen de una serie de propiedades
las cuales podemos cambiar al incluirlos en nuestras aplicaciones.
Ejemplos de propiedades son el color, el tipo de letra, el nombre, el texto,
etc...
Metodos* !on procedimientos asociados a los controles, es decir, rutinas
ya establecidas que podemos invocar desde nuestras aplicaciones para
que se realice al4una operaci+n sobre el control. 1or ejemplo el control
(ist0ie$ ( la lista de arc6ivos que aparece en el explorador de $indo$s)
dispone del mtodo order que te ordena los datos aparecidos en la lista.
-ventos* !on acciones que pueden ser motivadas por el propio usuario o
por mismo sistema operativo. Ejemplos pueden ser el movimiento del
rat+n o 6acer clic2 sobre su bot+n. En 0isual Basic di4amos que se
utili)a la pro4ramaci+n orientada a eventos, lo cual es una de las
di"erencias m7s importantes respecto a la pro4ramaci+n lineal de G!
*5!. Do necesitamos detectar cuando se 6a producido un evento
determinado, #indo$s lo detecta autom7ticamente. (os eventos ya estan
de"inidos, son bastantes y cada control cuenta con los suyos propios,
aunque son muy parecidos. (o Fnico que tendremos que 6acer es asociar
el c+di4o necesario al evento que necesitemos tratar.
#ext$ox
Gediante este control podremos reali)ar tanto la entrada como la salida de datos en nuestras aplicaciones.
Do 6ace "alta que indiquemos las coordenadas de la situaci+n del "ormulario en pantalla, simplemente
tendremos que marcar sobre el control de la caja de 6erramientas y dibujarlo con el tama8o que queramos
en nuestro "ormulario.

)RO)IEDADES
(as propiedades de las que dispone el control son las si4uientes:(para obtener el cuadro de propiedades,
seleccionar el control y pulsar F4 o pulsar con el boton derec6o para obtener el menF contextual y marcar
)ropierties)
+e0t* 3qu indicamos el texto que aparecer7 en el control. 1odemos asi4narle
cualquier texto en tiempo de dise8o o ejecuci+n. Tambin podemos tomar el
texto que 6aya introducido el usuario para tratarlo durante la ejecuci+n.
(ame* Esta propiedad la tienen todos los controles, el nombre que viene por
de"ecto en este caso Text= y es el nombre con el que se conocer7 el control
cuando lo utilicemos en el c+di4o. En un mismo "ormulario no puede 6aber Q
controles con el mismo nombre. %onviene poner un nombre que represente la
"unci+n que tiene el control en la aplicaci+n para que el c+di4o quede m7s claro.
Ejemplo, si en el textbox vamos a introducir la direcci+n de una persona
podemos asi4narle a esta propiedad el valor *irecci+n.
Multi6ine* 1ermite que introdu)camos varias lineas de texto en el control en
lu4ar de s+lo una.
Ali:nment* 3lineaci+n que tendr7 el texto dentro del control: i)quierda, centro o
derec6a. 1ara que "uncione la propiedad Gulti(ine debe estar con el valor true.
6oc;ed* !i esta con valor true bloquea el control, es decir, el usuario no puede
introducir ni modi"icar el texto que conten4a. Dos puede servir para utili)ar el
control como salida de datos sin que el usuario pueda modi"icarlos por error.
5tras propiedades que son comunes a la mayoria de los controles:
4ac;color* color de "ondo.
Forecolor* color de letra.
Font* tipo y tama8o de letra.

*E!ODOS
<ecordemos que por mtodos se entienten los procedimientos o "unciones asociados a un control, los
cuales nos permiten reali)ar ciertas operaciones Ftiles sobre dic6o control: Ej. ordenar sus elementos,
buscar un dato, etc..
1ues bien, los controles b7sicos que vamos a ver en este captulo Fnicamente contienen mtodos
avan)ados que no vamos a anali)ar por a6ora, ya que son mtodos que no se suelen utili)ar. G7s adelante
cuando veamos otros tipos de controles estudiaremos cuales son los mtodos que nos podr7n servir. !i
al4uien est7 interesado en conocer todas las caractersticas de los controles puede 6acerlo mirando en la
ayuda que proporciona 0B, 6aciendo clic2 sobre cualquier control de la caja de 6erramientas y pulsando a
continuaci+n &= obtendr7 ayuda re"erente a ese control donde aparecer7n todas sus propiedades, metodos
y eventos.



E+EN!OS
(os eventos son acciones que se pueden reali)ar en cualquier control: clic2, doble clic2, movimiento del
rat+n. 3 estos eventos se les puede asociar c+di4o para que se ejecute al producir el evento.
MouseMove: al mover el raton por encima del control.
Mousedo<n* al pulsar cualquier boton del raton
!han:e* al cambiar el contenido del control
!lic;* al 6acer clic2 con el bot+n i)quierdo del rat+n sobre el control
&ou%leclic;* al 6acer doble clic2 con el con el bot+n i)quierdo del rat+n sobre
el control
Get1ocus* este evento se activa cuando el control recibe el en"oque, es decir,
cuando se activa el control en tiempo de ejecuci+n para introducir datos en l o
reali)ar al4una operaci+n.
6ost1ocus* Es el contrario del anterior evento, se activa cuando el control pierde
el en"oque, es decir, se pasa a otro control para se4uir introduciendo datos.

-=-MP6,
0amos a probar el uso del control #ext$ox mediante un peque8o ejemplo en el que teniendo un Fnico
control de este tipo en un "ormulario, lo pro4ramaremos de "orma que al pasar el rat+n sobre el control
(evento mousemove) aparecer7 en el "ormulario el texto que conten4a.

5bservamos que al situar el control en el "ormulario aparece por de"ecto el texto +e0t1. 1ara que no
apare)ca ese texto al ejecutar la aplicaci+n, debemos cambiar la propiedad +e0t pulsando F4 y colocar el
texto que queramos o no colocar nada.
(o que queremos 6acer es que cada ve) que movamos el raton por el control apare)ca su contenido en el
"ormulario. Entonces lo que 6abr7 que 6acer abrir la ventana de c+di4o, seleccionando el control y
pulsando F>? o con el bot+n derec6o del rat+n y la opci+n +ie, code del menF contextual. Este proceso
nos llevar7 al cuadro de la ima4en si4uiente.
(o que tendremos que 6acer es seleccionar el evento que necesitemos de la secci+n Proc, en nuestro caso
mousemove y a continuaci+n teclear el codi4o correspondiente: (a instrucci+n print visuali)a un texto
en el "ormulario y si le ponemos te0t1.te0t le decimos que nos muestre la propiedad +e0t del control
+e0t1 que ese ser7 el nombre que tendr7 el control por de"ecto si no lo 6emos cambiado en la propiedad
name.
3l ejecutar esta peque8a aplicaci+n pulsando F observaremos como aparece en el "ormulario lo que
6ayamos tecleado en el control cada ve) que movemos el raton sobre el #extbox.
1odemos modi"icar el pro4rama para que responda a cualquier otro evento sin m7s que seleccionarlo en la
secci+n Proc e introduciendo el codi4o que sea necesario.

%abel
Este control es tambin uno de los m7s utili)ados, aunque su utilidad queda restrin4ida a la visuali)aci+n
de datos en el mismo, no permitiendo la introducci+n de datos por parte del usuario.
(a "orma de utili)arlo es similar a la del control anterior, dibujar el control en el "ormulario con el tama8o
que queramos y asi4narle un texto en tiempo de dise8o o de ejecuci+n esta ve) sin utili)ar la propiedad
text puesto que no la incorpora, sino utili)ando la propiedad caption.
Este control sirve para mostrar mensajes en nuestro "ormulario que orienten al usuario sobre la utilidad de
los dem7s controles que ten4amos en la aplicaci+n o para indicarnos acciones que podemos reali)ar. En el
ejemplo anterior donde apareca un textbox en el "ormulario, 6ubiera quedado mejor con un mensaje
aclaratorio contenido en un control label:


)RO)IEDADES
!a7tion* Es el texto que contendr7 el control.
Ali:nment* 3lineaci+n del texto contenido en el control, no necesita que est
activada nin4una otra propiedad.
4order't5le: !i queremos que apare)ca un borde alrededor del control
activaremos esta propiedad.

1ara este control no se suelen utili)ar los eventos ya que su contenido suele cambiar poco a lo lar4o de la
ejecuci+n de la aplicaci+n. *e todas "ormas los eventos son casi los mismos del control textbox excepto
que no dispone de los eventos GetFocus y 6ostFocus ya que a este control no se le puede dar el en"oque.
En la parte "inal de este capitulo veremos un ejemplo donde se muestra el "uncionamiento de todos los
controles que vamos a ir viendo.1or a6ora a ver si conse4uis que a6ora el mensaje no apare)ca en el
"ormulario sino en un se4undo label situado en el "ormulario, dejando un control label que muestre el
mensaje aclaratorio que 6emos visto antes.

ommand$utton
Este control es el tpico bot+n que aparece en todas las aplicaciones y que al 6acer clic2 sobre l nos
permite reali)ar al4una operaci+n concreta, normalmente 3ceptar o %ancelar. 3unque se4Fn el c+di4o que
le asociemos podremos reali)ar las operaciones que queramos.
En el ejemplo anterior podemos a8adir un control de este tipo para salir de la aplicaci+n sin tener pulsar
sobre la equis de la esquina superior derec6a.


1ero s+lo con introducir un control de este tipo con el texto salir que se introduce a traves de la propiedad
caption no basta. -abr7 que asociarle un c+di4o que nos permita salir de la aplicaci+n en el evento
adecuado. I el evento por excelencia de este control es clic2. 3s pues accederemos al c+di4o del control
y la sentencia nos permitir7 salir de la aplicaci+n es End, simplemente tecleamos esa palabra en el evento
clic2 y comprobar que realmente "inali)aremos nuestra aplicaci+n al pulsar sobre dic6o bot+n.
)RO)IEDADES
!a7tion* 3qui pondremos el letrero que queremos que apae)ca en el bot+n:
aceptar, cancelar, salir, etc...
-na%led* Esta es una nueva propiedad, cuando su valor es true el bot+n
"unciona normalmente, cuando su valor es "alse el boton se encuentra
desactivado, no responde a los eventos producidos sobre l y el texto aparece en
un 4ris claro advirtiendonos de su estado. 1odemos utili)ar esta propiedad para
activar o desactivar un boton dependiendo del estado de otros controles. 1or
ejemplo, en un boton 3ceptar, no activarlo 6asta que se 6aya introducido una
cantidad en un control textbox, ya que ese bot+n nos calcular7 el ?03 de la
cantidad.
E+EN!OS
!lic;* Es el evento tipico de este control y el que m7s se utili)a.
MouseMove: %omo sabemos detecta el movimiento del raton sobre el control.
1uede servir para que apare)ca un mensaje en un control (abel que nos aporte
in"ormaci+n sobre la utilidad del control ampliando el texto que 6ayamos
colocado como caption del commandbutton.

&ption$utton
Este control nos permite ele4ir una opci+n entre varias de las que se nos plantean. %ada opci+n ser7 un
control optionbutton di"erente.
&acilita la introducci+n de datos por parte del usuario:


*e todas las opciones que se nos o"rece, en este caso los M colores, s+lo podremos activar una. !i
activamos cualquier otra opci+n, se desactivar7 autom7ticamente la Fltima que tenamos activada.
El marco que est7 alrededor de los M controles optionbutton se trata del control -rame , es opcional,
aunque es conviente colocarlo siempre que 6a4amos uso de las opciones. Do s+lo por motivos de
presentaci+n sino porque de esta manera podremos establecer 4rupos de controles optionbutton
independientes en los que en cada 4rupo s+lo pueda 6aber una opcio+n activada a la ve). Tambin, al
mover el marco se mover7n los controles incluidos en l "acilit7ndonos las modi"icaciones.
1ara que los controles &ptionbutton queden en4lobados dentro de un control 'rame, primero tendremos
que colocar el control 'rame en el "ormulario con el tama8o adecuado y despues ir colocando los
controles &ptionbutton dentro del 'rame.
*el control &rame la Fnica propiedad que nos interesar7 es caption, que es el texto que aparecer7 en el
encabe)ado, en el ejemplo anterior: colores.
)RO)IEDADES DE O)!ION".!!ON
!a7tion* El texto que aparecer7 al lado del control: <ojo, verde, etc...
3alue* Es el valor que tendr7 el control: True si se encuentra activado y False
si no lo est7. 1ara comprobar que opcion 6a activado el usuario comprobaremos
el estado de esta propiedad.
Ali:nment* 3lineaci+n del texto respecto al control: Left Justify: el control
aparece a la i)quierda del texto. Es el ejemplo anterior.Right Justify: el
control aparece a la derec6a del texto.

(os eventos del control son los mismos que en anteriores controles, aunque no se suele asociar c+di4o a
los eventos de este tipo de controles, sino Fnicamente conocer el valor que tienen: true o false.

C%A%A0 /.LIC/CI@< 9& &J&5.L@
1ara practicar con los controles que 6emos visto vamos a reali)ar una peque8a aplicaci+n que consistir7
en reali)ar con Q nFmeros que introdu)camos, una operaci+n que seleccionemos y mostrar el resultado.
El "ormulario donde estar7n todos los controles es el si4uiente:

(a propiedad !a7tion de cada uno de los controles es la que se muestra en el "ormulario.
-e modi"icado la propiedad (ame de cada control para que al utili)arlos desde el codi4o sepamos cual es
el control con el que trabajamos:
(os controles #ext$ox tienen los nombres: (um1, (um2 y Resul.
(os controles &ptionbutton tienen cada uno de ellos el mismo nombre que su caption
(os controles ommand$utton tienen los nombres: !alcular, 6im7iar y 'alir.
3 los controles %abel y al 'rame no 6ave "alta cambiarles el nombre.

(o que 6abr7 que 6acer a6ora es asociar codi4o a cada uno de los botones que es de donde se van a
reali)ar las operaciones:
1ara el bot+n Calcular que es el que nos mostrar7 el resultado se4Fn la operaci+n seleccionada,
6e utili)ado la instrucci+n If Then Else que vimos en el captulo anterior:

El bot+n $impiar Datos nos va a servir para borrar de una "orma r7pida los datos introducidos
por el usuario y el resultado preparando los controles para introducir nuevos datos. El c+di4o que
tendremos que introducir es muy simple:
El bot+n Salir Fnicamente contendr7 la sentencia End.

# -$ormularios%

(os "ormularios tienen sus propios eventos, propiedades y mtodos con los que se puede controlar su
apariencia y comportamiento.
El primer paso para dise8ar un "ormulario consiste en establecer sus propiedades. 1uede establecer las
propiedades de un "ormulario en tiempo de dise8o en la ventana 1ropiedades o en tiempo de ejecuci+n,
escribiendo c+di4o.
(ota En tiempo de dise(o, que es cualquier momento mientras est7 desarrollando una aplicaci+n en
el entorno de 0isual Basic, se trabaja con "ormularios y controles, se establecen propiedades y se
escribe c+di4o para los eventos. #iempo de e)ecucin es cualquier momento mientras se ejecuta
realmente la aplicaci+n y se interactFa con ella como lo 6ara un usuario.

).$ *sta&leciendo las %ropiedades m4s importantes de los
#ormularios.

Guc6as propiedades de un "ormulario a"ectan a su apariencia "sica. (a propiedad !a7tion determina
el texto que muestra la barra de ttulo del "ormulario y la propiedad Icon establece el icono que
aparece cuando se minimi)a un "ormulario. (as propiedades Ma04utton y Min4utton determinan si
el "ormulario se puede maximi)ar o minimi)ar. %ambiando la propiedad 4order't5le puede controlar
el comportamiento de cambio de tama8o del "ormulario.
(as propiedades @ei:ht y 8idth determinan el tama8o inicial de un "ormulario, mientras que las
propiedades 6e1t y +o7 determinan la ubicaci+n del "ormulario en relaci+n con la esquina superior
i)quierda de la pantalla. %on la propiedad 8indo<'tate puede establecer si el "ormulario se inicia en
estado maximi)ado, minimi)ado o normal.
(a propiedad (ame establece el nombre con el que 6ar7 re"erencia al "ormulario en el c+di4o. *e
"orma predeterminada, cuando se a4re4a un "ormulario por primera ve) a un proyecto, su nombre es
&orm=, &ormQ, etc. Es conveniente establecer la propiedad (ame a al4o m7s si4ni"icativo, como
B"rmEntryC para un "ormulario de entrada de pedidos.
(a mejor manera de "amiliari)arse con las numerosas propiedades de los "ormularios es experimentar.
%ambie al4unas propiedades de un "ormulario en la ventana 1ropiedades y ejecute la aplicaci+n para
ver su e"ecto. 1uede aprender m7s sobre cada propiedad si la selecciona y presiona &= para ver 3yuda
contextual.

)., *!entos y M5todos de los #ormularios.

%omo objetos que son, los "ormularios pueden ejecutar mtodos y responder a eventos.
El evento <esi)e de un "ormulario se desencadena siempre que se cambia el tama8o de un "ormulario,
ya sea por una acci+n del usuario o a travs del c+di4o. Esto permite reali)ar acciones como mover o
cambiar el tama8o de los controles de un "ormulario cuando 6an cambiado sus dimensiones.
El evento 3ctivate se produce siempre que un "ormulario se convierte en el "ormulario activo9 el
evento *eactivate se produce cuando otro "ormulario u otra aplicaci+n se convierte en activo. Estos
eventos son adecuados para iniciar o "inali)ar acciones del "ormulario. 1or ejemplo, en el evento
3ctivate podra escribir c+di4o para resaltar el texto de un determinado cuadro de texto9 con el evento
*eactivate podra 4uardar los cambios e"ectuados en un arc6ivo o en una base de datos.
1ara 6acer visible un "ormulario se invoca el mtodo 'ho<:

&ormQ.!6o$

1ara descar4ar un "ormulario (cerrarlo), se invoca al mtodo Anload:

&ormQ.Unload
Unload Ge ^Ge si4ni"ica el &ormulario activo.

1ara ocultar un "ormulario (pero dejarlo activo en memoria) se invoca al mtodo @ide:

&ormQ.-ide

?nvocar el mtodo 'ho< tiene el mismo e"ecto que establecer a +rue la propiedad 3isi%le del
"ormulario.
Guc6os mtodos de un "ormulario implican texto o 4r7"icos. (os mtodos Print, 6ine, !ircle y
Re1resh son Ftiles para imprimir o dibujar directamente en la super"icie de un "ormulario.

).( *sta&lecer el #ormulario de arran6ue de la aplicacin.

*e "orma predeterminada, el primer "ormulario de la aplicaci+n es el formulario inicial. %uando la
aplicaci+n inicia la ejecuci+n, se presenta este "ormulario (el primer c+di4o que se ejecuta es el del
evento &ormA?nitiali)e de dic6o "ormulario). !i quiere presentar un "ormulario di"erente cuando se
inicie la aplicaci+n, debe cambiar el "ormulario inicial.

Para cam%iar el 1ormulario inicial

=. En el menF Pro5ecto, elija Pro7iedades del 7ro5ecto.
Q. Elija la "ic6a General.
L. En el cuadro de lista ,%2eto inicial, seleccione el "ormulario que desee que sea el nuevo
"ormulario inicial.
M. Elija Ace7tar.

Inicio sin 1ormulario inicial

3l4unas veces puede desear que la aplicaci+n se inicie sin car4ar nin4Fn "ormulario. 1or ejemplo,
puede que desee ejecutar c+di4o que car4ue un arc6ivo de datos y despus presentar uno de entre
varios "ormularios, se4Fn el contenido de dic6o arc6ivo. 1uede 6acerlo creando un procedimiento 'u%
llamado Gain en un m+dulo est7ndar, como en el si4uiente ejemplo:

!ub Gain()
*im int!tatus 3s ?nte4er
Z (lamar a un procedimiento de "unci+n para comprobar el estado
Z del usuario.
int!tatus ; :etUser!tatus
Z Gostrar un "ormulario inicial distinto se4Fn el estado.
?" int!tatus ; = T6en
"rmGain.!6o$
Else
"rm1ass$ord.!6o$
End ?"

Este procedimiento tiene que ser un procedimiento 'u% y no puede estar en un m+dulo de "ormulario.
1ara establecer el procedimiento 'u% Main como objeto inicial, en el menF Pro5ecto elija
Pro7iedades del 7ro5ecto, seleccione la "ic6a General y seleccione 'u% Main en el cuadro ,%2eto
inicial.

& -"ombo 'o( )lista combo*

Un control !om%o4o0 combina las caractersticas de un control +e0t4o0 y un control 6ist4o09 los
usuarios pueden introducir in"ormaci+n en la parte del cuadro de texto o seleccionar un elemento en la
parte de cuadro de lista del control.
1ara a4re4ar o eliminar elementos en un control !om%o4o0, use el mtodo AddItem o RemoveItem.
Estable)ca las propiedades 6ist, 6ist!ount y 6istInde0 para permitir a un usuario tener acceso a los
elementos de un control !om%o4o0. %omo alternativa, puede a4re4ar elementos a la lista mediante la
propiedad 6ist en tiempo de dise8o.
(ota Un evento !croll ocurrir7 en un control !om%o4o0 s+lo cuando se desplace el contenido de la
parte desple4able del !om%o4o0, no cada ve) que cambie el contenido del !om%o4o0. 1or ejemplo,
si la parte desple4able de un !om%o4o0 contiene cinco elementos y el elemento superior est7
resaltado, no ocurrir7 un evento !croll 6asta que presione seis veces la "lec6a 6acia abajo (o una ve) la
tecla 30 1_:). *espus de eso, ocurrir7 un evento !croll por cada pulsaci+n de la tecla de "lec6a 6acia
abajo. !in embar4o, si despus presiona la tecla de "lec6a 6acia arriba, no ocurrir7 un evento !croll
6asta que presione seis veces la tecla de "lec6a 6acia arriba (o una ve) la tecla <E 1_:). *espus de
eso, cada ve) que presione la tecla de "lec6a 6acia arriba se producir7 un evento !croll.

Eventos:
Evento %6an4e Evento (ost&ocus
Evento %lic2 Evento 5(E%omplete*ra4
Evento *bl%lic2 Evento 5(E*ra4*rop
Evento *ra4*rop Evento 5(E*ra45ver
Evento *ra45ver Evento 5(E:ive&eedbac2
Evento *rop*o$n Evento 5(E!et*ata
Evento :ot&ocus Evento 5(E!tart*ra4
Eventos `ey*o$n y `eyUp Evento !croll
Evento `ey1ress

Gtodos:
Gtodo 3dd?tem Gtodo <e"res6
Gtodo %lear (%lipboard, %omboBox, (istBox) Gtodo <emove?tem
Gtodo *ra4 Gtodo !et&ocus
Gtodo Gove Gtodo !6o$#6atsT6is
Gtodo 5(E*ra4 Gtodo a5rder

1ropiedades:
1ropiedad 3ppearance 1ropiedad (ist?ndex
1ropiedades Bac2%olor y &ore%olor 1ropiedad (oc2ed
1ropiedad %ontainer 1ropiedad Gouse?con
1ropiedad *ata%6an4ed 1ropiedad Gouse1ointer
1ropiedad *ata&ield 1ropiedad Dame
1ropiedad *ra4?con 1ropiedad De$?ndex
1ropiedad *ra4Gode 1ropiedad 5(E*ra4Gode
1ropiedad Enabled 1ropiedad 5(E*ropGode
1ropiedad &ont 1ropiedad 1arent
1ropiedades &ontBold, &ont?talic, &ont!tri2et6ru y &ontUnderline
1ropiedad &ontDame 1ropiedades !el(en4t6, !el!tart y !elText (%ontroles
3ctiveH)
1ropiedad &ont!i)e 1ropiedad !orted
1ropiedades -ei46t y #idt6 1ropiedad !tyle
1ropiedad -elp%ontext?* 1ropiedad Tab?ndex
1ropiedad 6#nd 1ropiedad Tab!top
1ropiedad ?ndex (%ontrol 3rray) 1ropiedad Ta4
1ropiedad ?nte4ral-ei46t 1ropiedad Text
1ropiedad ?tem*ata 1ropiedad ToolTipText
1ropiedades (e"t y Top 1ropiedad Top?ndex
1ropiedad (ist 1ropiedad 0isible
1ropiedad (ist%ount 1ropiedad #6atsT6is-elp?*
1ropiedades !el(en4t6, !el!tart y !elText

+- List 'o( )lista*%

Un control 6ist4o0 muestra una lista de elementos entre los cuales el usuario puede seleccionar uno o
m7s. !i el nFmero de elementos supera el nFmero que puede mostrarse, se a4re4ar7 autom7ticamente
una barra de despla)amiento al control 6ist4o0.
!i no se selecciona nin4Fn elemento, el valor de la propiedad 6istInde0 ser7 .=. El primer elemento de
la lista es 6istInde0 > y el valor de la propiedad 6ist!ount siempre es uno m7s que el mayor valor de
6istInde0.
1ara a4re4ar o eliminar elementos de un control 6ist4o0, use el mtodo AddItem o RemoveItem.
Estable)ca las propiedades 6ist, 6ist!ount y 6istInde0 para permitir que un usuario ten4a acceso a
elementos del 6ist4o0. Tambin puede a4re4ar elementos a la lista mediante la propiedad 6ist en
tiempo de dise8o.

Eventos
Evento %lic2 Eventos Gouse*o$n y GouseUp
Evento *bl%lic2 Evento GouseGove
Evento *ra4*rop Evento 5(E%omplete*ra4
Evento *ra45ver Evento 5(E*ra4*rop
Evento :ot&ocus Evento 5(E*ra45ver
Evento ?tem%6ec2 Evento 5(E:ive&eedbac2
Eventos `ey*o$n y `eyUp Evento 5(E!et*ata
Evento `ey1ress Evento 5(E!tart*ra4
Evento (ost&ocus Evento !croll

Gtodos
Gtodo 3dd?tem Gtodo <e"res6
Gtodo %lear (%lipboard, %omboBox, (istBox) Gtodo <emove?tem
Gtodo *ra4 Gtodo !et&ocus
Gtodo Gove Gtodo !6o$#6atsT6is
Gtodo 5(E*ra4 Gtodo a5rder

1ropiedades
1ropiedad 3ppearance 1ropiedad Gouse1ointer
1ropiedades Bac2%olor y &ore%olor 1ropiedad Gulti!elect
1ropiedad %olumns ((istBox) 1ropiedad Dame
1ropiedad %ontainer 1ropiedad De$?ndex
1ropiedad *ata%6an4ed 1ropiedad 5(E*ra4Gode
1ropiedad *ata&ield 1ropiedad 5(E*ropGode
1ropiedad *ata!ource 1ropiedad 1arent
1ropiedad *ra4?con 1ropiedad !el%ount
1ropiedad *ra4Gode 1ropiedad !elected
1ropiedad Enabled 1ropiedad !orted
1ropiedad &ont 1ropiedad !tyle
1ropiedades &ontBold, &ont?talic, &ont!tri2et6ru y &ontUnderline
1ropiedad &ontDame 1ropiedad Tab!top
1ropiedad &ont!i)e 1ropiedad Ta4
1ropiedades -ei46t y #idt6 1ropiedad Text
1ropiedad -elp%ontext?* 1ropiedad ToolTipText
1ropiedad 6#nd 1ropiedad Top?ndex
1ropiedad ?ndex (%ontrol 3rray) 1ropiedad 0isible
1ropiedad ?tem*ata 1ropiedad #6atsT6is-elp?*
1ropiedades (e"t y Top 1ropiedad Tab?ndex
1ropiedad (ist 1ropiedad (ist%ount
1ropiedad (ist?ndex 1ropiedad Gouse?con

,- -imer )cronmetro*

Un control +imer puede ejecutar c+di4o a intervalos peri+dicos produciendo un evento Timer.
El control +imer, invisible para el usuario, resulta Ftil para el procesamiento de "ondo.
Do puede establecer la propiedad -na%led de un +imer para una selecci+n mFltiple de controles que
no sean controles +imer.
Do existe nin4Fn lmite pr7ctico en cuanto al nFmero de controles +imer activos que puede tener en
0isual Basic @.> ejecut7ndose en #indo$s E@ o en #indo$s DT.

Eventos:
Evento Timer
Propiedades:
1ropiedad Enabled 1ropiedad Dame
1ropiedad ?ndex (%ontrol 3rray) 1ropiedad 1arent
1ropiedad ?nterval 1ropiedad Ta4
1ropiedades (e"t y Top

.- /0ae )1igura*%

'ha7e es un control 4r7"ico que se muestra como un rect7n4ulo, un cuadrado, una elipse, un crculo,
un rect7n4ulo redondeado o un cuadrado redondeado.
Utilice controles 'ha7e en tiempo de dise8o en lu4ar de o adem7s de invocar los mtodos !ircle y
6ine en tiempo de ejecuci+n. 1uede dibujar un control 'ha7e en un contenedor, pero no puede actuar
como contenedor. El e"ecto de establecer la propiedad 4order't5le depende del valor de la propiedad
4order8idth. !i 4order8idth no es = y 4order't5le no es > + S, 4order't5le se establece a =.

Gtodos:
Gtodo Gove Gtodo a5rder
Gtodo <e"res6

1ropiedades:
1ropiedades Bac2%olor y &ore%olor 1ropiedades -ei46t y #idt6
1ropiedad Bac2!tyle 1ropiedad ?ndex (%ontrol 3rray)
1ropiedad Border%olor 1ropiedades (e"t y Top
1ropiedad Border!tyle 1ropiedad Dame
1ropiedad Border#idt6 1ropiedad 1arent
1ropiedad %ontainer 1ropiedad !6ape
1ropiedad *ra$Gode 1ropiedad Ta4
1ropiedad &ill%olor 1ropiedad 0isible
1ropiedad &ill!tyle

2- Line )l3nea*%

6ine es un control 4r7"ico que se muestra como una lnea 6ori)ontal, vertical o dia4onal.
1uede utili)ar un control 6ine en tiempo de dise8o para dibujar lneas en "ormularios. En tiempo de
ejecuci+n puede utili)ar un control 6ine en lu4ar del mtodo 6ine, o adem7s de l. (as lneas
dibujadas con el control 6ine permanecen en el "ormulario aunque la propiedad AutoRedra< sea
False. (os controles 6ine pueden mostrarse en "ormularios, en cuadros de ima4en y en marcos. Do
puede utili)ar el mtodo Move para mover un control 6ine en tiempo de ejecuci+n, pero s se puede
mover o cambiar de tama8o alterando sus propiedades "1, "2, B1 e B2. El e"ecto de establecer la
propiedad 4order't5le depende del valor de la propiedad 4order8idth. !i 4order8idth no es = y
4order't5le no es > + S, 4order't5le se establecer7 a =.

Gtodos:
Mtodo Refresh
Mtodo ZOrder
1ropiedades:
1ropiedad Border%olor 1ropiedad Dame
1ropiedad Border!tyle 1ropiedad 1arent
1ropiedad Border#idt6 1ropiedad Ta4
1ropiedad %ontainer 1ropiedad 0isible
1ropiedad *ra$Gode 1ropiedades H=, I=, HQ y IQ
1ropiedad ?ndex (%ontrol 3rray)

14- Image )imagen*

Utilice el control Ima:e para mostrar un 4r7"ico. Un control Ima:e puede mostrar un 4r7"ico desde un
mapa de bits, un icono o un metarc6ivo, as como un metarc6ivo mejorado, un arc6ivo b1E: o
arc6ivos :?&.
El control Ima:e utili)a menos recursos del sistema y actuali)a con m7s rapide) que un control
Picture4o0, pero s+lo admite un subconjunto de las propiedades, los eventos y los mtodos de
Picture4o0. Use la propiedad 'tretch para determinar si el 4r7"ico se escala para ajustarse al control o
viceversa. 3unque puede colocar un control Ima:e dentro de un contenedor, un control Ima:e no
puede actuar como contenedor.

Eventos:
Evento %lic2 Evento 5(E%omplete*ra4
Evento *bl%lic2 Evento 5(E*ra4*rop
Evento *ra4*rop Evento 5(E*ra45ver
Evento *ra45ver Evento 5(E:ive&eedbac2
Eventos Gouse*o$n y GouseUp Evento 5(E!et*ata
Evento GouseGove Evento 5(E!tart*ra4

Gtodos:
Gtodo *ra4 Gtodo <e"res6
Gtodo Gove Gtodo !6o$#6atsT6is
Gtodo 5(E*ra4 Gtodo a5rder

1ropiedades:
1ropiedad 3ppearance 1ropiedad Gouse?con
1ropiedad Border!tyle 1ropiedad Gouse1ointer
1ropiedad %ontainer 1ropiedad Dame
1ropiedad *ata%6an4ed 1ropiedad 5(E*ra4Gode
1ropiedad *ata&ield 1ropiedad 5(E*ropGode
1ropiedad *ata!ource 1ropiedad 1arent
1ropiedad *ra4?con 1ropiedad 1icture
1ropiedad *ra4Gode 1ropiedad !tretc6
1ropiedad Enabled 1ropiedad Ta4
1ropiedades -ei46t y #idt6 1ropiedad ToolTipText
1ropiedad ?ndex (%ontrol 3rray) 1ropiedad 0isible
1ropiedades (e"t y Top 1ropiedad #6atsT6is-elp?*

11- Data )acceso a bases de datos*

1roporciona acceso a datos almacenados en bases de datos mediante uno de los tres tipos de objetos
Recordset. El control &ata le permite despla)arse de un re4istro a otro, as como presentar y
manipular datos de los re4istros en controles enla)ados. !in un control &ata los controles enla)ados a
datos (vinculados) de un "ormulario no pueden tener acceso a los datos autom7ticamente.
1uede reali)ar la mayora de las operaciones de acceso a datos utili)ando el control &ata sin escribir
c+di4o. (os controles enla)ados a datos vinculados a un control &ata presentan autom7ticamente los
datos de uno o varios campos del re4istro actual o, en al4unos casos, de un conjunto de re4istros
situado a ambos lados del re4istro actual. El control &ata reali)a todas sus operaciones sobre el
re4istro actual.
!i el control &ata recibe instrucciones para despla)arse a un re4istro di"erente, todos los controles
enla)ados pasan autom7ticamente los posibles cambios al control &ata para que los 4uarde en la base
de datos. *espus, el control &ata se despla)a al re4istro solicitado y pasa los datos del re4istro actual
a los controles enla)ados, en los que se presentan.
El control &ata administra autom7ticamente una serie de contin4encias entre las que se incluyen los
conjuntos de re4istros vacos, la inserci+n de nuevos re4istros, la modi"icaci+n y actuali)aci+n de
re4istros existentes, y la administraci+n de ciertos tipos de errores. !in embar4o, en aplicaciones m7s
so"isticadas es necesario interceptar al4unas condiciones de error que el control &ata no puede
administrar. 1or ejemplo, si el motor de base de datos Gicroso"t bet tiene un problema al tener acceso
al arc6ivo de base de datos, no tiene el permiso adecuado o no puede ejecutar la consulta, se producir7
un error interceptable. !i el error se produce antes de que se inicien los procedimientos de la aplicaci+n
o se trata de errores internos, se desencadenar7 el evento Error.

12- "ontroles enlazados

(os controles &46ist, &4!om%o, &4Grid y M'Fle0Grid son capaces de administrar conjuntos de
re4istros cuando est7n enla)ados a un control &ata. Todos estos controles permiten presentar o
manipular varios re4istros a la ve).
(os controles incorporados Picture, 6a%el, +e0t4o0, !hec;4o0, Ima:e, ,6-, 6ist4o0 y
!om%o4o0 tambin son controles enla)ados a datos y se pueden enla)ar a un Fnico campo de un
Recordset administrado por un control &ata. En las ediciones 1ro"esional y Empresarial se
encuentran disponibles otros controles enla)ados a datos como Mas;ed-dit y Rich+e0t4o09 otros
proveedores tambin o"recen controles adicionales.

$,.$ -uncionamiento

Una ve) iniciada la aplicaci+n, 0isual Basic utili)a las propiedades del control &ata para abrir la base
de datos seleccionada, crear un objeto &ata%ase y crear un objeto Recordset. (as propiedades
&ata%ase y Recordset del control &ata 6acen re"erencia a los objetos &ata%ase y Recordset recin
creados, que se pueden manipular de "orma independiente del control &ata, con o sin controles
enla)ados. El control &ata se iniciali)a antes del evento &ormA(oad inicial del "ormulario en el que se
encuentra. !i se producen errores durante esta "ase de iniciali)aci+n, se produce un error no
interceptable.
%uando 0isual Basic utili)a el motor de base de datos bet para crear un Recordset, no se pueden
producir otras operaciones o eventos de 0isual Basic 6asta que se termine la operaci+n. !in embar4o,
otras aplicaciones basadas en #indo$s pueden se4uir en ejecuci+n mientras se est7 creando el
Recordset. !i el usuario presiona %T<(K?DTE< mientras el motor bet est7 4enerando un Recordset, la
operaci+n termina, se produce un error interceptable y la propiedad Recordset del control &ata se
establece a Dot6in4. En tiempo de dise8o, la se4unda ve) que se presiona %T<(K?DTE< 6ace que 0isual
Basic presente la ventana
&e7uracin.
1uede manipular el control &ata con el mouse (rat+n), despla)7ndose de un re4istro a otro, o al
principio o al "inal del Recordset. (as propiedades -,FAction y 4,FAction determinan lo que
ocurre cuando el usuario se despla)a al principio o al "inal de un Recordset con el mouse. Do puede
establecer el en"oque en un control &ata.

$,., Validacin

El evento 3alidate y la propiedad &ata!han:ed se utili)an para reali)ar comprobaciones de Fltima
6ora sobre los re4istros que se van a escribir en la base de datos.

$,.( 7&'etos de acceso a datos
En los procedimientos puede utili)ar los objetos de acceso a datos &ata%ase y Recordset creados por
el control &ata. %ada objeto &ata%ase y Recordset tiene sus propias propiedades y mtodos, y puede
escribir procedimientos que utilicen dic6as propiedades y mtodos para manipular sus datos.
1or ejemplo, el mtodo Move(e0t de un objeto Recordset despla)a el re4istro actual al si4uiente
re4istro dentro del Recordset. 1ara invocar este mtodo, podra utili)ar el c+di4o si4uiente:
*ata=.<ecordset.GoveDext

El control &ata puede tener acceso a cualquiera de los tres tipos de objetos Recordset del motor bet
versi+n L.>. !i no selecciona el tipo de conjunto de re4istros, se crea un Recordset de tipo dynaset.
En muc6os casos, el tipo predeterminado y la con"i4uraci+n del objeto Recordset creado son muy
ine"icientes. Es decir, puede que no necesite un cursor actuali)able totalmente despla)able de conjunto
de claves para tener acceso a los datos. 1or ejemplo, un Recordset de tipo snaps6ot, de s+lo lectura y
unidireccional se creara con m7s rapide) que el cursor predeterminado. 3se4Frese de ele4ir el tipo
m7s e"iciente, as como las propiedades -0clusive, ,7tions y Read,nl5 adecuadas a su situaci+n.

1ara seleccionar un tipo de Recordset espec"ico, estable)ca la propiedad Recordset+57e del control
&ata a:
Recordset+57e 3alor !onstante
Table > v%R'+57e+a%le
*ynaset = v%R'+57e&5naset (1redeterminado)
!naps6ot Q v%R'+57e'na7shot

$,.) *diciones %ro#esional y *mpresarial

En lo que concierne al acceso a datos, la principal di"erencia entre las ediciones de 3prendi)aje,
1ro"esional y Empresarial de 0isual Basic es la capacidad de crear nuevos objetos de acceso a datos.
En la Edici+n est7ndar no puede declarar (con la palabra clave &im) variables como objetos de acceso
a datos dentro del c+di4o. Esto si4ni"ica que s+lo el control &ata puede crear objetos &ata%ase y
Recordset.
En las ediciones 1ro"esional y Empresarial de 0isual Basic versi+n @.> puede crear un objeto
Recordset y asi4narlo a la propiedad Recordset de un control &ata. %ualquier control enla)ado que
est conectado al control &ata permitir7 manipular los re4istros del Recordset que 6a creado.
3se4Frese de que las propiedades &ataField de los controles enla)ados estn establecidas a nombres
de campo v7lidos dentro del nuevo Recordset.

$,.8 Consultas almacenadas

5tra opci+n importante al utili)ar el control &ata es la posibilidad de ejecutar consultas almacenadas.
!i antes 6a creado un objeto Cuer5&e1, el control &ata puede ejecutarlo y crear un Recordset
mediante las propiedades 'C6, !onnect y otras del objeto Cuer5&e1. 1ara ejecutar un Cuer5&e1,
estable)ca la propiedad Record'ource del control &ata al nombre del Cuer5&e1 y utilice el mtodo
Re1resh.
!i el Cuer5&e1 almacenado contiene par7metros, tiene que crear el Recordset y pasarlo al control
&ata.

$,.9 /ratamiento de B7-:*7-
El control &ata tambin puede administrar lo que ocurre cuando se encuentre con un Recordset sin
re4istros. Godi"icando la propiedad -,FAction puede pro4ramar el control &ata para que pase al
modo 3ddDe$ de "orma autom7tica.
1uede pro4ramar el control &ata para que se ajuste autom7ticamente a la parte superior o in"erior del
"ormulario primario utili)ando la propiedad Ali:n. En cualquiera de los casos, el control &ata cambia
de tama8o 6ori)ontalmente para llenar todo el anc6o de su "ormulario primario, siempre que ste
cambie de tama8o.

Eventos:
Evento *ra4*rop Evento 5(E*ra45ver
Evento *ra45ver Evento 5(E:ive&eedbac2
Evento Error Evento 5(E!et*ata
Eventos Gouse*o$n, GouseUp Evento 5(E!tart*ra4
Evento GouseGove Evento <eposition
Evento 5(E%omplete*ra4 Evento <esi)e
Evento 5(E*ra4*rop Evento 0alidate

Gtodos
Gtodo *ra4 Gtodo !6o$#6atsT6is
Gtodo Gove Gtodo Update%ontrols
Gtodo 5(E*ra4 Gtodo Update<ecord
Gtodo <e"res6 Gtodo a5rder

1ropiedades
1ropiedad 3li4n 1ropiedad &ont!i)e
1ropiedad 3ppearance 1ropiedades -ei46t, #idt6
1ropiedades Bac2%olor, &ore%olor 1ropiedad ?ndex (Gatri) de controles)
1ropiedad B5&3ction, E5&3ction 1ropiedades (e"t, Top
1ropiedad %aption 1ropiedad Gouse?con
1ropiedad %onnect 1ropiedad Gouse1ointer
1ropiedad *atabase 1ropiedad Dame
1ropiedad *atabaseDame 1ropiedad 5(E*ropGode
1ropiedad *e"ault%ursorType 1ropiedad 5ptions
1ropiedad *e"aultType 1ropiedad 1arent
1ropiedad *ra4?con 1ropiedad <ead5nly (3ceso de datos)
1ropiedad *ra4Gode 1ropiedad <ecordset
1ropiedad EditGode 1ropiedad <ecordsetType
1ropiedad Enabled 1ropiedad <ecord!ource
1ropiedad Exclusive 1ropiedad Ta4
1ropiedad &ont 1ropiedad ToolTipText
1ropiedades &ontBold, &ont?talic, &ont!tri2et6ru, &ontUnderline
1ropiedad &ontDame 1ropiedad #6atsT6is-elp?*
1ropiedad 0isible

1! -Eventos ms imortantes de los controles estndares%

$(.$Change

3plicable a:
%ontrol %omboBox, %ontroles -!crollBar y 0!crollBar, %ontrol (abel, %ontrol 1ictureBox, %ontrol
TextBox

?ndica que el contenido de un control 6a cambiado. %+mo y cu7ndo 6a ocurrido este evento vara
se4Fn el control:
!om%o4o0: cambia el texto de la parte de cuadro de texto del control. 5curre s+lo si la
propiedad 't5le est7 establecida a > (*ropdo$n %ombo) o = (!imple %ombo) y el usuario cambia
el texto o usted cambia la con"i4uraci+n de la propiedad +e0t mediante c+di4o.
&ir6ist4o0: cambia el directorio seleccionado. 5curre cuando el usuario 6ace doble clic en un
nuevo directorio o cuando usted cambia la con"i4uraci+n de la propiedad Path mediante c+di4o.
&rive6ist4o0: cambia la unidad seleccionada. 5curre cuando el usuario selecciona una nueva
unidad o cuando usted cambia la con"i4uraci+n de la propiedad &rive mediante c+di4o.
@'croll4ar y 3'croll4ar (barras de despla)amiento 6ori)ontal y vertical): mueven la parte de
cuadro de despla)amiento de la barra de despla)amiento. 5curre cuando el usuario despla)a o
cuando usted cambia la con"i4uraci+n de la propiedad 3alue mediante c+di4o.
6a%el: cambia el contenido del control 6a%el. 5curre cuando un vnculo **E actuali)a los datos
o cuando usted cambia la con"i4uraci+n de la propiedad !a7tion mediante c+di4o.
Picture4o0: cambia el contenido del control Picture4o0. 5curre cuando un vnculo **E
actuali)a los datos o cuando usted cambia la con"i4uraci+n de la propiedad Picture mediante
c+di4o.
+e0t4o0: cambia el contenido del cuadro de texto. 5curre cuando un vnculo **E actuali)a los
datos, cuando un usuario cambia el texto o cuando usted cambia la con"i4uraci+n de la propiedad
+e0t mediante c+di4o.

'inta0is
Private 'u% ob)etoD!han:eEW*ndice As Inte:erXF

(a sintaxis del evento %6an4e consta de las si4uientes partes:
Parte &escri7cin
ob)eto Una expresi+n de objeto que da como resultado un objeto de la lista 3plicable a.
*ndice Un entero que identi"ica Fnicamente a un control si est7 en una matri) de controles.

!omentarios
El procedimiento del evento %6an4e puede sincroni)ar o coordinar la presentaci+n de datos entre
controles. 1or ejemplo, puede utili)ar un procedimiento de evento %6an4e de una barra de
despla)amiento para actuali)ar la con"i4uraci+n de la propiedad 3alue de la barra de despla)amiento
de un control +e0t4o0. 5 bien, puede utili)ar un procedimiento de evento %6an4e para mostrar datos y
"+rmulas en un 7rea de trabajo y los resultados en otra 7rea.
(os procedimientos de evento %6an4e son tambin Ftiles para actuali)ar propiedades de controles del
sistema de arc6ivos (&ir6ist4o0, &rive6ist4o0 y File6ist4o0). 1or ejemplo, puede actuali)ar la
con"i4uraci+n de la propiedad Path para que un control &ir6ist4o0 re"leje un cambio en la
con"i4uraci+n de la propiedad &rive de un control &rive6ist4o0.
(ota Un procedimiento de evento %6an4e puede al4unas veces causar un evento en cascada. Esto
ocurre cuando el procedimiento de evento %6an4e del control altera el contenido del control, por
ejemplo, estableciendo una propiedad en el c+di4o que determina el valor del control, como el valor de
la propiedad +e0t para un control +e0t4o0. 1ara impedir un evento en cascada:
!i es posible, evite escribir un procedimiento de evento %6an4e para un control que altere el
contenido de ese control. !i escribe un procedimiento as, ase4Frese de establecer un indicador
que impida cambios posteriores mientras el cambio actual est7 en curso.
Evite crear dos o m7s controles cuyos procedimientos de evento %6an4e se vean a"ectados entre
s, por ejemplo, dos controles +e0t4o0 que se actualicen entre s durante sus eventos %6an4e.
Evite utili)ar una "unci+n o una instrucci+n Ms:4o0 en este evento para los controles
@'croll4ar y 3'croll4ar.

*'emplo del e!ento Change

Este ejemplo muestra la con"i4uraci+n numrica de la propiedad 3alue de una barra de despla)amiento
6ori)ontal en un control +e0t4o0. 1ara probar este ejemplo, cree un "ormulario con un control
+e0t4o0 y un control @'croll4ar y despus pe4ue el c+di4o en la secci+n *eclaraciones de un
"ormulario que conten4a una barra de despla)amiento 6ori)ontal (control @'croll4ar) y un control
+e0t4o0. 1resione &@ y 6a4a clic en la barra de despla)amiento 6ori)ontal.

1rivate !ub &ormA(oad ()
-!croll=.Gin ; > Z Establece Gin.
-!croll=.Gax ; =>>> Z Establece Gax.
-!croll=.(ar4e%6an4e ; =>> Z Establece (ar4e%6an4e.
-!croll=.!mall%6an4e ; = Z Establece !mall%6an4e.
End !ub

1rivate !ub -!croll=A%6an4e ()
Text=.Text ; -!croll=.0alue
End !ub

$(.,Clic;

3plicable a:
%ontrol %6ec2Box, %ontrol %omboBox, %ontrol %ommandButton, 5bjeto &orm, %ontrol &rame,
%ontrol ?ma4e, %ontrol (abel, %ontrol (istBox, %ontrol Genu, %ontrol 5ptionButton, %ontrol
1ictureBox, %ontrol TextBox.
5curre cuando el usuario presiona y suelta un bot+n del mouse (rat+n) en un objeto. Tambin puede
ocurrir cuando se cambia el valor de un control.
1ara un objeto Form, este evento ocurre cuando el usuario 6ace clic en un 7rea en blanco o en un
control desactivado. 1ara un control, este evento ocurre cuando el usuario:
-ace clic en un control con el bot+n primario o secundario del mouse. %on un control !hec;4o0,
!ommand4utton, 6ist4o0 o ,7tion4utton, el evento %lic2 s+lo ocurre cuando el usuario 6ace
clic con el bot+n primario del mouse.
!elecciona un elemento de un control !om%o4o0 o 6ist4o0, ya sea presionando las teclas de
direcci+n o 6aciendo clic con el bot+n del mouse.
1resiona la B3<<3 E!13%?3*5<3 cuando un control !ommand4utton, ,7tion4utton o
!hec;4o0 tiene el en"oque.
1resiona EDT<3< cuando un "ormulario tiene un control !ommand4utton con su propiedad
&e1ault establecida a +rue.
1resiona E!% cuando un "ormulario tiene un bot+n !ancelar, un control !ommand4utton con
su propiedad !ancel establecida a +rue.
1resiona una tecla de acceso para un control. 1or ejemplo, si el ttulo de un control
!ommand4utton es ,c?r,, al presionar 3(TK? se desencadena este evento.

Tambin puede desencadenar el evento %lic2 en el c+di4o si:
Establece la propiedad 3alue de un control !ommand4utton a +rue.
Establece la propiedad 3alue de un control ,7tion4utton a +rue.
%ambia el valor de la propiedad 3alue de un control !hec;4o0.

'inta0is
Private 'u% FormD!lic;E F
Private 'u% ob)etoD!lic;EW*ndice As Inte:erXF

(a sintaxis del evento %lic2 consta de las si4uientes partes:
Parte &escri7cin
ob)eto Una expresi+n de objeto que da como resultado un objeto de la lista 3plicable a.
*ndice Un entero que identi"ica Fnicamente a un control si est7 en una matri) de controles.

!omentarios
1or lo 4eneral se adjunta un procedimiento de evento %lic2 a un control !ommand4utton, un objeto
Menu o un control Picture4o0 para reali)ar comandos y acciones similares a comandos. 1ara los
dem7s controles aplicables, utilice este evento para desencadenar acciones como respuesta a un
cambio en el control.
1uede utili)ar la propiedad 3alue de un control para comprobar el estado del control desde el c+di4o.
-acer clic en un control 4enera los eventos Gouse*o$n y GouseUp adem7s del evento %lic2. El
orden en que ocurren estos tres eventos vara de un control a otro. 1or ejemplo, para los controles
6ist4o0 y !ommand4utton, los eventos ocurren en este orden: Gouse*o$n, %lic2, GouseUp. 1ero
para los controles File6ist4o0, 6a%el o Picture4o0, los eventos ocurren en este otro orden:
Gouse*o$n, GouseUp y %lic2. %uando est7 adjuntando procedimientos para estos eventos
relacionados, ase4Frese de que sus acciones no entran en con"licto. !i el orden de los eventos es
importante en la aplicaci+n, pruebe el control para determinar el orden de los mismos.
(ota 1ara distin4uir entre los botones primario, secundario y central del mouse, utilice los eventos
Gouse*o$n y GouseUp.

!i 6ay c+di4o en el evento %lic2, nunca se activar7 el evento *lb%lic2 ya que de los dos eventos, %lic2
es el primero que se activa. %omo resultado, el evento %lic2 intercepta el clic del mouse, por lo que
*bl%lic2 nunca se producir7.

*'emplo del *!ento Clic;

En este ejemplo, cada ve) que se 6ace clic en un control Picture4o0 se mueve dia4onalmente por un
"ormulario. 1ara probar este ejemplo, pe4ue el c+di4o en la secci+n *eclaraciones de un "ormulario
que conten4a un control Picture4o0 en la esquina in"erior i)quierda del mismo, despus presione &@ y
6a4a clic en el control Picture4o0.
1rivate !ub 1icture=A%lic2 ()
1icture=.Gove 1icture=.(e"t K R@>, 1icture=.Top . @@>
End !ub

$(.( Got-ocus

3plicable a:
%ontrol %6ec2Box, %ontrol %omboBox, %ontrol %ommandButton, , 5bjeto &orm %ontroles
-!crollBar y 0!crollBar, %ontrol (istBox, %ontrol 5ptionButton, %ontrol 1ictureBox, %ontrol
TextBox.

5curre cuando un objeto recibe el en"oque, ya sea mediante una acci+n del usuario, como tabular o
6acer clic en el objeto, o cambiando el en"oque en el c+di4o mediante el mtodo 'etFocus. Un
"ormulario recibe el en"oque s+lo cuando todos los controles visibles est7n desactivados.
'inta0is
Private 'u% FormDGotFocusE F
Private 'u% ob)etoDGotFocusEW*ndice As Inte:erXF

(a sintaxis del evento :ot&ocus consta de las si4uientes partes:
Parte &escri7cin
ob)eto Una expresi+n de objeto que da como resultado un objeto de la lista 3plicable a.
*ndice Un entero que identi"ica de manera Fnica a un control si est7 en una matri) de controles.

!omentarios

Dormalmente, el procedimiento de evento :ot&ocus se utili)a para especi"icar las acciones que
ocurren cuando un control o un "ormulario recibe primero el en"oque. 1or ejemplo, si adjunta un
procedimiento de evento :ot&ocus a cada control de un "ormulario puede 4uiar al usuario mostr7ndole
instrucciones breves o mensajes en la barra de estado. Tambin puede proporcionar avisos visuales
activando, desactivando o mostrando otros controles que dependan del control que tiene el en"oque.
(ota Un objeto puede recibir el en"oque s+lo si sus propiedades -na%led y 3isi%le est7n establecidas
a +rue. 1ara personali)ar el inter"a) de teclado en 0isual Basic para mover el en"oque, estable)ca el
orden de tabulaci+n o especi"ique teclas de acceso para controles de un "ormulario.

-2em7lo del evento GotFocus

Este ejemplo muestra un mensaje en la barra de estado cuando un bot+n de un 4rupo ,7tion4utton
obtiene el en"oque. 1ara probar este ejemplo, pe4ue el c+di4o en la secci+n *eclaraciones de un
"ormulario que conten4a dos controles ,7tion4utton y un control 6a%el. Estable)ca la propiedad
(ame de ambos controles ,7tion4utton a 5ption:roup y, despus, presione &@ y 6a4a clic en los
controles ,7tion4utton.

1rivate !ub &ormA(oad ()
(abel=.3uto!i)e ; True
End !ub

1rivate !ub 5ption:roupA:ot&ocus (?ndex 3s ?nte4er)
!elect %ase ?ndex
%ase >
(abel=.%aption ; ,(a opci+n = tiene el en"oque.,
%ase =
(abel=.%aption ; ,(a opci+n Q tiene el en"oque.,
End !elect
End !ub

1rivate !ub 5ption:roupA(ost&ocus (?ndex 3s ?nte4er)
(abel=.%aption ; ,,
End !ub

$(.) <ey%ress

3plicable a:
%ontrol %6ec2Box, %ontrol %omboBox, %ontrol %ommandButton, 5bjeto &orm %ontroles
-!crollBar y 0!crollBar, %ontrol (istBox, %ontrol 5ptionButton, %ontrol 1ictureBox, %ontrol
TextBox.

5curre cuando el usuario presiona y suelta una tecla.
'inta0is
Private 'u% FormDGe5PressE+eyascii As Inte:erF
Private 'u% ob)etoDGe5PressEW*ndice As Inte:er,X+eyascii As Inte:erF

(a sintaxis del evento `ey1ress consta de las si4uientes partes:
Parte &escri7cin
ob)eto Una expresi+n de objeto que da como resultado un objeto de la lista 3plicable a.
*ndice Un entero que identi"ica de manera Fnica a un control si est7 en una matri) de controles.
+eyascii Un entero que devuelve un c+di4o de tecla numrico 3D!? est7ndar. +eyascii se pasa
por re"erencia9
al cambiarlo se enva un car7cter di"erente al objeto. %ambiar +eyascii a > cancela la pulsaci+n
de
tecla, de "orma que el objeto no recibe nin4Fn car7cter.

!omentarios

El objeto que tiene el en"oque recibe el evento. Un "ormulario puede recibir el evento s+lo si no tiene
controles visibles y activados. Un evento `ey1ress puede implicar a cualquier car7cter imprimible del
teclado, a la tecla %T<( combinada con un car7cter del al"abeto est7ndar o uno de los caracteres
especiales, y la tecla EDT<3< o <ET<5%E!5. Un procedimiento de evento `ey1ress es Ftil para
interceptar pulsaciones de teclas reali)adas en un control +e0t4o0 o !om%o4o0. Esto le permite
comprobar inmediatamente la valide) de las pulsaciones o el "ormato de los caracteres a medida que se
escriben. %ambiar el valor del ar4umento +eyascii cambia el car7cter mostrado.
`ey1ress interpreta las mayFsculas y minFsculas de cada car7cter como c+di4os de tecla distintos y,
por tanto, como caracteres di"erentes.
(ota El nFmero 3D!? para la combinaci+n de teclado %T<(Kd es >. 1uesto que 0isual Basic
reconoce un valor +eyascii de > como una cadena de lon4itud cero (,,), evite utili)ar %T<(Kd en sus
aplicaciones.

-2em7lo del evento Ge5Press

Este ejemplo convierte a mayFsculas el texto escrito en un control +e0t4o0. 1ara probar este ejemplo,
pe4ue el c+di4o en la secci+n *eclaraciones de un "ormulario que conten4a un control +e0t4o0 y,
despus, presione &@ y escriba al4o en el control +e0t4o0.

1rivate !ub Text=A`ey1ress (`ey3scii 3s ?nte4er)
%6ar ; %6r(`ey3scii)
`ey3scii ; 3sc(U%ase(%6ar))
End !ub

$(.8 Load

3plicable a:
5bjeto &orm.

5curre cuando se car4a un "ormulario. 1ara un "ormulario de inicio, ocurre cuando una aplicaci+n se
inicia como resultado de una instrucci+n 6oad o como resultado de una re"erencia a una propiedad o
control de un "ormulario descar4ado.
'inta0is
Private 'u% FormD6oadE F
Private 'u% M&IFormD6oadE F

!omentarios

Dormalmente utili)a un procedimiento de evento (oad para incluir c+di4o de iniciali)aci+n para un
"ormulario9 por ejemplo, c+di4o que especi"ica los valores predeterminados de los controles, indica el
contenido que se va a car4ar en controles !om%o4o0 o 6ist4o0 e iniciali)a variables a nivel del
"ormulario.
El evento (oad ocurre tras el evento ?nitiali)e.
(ota %uando cree procedimientos para eventos relacionados, como 3ctivate, :ot&ocus, 1aint y
<esi)e, ase4Frese de que sus acciones no entran en con"licto y no producen eventos recursivos.

-2em7lo del evento 6oad

Este ejemplo car4a elementos en un control !om%o4o0 cuando se car4a un "ormulario. 1ara probar
este ejemplo, pe4ue el c+di4o en la secci+n *eclaraciones de un "ormulario que conten4a un control
!om%o4o0 y despus presione &@.

1rivate !ub &ormA(oad ()
%ombo=.3dd?tem ,Go)art, Z 34re4a elementos a la lista.
%ombo=.3dd?tem ,Beet6oven,
%ombo=.3dd?tem ,<oc2 Zn <oll,
%ombo=.3dd?tem ,<e44ae,
%ombo=.(ist?ndex ; Q Z Establece la selecci+n predeterminada.
End !ub

$(.9 Lost-ocus

3plicable a
%ontrol %6ec2Box, %ontrol %omboBox, %ontrol %ommandButton, 5bjeto &orm %ontroles -!crollBar
y 0!crollBar, %ontrol (istBox, %ontrol 5ptionButton, %ontrol 1ictureBox, %ontrol TextBox.

5curre cuando un objeto pierde el en"oque, ya sea por una acci+n del usuario, como tabular o 6acer
clic en otro objeto, o bien mediante un cambio del en"oque en el c+di4o con el mtodo 'etFocus.
'inta0is
Private 'u% FormD6ostFocusE F
Private 'u% ob)etoD6ostFocusEW*ndice As Inte:erXF

(a sintaxis del evento (ost&ocus consta de las si4uientes partes:
Parte &escri7cin
ob)eto Una expresi+n de objeto que da como resultado un objeto de la lista 3plicable a.
*ndice Un entero que identi"ica de manera Fnica a un control si est7 en una matri) de controles.

!omentarios

Un procedimiento de evento (ost&ocus resulta especialmente Ftil para comprobar y validar
actuali)aciones. Utili)ar (ost&ocus puede 6acer que la validaci+n ten4a lu4ar con"orme el usuario
mueve el en"oque del control. 5tro uso para este tipo de procedimiento de evento es activar,
desactivar, ocultar y mostrar otros objetos, como en un procedimiento de evento :ot&ocus. Tambin
puede invertir o cambiar condiciones que estableci+ en el procedimiento de evento :ot&ocus del
objeto.

*'emplo del e!ento Lost-ocus

Este ejemplo cambia el color de un control +e0t4o0 cuando recibe o pierde el en"oque (se selecciona
con el mouse o la tecla T3B) y muestra el texto apropiado en el control 6a%el. 1ara probar este
ejemplo, pe4ue el c+di4o en la secci+n *eclaraciones de un "ormulario que conten4a dos controles
+e0t4o0 y un control 6a%el y, despus, presione &@ y mueva el en"oque entre Text= y TextQ.

1rivate !ub Text=A:ot&ocus ()
Z Guestra el en"oque en rojo.
Text=.Bac2%olor ; <:B(Q@@, >, >)
(abel=.%aption ; ,Text= tiene el en"oque.,
End !ub

1rivate !ub Text=A(ost&ocus ()
Z Guestra la prdida del en"oque en a)ul.
Text=.Bac2%olor ; <:B(>, >, Q@@)
(abel=.%aption ; ,Text= no tiene el en"oque.,
End !ub

$(.= MouseMo!e

3plicable a:
%ontrol %6ec2Box, %ontrol %ommandButton, %ontrol *ata, 5bjeto &orm, %ontrol &rame, %ontrol
?ma4e, %ontrol (abel, %ontrol (istBox, %ontrol 5ptionButton, %ontrol 1ictureBox, %ontrol TextBox.

5curre cuando el usuario mueve el mouse.

'inta0is
Private 'u% FormDMouseMoveEbotn As Inte:er, may,s As Inte:er, x As 'in:le, y As 'in:leF
Private 'u% M&IFormDMouseMoveEbotn As Inte:er, may,s As Inte:er, x As 'in:le, y As 'in:leF
Private 'u% ob)etoDMouseMoveEW*ndice As Inte:er,X botn As Inte:er, may,s As Inte:er, x As
'in:le, y As 'in:leF

(a sintaxis del evento GouseGove consta de las si4uientes partes:
Parte &escri7cin
ob)eto Una expresi+n de objeto que da como resultado un objeto de la lista 3plicable a.
*ndice Un entero que identi"ica de manera Fnica a un control si est7 en una matri) de controles.
botn Un entero que corresponde al estado de los botones del mouse en el cual un bit se establece si el
bot+n est7 presionado. El ar4umento botn es un campo de bit con los bits correspondientes al bot+n
primario (bit >), al bot+n secundario (bit =) y al bot+n central (bit Q). Estos bits corresponden a los valores
=, Q y M, respectivamente. ?ndica el estado completo de los botones del mouse9 al4uno, todos o nin4uno de
estos tres bits puede estar establecido, lo que indica que al4unos, todos o nin4uno de los botones est7
presionado.
may,s Un entero que corresponde al estado de las teclas G3Ie!, %T<( y 3(T. Un bit est7 establecido si
la tecla est7 presionada. El ar4umento may,s es un campo de bits con los bits menos si4ni"icativos
correspondientes a la tecla G3Ie! (bit >), %T<( (bit =) y 3(T (bit Q ). Estos bits corresponden a los valores
=, Q y M, respectivamente. El ar4umento may,s indica el estado de estas teclas. 3l4uno, todos o nin4uno
de los bits puede estar establecido, lo que indica que al4una, todas o nin4una de las teclas est7 presionada.
1or ejemplo, si se presionaron las teclas %T<( y 3(T, el valor de shift sera S.
x, y Un nFmero que especi"ica la ubicaci+n actual del puntero del mouse. (os valores x e y siempre se
expresan en trminos del sistema de coordenadas establecido por las propiedades 'cale@ei:ht,
'cale8idth, 'cale6e1t y 'cale+o7 del objeto.

!omentarios

El evento GouseGove se 4enera continuamente a medida que el puntero del mouse se mueve por los
objetos. 3 menos que otro objeto 6aya capturado el mouse, un objeto reconoce un evento GouseGove
siempre que la posici+n del mouse est dentro de sus bordes.

-2em7lo del evento MouseMove

Este ejemplo muestra una aplicaci+n de dibujo simple. El procedimiento de evento Gouse*o$n
"unciona con un procedimiento GouseGove relacionado para activar el dibujo cuando est7 presionado
cualquier bot+n del mouse. El procedimiento de evento GouseUp desactiva el dibujo. 1ara probar este
ejemplo, pe4ue el c+di4o en la secci+n *eclaraciones de un "ormulario, despus presione &@, 6a4a clic
en el "ormulario y mueva el mouse mientras est7 presionado el bot+n del mismo.

*im 1aintDo$ 3s Boolean Z *eclara una variable.
1rivate !ub &ormAGouse*o$n (Button 3s ?nte4er, !6i"t 3s ?nte4er, H 3s !in4le, I 3s !in4le)
1aintDo$ ; True Z 3ctiva el dibujo.
End !ub

1rivate !ub &ormAGouseUp (Button 3s ?nte4er, H 3s !in4le, I 3s !in4le)
1aintDo$ ; &alse Z *esactiva el dibujo.
End !ub

1rivate !ub &ormAGouseGove (Button 3s ?nte4er, !6i"t 3s ?nte4er, H 3s !in4le, I 3s !in4le)
?" 1aintDo$ T6en
1!et (H, I) Z *ibuja un punto.
End ?"
End !ub

1rivate !ub &ormA(oad ()
*ra$#idt6 ; => Z Utili)a un pincel m7s anc6o.
&ore%olor ; <:B(>, >, Q@@) Z Establece el color de dibujo.
End !ub

$(.> /imer

3plicable a:
%ontrol Timer

5curre cuando 6a transcurrido un intervalo preestablecido para un control +imer. (a "recuencia del
intervalo se almacena en la propiedad Interval del control, que especi"ica el tiempo en milise4undos.

'inta0is
Private 'u% ob)etoD+imerEW*ndice As Inte:erXF

(a sintaxis del evento Timer consta de las si4uientes partes:
Parte &escri7cin
ob)eto Una expresi+n de objeto que da como resultado un objeto de la lista 3plicable a.
*ndice Un entero que identi"ica de manera Fnica a un control si est7 en una matri) de controles.

!omentarios

Utilice este procedimiento de evento para indicar a 0isual Basic qu 6acer cada ve) que se a4ote el
intervalo de tiempo de un control +imer. %uando est trabajando con el evento Timer:
(a propiedad Interval especi"ica el intervalo entre los eventos Timer, en milise4undos.
!iempre que la propiedad -na%led del control +imer est establecida a +rue y la propiedad
Interval sea mayor que >, el evento Timer espera durante el periodo especi"icado en la propiedad
Interval.

-2em7lo del evento +imer

Este ejemplo muestra un reloj di4ital. 1ara probar este ejemplo, pe4ue el c+di4o en la secci+n
*eclaraciones de un "ormulario que conten4a un control 6a%el y un control +imer y, despus,
presione &@.

1rivate !ub &ormA(oad ()
Timer=.?nterval ; =>>> Z Establece el intervalo de Timer.
End !ub

1rivate !ub Timer=ATimer ()
(abel=.%aption ; Time Z 3ctuali)a la presentaci+n de la 6ora.
End !ub

Este ejemplo mueve un control Picture4o0 por un "ormulario. 1ara probar este ejemplo, pe4ue el
c+di4o en la secci+n *eclaraciones de un "ormulario que conten4a un control +imer y un control
Picture4o0 y, despus, presione &@. !i desea obtener un e"ecto visual mejor puede asi4nar un mapa de
bits al control Picture4o0 mediante la propiedad Picture.

*im *eltaH, *eltaI 3s ?nte4er Z *eclara variables.
1rivate !ub Timer=ATimer ()
1icture=.Gove 1icture=.(e"t K *eltaH, 1icture=.Top K *eltaI
?" 1icture=.(e"t ] !cale(e"t T6en *eltaH ; =>>
?" 1icture=.(e"t K 1icture=.#idt6 / !cale#idt6 K !cale(e"t T6en
*eltaH ; .=>>
End ?"
?" 1icture=.Top ] !caleTop T6en *eltaI ; =>>
?" 1icture=.Top K 1icture=.-ei46t / !cale-ei46t K !caleTop T6en
*eltaI ; .=>>
End ?"
End !ub

1rivate !ub &ormA(oad ()
Timer=.?nterval ; =>>> Z Establece el intervalo.
*eltaH ; =>> Z ?niciali)a variables.
*eltaI ; =>>
End !ub

$(.? @nload

3plicable a:
5bjeto &orm.

5curre cuando un "ormulario est7 a punto de quitarse de la pantalla. %uando ese "ormulario se vuelve a
car4ar, el contenido de todos sus controles se reiniciali)a. Este evento se desencadena porque un
usuario cierra el "ormulario mediante el comando !errar del menF !ontrol o una instrucci+n Anload.

'inta0is
Private 'u% ob)etoDAnloadEcancelar As Inte:erF

(a sintaxis del evento Unload consta de las si4uientes partes:
Parte &escri7cin
ob)eto Una expresi+n de objeto que da como resultado un objeto de la lista 3plicable a.
cancelar Un entero que determina si el "ormulario se quita de la pantalla. !i cancelar es >, el
"ormulario se quita. Establecer cancelar a cualquier valor distinto de cero impide que el "ormulario se
quite.

!omentarios

Establecer cancelar a un valor distinto de cero impide que el "ormulario se quite, pero no detiene los
dem7s eventos, como la salida del entorno operativo Gicroso"t #indo$s. Utilice el evento
\ueryUnload para detener la salida de #indo$s.
Utilice un procedimiento de evento Unload para comprobar si el "ormulario se debe descar4ar o para
especi"icar acciones que desea que ten4an lu4ar cuando se descar4ue el "ormulario. Tambin puede
incluir cualquier c+di4o de validaci+n a nivel del "ormulario que pueda necesitar para cerrar el
"ormulario o 4uardar los datos en un arc6ivo.
El evento \ueryUnload ocurre antes que el evento Unload. El evento Unload ocurre antes que el
evento Terminate.
El evento Unload puede estar causado por la utili)aci+n de la instrucci+n Anload o porque el usuario
elija el comando !errar del menF !ontrol del "ormulario, sal4a de la aplicaci+n con el bot+n
FinaliHar tarea de la (ista de tareas, o sal4a del entorno operativo Gicroso"t #indo$s mientras la
aplicaci+n se est7 ejecutando.

-2em7lo del evento Anload

Este ejemplo muestra un procedimiento simple para cerrar un "ormulario mientras se avisa al usuario
con varios cuadros de mensajes. En una aplicaci+n real, puede a4re4ar llamadas a procedimientos 'u%
de prop+sito 4eneral que emulen el proceso de los comandos 'alir, Guardar y Guardar como del
menF Archivo de 0isual Basic. 1ara probar este ejemplo, pe4ue el c+di4o en la secci+n *eclaraciones
de un "ormulario y, despus, presione &@. Una ve) que se muestre el "ormulario, presione 3(TK&M para
cerrar el "ormulario.

1rivate !ub &ormAUnload (%ancel 3s ?nte4er)
*im Gs4, <esponse Z *eclara variables.
Gs4 ; ,U*esea 4uardar los datos antes de cerrarV,
<esponse ; Gs4Box(Gs4, vb\uestion K vbIesDo%ancel, ,*i7lo4o %errar,)
!elect %ase <esponse
%ase vb%ancel Z Do se permite cerrar.
%ancel ; .=
Gs4 ; ,!e 6a cancelado el comando.,
%ase vbIes
Z ?ntrodu)ca c+di4o para 4uardar los datos aqu.
Gs4 ; ,*atos 4uardados.,Z
%ase vbDo
Gs4 ; ,*atos no 4uardados.,
End !elect
Gs4Box Gs4, vb5`5nly, ,%on"irmaci+n, Z Gostrar mensaje.
End !ub


$(.$A Buery@nload

3plicable a:
5bjeto &orm y %olecci+n &orms, 5bjeto G*?&orm

5curre antes de que se cierre un "ormulario o una aplicaci+n.

'inta0is
Private 'u% FormDCuer5AnloadEcancelar As Inte:er, modo_descarga As Inte:erF
Private 'u% M&IFormDCuer5AnloadEcancelar As Inte:er, modo_descarga As Inte:erF

(a sintaxis del evento \ueryUnload consta de las si4uientes partes:
Parte &escri7cin
cancelar Un entero. Establecer este ar4umento a cualquier valor distinto de > detiene el
evento \ueryUnload en todos los "ormularios car4ados y detiene el cierre del "ormulario y de la
aplicaci+n.
modo_descarga Un valor o una constante que indica la causa del evento \ueryUnload, tal y como se
describe en 0alores que se pueden obtener.

3alores Iue se 7ueden o%tener
El ar4umento modo_descarga devuelve los si4uientes valores:
!onstante 3alor &escri7cin
v%Form!ontrolMenu > El usuario eli4i+ el comando !errar del menF !ontrol del
"ormulario.
v%Form!ode = !e invoc+ la instrucci+n Anload desde el c+di4o.
3%A778indo<s Q (a sesi+n actual del entorno operativo Gicroso"t #indo$s est7 inali)ando.
v%A77+as;Mana:er L El 3dministrador de tareas de Gicroso"t #indo$s est7 cerrando la

aplicaci+n.
v%FormM&IForm M Un "ormulario G*? secundario se est7 cerrando porque el
"ormulario G*?
tambin se est7 cerrando.

!omentarios

Dormalmente este evento se utili)a para ase4urarse de que no 6ay tareas sin "inali)ar en los
"ormularios incluidos en una aplicaci+n antes de que esa aplicaci+n se cierre. 1or ejemplo, si un
usuario no 6a 4uardado todava al4unos datos nuevos de cualquier "ormulario, su aplicaci+n puede
pedir al usuario que los 4uarde.
%uando una aplicaci+n se cierra, puede utili)ar los procedimientos de evento \ueryUnload o Unload
para establecer la propiedad !ancel a +rue, deteniendo el proceso de cierre. !in embar4o, el evento
\ueryUnload ocurre en todos los "ormularios antes de que se descar4ue nin4uno de ellos y el evento
Unload ocurre con"orme se descar4a cada "ormulario.

-2em7lo del evento Cuer5Anload

En este ejemplo, al cerrar un "ormulario se consulta al operador si realmente quiere salir o no. Tambin
se c6equea si est7 saliendo del "ormulario o de toda la aplicaci+n.

Z 1e4ar en la secci+n *eclaraciones de &orm=.
1rivate !ub &ormA\ueryUnload (%ancel 3s ?nte4er, UnloadGode 3s ?nte4er)
*im Gs4 Z *eclara la variable.
?" UnloadGode / > T6en
Z !i sale de la aplicaci+n.
Gs4 ; ,U<ealmente desea salir de la aplicaci+nV,
Else
Z !i s+lo se cierra el "ormulario.
Gs4 ; ,U<ealmente desea cerrar el "ormularioV,
End ?"
Z !i el usuario 6ace clic en el bot+n Do, se detiene \ueryUnload.
?" Gs4Box(Gs4, vb\uestion K vbIesDo, Ge.%aption) ; vbDo T6en %ancel ; True
End !ub


$(.$$ Validate

3plicable a:
%ontrol *ata

!e produce antes de que otro re4istro se convierta en el re4istro actual, antes del mtodo A7date
(excepto cuando se 4uardan los datos con el mtodo A7dateRecord) y antes de una operaci+n &elete,
Anload o !lose.
'inta0is
Private 'u% ob)etoD3alidate EW*ndice As Inte:er,X accin As Inte:er, guardar As Inte:erF

(a sintaxis del evento 0alidate consta de las si4uientes partes:
Parte &escri7cin
ob)eto Una expresi+n de objeto cuyo resultado es un objeto de la lista 3plicable a
*ndice ?denti"ica el control si se encuentra en una matri) de controles
accin Un entero que indica la operaci+n que provoca el evento, como se describe en 0alores
guardar Una expresi+n booleana que especi"ica si los datos enla)ados 6an cambiado, como se describe en
0alores

3alores
(os valores de accin son:
!onstante 3alor &escri7cin
v%&ataAction!ancel > %ancela la operaci+n al salir de 'u%
v%&ataActionMoveFirst = Gtodo MoveFirst
v%&ataActionMovePrevious Q Gtodo MovePrevious
v%&ataActionMove(e0t L Gtodo Move(e0t
v%&ataActionMove6ast M Gtodo Move6ast
v%&ataActionAdd(e< @ Gtodo Add(e<
v%&ataActionA7date S 5peraci+n A7date (no A7dateRecord)
v%&ataAction&elete R Gtodo &elete
v%&ataActionFind T Gtodo Find
v%&ataAction4oo;mar; E !e 6a establecido la propiedad 4oo;mar;
v%&ataAction!lose => El mtodo !lose
v%&ataActionAnload == !e est7 descar4ando el "ormulario

(os valores de guardar son:
3alor &escri7cin
+rue (os datos enla)ados 6an cambiado
False (os datos enla)ados no 6an cambiado

!omentarios

El ar4umento guardar indica inicialmente si los datos enla)ados 6an cambiado. Este ar4umento puede
ser False si los datos del bF"er de copia 6an cambiado. !i guardar es +rue cuando este evento termina,
se invocan los mtodos -dit y A7dateRecord. El mtodo A7dateRecord s+lo 4uarda los datos de
controles enla)ados o del bF"er de copia en los que la propiedad &ata!han:ed sea +rue.
Este evento se produce incluso aunque no se 6ayan modi"icado los datos de los controles enla)ados y
aunque no existan controles enla)ados. 1uede utili)ar este evento para cambiar valores y actuali)ar
datos. Tambin puede decidir 4uardar los datos o detener cualquier acci+n que est provocando el
evento y sustituirla por otra acci+n di"erente.
1uede cambiar el ar4umento accin para cambiar una acci+n por otra. 1uede cambiar los diversos
mtodos Gove y el mtodo Add(e<, que se pueden intercambiar libremente (cualquier Gove en
Add(e<, cualquier Gove en cualquier otro Gove o Add(e< en cualquier Gove). %uando utilice
Add(e<, puede utili)ar Move(e0t y despus ejecutar otro Add(e< para examinar la propiedad
-ditMode y determinar si 6ay una operaci+n -dit o Add(e< en curso. El intento de sustituir
Add(e< o una acci+n Gove en cualquier otra acci+n se pasa por alto o 4enera un error interceptable.
!i se establece accin a >, se puede detener cualquier acci+n.
*entro del c+di4o de este evento puede comprobar los datos de cada control enla)ado en el que
&ata!han:ed sea +rue. *espus puede establecer &ata!han:ed a False para evitar 4uardar dic6os
datos en la base de datos.
*urante este evento no puede utili)ar nin4Fn mtodo (como Move(e0t) en el objeto Recordset
subyacente.

*'emplo de la propiedad +ataChanged y del e!ento Validate

Este ejemplo ilustra una validaci+n de datos sencilla. En la tabla 3ut6ors de la base de datos
Biblio.mdb 6ay dos campos: 3uA?* y 3ut6or. %omo el valor de 3uA?* se utili)a para identi"icar de
"orma Fnica al autor, este valor no se debe cambiar. El ejemplo no permite que se modi"ique el campo
3uA?*, que est7 enla)ado a Text=.

1rivate !ub *ata=A0alidate (3ction 3s ?nte4er, !ave 3s ?nte4er)
?" Text=.*ata%6an4ed T6en Z %omprueba si los datos 6an cambiado.
Gs4Box ,Do puede cambiar el nFmero de ?d.,
Text=.*ata%6an4ed ; &alse Z Do 4uarda los datos modi"icados.
End ?"
...
End !ub

1#- 56todos ms imortantes de los controles estndares%

$).$ Cdd2tem

3plicable a:
%ontrol%omboBox, %ontrol(istBox

34re4a un elemento a un control 6ist4o0 o !om%o4o0.
'inta0is
ob)eto.AddItem elemento, *ndice

(a sintaxis del mtodo AddItem consta de las si4uientes partes:
Parte &escri7cin
ob)eto <equerido. Una expresi+n de objeto cuyo resultado es un objeto de la lista 3plicable a.
-lemento <equerido. expresi+n de cadena que especi"ica el elemento que se va a a4re4ar al objeto.
*ndice 5pcional. Entero que especi"ica la posici+n dentro del objeto donde se insertan el elemento o
la "ila nuevos. 1ara el primer elemento de un control 6ist4o0 o !om%o4o0, *ndice es >.

!omentarios

!i se especi"ica un valor v7lido para *ndice, elemento se sitFa en dic6a posici+n dentro del ob)eto. !i se
omite *ndice, elemento se a4re4a en la posici+n que le corresponda dentro del orden apropiado (si la
propiedad 'orted es +rue) o al "inal de la lista (si 'orted es False).
(os controles 6ist4o0 o !om%o4o0 que est7n enla)ados a un control &ata no aceptan el mtodo
AddItem.

*'emplo del m5todo Cdd2tem

Este ejemplo utili)a el mtodo AddItem para a4re4ar =>> elementos a un cuadro de lista. 1ara probar
este ejemplo, pe4ue el c+di4o en la secci+n *eclaraciones de un "ormulario con un control 6ist4o0
llamado (ist=, y despus presione &@ y 6a4a clic en el "ormulario.
1rivate !ub &ormA%lic2 ()
*im Entry, ?, Gs4 Z *eclara variables.
Gs4 ; ,-a4a clic en 3ceptar para a4re4ar =>> elementos a su cuadro de lista.,
Gs4Box Gs4 Z Guestra el mensaje.
&or ? ; = To =>> Z %uenta de = a =>>.
Entry ; ,Entrada , c ? Z %rea la entrada.
(ist=.3dd?tem Entry Z 34re4a la entrada.
Dext ?
Gs4 ; ,-a4a clic en 3ceptar para quitar una de cada dos entradas.,
Gs4Box Gs4 Z Guestra el mensaje.
&or ? ; = To @> Z *etermina c+mo quitar
(ist=.<emove?tem ? Z cada elemento
Dext ?
Gs4 ; ,-a4a clic en 3ceptar para quitar todos los elementos del cuadro de lista.,
Gs4Box Gs4 Z Guestra el mensaje.
(ist=.%lear Z (impia el cuadro de lista.
End !ub

$)., CddNew 07&'eto Recordset1

3plicable a:
5bjeto <ecordset.

%rea un nuevo re4istro para un objeto Recordset de tipo Table o *ynaset.

'inta0is
recordset.Add(e<

El marcador de posici+n del recordset es una variable de objeto que representa un objeto Recordset
que se puede actuali)ar al que puede a4re4ar un re4istro nuevo.

!omentarios

Utilice el mtodo Add(e< para crear y a4re4ar un nuevo re4istro en el objeto Recordset llamado por
el recordset. Este mtodo establece los campos a los valores predeterminados y si no se especi"ican
valores predeterminados, establece los campos a (ull (los valores predeterminados especi"icados pare
el Recordset tipo Table).
*espus de modi"icar el nuevo re4istro, utilice el mtodo A7date para 4uardar los cambios y a4re4ar
el re4istro al Recordset. Do se producir7n cambios en la base de datos 6asta que no se utilice el
mtodo A7date.

Precaucin !i ejecuta un Add(e< y a continuaci+n reali)a una operaci+n que desplace otro re4istro
sin usar A7date, los cambios se perder7n sin previo aviso. 3dem7s, si cierra el Recordset o "inali)a el
procedimiento que declara el Recordset o su objeto &ata%ase, el nuevo re4istro y los cambios
reali)ados se descartar7n sin previo aviso.

!i no se 6a despla)ado 6asta el Fltimo re4istro de su Recordset, los re4istros a4re4ados a las tablas
subyacentes pueden incluirse, si se colocan m7s all7 del re4istro activo. !in embar4o, si a4re4a un
re4istro a un Recordset, el re4istro ser7 visible en el Recordset y se incluir7 en la tabla subyacente
donde estar7 visible para todos los nuevos objetos Recordset.
(a posici+n del nuevo re4istro depende del tipo de Recordset:
En un objeto Recordset tipo *ynaset, los re4istros se insertan al "inal del conjunto del Recordset,
independientemente de las re4las de clasi"icaci+n u orden que estuvieran en vi4or cuando se abri+
el Recordset.
En un objeto Recordset tipo Table en el que su propiedad Inde0 se 6aya establecido, los re4istros
se insertan en el lu4ar adecuado dentro del orden de"inido. !i no se 6a establecido la propiedad
Inde0, los nuevos re4istros se insertar7n al "inal del Recordset.

-2em7lo de mJtodo Add(e<

En este ejemplo se a4re4a un re4isro nuevo a la tabla 34enda de la base de datos %lientes, tomando los
datos desde un "ormulario que contiene L cajas de texto (txt%odi4o, txtDombre y txt*ireccion) y un bot+n
para a4re4ar los datos (cmd34re4ar)


1rivate !ub cmd34re4arA%lic2 ()
*im $sp as #or2!pace ^*imensiono las variables
*im Base as *atabase
*im 34enda as <ecordset

!et $sp ; *bEn4ine.#or2spaces(>) ^!eteo el espacio de trabajo
!et Base ; $sp.5pen*atabase (B%lientes.mdbC) ^3bro la base de *atos
!et 34enda ; Basede*atos.5pen<ecordset(B!E(E%T [ &<5G 34endaC) ^3bro el <ecordset

34enda.3ddDe$ ^34re4o un re4istro en blanco
34endaf%odi4o ; txt%odi4o.Text ^3si4no los valores de las cajas de texto a los campos
34endaf*ireccion ; txt*ireccion.Text
34enda.Dombre ; txtDombre.Text
34enda.Update

34enda.%lose ^%ierro el <ecordset
Base.%lose ^%ierro la base de *atos
#sp.%lose ^%ierro el espacio de trabajo

End !ub


$).( Cancel@pdate 07&'eto Recordset1

3plicanble a:
5bjeto <ecordset.

%ancela todas las actuali)aciones pendientes del objeto Recordset.

'inta0is
recordset.!ancelA7date tipo

(a sintaxis del mtodo !ancelA7date consta de las si4uientes partes.

Parte &escri7cin
recordset Una variable de objeto que representa el objeto Recordset en el que se cancelan las
actuali)aciones pendientes.
#ipo 5pcional. Una constante que indica el tipo de actuali)aci+n, como se especi"ica en 0alores (s+lo
espacios de trabajo 5*B%*irect).

!omentarios

El mtodo !ancelA7date cancela todas las actuali)aciones pendientes a causa de una operaci+n -dit
o Add(e<. 1or ejemplo, si un usuario llama al mtodo -dit o Add(e< sin 6aber llamado
anteriormente al mtodo A7date, !ancelA7date cancelar7 todos los cambios e"ectuados despus de
llamar a -dit o Add(e<.

-2em7lo del mJtodo !ancelA7date

3l mismo ejemplo del Evento Add(e<, le a4re4amos la opci+n de con"irmar o volver para atr7s la
actuali)aci+n al operador, se4Fn la respuesta a una caja de mensajes.

1rivate !ub cmd34re4arA%lic2 ()
*im $sp as #or2!pace ^*imensiono las variables
*im Base as *atabase
*im 34enda as <ecordset

!et $sp ; *bEn4ine.#or2spaces(>) ^!eteo el espacio de trabajo
!et Base ; $sp.5pen*atabase (B%lientes.mdbC) ^3bro la base de *atos
!et 34enda ; Basede*atos.5pen<ecordset(B!E(E%T [ &<5G 34endaC) ^3bro el <ecordset

34enda.3ddDe$ ^34re4o un re4istro en blanco
34endaf%odi4o ; txt%odi4o.Text ^3si4no los valores de las cajas de texto a los campos
34endaf*ireccion ; txt*ireccion.Text
34enda.Dombre ; txtDombre.Text

?" Gs4Box (,34re4a el nuevo re4istroC, vbIesDo) ; vbIes t6en
34enda.Update
Else
34enda.%ancelUpdate
End ?"

34enda.%lose ^%ierro el <ecordset
Base.%lose ^%ierro la base de *atos
#sp.%lose ^%ierro el espacio de trabajo

End !ub


$).) Clear 0Clip&oard, Com&o BoD, List BoD1

3plicable a:
5bjeto %ontrol %omboBox, %ontrol (istBox.

Borra el contenido de los controles 6ist4o0 o !om%o4o0.
'inta0is
ob)eto.!lear

El marcador de posici+n ob)eto representa una expresi+n de objeto cuyo resultado es un objeto de la
lista 3plicable a.

!omentarios

(os controles 6ist4o0 o !om%o4o0 que estn enla)ados a un control &ata no aceptan el mtodo
!lear.

-2em7lo del mJtodo !lear

Este ejemplo utili)a el mtodo !lear para borrar todos los elementos de un cuadro de lista. 1ara probar
este ejemplo, pe4ue el c+di4o en la secci+n *eclaraciones de un "ormulario con un control 6ist4o0
llamado (ist=, y despus presione &@ y 6a4a clic en el "ormulario.
1rivate !ub &ormA%lic2 ()
*im Entry, ?, Gs4 Z *eclara variables.
Gs4 ; ,-a4a clic en 3ceptar para a4re4ar =>> elementos a su cuadro de lista.,
Gs4Box Gs4 Z Guestra el mensaje.
&or ? ; = To =>> Z %uenta de = a =>>.
Entry ; ,Entrada , c ? Z %rea la entrada.
(ist=.3dd?tem Entry Z 34re4a la entrada.
Dext ?
Gs4 ; ,-a4a clic en 3ceptar para quitar cualquier otra entrada.,
Gs4Box Gs4 Z Guestra el mensaje.
&or ? ; = To @> Z *etermina c+mo quitar
(ist=.<emove?tem ? Z uno de cada dos
Dext ? Z elementos.
Gs4 ; ,-a4a clic en 3ceptar para quitar todos los elementos del cuadro de lista.,
Gs4Box Gs4 Z Guestra el mensaje.
(ist=.%lear Z (impia el cuadro de lista.
End !ub

$).8 Close 07&'etos +ata&ase, Recordset o Eor;space1

3plicable a:
5bjeto *atabase, 5bjeto <ecordset, 5bjeto #or2space.

%ierra un objeto *35 (*ata 3ccess 5bject).

'inta0is
ob)eto.!lose

El marcador de posici+n ob)eto es una variable de objeto que representa un objeto &ata%ase,
Recordset o 8or;s7ace abierto.

!omentarios

!i el objeto &ata%ase, Recordset o 8or;s7ace llamado por ob)eto est7 cerrado cuando utili)a !lose
se produce un error en tiempo de ejecuci+n.

Precaucin !i sale de un procedimiento que declara objetos &ata%ase o Recordset y la base de datos
est cerrada, los cambios no 4uardados se perder7n, todas las transacciones pendientes se anular7n y se
anular7n todas las modi"icaciones pendientes de los datos.

!i intenta cerrar un objeto !onnection o &ata%ase mientras 6ay al4Fn objeto Recordset abierto, estos
objetos Recordset se cerrar7n y las actuali)aciones o modi"icaciones pendientes quedar7n anuladas. !i
intenta cerrar un objeto 8or;s7ace mientras 6ay al4Fn objeto &ata%ase abierto, los objetos
&ata%ase se cerrar7n, el cual cerrar7 sus objetos Recordset.
(a utili)aci+n del mtodo !lose en un objeto Recordset ori4inal o duplicado no a"ecta al otro objeto
Recordset.
Una alternativa al mtodo !lose es establecer el valor de una variable de objeto a (othin: (!et
dbsTemp ; Dot6in4).

-2em7lo de mJtodo !lose

!on v7lidos los ejemplos de los mtodos Add(e< y !ancelA7date. (donde se cierran objetos
#or2space, *atabase y <ecordset),

$).9 Cls

3plicable a:
5bjeto &orm, %ontrol 1ictureBox.

Borra los 4r7"icos y el texto 4enerados en tiempo de ejecuci+n de los controles Form o Picture4o0.

"intaDis
ob)eto.!ls

El marcador de posici+n ob)eto representa una expresi+n de objeto cuyo resultado es un objeto de la
lista 3plicable a. !i se omite ob)eto, se supone que el ob)eto es el control Form que ten4a el en"oque.

Comentarios

!ls borra el texto y los 4r7"icos 4enerados en tiempo de ejecuci+n por instrucciones 4r7"icas y de
impresi+n. (os mapas de bits de "ondo de"inidos mediante la propiedad Picture y los controles
colocados en un Form en tiempo de dise8o no se ven a"ectados por !ls.
*espus de llamar a !ls, las propiedades !urrent" y !urrentB del ob)eto se restablecen a >.

-2em7lo del mJtodo !ls

Este ejemplo utili)a el mtodo !ls para eliminar la in"ormaci+n impresa de un "ormulario. 1ara probar
este ejemplo, pe4ue el c+di4o en la secci+n *eclaraciones de un "ormulario, y despus presione &@ y
6a4a clic en el "ormulario.
1rivate !ub &ormA%lic2 ()
*im Gs4 Z *eclara variable.
&ore%olor ; \B%olor(=@) Z Establece el color de primer plano a blanco.
Bac2%olor ; \B%olor(=) Z Establece el color de "ondo a a)ul.
Gs4 ; ,Esta in"ormaci+n se imprime en el "ondo del "ormulario.,
1rint Gs4 Z ?mprime el mensaje en el "ormulario.
Gs4 ; ,-a4a clic en 3ceptar para borrar la in"ormaci+n y el patr+n de "ondo ,
Gs4 ; Gs4 c ,mostrado en el "ormulario.,
Gs4Box Gs4 Z Guestra el mensaje.
%ls Z Borra el "ondo del "ormulario.
End !ub

$).= Compact+ata&ase 07&'eto +B*ngine1

3plicable a:
5bjeto *BEn4ine

%opia, compacta y o"rece la posibilidad de cambiar la versi+n, la secuencia de ordenaci+n y la
codi"icaci+n. (s+lo espacio de trabajo Gicroso"t bet).

"intaDis
&4-n:ine.!om7act&ata%ase antiguabasededatos? nuevabasededatos? escenario? opciones,
contrase(a

(a sintaxis del mtodo !om7act&ata%ase tiene los si4uientes ar4umentos:

/Anti0uabasededatos1 Una 'trin: que identi"ica una base de datos existente y cerrada. 1uede ser una ruta
completa y un nombre de arc6ivo, como ,%:Jdb=.mdb,. !i el nombre de arc6ivo tiene una extensi+n,
deber7 especi"icarla. !i su red lo admite, tambin puede especi"icar una ruta de red, como
,JJserver=Js6are=Jdir=Jdb=.mdb,.
/nuevabasededatos1 Un tipo de datos 'trin: que es la ruta completa de la base de datos compactada que
va a crear. Tambin puede especi"icar una ruta de acceso de red al i4ual que con antiguabasededatos. Do
puede usar el ar4umento nuevabasededatos para especi"icar el mismo arc6ivo de base de datos que
antiguabasededatos.
/Escenario1 5pcional. Un tipo de datos 3ariant que es una expresi+n de cadena que se utili)a para
especi"icar la secuencia de ordenaci+n para crear nuevabasededatos, como se especi"ica en 5pciones. !i
omite este ar4umento, el escenario de la nuevabasededatos ser7 el mismo que el de la
antiguabasededatos.
Tambin puede crear una contrase8a para nuevabasededatos concatenando la cadena de la contrase8a
(que comien)a con ,9p$d;,) con una constante del ar4umento escenario, como este:
db(an4!panis6 c ,9p$d;Dueva%ontrase8a,
!i desea utili)ar el mismo escenario como antiguabasededatos (el valor predeterminado), pero especi"icar
una contrase8a nueva, simplemente escriba una contrase8a en escenario:
,9p$d;Dueva%ontrase8a,
opciones 5pcional. Un valor entero que indica una o m7s opciones, se4Fn se especi"ica en
5pciones. 1uede combinar opciones sumando las correspondientes constantes.
/Contrase'a1 5pcional. Un tipo de datos 3ariant que es una expresi+n de cadena que contiene una
contrase8a, si la base de datos est7 prote4ida con contrase8a. (a cadena ,9p$d;, debe preceder a la
propia contrase8a. !i incluye una valor de contrase8a en escenario, este valor se i4nora.

1uede utili)ar una de las si4uientes constantes en el ar4umento opciones para especi"icar si desea o no
codi"icar la base de datos mientras se compacta.
!onstante &escri7cin
d%-ncr57t %odi"ica la base de datos durante la compactaci+n.
&%&ecr57t *escodi"ica la base de datos durante la compactaci+n.

!i omite una constante de codi"icaci+n o si incluye a la ve) d%&ecr57t y d%-ncr57t,
nuevabasededatos tendr7 la misma codi"icaci+n que antiguabasededatos.
1uede usar una de las si4uientes constantes en el ar4umento opciones para especi"icar la versi+n del
"ormato de los datos para la base de datos compactada. Esta constante a"ecta s+lo a la versi+n del
"ormato de datos de nuevabasededatos y no a"ecta a la versi+n de nin4uno de los objetos de"inidos por
Gicroso"t 3ccess, como "ormularios e in"ormes.
!onstante &escri7cin
d%3ersion1K %rea una base de datos que utili)a el motor de base de datos Gicroso"t bet versi+n =.>
durante la compactaci+n.
&%3ersion11 %rea una base de datos que utili)a el motor de base de datos Gicroso"t bet versi+n =.=
durante la compactaci+n.
&%3ersion2K %rea una base de datos que utili)a el motor de base de datos Gicroso"t bet versi+n Q.>
durante la compactaci+n.
&%3ersion3K %rea una base de datos que utili)a el motor de base de datos Gicroso"t bet versi+n L.>
(compatible con la versi+n L.@) durante la compactaci+n.

!+lo puede especi"icar una constante de versi+n. !i omite una constante de versi+n, nuevabasededatos
tendr7 la misma versi+n que antiguabasededatos. !+lo puede compactar nuevabasededatos a una
versi+n i4ual o posterior a la de antiguabasededatos.

!omentarios

3l cambiar datos de una base de datos, el arc6ivo de base de datos puede "ra4mentarse y utili)ar m7s
espacio en disco del necesario. <e4ularmente, puede usar el mtodo !om7act&ata%ase en la base de
datos para des"ra4mentar el arc6ivo de base de datos. (a base de datos compactada suele ser m7s
peque8a y ejecutarse con m7s rapide). Tambin puede cambiar la secuencia de ordenaci+n, la
codi"icaci+n o la versi+n del "ormato de datos, mientras copia y compacta la base de datos.
Tiene que cerrar antiguabasededatos antes de compactarla. En un entorno multiusuario, los dem7s
usuarios no pueden tener abierta antiguabasededatos mientras usted la compacta. !i
antiguabasededatos no est7 cerrada o no se encuentra disponible para su uso exclusivo, se producir7
un error.
1uesto que !om7act&ata%ase crea una copia de la base de datos, deber7 disponer de espacio
su"iciente en disco para la base de datos ori4inal y la duplicada. (a operaci+n de compactaci+n
"racasar7 si no 6ay su"iciente espacio disponible en disco. (a base de datos duplicada
nuevabasededatos no tiene por qu estar en el mismo disco que antiguabasededatos. *espus de
compactar una base de datos, puede eliminar el arc6ivo antiguabasededatos y cambiar el nombre del
arc6ivo compactado nuevabasededatos por el nombre del arc6ivo ori4inal.
El mtodo !om7act&ata%ase copia todos los datos y valores de permisos de se4uridad de la base de
datos especi"icada en antiguabasededatos a la base de datos especi"icada en nuevabasededatos.
!i utili)a el mtodo !om7act&ata%ase para convertir una base de datos versi+n =.x a una versi+n Q.@
o L.x, solamente las aplicaciones que utili)an las versiones de Gicroso"t bet Q.@ o L.x pueden abrir la
base de datos convertida.

Precaucin *ebido a que el mtodo !om7act&ata%ase no convertir7 objetos Gicroso"t 3ccess, no
es recomendable utili)ar !om7act&ata%ase para convertir una base de datos que conten4a dic6os
objetos. 1ara convertir una base de datos que conten4a objetos Gicroso"t 3ccess, en el menF
@erramientas, elija Atilidades de la %ase de datos y despus 6a4a clic en !onvertir %ase de datos.

*'emplo de m5todo Compact+ata&ase

Este ejemplo utili)a el mtodo !om7act&ata%ase compactar la base de *atos %lientes.mdb.
!ub %ompact*atabaseH()
*BEn4ine.%ompact*atabase ,%lientes.mdb,, B%ompact.mdb,
End !ub

$).> +elete 07&'eto Recordset1

3plicable a:
5bjeto <ecordset.

5bjetos Recordset: elimina el re4istro activo de un objeto Recordset de tipo *ynaset o Table.
1ara espacios de trabajo 5*B%*irect, el tipo de controlador determina si los objetos Recordset
se pueden actuali)ar y, por tanto, admiten el mtodo &elete.

'inta0is
recordset.&elete

(a sintaxis del mtodo &elete utili)a los si4uientes ar4umentos.
Ar:umentos &escri7cin
recordset Una variable de objeto que identi"ica un objeto Recordset de tipo *ynaset o Table
abierto, que contiene el re4istro que desea eliminar.

Comentarios

1uede utili)ar el mtodo &elete para eliminar un re4istro activo de un objeto Recordset.
Recordsets
Un objeto Recordset debe contener un re4istro activo antes de que utilice el mtodo &elete9 en caso
contrario se produce un error en tiempo de ejecuci+n.
En objetos Recordset, &elete elimina el re4istro activo y lo 6ace inaccesible. 3unque no pueda
modi"icarlo o utili)arlo, el re4istro eliminado permanecer7 activo. !in embar4o, una ve) que se
desplace a otro re4istro no podr7 volver a convertir en activo el re4istro eliminado. (as re"erencias
subsi4uientes a un re4istro eliminado en un Recordset no son v7lidas y producen un error.
!i la tabla base es la tabla principal en una relaci+n de eliminaci+n de cascada, al eliminar el re4istro
activo tambin se eliminar7n uno o m7s re4istros de una tabla externa.
(ota 1ara a4re4ar, modi"icar o eliminar un re4istro, debe tener un ndice Fnico en el re4istro en el
ori4en de datos de base. !i no es as, se producir7 un error ,1ermiso dene4ado, en la llamada al
mtodo Add(e<, &elete o -dit en un espacio de trabajo Gicroso"t bet.

*'emplo de m5todo +elete

!e necesitan borrar todos los re4istros de la tabla 34enda (dentro de la base de datos %lientes) cuyos
c+di4os de %lientes sean menores a =>.

1rivate !ub cmd34re4arA%lic2 ()
*im $sp as #or2!pace ^*imensiono las variables
*im Base as *atabase
*im 34enda as <ecordset

!et $sp ; *bEn4ine.#or2spaces(>) ^!eteo el espacio de trabajo
!et Base ; $sp.5pen*atabase (B%lientes.mdbC) ^3bro la base de *atos
!et 34enda ; Basede*atos.5pen<ecordset(B!E(E%T [ &<5G 34enda #-E<E 34enda.%odi4o ]
=>C) ^3bro el <ecordset

?" Dot 34enda.E5& ^si encontr al4Fn re4istro
34enda.Gove&irst ^me muevo al primer re4istro
*o #6ile Dot 34enda.E5& ^mientras no sea "in de arc6ivo
34enda.*elete ^elimino el re4istro
34enda.GoveDext ^me despla)o al si4uiente re4istro
(oop
End ?"

34enda.%lose ^%ierro el <ecordset
Base.%lose ^%ierro la base de *atos
#sp.%lose ^%ierro el espacio de trabajo

End !ub


$).? *dit 07&'eto Recordset1

3plicable a :
5bjeto <ecordset.

%opia el re4istro activo de un objeto Recordset al bF"er de copia para su posterior edici+n.

'inta0is
recordset.-dit

El recordset representa el nombre de un objeto Recordset abierto y que se puede actuali)ar que
contiene el re4istro que desea modi"icar.

Comentarios

Una ve) que utili)a el mtodo -dit, los cambios reali)ados en los campos del re4istro activo son
copiados al bF"er de copia. *espus de reali)ar los cambios deseados en el re4istro, utilice el mtodo
A7date para 4uardar los cambios.
El re4istro activo permanece activo despus de utili)ar el mtodo -dit.

Precaucin !i modi"ica un re4istro y a continuaci+n pasa a otro re4istro sin utili)ar antes A7date, los
cambios se perder7n sin previo aviso. 3dem7s, si cierra recordset o "inali)a el procedimiento que
declara el Recordset o el objeto &ata%ase o !onnection, el re4istro modi"icado se descarta sin previo
aviso.

(a utili)aci+n de -dit produce un error bajo las si4uientes condiciones:
Do 6ay nin4Fn re4istro activo.
El objeto &ata%ase o Recordset se abri+ de s+lo lectura.
Do 6ay campos que se pueden actuali)ar en el re4istro.
El objeto &ata%ase o Recordset se abri+ para uso en modo exclusivo por otro usuario (espacio de
trabajo Gicroso"t bet).

(ota 1ara a4re4ar, modi"icar o eliminar un re4istro, debe tener un ndice Fnico en el re4istro en el
ori4en de datos de base. !i no es as, se producir7 un error ,1ermiso dene4ado, en la llamada al
mtodo Add(e<, &elete o -dit en un espacio de trabajo Gicroso"t bet, o se producir7 un error
,3r4umento no v7lido, el la llamada al mtodo A7date en un espacio de trabajo 5*B%*irect.

*'emplo de m5todo *dit

!e necesita asi4nar la )ona = a todos los re4istros de la tabla 34enda (dentro de la base de datos %lientes)
cuyos c+di4os de %lientes sean menores a Q>.

1rivate !ub cmd34re4arA%lic2 ()
*im $sp as #or2!pace ^*imensiono las variables
*im Base as *atabase
*im 34enda as <ecordset

!et $sp ; *bEn4ine.#or2spaces(>) ^!eteo el espacio de trabajo
!et Base ; $sp.5pen*atabase (B%lientes.mdbC) ^3bro la base de *atos
!et 34enda ; Basede*atos.5pen<ecordset(B!E(E%T [ &<5G 34enda #-E<E 34enda.%odi4o ]
Q>C) ^3bro el <ecordset

?" Dot 34enda.E5& ^si encontr al4Fn re4istro
34enda.Gove&irst ^me muevo al primer re4istro
*o #6ile Dot 34enda.E5& ^mientras no sea "in de arc6ivo
34enda.Edit ^Edito el re4istro
34endafaona ; =
34enda.Update
34enda.GoveDext ^me despla)o al si4uiente re4istro
(oop
End ?"
34enda.%lose ^%ierro el <ecordset
Base.%lose ^%ierro la base de *atos
#sp.%lose ^%ierro el espacio de trabajo

End !ub

$).$A Fide

3plicable a:
5bjeto &orm.

5culta un objeto Form pero no lo descar4a.

'inta0is
ob)eto.@ide

El marcador de posici+n ob)eto representa una expresi+n de objeto cuyo resultado es un objeto de la
lista 3plicable a. !i se omite ob)eto, se supone que ob)eto es el "ormulario que ten4a el en"oque.

Comentarios

%uando se oculta un "ormulario, se quita de la pantalla y su propiedad 3isi%le queda establecida a
False. (os controles de un "ormulario oculto no son accesibles para el usuario, pero est7n disponibles
para la aplicaci+n de 0isual Basic en ejecuci+n y para otros procesos que se estn comunicando con la
aplicaci+n mediante **E, as como para los eventos del control +imer.
%uando se oculta un "ormulario, el usuario no puede interactuar con la aplicaci+n 6asta que el c+di4o
del procedimiento de evento que 6a provocado la ocultaci+n del "ormulario 6aya terminado de
ejecutarse.
!i el "ormulario no est7 car4ado cuando se llama al mtodo @ide, el mtodo @ide car4a el "ormulario
pero no lo presenta.

-2em7lo del mJtodo @ide

Este ejemplo utili)a el mtodo @ide para ocultar un "ormulario. 1ara probar este ejemplo, pe4ue el
c+di4o en la secci+n *eclaraciones de un "ormulario, y despus presione &@ y 6a4a clic en el
"ormulario.
1rivate !ub &ormA%lic2 ()
*im Gs4 Z *eclara variable.
-ide Z 5culta el "ormulario.
Gs4 ; ,-a4a clic en 3ceptar para que vuelva a aparecer el "ormulario.,
Gs4Box Gs4 Z Guestra el mensaje.
!6o$ Z Guestra de nuevo el "ormulario.
End !ub

$).$$Mo!e-irst Mo!eLast Mo!eNeDt 3 Mo!e%re!ious 07&'eto
Recordset1

3plicable a:
5bjeto <ecordset.

Gueven al re4istro primero, Fltimo, si4uiente o anterior de un objeto Recordset y lo convierten en el
re4istro activo.

"intaDis
recordset.gMoveFirst h Move6ast Wd%RunAs5ncX h Move(e0t h MovePreviousi

El marcador de posici+n recordset es una variable de objeto que representa un objeto Recordset
abierto.

Comentarios


Precaucin !i modi"ica el re4istro activo, utilice el mtodo A7date para 4uardar los cambios antes de
ir a otro re4istro. !i va a otro re4istro sin actuali)ar, los cambios se perder7n sin previo aviso.

3l abrir un Recordset, el primer re4istro est7 activo y la propiedad 4,F es False. !i el Recordset no
contiene re4istros la propiedad 4,F es +rue y no 6abr7 nin4Fn re4istro activo.
!i el primer o el Fltimo re4istro est7 activo cuando utili)a MoveFirst o Move6ast, el re4istro activo
no cambia.
!i utili)a MovePrevious cuando el primer re4istro est7 activo, la propiedad 4,F es +rue y no 6abr7
nin4Fn re4istro activo. !i vuelve a utili)ar MovePrevious se producir7 un error y 4,F ser7 +rue.
!i utili)a Move(e0t cuando el Fltimo re4istro est7 activo, la propiedad -,F es +rue y no 6abr7
nin4Fn re4istro activo. !i vuelve a utili)ar Move(e0t se producir7 un error y -,F ser7 +rue.
!i recordset 6ace re"erencia a un objeto Recordset de tipo Table (s+lo espacios de trabajo Gicroso"t
bet), el movimiento se4uir7 el ndice activo. 1uede establecer el ndice activo utili)ando la propiedad
Inde0. !i no establece el ndice activo, el orden de los re4istros devueltos no estar7 de"inido.
Im7ortante 1uede utili)ar el mtodo Move6ast para llenar completamente un objeto Recordset de
tipo *ynaset o !naps6ot para obtener el nFmero de re4istros activos en el Recordset. !in embar4o, si
utili)a Move6ast puede 6acer m7s lentas sus aplicaciones. !+lo debe utili)ar Move6ast para obtener
un total de re4istros si es absolutamente necesario obtener un total exacto en un Recordset abierto
recientemente.

Do puede utili)ar los mtodos MoveFirst, Move6ast y MovePrevious en un Recordset de tipo
&or$ard.only.
1ara mover la posici+n del re4istro activo en un objeto Recordset un nFmero espec"ico de re4istros
6acia adelante o 6acia atr7s, utilice el mtodo Move.

-2em7lo de mJtodos MoveFirst? Move6ast? Move(e0t? MovePrevious

1ara un ejemplo de uso de los mtodos MoveFirst y Move(e0t, mire el ejemplo del mtodo -dit.
!e necesita asi4nar la )ona = a todos los re4istros de la tabla 34enda (dentro de la base de datos %lientes)
cuyos c+di4os de %lientes sean menores a Q>. Es necesario recorrer la tabla de atr7s 6acia adelante.

1rivate !ub cmd34re4arA%lic2 ()
*im $sp as #or2!pace ^*imensiono las variables
*im Base as *atabase
*im 34enda as <ecordset

!et $sp ; *bEn4ine.#or2spaces(>) ^!eteo el espacio de trabajo
!et Base ; $sp.5pen*atabase (B%lientes.mdbC) ^3bro la base de *atos
!et 34enda ; Basede*atos.5pen<ecordset(B!E(E%T [ &<5G 34enda #-E<E 34enda.%odi4o ]
Q>C) ^3bro el <ecordset

?" Dot 34enda.E5& ^si encontr al4Fn re4istro
34enda.Gove(ast ^me muevo al Fltimo re4istro
*o #6ile Dot 34enda.B5& ^mientras no sea principio de arc6ivo
34enda.Edit ^Edito el re4istro
34endafaona ; =
34enda.Update
34enda.Gove1revious ^me despla)o al re4istro anterior
(oop
End ?"
34enda.%lose ^%ierro el <ecordset
Base.%lose ^%ierro la base de *atos
#sp.%lose ^%ierro el espacio de trabajo

End !ub

$).$, 7pen+ata&ase 07&'eto Eor;space1

3plicable a:
5bjeto *BEn4ine, 5bjeto #or2space.

3bre una base de datos especi"icada en un objeto 8or;s7ace y devuelve una re"erencia al objeto
&ata%ase que la representa.

'inta0is
'et basededatos ; espaciodetraba)o.,7en&ata%ase Enombrebasededatos? opciones? slolectura?
conexinF

(a sintaxis del mtodo ,7en&ata%ase consta de las si4uientes partes.
Ar:umento &escri7cin
basededatos Una variable de objeto que representa el objeto &ata%ase que va a abrir.
espaciodetraba)o 5pcional. Una variable de objeto que representa el objeto 8or;s7ace
existente que
contendr7 la base de datos. !i no incluye un valor para espaciodetraba)o,
,7en&ata%ase utili)a el espacio de trabajo predeterminado.
.ombrebasededatos Un tipo de datos 'trin: que es el nombre de un arc6ivo de base de datos
Gicroso"t bet
existente o el nombre del ori4en de datos (*!D) de un ori4en de datos 5*B%
existente.
opciones 5pcional. Un tipo de datos 3ariant que establece varias opciones para la base de
datos, como se especi"ica en 0alores.
slolectura 5pcional. Un valor de tipo de datos 3ariant (subtipo 4oolean) que es +rue si
desea
abrir la base de datos con acceso de s+lo lectura o False (predeterminado) si
desea
abrir la base de datos con acceso de lecturaOescritura.
conexin 5pcional. Un tipo de datos 3ariant (subtipo 'trin:) que especi"ica in"ormaci+n
variada sobre la conexi+n, incluyendo las contrase8as.

3alores
1ara los espacios de trabajo Gicroso"t bet, puede utili)ar los si4uientes valores para el ar4umento
opciones:
3alor &escri7cin
+rue 3bre la base de datos en modo exclusivo.
False (1redeterminado) 3bre la base de datos en modo compartido.

!omentarios

%uando abre una base de datos, autom7ticamente se a4re4a a la colecci+n &ata%ases.
Estas son al4unas consideraciones que debe aplicar cuando utilice nombrebasededatos:
!i 6ace re"erencia a una base de datos que ya est7 abierta para acceso en modo exclusivo por otro
usuario, se produce un error.
!i no 6ace re"erencia a una base de datos existente, se produce un error.

El ar4umento conexin se expresa en dos partes: el tipo de base de datos, se4uido por punto y coma (9)
y los ar4umentos opcionales. 1rimero debe proporcionar el tipo de base de datos, como ,5*B%9, o
,&ox1ro Q.@9,. 3 continuaci+n, os ar4umentos opcionales sin un orden concreto, separados por punto y
coma. Uno de los par7metros puede ser la contrase8a (si 6ay al4una asi4nada). 1or ejemplo:
,&ox1ro Q.@9 p$d;micontrase8a,

1ara cerrar una base de datos y, de este modo, quitar el objeto &ata%ase de la colecci+n &ata%ases,
utilice el mtodo !lose en el objeto .

-2em7lo mJtodo ,7en&ata%ase

Es v7lido el mismo ejemplo utili)ado para los mtodos MoveFirst? Move6ast? Move(e0t?
MovePrevious.

$).$( 7penRecordset 07&'eto +ata&ase1

3plicable a:
5bjeto *atabase.

%rea un nuevo objeto Recordset y lo a8ade a la colecci+n Recordsets.

'inta0is
'et variable ; ob)eto.,7enRecordset Eorigen? tipo? opciones? bloquearmodificacionesF

(a sintaxis del mtodo ,7enRecordset consta de las si4uientes partes.
Ar:umento &escri7cin
variable Una variable de objeto que representa el objeto Recordset que desea
abrir.
&b)eto Una variable de objeto que representa un objeto existente desde el que desea
crear
el objeto Recordset nuevo.
&rigen Un tipo de datos 'trin: que especi"ica el ori4en de los re4istros para el nuevo
Recordset. El ori4en puede ser un nombre de tabla, un nombre de consulta o
una
instrucci+n !\( que devuelve re4istros.
#ipo 5pcional. Una constante que indica el tipo de objeto Recordset a abrir, como
se
especi"ica en 0alores.
&pciones 5pcional. Una combinaci+n de constantes que especi"ican las caractersticas
del
objeto Recordset nuevo, como se especi"ica en 0alores.
$loquearmodificaciones 5pcional. Una constante que determina el bloqueo para el objeto
Recordset,
como se especi"ica en 0alores.

3alores
1uede utili)ar una de las si4uientes constantes para el ar4umento tipo.
!onstante &escri7cin
d%,7en+a%le 3bre un objeto Recordset de tipo Table (s+lo espacios de trabajo Gicroso"t
bet).
d%,7en&5naset 3bre un objeto Recordset de tipo *ynaset (actuali)able).
&%,7en'na7shot 3bre un objeto Recordset de tipo !naps6ot (s+lo lectura)
&%,7enFor<ard,nl5 3bre un objeto Recordset de tipo &or$ard.only.

(ota !i abre un objeto Recordset en un espacio de trabajo Gicroso"t bet y no especi"ica un tipo, el
mtodo ,7enRecordset crea una objeto Recordset de tipo Table, si es posible. !i especi"ica una tabla
vinculada o una consulta, el mtodo ,7enRecordset crea un objeto Recordset.de tipo *ynaset.

1uede utili)ar una combinaci+n de las si4uientes constantes para el ar4umento opciones:

-&%A77end,nl5* 1ermite al usuario anexar re4istros nuevos al objeto Recordset, pero impide la
modi"icaci+n o eliminaci+n de re4istros existentes (s+lo objetos Recordset de tipo *ynaset de Gicroso"t
bet).
-&%'ee!han:es* :enera un error en tiempo de ejecuci+n si otro usuario est7 cambiando los datos que
usted est7 modi"icando.(!+lo en objetos Recordset de tipo !naps6ot de Gicroso"t bet). Esto es Ftil en
aplicaciones donde varios usuarios tiene acceso de lecturaOescritura simult7neo a los mismos datos.
-&%&en58rite* 1reviene que otros usuarios puedan modi"icar o a4re4ar re4istros (s+lo objetos
Recordset de Gicroso"t bet).
-&%&en5Read* 1reviene que otros usuarios puedan leer datos de una tabla (s+lo objetos Recordset de
tipo Table de Gicroso"t bet).
-&%For<ard,nl5* %rea un objeto Recordset de tipo &or$ard.only (s+lo objetos Recordset de tipo
!naps6ot de Gicroso"t bet). !e proporciona s+lo para compatibilidad con versiones anteriores y debe
utili)ar la constante d%,7enFor<ard,nl5 en el ar4umento tipo en ve) de utili)ar esta opci+n.
-&%Read,nl5 : 1reviene que otros usuarios puedan 6acer cambios el objeto Recordset (s+lo Gicroso"t
bet). (a constante d%Read,nl5 en el ar4umento bloquearmodificaciones reempla)a esta opci+n, la cual
se proporciona para compatibilidad con versiones anteriores.
-d%Inconsistent : 1ermite actuali)aciones inconsistentes (s+lo objetos Recordset de tipo *ynaset de
Gicroso"t bet).
-&%!onsistent : 1ermite s+lo actuali)aciones consistentes (s+lo objetos Recordset de tipo *ynaset de
Gicroso"t bet).

(ota (as constantes d%!onsistent y d%Inconsistent se excluyen mutuamente y el uso de ambos
produce un error. 1roporcionar un ar4umento bloquearmodificaciones cuando el ar4umento opciones
utili)a la constante d%Read,nl5 tambin produce un error.

1uede utili)ar las si4uientes constantes para el ar4umento bloquearmodificaciones:.
-d%Read,nl5* 1reviene que los usuarios 6a4an cambios al Recordset. 1uede utili)ar d%Read,nl5 en el
ar4umento opciones o en el ar4umento bloquearmodificaciones, pero nunca en ambos. !i lo utili)a en
ambos ar4umentos, se produce un error en tiempo de ejecuci+n.
-&%Pessimistic* Utili)a el bloqueo pesimista para determinar c+mo se pueden 6acer cambios al objeto
Recordset en un entorno multiusuario. (a p74ina que contiene el re4istro que est7 modi"icando est7
bloqueada mientras utili)a el mtodo -dit (predeterminado en espacios de trabajo Gicroso"t bet).
-&%,7timistic* Utili)a el bloqueo optimista para determinar c+mo se pueden 6acer cambios al objeto
Recordset en un entorno multiusuario. (a p74ina que contiene el re4istro que est7 modi"icando est7
bloqueada mientras se ejecuta el mtodo A7date.

!omentarios

En un espacio de trabajo Gicroso"t bet, si ob)eto 6ace re"erencia a un objeto Cuer5&e1 o Recordset de
tipo *ynaset o !naps6ot o si origen 6ace re"erencia a una instrucci+n !\( o un +a%le&e1 que
representa una tabla adjunta, no podr7 utili)ar d%,7en+a%le para el ar4umento tipo y si lo 6ace, se
producir7 un error interceptable.
!i ob)eto 6ace re"erencia a un Recordset de tipo *ynaset o !naps6ot, el Recordset nuevo es del
mismo tipo ob)eto. !i ob)eto 6ace re"erencia a un objeto Recordset de tipo Table, el tipo del objeto
nuevo es un objeto Recordset de tipo *ynaset. Do puede abrir objetos Recordset nuevos desde
objetos Recordset de tipo &or$ard.only.

Utilice la constante d%'ee!han:es en espacio de trabajo Gicroso"t bet si desea captar los cambios
reali)ados mientras dos o m7s usuarios est7n modi"icando o eliminando el mismo re4istro. 1or
ejemplo, si dos usuarios empie)an a modi"icar el mismo re4istro, el primer usuario que ejecute el
mtodo A7date consi4ue reali)ar la operaci+n. %uando el se4undo usuario ejecute el mtodo A7date
ocurre un error de tiempo de ejecuci+n. *el mismo modo, si el se4undo usuario intenta utili)ar el
mtodo &elete para eliminar un re4istro y el primer usuario 6a cambiado ya el mismo, se produce un
error de tiempo de ejecuci+n.
En 4eneral, si al usuario se le presenta este error mientras est7 actuali)ando, su c+di4o debe actuali)ar
el contenido de los campos y leer los valores recientemente modi"icados. !i se produce el error durante
el proceso de eliminaci+n, el c+di4o puede mostrar al usuario los nuevos datos del re4istro junto con
un mensaje que indica que se 6an modi"icado recientemente los datos. En este momento, el c+di4o
puede solicitar una con"irmaci+n de que el usuario desea aFn eliminar el re4istro.
3l cerrar un Recordset utili)ando el mtodo !lose, se eliminar7 autom7ticamente de la colecci+n
Recordsets.

*'emplo del m5todo 7penRecordset

Es v7lido el mismo ejemplo utili)ado para los mtodos MoveFirst? Move6ast? Move(e0t?
MovePrevious.

$).$) Remo!e2tem

3plicable a:
%ontrol %omboBox, %ontrol (istBox.

\uita un elemento de un control 6ist4o0 o !om%o4o0. Do acepta ar4umentos con nombre.

'inta0is
ob)eto.RemoveItem *ndice

(a sintaxis del mtodo RemoveItem consta de las si4uientes partes:
Parte &escri7cin
ob)eto <equerido. Una expresi+n de objeto cuyo resultado es un objeto de la lista 3plicable a.
*ndice <equerido. Un entero que especi"ica la posici+n dentro del objeto del elemento o la "ila que se va
a
quitar. 1ara los primeros elementos de los controles 6ist4o0 o !om%o4o0, *ndice es >.

!omentarios

(os controles 6ist4o0 o !om%o4o0 que est7n enla)ados a un control &ata no aceptan el mtodo
RemoveItem.

-2em7lo del mJtodo RemoveItem

Este ejemplo utili)a el mtodo RemoveItem para quitar entradas de un cuadro de lista. 1ara probar
este ejemplo, pe4ue el c+di4o en la secci+n *eclaraciones de un "ormulario que conten4a un control
6ist4o0 llamado (ist=, y despus presione &@ y 6a4a clic en el "ormulario.

1rivate !ub &ormA%lic2 ()
*im Entry, ?, Gs4 Z *eclara variables.
Gs4 ; ,-a4a clic en 3ceptar para a4re4ar =>> elementos al cuadro de lista.,
Gs4Box Gs4 Z Guestra el mensaje.
&or ? ; = To =>> Z %uenta de = a =>>.
Entry ; ,Entrada , c ? Z %rea la entrada.
(ist=.3dd?tem Entry Z 34re4a la entrada.
Dext ?
Gs4 ; ,-a4a clic en 3ceptar para quitar una de cada dos entradas.,
Gs4Box Gs4 Z Guestra el mensaje.
&or ? ; = To @> Z *etermina c+mo quitar
(ist=.<emove?tem ? Z uno de cada dos
Dext ? Z elementos.
Gs4 ; ,-a4a clic en 3ceptar para quitar todos los elementos del cuadro de lista.,
Gs4Box Gs4 Z Guestra el mensaje.
(ist=.%lear Z Borra el cuadro de lista.
End !ub


$).$8 Repair+ata&ase 07&'eto +B*ngine1

3plicable a:
5bjeto *BEn4ine.

?ntenta reparar una base de datos da8ada que accede a base de datos Gicroso"t bet.

'inta0is

&4-n:ine.Re7air&ata%ase nombrebasededatos

El ar4umento nombrebasededatos representa un tipo de datos 'trin: que es la ruta de acceso y el
nombre de un arc6ivo de base de datos del motor Gicroso"t bet existente. !i se omite la ruta, s+lo se
buscar7 en el directorio activo.

!omentarios

*ebe cerrar la base de datos especi"icada por nombrebasededatos antes de repararla. En un entorno
multiusuario, los dem7s usuarios no podr7n tener abierto nombrebasededatos mientras usted la repara.
!i no est7 cerrado nombrebasededatos o no est7 disponible para uso exclusivo, se producir7 un error.
Este mtodo intenta reparar una base de datos marcada como posiblemente da8ada por una operaci+n
de escritura incompleta. Esto puede ocurrir si una aplicaci+n que utili)a el motor de base de datos
Gicroso"t bet termina inesperadamente debido a un corte en el suministro elctrico o un problema de
6ard$are. (a base de datos no se marcar7 como posiblemente da8ada si utili)a el mtodo !lose o si
sale de la aplicaci+n de una manera normal.
El mtodo Re7air&ata%ase tambin intenta validar todas las tablas del sistema y todos los ndices. !e
descartan los datos que no se puedan reparar. !i no se puede reparar la base de datos, se produce un
error interceptable.
%uando intente abrir o compactar una base de datos da8ada, normalmente se producir7 un error
interceptable. En al4unas situaciones, sin embar4o, puede que no se detecte una base de datos da8ada y
no se produ)ca nin4Fn error. Es conveniente o"recer a los usuarios un mtodo de ejecutar el mtodo
Re7air&ata%ase en su aplicaci+n, si la base de datos se comporta de manera impredecible.
3l4unos tipos de bases de datos se pueden da8ar si un usuario termina una aplicaci+n sin cerrar los
objetos &ata%ase o Recordset y el motor de base de datos Gicroso"t bet, Gicroso"t #indo$s no
tienen la oportunidad de vaciar las memorias de cac6 de datos. 1ara evitar que se da8en las bases de
datos, estable)ca procedimientos para cerrar las aplicaciones y apa4ar los sistemas que ase4uren que
todas las p74inas de la memoria cac6 est7n 4uardadas en la base de datos. En al4unos casos, puede
que sean necesarias "uentes de alimentaci+n ininterrumpida para evitar prdidas de datos por las
"luctuaciones del suministro elctrico.
(ota *espus de reparar una base de datos, tambin es conveniente compactar la misma utili)ando el
mtodo !om7act&ata%ase para de"ra4mentar el arc6ivo y recuperar espacio en disco.

*'emplo del m5todo Repair+ata&ase

Este ejemplo intenta reparar la base de datos llamada Deptuno.mdb.
!ub <epair*atabaseH()

*im errBucle 3s Error
?" Gs4Box(,U*esea reparar la base de datos DeptunoV,, vbIesDo) ; vbIes T6en
*BEn4ine.<epair*atabase ,Deptuno.mdb,
Gs4Box ,j&in del procedimiento repararf,
End ?"

End !ub

$).$9 "et-ocus

3plicable a
%ontrol %6ec2Box, %ontrol %omboBox, %ontrol %ommandButton, 5bjeto &orm %ontroles -!crollBar
y 0!crollBar, %ontrol (istBox%ontrol 5ptionButton, %ontrol 1ictureBox, %ontrol TextBox.

Gueve el en1oIue al control o "ormulario especi"icado.

"intaDis
ob)eto.'etFocus

El marcador de posici+n ob)eto representa una e07resin de o%2eto que da como resultado un objeto
de la lista 3plicable a.

!omentarios

El objeto debe ser un objeto Form o un control que pueda recibir el en"oque. *espus de invocar el
mtodo 'etFocus, cualquier entrada del usuario se diri4e al "ormulario o al control especi"icado.
El en"oque s+lo se puede mover a un "ormulario o un control visible. %omo un "ormulario y los
controles de un "ormulario no son visibles 6asta que el evento (oad del "ormulario 6a terminado, no
puede usar en su propio evento (oad el mtodo 'etFocus para mover el en"oque al "ormulario que se
est7 car4ando a menos que use primero el mtodo 'ho< para mostrar el "ormulario antes de que el
procedimiento de evento &ormA(oad 6aya terminado.
Tampoco puede mover el en"oque a un "ormulario o un control si su propiedad -na%led es False. !i la
propiedad -na%led se 6a establecido a False en tiem7o de diseLo, primero debe establecerla a +rue
antes de poder recibir el en"oque mediante el mtodo 'etFocus.

*'emplo del m5todo "et-ocus

3l 6acer clic2 en un bot+n de comando, setea el "oco a la caja de texto txt%odi4o

1rivate !ub cmd=A%lic2()
Txt%odi4o.!et"ocus
End !ub

$).$= "how

3plicable a:
5bjeto &orm.

'inta0is
ob)eto.'ho< estilo/ formulario_propietario

(a sintaxis del mtodo 'ho< consta de las si4uientes partes:
Parte &escri7cin
ob)eto 5pcional. Una expresi+n de objeto cuyo resultado es un objeto de la lista
3plicable
a. !i se omite ob)eto, se supone que ob)eto es el "ormulario asociado con el
m+dulo de "ormulario activo.
estilo 5pcional. Un entero que determina si el "ormulario es modal o no modal. !i
estilo
es >, el "ormulario es no modal9 si estilo es =, el "ormulario es modal.
formulario_propietario 5pcional. Una expresi+n de cadena que especi"ica el componente que ,posee, el
"ormulario que se muestra. 1ara los "ormularios est7ndar de 0isual Basic,
utilice la
palabra clave Me.

!omentarios

!i el "ormulario especi"icado no est7 car4ado cuando se invoca el mtodo 'ho<, 0isual Basic lo car4a
autom7ticamente.
%uando 'ho< presenta un "ormulario no modal, continFa con la ejecuci+n del c+di4o que 6aya a
continuaci+n. %uando 'ho< presenta un "ormulario modal, el c+di4o que 6ay a continuaci+n no se
ejecuta 6asta que el "ormulario se oculta o se descar4a.
%uando 'ho< presenta un "ormulario modal, no 6ay entradas (de teclado o del mouse) excepto sobre
los objetos del "ormulario modal. El pro4rama debe ocultar o descar4ar los "ormularios modales
(normalmente como respuesta a al4una acci+n del usuario) antes de que pueda producirse la entrada en
otro "ormulario.
3unque los dem7s "ormularios de la aplicaci+n est7n des6abilitados cuando se presenta un "ormulario
modal, los de las dem7s aplicaciones no lo est7n.
El "ormulario inicial de una aplicaci+n se muestra autom7ticamente despus de invocar su evento
(oad.

-2em7lo del mJtodo 'ho<

Este ejemplo utili)a el mtodo 'ho< para mostrar un "ormulario oculto. 1ara probar este ejemplo,
pe4ue el c+di4o en la secci+n *eclaraciones de un "ormulario y despus presione &@ y 6a4a clic en el
"ormulario.
1rivate !ub &ormA%lic2 ()
*im Gs4 Z *eclara variable.
-ide Z 5culta el "ormulario.
Gs4 ; ,-a4a clic en 3ceptar para que vuelva a aparecer el "ormulario.,
Gs4Box Gs4 Z Guestra el mensaje.
!6o$ Z Guestra de nuevo el "ormulario.
End !ub

$).$> @pdate 07&'eto recordset1

3plicable a
5bjeto <ecordset.

:uarda el contenido del bF"er de copia en un objeto Recordset de tipo *ynaset o Table especi"icado.

"intaDis
recordset.A7date Etipo, obligar F

(a sintaxis del mtodo A7date tiene las si4uientes partes.
Parte &escri7cin
0ecordset Una variable de objeto que representa un objeto Recordset abierto que se puede actuali)ar.
#ipo 5pcional. Una constante que indica el tipo de actuali)aci+n, como se especi"ica en 0alores
(s+lo espacios de trabajo 5*B%*irect).
&bligar 5pcional. Un valor de tipo 4oolean que indica si se pueden o no obli4ar los cambios en la
base
de datos, sin tener en cuenta si los datos base se 6an cambiado por otro usuario desde la
llamada al mtodo Add(e<, &elete o -dit. !i es +rue, los cambios se "uer)an y los
cambios
6ec6os por otros usuarios se sobrescriben. !i es False (predeterminado), los cambios
6ec6os
por otros usuarios mientras la actuali)aci+n est7 pendiente provocar7n que "alle la
actuali)aci+n para aquellos cambios con"lictivos.

Comentarios

Utilice A7date para 4uardar el re4istro activo y los cambios que 6aya e"ectuado en l.

Precaucin (os cambios reali)ados en el re4istro activo se perder7n si:
Utili)a el mtodo -dit o Add(e< y a continuaci+n, pasa a otro re4istro sin actuali)arlo
previamente mediante A7date.
Utili)a -dit o Add(e< y, a continuaci+n, vuelve a usar -dit o Add(e< sin utili)ar previamente
A7date.
%ierra el conjunto de re4istros a los que 6ace re"erencia recordset sin utili)ar primero A7date.
%ancela la operaci+n -dit utili)ando el mtodo !ancelA7date.


1ara modi"icar un re4istro, utilice el mtodo -dit para copiar el contenido del re4istro activo al bF"er
de copia. !i no utili)a -dit en primer lu4ar, se producir7 un error cuando utilice A7date o intente
cambiar el valor de un campo.
En un espacio de trabajo Gicroso"t bet, cuando el objeto Recordset de la propiedad 6oc;-dits
establecida como +rue (bloqueo pesimista) en un entorno multiusuario, el re4istro permanecer7
bloqueado desde el momento en que se utili)a -dit 6asta que se ejecuta el mtodo A7date o se
cancele la edici+n. !i la con"i4uraci+n de la propiedad 6oc;-dits es False (bloqueo optimista), el
re4istro se bloquea y se compara con el re4istro previamente modi"icado justo antes de se actuali)ado
en la base de datos. !i 6a cambiado el re4istro desde que utili)+ el mtodo -dit, la operaci+n A7date
"alla.. 1ara que la operaci+n A7date continFe con los cambios, utilice de nuevo el mtodo A7date.
1ara volver al re4istro, tal como lo cambi+ el otro usuario, actualice el re4istro activo usando los
mtodos Gove >.
(ota 1ara a4re4ar, modi"icar o eliminar un re4istro, debe 6aber un ndice Fnico en el re4istro del
ori4en de datos base. !e obtiene no lo 6ay, se producir7 un error ,1ermiso dene4ado, en la llamada al
mtodo Add(e<, &elete o -dit en un espacio de trabajo Gicroso"t bet, se producir7 un error
,3r4umento no v7lido, en la llamada al mtodo A7date en un espacio de trabajo 5*B%*irect.

-2em7lo del mJtodo A7date

Es v7lido el ejemplo del mtodo Add(e<.

Anda mungkin juga menyukai