Sunteți pe pagina 1din 601

Visual Basic - Gua del Estudiante Cap.

1
INTRODUCCION Antecedentes histricos.
El lenguaje de programacin BASIC (Beginner's All purpose Symbolic Instruction Code ) naci en el ao
1964 como una herramienta destinado a principiantes, buscando una forma sencilla de realizar
programas, empleando un lenguaje casi igual al usado en la vida ordinaria ( en ingls), y con
instrucciones muy sencillas y escasas. Teniendo en cuenta el ao de su nacimiento, este lenguaje cubra
casi todas las necesidades para la ejecucin de programas. Tngase en cuenta que las mquinas
existentes en aquella poca estaban estrenando los transistores como elementos de conmutacin, los
ciclos de trabajo llegaban a la impensable cifra de 10.000 por segundo y la memoria no pasaba de unos
pocos ks en toroides de ferrita.
Los autores fueron los cientficos John G. Kemeny (Budapest, 1926 USA 1992) y Thomas E. Kurtz
(Illinois 1928) Su trabajo original se llam True BASIC.
La evolucin del BASIC por los aos 70 fue escasa, dado el auge que tomaron en aquella poca
lenguajes de alto nivel como el FORTRAN y el COBOL. En 1978 se defini una norma para unificar los
Basics existentes crendose la normativa BASIC STANDARD
Con la aparicin de los primeros ordenadores personales, dedicados comercialmente al usuario
particular, all por la primera mitad de los ochenta, el BASIC resurgi como lenguaje de programacin
pensado para principiantes, y muchos de estos pequeos ordenadores domsticos lo usaban como
nico sistema operativo (Sinclair, Spectrum, Amstrad)
Con la popularizacin del PC, salieron varias versiones del BASIC que funcionaban en este tipo de
ordenadores (Versiones BASICA, GW-BASIC), pero todas estas versiones del BASIC no hicieron otra
cosa que terminar de rematar este lenguaje. Los programadores profesionales no llegaron a utilizarlo,
habida cuenta de las desventajas de este lenguaje respecto a otras herramientas (PASCAL, C,
CLIPPER). El BASIC con estas versiones para PC lleg incluso a perder crdito entre los profesionales
de la informtica.
Las razones para ello eran obvias:
- No era un lenguaje estructurado.
- No existan herramientas de compilacin fiables.
- No dispona de herramientas de intercambio de informacin.
- No tena libreras.
- No se poda acceder al interior de la mquina.
- Un largo etctera de desventajas respecto a otros lenguajes de programacin.
Tal fue ese abandono por parte de los usuarios, que la aparicin del Quick-BASIC de Microsoft, una
versin ya potente del BASIC, que correga casi todos los defectos de las versiones pas prcticamente
inadvertida, a no ser porque las ltimas versiones del sistema operativo MS-DOS incluan una versin de
Quick-BASIC algo recortada (Q-Basic) como un producto mas dentro de la amplia gama de ficheros
ejecutables que acompaan al sistema operativo, y aprovecha de l el editor de textos (Cada vez que se
llama al EDIT estamos corriendo el editor del Q-Basic).
Esta versin del popular BASIC ya es un lenguaje estructurado, lo que permite crear programas
modularmente, mediante subrutinas y mdulos, capaz de crear programas ya competitivos con otros
lenguajes de alto nivel. Sin embargo llegaba tarde, pues los entornos MS-DOS estaban ya superados por
el entorno grfico Windows.
Sin embargo algo haba en el BASIC que tentaba a superarse: su gran sencillez de manejo. Si a esto se
le aade el entorno grfico Windows, el aprovechamiento al mximo de las posibilidades de Windows en
cuanto a intercambio de informacin, de sus libreras, de sus drivers y controladores, manejo de bases
de datos, etc. el producto resultante puede ser algo que satisfaga todas las necesidades de
programacin en el entorno Windows. La suma de todas estas cosas es VISUAL - BASIC. Esta
LSB Visual Basic - Gua del Estudiante
Captulo 1
Pgina 1

herramienta conserva del BASIC de los aos 80 nicamente su nombre y su sencillez, y tras su
lanzamiento al mercado, la aceptacin a nivel profesional hizo borrar por fin el "mal nombre" asociado a
la palabra BASIC.
Actualmente (2001) se est comercializando la versin 6.0 de este producto. Desde su salida al
mercado, cada versin supera y mejora la anterior. Dados los buenos resultados a nivel profesional de
este producto, y el apoyo prestado por el fabricante para la formacin de programadores, Visual-Basic se
ha convertido en la primera herramienta de desarrollo de aplicaciones en entorno Windows.
Es obligado decir sin embargo, que sigue siendo BASIC. No se pueden comparar sus prestaciones con
otros lenguajes cuando deseamos llegar al fondo de la mquina y controlar uno a uno sus registros. No
es ese el fin perseguido con VB y si es necesario llegar a esas precisiones ser necesario utilizar otro
lenguaje que permita bajar el nivel de programacin. (Visual-C). o realizar libreras (DLLs) que lo hagan.
En la mayor parte de las aplicaciones, las herramientas aportadas por VB son mas que suficiente para
lograr un programa fcil de realizar y de altas prestaciones.

Caractersticas Generales de Visual-Basic


Visual-Basic es una herramienta de diseo de aplicaciones para Windows, en la que estas se desarrollan
en una gran parte a partir del diseo de una interface grfica. En una aplicacin Visual Basic, el
programa est formado por una parte de cdigo puro, y otras partes asociadas a los objetos que forman
la interface grfica.
Es por tanto un termino medio entre la programacin tradicional, formada por una sucesin lineal de
cdigo estructurado, y la programacin orientada a objetos. Combina ambas tendencias. Ya que no
podemos decir que VB pertenezca por completo a uno de esos dos tipos de programacin, debemos
inventar una palabra que la defina : PROGRAMACION VISUAL.
La creacin de un programa bajo Visual Basic lleva los siguientes pasos:
Anlisis . Es el studio de las necesidades que han dado origen a la creacin de ese programa.
Es lo que se se llama Anlisis de la aplicacin. Es la primera fase que debe tener siempre un
programa y es tambien la ms olvidada entre los programadores noveles. Una aplicacin no se
inicia con el teclado, sino sobre un papel.
- Creacin de un interface de usuario. Este interface ser la principal va de comunicacin
hombre mquina, tanto para salida de datos como para entrada. Ser necesario partir de una o
varias ventanas - Formularios - a las que le iremos aadiendo los controles necesarios.
- Definicin de las propiedades de los controles Se dar la forma, posicin, y todas las
caractersticas necesarias a los controles que hayamos colocado en ese formulario. Estas
propiedades determinarn la forma esttica de los controles, es decir, como son los controles y
para qu sirven.
- Generacin del cdigo asociado a los eventos que ocurran a estos controles. A la
respuesta a estos eventos (click, doble click, una tecla pulsada, etc.) le llamamos Procedimiento,
y deber generarse de acuerdo a las necesidades del programa.
- Generacin del cdigo del programa. Un programa puede hacerse solamente con la
programacin de los distintos procedimientos que acompaan a cada objeto. Sin embargo, VB
ofrece la posibilidad de establecer un cdigo de programa separado de estos eventos. Este
cdigo puede introducirse en unos bloques llamados Mdulos, en otros bloques llamados
Funciones, y otros llamados Procedimientos. Estos Procedimientos no responden a un evento
acaecido a un control o formulario, sino que responden a un evento producido durante la
ejecucin del programa.
No es necesario entender de momento lo anterior. Visual Basic introduce un concepto nuevo de
programacin, y es necesario cambiar hasta el argot del programador. Posiblemente se le habrn
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 2

acumulado demasiados trminos de una sola vez. Es normal. A poco que siga leyendo ver las cosas
mas claras cuando se explique una por una.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 3

VARIABLES. DEFINICION Y ENTORNO


Basic, desde siempre, al contrario de otros sistemas de programacin, no exigi la definicin previa de
una variable. Una variable, como Vd. seguro que conoce, es un nombre que en el programa le
asignamos a un dato. Ese dato podr cambiar. Piense por ejemplo, en un programa consistente en la
toma de datos de los alumnos de un centro escolar. Existirn varias variables para poder introducir los
datos de los alumnos. Estas variables pueden tener nombre tales como:
Nombre
Apellido1
Apellido2
Direccin
Telfono
Salario
La variable Nombre tomar valores distintos segn vayamos introduciendo los datos de los distintos
alumnos. Es posible, que a lo largo de la ejecucin del programa, esta variable Nombre valga:
Jos
Pedro
Mara
Luis
Espero que su intuicin o conocimiento anterior le lleve a conocer el concepto de variable. Mas adelante
lo ver mas claro.
Decamos que Basic no exige la definicin previa de las variables. Otras herramientas exigen que se
haga as. Por lo tanto es normal encontrar, en otros sistemas de programacin, que un programa
comienza de la siguiente forma:
Declare Nombre As String
Declare Apellido1 As String
Declare Apellido2 As String
Declare Direccin As String
Declare Telfono As String
Declare Salario As Nmero

Le dice que Nombre es una sucesin de letras

Le dice que Telfono es una sucesin de letras


Le dice que Salario es un nmero

Mediante estas declaraciones, el programa sabe de que tipo de dato se trata y por tanto cmo debe
trabajar con l. En otros sistemas de programacin distintos de Basic, es necesario realizar esta
declaracin antes de introducir una variable.
Basic permite que no se declaren. Cuando a lo largo del programa le introducimos una variable nueva,
asume que es una variable y que el tipo es el adecuado para el valor que le estamos introduciendo en
ese momento.
Por ejemplo, si Basic encuentra estas instrucciones
Salario=50000000
Nombre ="Pedro"
Telfono = "1234567"
entiende que Salario, Nombre y Telfono son variables, que Salario es un nmero (No hemos metido su
valor entre comillas), y que Nombre y Telfono son sucesiones de caracteres alfanumricos (su valor
est entre comillas)

Esta particularidad de no necesitar declarar las variables hace que sea sencillo introducir una variable
nueva. Sin embargo entraa un gran peligro. Imagnese que en un paso posterior del programa, le
mandamos escribir esos tres datos anteriores con la instruccin PRINT
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 4

Print Salario
Print Nombre
Print Telwfono
Habr observado en tercer lugar la palabra Telwfono, que por error ha introducido el programador.
Basic interpreta que Telwfono es una variable e ir a leer en memoria el valor que tiene. No tendr
ningn valor. Por lo tanto no escribir nada y encima no dar ningn aviso de que se ha cometido un
error. Nada es gratis en esta vida, y la facilidad para introducir variables se paga con la posibilidad de un
error.
El peligro de no declarar las variables no termina en esa posibilidad de error. Cuando no declaramos el
tipo de variables, Visual Basic supone que la variable es de un tipo que soporta cualquier tipo de datos :
una variable tipo Variant. En ese tipo podr meter cualquier tipo de variable, pero a costa de ocupar
mucho mas espacio en la memoria que si la hubiese declarado con el tipo correcto para el dato que va a
meter en ella.
Basic ha pensado en ese problema, y se puede solucionar con esta que ser la primera instruccin
BASIC que vamos a estudiar:
OPTION EXPLICIT
Obliga a declarar previamente las variables que se vayan a usar. De no haberla
declarado antes de usarla, el programa dar una comunicacin de error.
Esta declaracin debe ponerla al comienzo de la seccin de declaraciones de cada formulario y mdulo
que contenga su aplicacin. Pero no se preocupe de ello puesto que VB lo ha hecho por Vd. Basta que
lo programe en las opciones del VB. Haga click en Herramientas | Opciones de la barra de men del
VB y le aparecer este cuadro, donde debe marcar las casilla Requerir declaracin de variables. A
partir de ahora, ser VB quien ponga la sentencia Option Explicit en el lugar correcto. (Fig. 1.1)

TIPOS DE VARIABLES
Las variables pueden ser de los siguientes tipos: (El nmero indicado en segundo lugar indica el nmero
de Bytes que ocupa en memoria.)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 5

Booleana
Byte
Integer
Long
Single
Doble
Currency
String
Date
Objet
Variant

(2)
(1)
(2)
(4)
(4)
(8)
(8)
(*)
(8)
(4)
(**)

Admite los valores 0 y 1, o True (verdadero) y False (falso)


Nmeros enteros, en el rango de 0 a 255
Nmeros enteros en el rango de -32768 a 32767
Nmeros enteros en el rango de -2147483648 a 2147483647
Punto flotante, simple precisin
Punto flotante, doble precisin.
Entero, con punto decimal fijo (Tpico de monedas)
Cadenas alfanumricas de longitud variable o fija
Fechas
Referencia a objetos
Otros tipos de datos

(*) Una variable tipo String ocupa el mismo nmero de bytes que caracteres tenga la cadena.
(**) Una variable tipo Variant ocupa 16 bytes si se trata de un nmero y 22 bytes + longitud de la cadena
si se trata de un dato tipo cadena de caracteres.
Existen tambin variables definidas por el usuario (Ya ver la sentencia Type). En este tipo de variables
se pueden introducir muchos datos de distinto tipo. Los bytes necesarios para almacenar esa variable
depender de los datos que se hayan definido.
Dentro de las variables Objet (variables que se refieren a objetos) existe una gran variedad que a estas
alturas del curso no debemos complicarnos con ellas. Pero para adelantar algo, veremos que una
variable puede ser del tipo Form - Formulario - , tipo Recordset, etc. etc.
Cada tipo de variable ocupa unos determinados bytes. Si no se define una variable, VB toma como tipo
por defecto para la variable el tipo Variant, tal como citbamos anteriormente. Este tipo ocupa mas bytes
que, por ejemplo, un integer. Si el tipo de dato que vamos a introducir en una variable es un integer, y no
la hemos declarado como tal, VB asumir para esa variable que es del tipo Variant, lo que le llevar a
gastar mas bytes de memoria (16) que los que necesitara (2) si la hubisemos declarado previamente.
Si esa variable va a estar en el rango de 0 a 255, y no declaramos previamente que la variable va a ser
del tipo Byte, o la declaramos como integer, p. e., estamos desperdiciando memoria RAM y
posiblemente, retardando la ejecucin del programa. Lo mismo podemos decir del resto de las variables,
y lo importante que es declararlas y declararlas bien.
NOTA. Observe en la lista anterior que un dato Booleano ocupa 2 Bytes, mientras que un dato tipo Byte
ocupa un byte. En muchas ocasiones declaramos variables tipo Boolean con la intencin de que ocupen
menos espacio. Paradoja del VB. Si la declaramos como Byte ocupamos menos espacio en memoria.
Declarar una variable como Boolean tiene tambin sus ventajas (escribir menos cdigo por lo general
cuando necesite leer o escribir una variable tipo Boolean), pero tenga presente esta observacin
respecto al tamao de los datos Boolean.
Puede declarar el tipo de la variable mediante un carcter despus del nombre de la variable. Esta
tcnica, obligatoria en Quick-Basic, est en desuso en VB. No es recomendable definir el tipo de esta
forma, pues existe un serio peligro de error. De cualquier forma, eso es potestativo del programador y de
sus costumbres.
Los caracteres que definen cada tipo de variable son:
%

Integer

&

Long

#
Double
@
Currency
Ejemplos Prcticos de declaracin de variables

Single

String

En Visual Basic, cuando declaramos una variable como String (Cadena de caracteres), no es necesario
declarar su longitud. VB aceptar cualquier nmero de caracteres. Si desea evitar que se puedan
introducir ms de un determinado nmero de caracteres, debe declarar su nmero. Por ejemplo :
Dim Var1 as String
LSB

Visual Basic Gua del Estudiante

Var1 puede tener cualquier nmero de caracteres


Captulo 1

Pgina 6

Dim Var2 as String * 15

Var2 puede tener un mximo de 15 caracteres.

En este segundo caso, si se introduce como Var2 una cadena de caracteres con mas de 15 caracteres,
Var2 tomar solamente los 15 primeros. Visual basic no presenta ningn aviso de que esa variable ha
omitido los caracteres que han sobrepasado la cifra de 15. Si desea que el usuario conozca esa
circunstancia, debe introducir el cdigo oportuno para producir el aviso.
La declaracin de variables tipo String con nmero de caracteres predefinido presenta tambin
inconvenientes a la hora de tratar esa cadena de caracteres con sentencias tales como Mid, Left y Right,
o a la hora de aadir una cadena a otra. La experiencia nos indica que NO merece la pena declarar
variables tipo String con el nmero de caracteres prefijado, excepto que sea necesario justamente
para definir la longitud de la cadena.
En una gran parte de los casos una variable que se compone de nmeros debe declararse como una
variable de cadena de caracteres (String), y no como numrica. Cuando pensamos por ejemplo en un
nmero de DNI, compuesto por 7 u 8 cifras, un cdigo postal, el nmero de una calle, el piso de un
edificio, parecen invitar a que la variable que los contenga sea una variable de tipo numrico (Byte,
Integer, Long, ...). Estas variables, aunque su contenido sean nmeros, siempre se deben declarar
como String, ya que se tratan en realidad de cadenas de caracteres, aunque estos no sean letras sino
nmeros. Para aclarar mas estas ideas, piense en el nmero del DNI con la letra del NIF incluido, o que
el lugar del DNI se deba rellenar con el nmero del permiso de residencia, (lleva letras). Piense en el
cdigo postal de una provincia que comienza por 0 ( 08XXX = Barcelona ) . Si la variable que va a
contener ese cdigo postal se declara como numrica, el cero de la izquierda lo desprecia, por lo que
ese cdigo postal quedara reducido al 8XXX, nmero de 4 cifras que el cartero nunca reconocera
como un cdigo postal, que necesariamente ha de tener 5 cifras. Para terminar, piense la forma de
introducir en una variable numrica el nmero 32Bis de una calle o el piso S2 de un edificio. O piense en
una variable que va a contener un cdigo de un producto. Ese cdigo siempre va a ser un nmero, por
ejemplo de 9 cifras. Ha pensado como tratara el ordenador una variable numrica que contiene el
cdigo 000100123 ?. El resultado sera que convertira ese cdigo en la cifra 100123, y Vd. deber
buscarse la vida para aadir los ceros iniciales a la hora de sacarlo a una impresora, por ejemplo.
En todos los casos anteriores, el nmero no representa una cantidad numrica, sino un nombre.
Lo que ocurre es que ese nombre contiene solamente nmeros.
Qu variables debemos declarar entonces como numricas ? La respuesta es bien sencilla : Aquellas
que van a contener datos con lo que vamos a realizar operaciones matemticas.
Las variables booleanas (True/False) pueden en muchos casos sustituirse por una variable del tipo Byte.
Si ese datos True / False se va a introducir en una base de datos o en fichero en el disco, puede ser mas
prudente poner 0 en vez de False y 1 en vez de True.
Una variable byte ocupa muy poco, simplemente 1 byte como su nombre indica. Pero no puede contener
nmeros mayores de 255 ni nmeros negativos.
Cada vez que declare una variable numrica piense en los valores que puede tener, sobre todo cuando
esa variable va a ser el resultado de una operacin matemtica. Recuerde el escaso margen de una
variable tipo Integer ( de -32768 a 32767)
Si la aplicacin va a tratar moneda, piense en la forma de expresar los nmeros decimales y el nmero
de ellos permitidos, as como el redondeo. La variable correcta para este caso es Currency, pero
Currency le aade automticamente el tipo de moneda de cada pas (Pts. Para Espaa) lo que con
frecuencia es un engorro. Los datos del tipo de moneda los toma del sistema operativo del ordenador,
por lo que no se extrae si le expresa el nmero de pesetas en dlares. Cambie el pas en su S. O.
Otro tipo de variable es Date. Este tipo de variable representa una fecha o una hora. Pero debe ser
objeto de un estudio un poco mas extenso para tener claro que es una fecha para Visual Basic, como las
trata y como se pueden comparar. Lo ver mas adelante al estudiar las funciones Format y DateDiff.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 7

Ambito de las variables.


Denominamos mbito de una variable a las partes del programa donde esa variable est declarada.
Para entenderlo mejor, veamos someramente la forma de un programa desarrollado en VB.
Un programa VB tiene uno o varios formularios. Cada formulario tiene varios controles. Tanto el
formulario como cada uno de sus controles tienen una parte del programa, justamente la parte
relacionada con cada uno de los eventos que pueden suceder bien al formulario o a los controles. A
estas partes las habamos llamado Procedimientos. Podemos tener procedimientos que no estn
relacionados con ningn evento ocurrido al formulario o a sus controles. (Los Procedimientos que iremos
insertando a lo largo de la aplicacin)
Aparte de formularios y controles, un programa puede tener Mdulos, y en cada uno de los mdulos
podemos insertar cuantos Procedimientos y Funciones queramos. La estructura de un programa VB
puede ser de la siguiente forma:
Formulario1
Declaraciones
Proc. A1
Proc. A2
Proc. A3
Proc. A4
Proc. A5
Proc. AA1
Proc. AA2
Proc. AA3

Formulario2
Declaraciones
Proc.B1
Proc.B2
Proc.B3
Proc.B4
Proc.BB1
Proc.BB2
Proc.B33

Formulario3
Declaraciones
Proc.C1
Proc.C2
Proc.C3
Proc.C4
Proc.CC1
Proc.CC2
Proc.CC3
Proc.CC4

Mdulo1
Declaraciones
Proc.D1
Proc.D2
Proc.D3
Proc.D4

Modulo2
Declaraciones
Proc.E1
Proc.E2
FuncinE1
FuncinE2
FuncinE3
FuncinE4
FuncinE5
FuncinE6

Si se declara una variable dentro de un procedimiento o Funcin, esa variable "NO SALE" del
Procedimiento o Funcin donde se declar. El procedimiento puede estar en un Formulario (Cualquier
procedimiento de un control o un procedimiento creado por nosotros) o en un Mdulo (En este caso, el
procedimiento solo puede ser creado por nosotros)
En un Formulario, una variable puede declararse de dos formas : Privada o Pblica. Para declarar una
variable a nivel de formulario debe hacerse en la seccin de declaraciones, que est la ventana de
cdigo Objeto = General, Proc. = Declaraciones. Si se declara Privada, esa variable se puede ver en
todo el formulario, (es decir, en todos los procedimientos de todos los controles del formulario y en los
Procedimientos que pudisemos insertar en ese formulario), pero no sale de dicho formulario. Si se
declara como Pblica, esa variable puede verse por todo el formulario, de la misma forma que lo hara
declarada como Privada, y adems puede ser usada desde otro Formulario o Mdulo, citndola con el
nombre del Formulario, seguido del nombre de la variable (Formulario.Variable)
En un Mdulo una variable puede declararse como Privada, con lo que no saldr de ese Mdulo, o
Pblica, pudiendo en este caso usarse en todo el programa. Cuando se declara una variable como
pblica en un Mdulo, basta referirse a ella por su nombre, sin citar el nombre del Mdulo donde se
declar.
En VB es posible declarar varias veces las variables, es decir, pueden declararse a nivel de formulario,
en su apartado de declaraciones, y esa variable conservar su valor en todas las partes de ese
formulario. Sin embargo, si se declara una variable con el mismo nombre a un nivel inferior, por ejemplo
al principio de un procedimiento, esa variable ser una variable distinta a la anterior, aunque tenga el
mismo nombre, al declararla en un Procedimiento, solamente ser vlida en ese Procedimiento. Una vez
que hayamos salido de ese procedimiento, la variable con ese nombre volver a ser la declarada en el
Formulario. En realidad, lo que tenemos son dos variables distintas, pero con el mismo nombre, una
declarada para todo el formulario excepto para el procedimiento donde se volvi a declarar, y otra para
ese procedimiento concreto.
NOTA.- No es recomendable declarar una variable a dos niveles. Es mucho mejor utilizar otro nombre
para esa variable dentro del procedimiento donde se le declarara por segunda vez. A esta nota cabe
exceptuar cuando declaramos variables para una operacin tipo contador
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 8

For I = 1 To N
Esa variable I es prctico declararla con el mismo nombre en cada Procedimiento donde se use.

Tipos de declaracin de variables.


Sentencia DIM

Dim

Es la forma mas comn de declarar una variable como


Privada. Puede emplearse en un Procedimiento, Funcin, Formulario o
Mdulo. La sintaxis es de la siguiente forma:
nombrevariable As Integer

(o el tipo que sea)

Declarando una variable con la sentencia DIM, en un formulario, Funcin, procedimiento o mdulo, el
mbito de la variable ser el explicado anteriormente para una variable declarada como Privada. Es
decir, esa variable no sale del formulario, procedimiento mdulo donde se declar. Cada vez que
entremos al formulario, procedimiento o mdulo, esa variable tomar el valor cero (si es numrica) o nulo
(si es string).
Sentencia PRIVATE

Es la forma de declarar una variable como Privada. Puede


emplearse solamente en la seccin de declaraciones de un Formulario o
Mdulo. La sintaxis es de la siguiente forma:

Private

nombrevariable As Tipovariable

Declarando una variable mediante la sentencia PRIVATE en un Formulario o Mdulo, esa variable puede
usarse en todo ese Formulario o Mdulo (En todos sus Procedimientos y Funciones), pero NO fuera del
Formulario o Mdulo donde se declar.
La sentencia Private no puede usarse en un procedimiento o funcin.

Sentencia PUBLIC

Es la forma de declarar una variable como Pblica. Puede


emplearse solamente en la seccin de declaraciones de un Formulario o
Mdulo. La sintaxis es de la siguiente forma:
Public

nombrevariable

As

Tipovariable

Declarando una variable de esta forma en la seccin de declaraciones de un Mdulo, esa variable
puede usarse en cualquier parte del programa citndola simplemente por su nombre.
Si se declara de esta forma en la seccin de declaraciones de un Formulario, esa variable puede usarse
en toda el programa. Para nombrarla, si estamos en el Formulario donde se declar basta con citarla por
su nombre. Si no estamos en ese Formulario, habr que citarla por el nombre del Formulario, seguido
del nombre de la variable, separados por un punto :
NombreFormulario.Nombrevariable
En un Mdulo puede usarse tambin la sentencia Global en vez de Public :
Sentencia GLOBAL Declara una variable que es vlida en todo el programa. La
sintaxis es:
Global

nombrevariable As

tipovariable

La sentencia Global slo puede usarse en el apartado de declaraciones de un Mdulo. Esta sentencia
se mantiene por compatibilidad con versiones anteriores de VB. No la use.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 9

Sentencia STATIC
Como se dijo anteriormente, una variable declarada en un procedimiento pierde su valor al salir de l. Lo
peor es que una vez que el programa vuelva a entrar en ese procedimiento, la variable estar puesta a
cero. Afortunadamente, esto ltimo tiene solucin. Si declarsemos una variable en un procedimiento o
funcin, como esttica, esa variable, aunque no la podremos utilizar fuera de ese procedimiento o
funcin, cuando volvamos a l conservar el valor que tena cuando lo abandonamos. Esta declaracin
como esttica se realiza mediante la instruccin Static
Static

nombrevariable

As

tipovariable

El nombre de una variable puede ser tan largo como queramos. hasta un mximo de 40 caracteres. En
la versin VB para Espaa se pueden usar incluso la y vocales acentuadas. Es indiferente usar
mayscula minsculas. No se sorprenda, si por ejemplo, la ha declarado con maysculas y luego la
cita con minsculas al escribir el cdigo, que automticamente se cambie a maysculas. El nombre de
una variable siempre debe comenzar por una letra.
No hay problema por utilizar variables largas. Al compilar el programa no se lleva el nombre, es decir, no
le va a ocupar mas espacio. Utilice siempre nombres que le definan la variable con algn sentido. Es
muy til a la hora de acordarse como se llaman, y sobre todo, a la hora de rehacer un programa que
realiz hace seis meses.
Pese a que Visual Basic no obliga a declarar variables, es muy til hacerlo. De esta forma se tiene
control sobre el programa. La experiencia se lo ir demostrando.
Resumimos la forma de declarar una variable:
En un Procedimiento (La variable no puede usarse fuera de esta Procedimiento)
Dim Variable As Tipovariable
En un Procedimiento, como permanente (La variable no puede usarse fuera de este procedimiento, y
dentro de l conserva el valor aunque se salga y se vuelva a entrar)
Static Variable As Tipovariable

En un Formulario (En su seccin de declaraciones)


Como Privada (Solamente se puede usar en ese Formulario)
Dim Variable As Tipovariable

Private Variable As Tipovariable


Como Pblica

(Puede usarse en toda la aplicacin)


Public Variable As Tipovariable

En un Mdulo
Como Privada (Solamente puede usarse en ese Mdulo)
Dim Variable As Tipovariable

Private Variable As Tipovariable


Como Pblica
LSB

(Puede usarse en toda la aplicacin)

Visual Basic Gua del Estudiante

Captulo 1

Pgina 10

Public Variable As Tipovariable

Global Variable As Tipovariable


Error tpico de un programador novel de Visual Basic
Creo que esta costumbre viene del lenguaje C. Pero no vale en VB. Se trata de declarar varias variables
juntas en una misma lnea :
Dim Variable1, Variable2, Variable3, Variable4 As String
Esta declaracin est MAL hecha. Visual Basic interpretar que Variable1, Variable2 y Variable3 son del
tipo Variant, y solamente Variable4 la supone como tipo String
La forma correcta de hacerlo, si queremos declarar esas variables un una sola lnea, es la siguiente :
Dim Variable1 As String, Variable2 As String, Variable3 As String, Variable4 As String.
Forma de conocer el tipo de una variable. Funcin TypeName
Podemos conocer el tipo con el que se ha declarado una variable. Esto se hace mediante la Funcin
TypeName, que devuelve una cadena con el tipo de una variable.
MiTipo = TypeName(NombreVariable)
NombreVariable puede ser cualquier variable con excepcin de las de tipos definidos por el usuario.
La cadena de caracteres devuelta por TypeName puede ser una de las siguientes:
Cadena devuelta

La variable contiene

Byte
Entero
Largo
Simple
Doble
Moneda
Fecha
Cadena
Boolean
Error
Empty
Null
Objeto
Desconocido
Nada

Un byte
Un entero.
Un entero largo.
Un nmero de punto flotante de precisin simple.
Un nmero de punto flotante de precisin doble.
Un valor de moneda.
Una fecha.
Una cadena.
Un valor Boolean.
Un valor de error.
No inicializado.
No hay datos vlidos.
Un objeto que no respalda Automatizacin OLE.
Un objeto de Automatizacin OLE cuyo tipo es desconocido.
Una variable de objeto que no se refiere a un objeto.

Si NombreVariable es una matriz, la cadena devuelta puede ser cualquiera de las cadenas posibles con
un parntesis vaco adherido. Por ejemplo, si NombreVariable es una matriz de enteros, TypeName
devolver "Integer()".
Vamos a hacer nuestro primer programa en Visual Basic. Arranque VB y coloque en el formulario que
aparece nada mas arrancarlo, un botn de comando (CommandButton) y tres etiquetas (Label). El botn
de comando le aparecer con el nombre de Command1 y los labels con Label1, Label2 y Label3. Haga
doble click sobre el formulario. Le aparecer una ventana. En la parte superior izquierda tiene una lnea
con la palabra Form y una flecha hacia abajo que parece que va a desplegar algo. Haga click sobre esa
flecha y luego sobre la palabra General que le aparecer. Teclee aqu las declaraciones de varias
variables (observe que en la ventana similar de la derecha aparece Declaraciones). Puede que ya le
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 11

aparezca la linea con Option Explicit. Si no le aparece, teclela.


Option Explicit
Dim MiString As String
Dim MiEntero As Integer
Dim MiObjeto As Control

Hemos declarado que MiString es una variable tipo String


Hemos declarado que MiObjeto es una variable tipo Objeto

Haga doble click sobre el botn de comando. Le aparecer la ventana anterior, pero referida ahora al
Command1. Teclee el siguiente cdigo :
Private Sub Command1_Click()
Set MiObjeto = Command1
Y aqu decimos que MiObjeto es precisamente el Command1
Label1 = TypeName(MiString)
label2 = TypeName(MiEntero)
Label3 = TypeName(MiObjeto)
End Sub
En los labels 1, 2 y 3 aparecer el tipo de cada variable: String, Integer y CommandButton.
Esta funcin tiene mucha utilidad para determinar errores durante el diseo. Cuando aparece el error No
coinciden los tipos puede interrogarse al programa para ver qu tipo de variable es el que hemos
declarado. Esta idea es especialmente til cuando el trabajo a realizar sea retomar el trabajo comenzado
por otro programador.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 12

Lenguaje Basic del Visual Basic.


No ha sido un juego de palabras. VB emplea unas instrucciones casi iguales a las que emplea Quick
Basic. Sin embargo ha aadido otras nuevas instrucciones, inherentes con la programacin visual.
Vamos a estudiar aqu las instrucciones y definiciones mas sencillas, comunes a QB y VB.
Sentencias condicionales.
Llamamos sentencias condicionales a aquellas que se realizan si se cumple una determinada condicin.
Son las sentencias por las que empieza cualquier texto de Basic, y este no va ser menos.
La sentencia condicional ms usada es:
Si se cumple una condicin Entonces
Realiza estas instrucciones
Si no se cumple
Realiza estas otras instrucciones
Fin de la sentencia.
As de fcil es programar en Basic. Lo que ocurre es que esta herramienta habla ingls, y lo descrito
anteriormente toma la forma:
If condicin Then
Instrucciones
Else
Otras instrucciones
End If
En este ejemplo, o se cumple una condicin y ejecuta unas determinadas instrucciones, o no se cumple,
y ejecuta otras instrucciones distintas. Puede ocurrir que, caso de no cumplirse la condicion primera, se
abra un abanico de dos o tres posibilidades. La sentencia condicional tendra entonces la forma:
If condicin 1 Then
Instrucciones
ElseIf Condicin 2
Otras instrucciones
ElseIf Condicin 3
Otro juego de instrucciones
Else
Instrucciones que debe realizar caso de no cumplir las condiciones 1, 2 y 3.
End If
Como decamos anteriormente, este es el tipo de sentencia condicional mas usada.
Existe otra sentencia condicional muy usada: Select Case
Su nombre casi nos define lo que es: Selecciona, dependiendo del caso, un determinado juego de
instrucciones:
Select Case variable

' variable es una variable que puede tomar los valores (p.e.) de 1 a 4

Case 1
Instrucciones a ejecutar en caso de que variable = 1
Case 2
Instrucciones a ejecutar en caso de que variable = 2
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 13

Case 3
Instrucciones a ejecutar en caso de que variable = 3
Case 4
Instrucciones a ejecutar en caso de que variable = 4
Case Else
Instrucciones a ejecutar en caso de que variable sea distinta a los valores
anteriores
End Select
Este procedimiento resulta mucho mas sencillo y rpido que las sentencias If Then Else
vistas anteriormente, cuando el margen de eleccin es mayor que 2.
Puede agrupar varios valores en una misma lnea. Por ejemplo, si tiene 100 valores posibles, y el
tratamiento es igual para varios de ellos, puede agruparlos as:
Select Case Valor
Case Is < 20
Instrucciones
Case Is = 20
Instrucciones
Case Is = 21, 22, 23, 24, 25, 26
Instrucciones
Case Is > 26
Instrucciones
End Select
Cuando lo que queremos es elegir un valor, no ejecutar instrucciones como hacamos anteriormente,
disponemos de otras dos funciones: Choose y Switch.
Switch toma una serie de parmetros, todos por parejas. El primer trmino de cada pareja es la
expresin a evaluar. El segundo es el valor que tiene que devolver. En realidad Switch es una funcin
(las funciones las veremos muy pronto)
A = Switch (B=1, 5, B=2, 7, B=3, 11)
Esta instruccin obtiene un valor para A que depender del valor que tome B entre los valores posibles
(1, 2 3)
La sentencia Choose es casi igual, cambia solamente la forma. La misma intruccin anterior puede
realizarse con Choose de la siguiente forma:
A = Choose ( B, 5, 7, 11 )
En estas sentencias, Switch y Choose, si el valor de B no coincide con ninguno de los valores que se
le haban establecido (1, 2 3 en nuestro caso), la sentencia devuelve el valor Nulo ( Null ). Esto puede
producir algn error si no se contempla esa posibilidad.
Las sentencias Switch y Choose no se usan mucho en programacin. Parece que los programadores
o no las conocen o se lan (y es comprensible) al utilizarlas. Le garantizo que puede llegar a ser un gran
programador sin necesidad de utilizarlas. Use preferentemente If End If y Select Case.

Otra sentencia condicional: IIF


Devuelve uno de entre dos valores, dependiendo de la evaluacin de una expresin.
Sintaxis

Iif (Expresin, SiEsCierto, SiEsFalso)

Expresin es la expresin a evaluar.


LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 14

SiEsCierto
SiEsFalso

Valor o expresin devuelta si Expresin es True.


Valor o expresin devuelta si Expresin es False.

Observaciones
IIf siempre evala SiEsCierto y SiEsFalso, aunque slo vaya a devolver una de ellas. Por esta razn,
deber vigilar que no se produzcan efectos no deseados. Por ejemplo, si al evaluar SiEsFalso se
produce un error de divisin entre cero, se generar un error aunque Expresin d como resultado True.
Como ejemplo, en el formulario de nuestro primer programa introduzca un nuevo botn de comando.
Introduzca tambin un TextBox. Vea que poco a poco vamos metiendo cosas aunque no las conocemos
todava. Mas tarde las conocer. El TextBox tendr por nombre Text1. Haga doble click sobre el botn
de comando e introduzca el siguiente cdigo :
Private Sub Command2_Click()
Dim MiVariable As String
MiVariable = IIf(Clng(Text1.Text) > 100, "Es mayor", "Es menor")
Label1 = MiVariable
End Sub
Al ejecutar el programa, debe introducir un valor numrico en Text1. Si ese valor numrico es menor que
100, MiVariable tomar el valor Es menor (No se cumple la condicin expresada en el primer
parmetro Text1.Text > 1000). Si introduce una cantidad mayor, se cumple esa condicin, por lo que
MiVariable tomar el valor Es mayor. El valor que toma la variable puede verlo en Label1.
Fjese que hemos declarado MiVariable como String, ya que va a contener un dato tipo cadena de
caracteres.
Con estas sentencias condicionales es posible realizar bifurcaciones del programa, cambiar las
propiedades de un objeto, obtener resultados de operaciones, ....
Sentencias de bucle.
Es muy comn utilizar bucles a lo largo de un programa. Un bucle es una sucesin repetitiva de
instrucciones, que se estarn realizando mientras se cumpla una condicin o mientras no se cumpla otra
condicin. Es tan sencillo como esto:
Mientras condicin
Instrucciones
Fin del bucle
Existen dos formas de bucle: Una, que realiza un nmero determinado de recorridos por el bucle. Es el
denominado bucle por contador. Otra, realiza el bucle hasta que se cumpla (o deje de cumplirse) una
condicin. Es el llamado bucle por condicin.
Bucle por contador
Realiza el bucle tantas veces como le indiquemos. Por ejemplo, en este bucle nos va a presentar
las 26 letras maysculas del alfabeto ingls
For N=65 To 90
Label1.caption = Chr ( N )
Next N
Este "programa" nos presentar en una caja (Label) los caracteres cuyo nmero ASCII vaya desde el 65
(A) al 90 (Z)
Comenzar presentando el correspondiente al nmero 65, e ir presentando
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 15

sucesivamente el 66, el 67, etc., hasta llegar al 90, donde se parar.


Bucles por condicin
Ejecuta las instrucciones del bucle mientras se cumple una condicin
X=0
Do While X < 1000
X=X+1
Loop
El programa toma una variable ( X ) que previamente tuvimos la curiosidad de ponerla a cero, e
incrementa su valor una unidad. Analiza si el valor de X es menor que 1000, y si es cierto, vuelve a
realizar el bucle. As hasta que X ya no sea menor que 1000. Al dejar de cumplirse que X sea menor que
1000, sale del bucle. Acabamos de realizar un temporizador, y tambin de exponer las sentencias
condicionales y los bucles, inicio de cualquier curso de Basic. Como final de leccin, se propone un
problema. Con el primer bucle, donde visualizbamos los caracteres A a la Z, posiblemente no nos
diese tiempo de ver cada una de las letras que iban apareciendo en la pantalla, en la etiqueta Label1,
dado que cambiara con mucha velocidad, y solamente veramos la Z, que es donde se detuvo el
programa. Podemos poner un temporizador cada vez que presente una letra, y as nos dar tiempo a
verla. Con los dos bucles vistos anteriormente ya podemos hacerlo.
Si lo que queremos es que el programa se ejecute mientras no se cumpla una determinada condicin, la
sentencia ser:
X=0
Do Until X > 1000
X=X+1
Loop
Observe que la diferencia entre una y otra es la condicin, While para indicar Mientras se cumpla que
... y Until para indicar Mientras no se cumpla que ....
Para terminar bien el programa anterior utilizaremos la condicin de While (Mientras se cumpla la
condicin)
For N=65 To 90
Label1.caption = Chr ( N )
Label1.RefreshN
X=0
Do While X < 1000
X=X+1
Loop
Next N

' Refresca la etiqueta

Este es nuestro primer programa en BASIC. En VISUAL BASIC es idntico, pero nos falta la interface
grfica. Para realizarla basta con abrir el VB y sobre el formulario que aparece al abrirlo, introducir una
etiqueta, (Label) que llevar el nombre por defecto de Label1. Solo nos queda pensar donde
introducimos el cdigo anterior. Podemos introducir un botn de comando (Command Button) que
saldr con el nombre por defecto de Command1. Haga doble click sobre el botn. Aparecer el
procedimiento Click. Este procedimiento es el que se realiza cuando hacemos click sobre ese botn.
Escriba en ese procedimiento este cdigo.
Private Sub Command1_Click() ' Esta lnea sale automticamente
For N=65 To 90
Label1.caption = Chr ( N )
Label1.RefreshN
' Refresca la etiqueta
X=0
Do While X < 1000
' Bucle de temporizacin (*)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 16

X=X+1
Loop
Next N
End Sub

' Termina el bucle de temporizacin


' Esta lnea sale automticamente

Hemos puesto nuestra primera piedra en Visual Basic. Este ejemplo es muy sencillo. Visual Basic es tan
sencillo como este ejemplo.
(*)
Las temporizaciones no se hacen realmente as. El ejemplo anterior no deja de ser una forma
sencilla de detener el programa, para que en los comienzos de su carrera como programador pueda ver
el contenido de una etiqueta. Si lo hiciera de esta forma, su ordenador estara detenido realizando una
funcin bastante triste, contar hasta 1000 para luego continuar el programa. Y lo que es peor, en un
ordenador a 300 MHz. Tardara menos tiempo que en uno a 66. Esta misma funcin puede hacerla con
Sleep que la ver mas adelante, que es la forma limpia y elegante de hacer una temporizacin

Formas de salir de un bucle


Para salir de un bucle, podemos esperar a que se complete, bien porque se ha cumplido la condicin
(Bucles por condicin) o a que se haya llegado al final de la cuenta (Bucles por contador). Pero puede
ocurrir que interese salir del bucle sin haber terminado la ejecucin total del mismo, por ejemplo, porque
ya hemos encontrado lo que estabamos buscando, y sera una prdida de tiempo seguir ejecutando el
bucle cuando ya hemos obtenido lo que buscamos. Para ello, basta con ejecutar la sentencia Exit Do
(Cuando hemos comenzado el bucle con Do Until o Do While, o con Exit For cuando lo hemos
comenzado con For ... To
Ejemplos
En el siguiente ejemplo pretendemos parar el programa cierto tiempo, a la espera que otro equipo se
conecte a travs del puerto serie. (Cuando se conecte, el control MSComm1 detectar la seal DSR que
le enva el otro equipo y deberemos salir inmediatamente del bucle para, por ejemplo, atender a ese
puerto serie)
Contador = 0
Do While Contador < 1000
Contador = Contador + 1
DoEvents
If MSComm1.DSRHolding = True Then Exit Do
Sleep (1000)
Loop
Aqu comenzamos a atender al puerto serie
En el siguiente ejemplo, deseamos transmitir por el puerto serie una serie de nmeros, del 1 al 1000,
pero siempre y cuando que el equipo que est al otro lado de la lnea serie est a la escucha (Condicin
MSComm1.DSRHolding = True) Si se desconecta ese equipo, y la condicin pasa de True a False,
deseamos salir del bucle:
For I = 1 To 1000
If MSComm1.DSRHolding = False Then Exit Do
MSComm1.Output = Str(I)
Next I
No se preocupe que no entienda esto del MSComm. Lo entender perfectamente unos captulos mas
adelante. Lo importante es que entienda la idea de salir de un bucle por la va rpida.
Funcin DoEvents
Si hablameos de bucles, necesariamente debemos hablar de la funcin DoEvents. Y es as por la misma
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 17

razn que cada vez que ponemos un bucle, deberamos poner dentro de ese bucle la palabra mgica
DoEvents.
Imagnese que Visual Basic est ejecutando este cdigo:
Do While Valor < 100
Valor = valor + 1
If Valor = 90 then Valor =1
Loop
Observar que la variable Valor nunca podr llegar a tener el valor 100, puesto que cada vez que llega a
90 le ponemos de nuevo el valor 0. El programa no va a salir nunca del bucle, pero adems no podr
atender a otros eventos que se produzcan en el ordenador (por ejemplo la pulsacin de una tecla) ya que
el microprocesador est atendiendo solamente a ese bucle. Si lo est ejecutando desde el propio
entorno de Visual Basic, deber parar la ejecucin mediante las teclas Ctrl Pausa. No podr pararlo
mediante el botn Terminar de la barra de herramientas de VB. En un programa compilado posiblemente
tenga que reiniciar el equipo mediante Alt Ctrl Sup, llevndose por delante el resto de los programas
que se estn ejecutando en ese momento en su PC.
No es difcil cometer este error involuntariamente. Esto es lo que se llama un bucle infinito. Para que no
suceda, o al menos, que si nuestro programa entra en un bucle infinito se pueda salir de una forma no
tan agresiva, hay que introducir dentro del bucle la instruccin DoEvents. Cuando VB encuentra esta
funcin el control del microprocesador al sistema operativo, y si hay alguna operacin en espera (la
pulsacin de una tecla, por ejemplo) la ejecuta y posteriormente vuelve a ejecutar el bucle. De esta
forma, podemos salvar al menos los datos de las otras aplicaciones que se estn ejecutando al mismo
tiempo.
El bucle tomara esta forma:
Do While Valor < 100
Valor = valor + 1
If Valor = 90 then Valor =1
DoEvents
Loop
Salir de un procedimiento antes de terminar su ejecucin
Y ya que explicamos como se sale de un bucle por la va rpida, veamos como salir de un
procedimiento usando tambin esa va rpida.
Para salir de un procedimiento basta con ejecutar la sentencia Exit Sub. En el ejemplo siguiente,
usamos el botn BotonLeerNombre para introducir el dato Nombre en una base de datos. Pero ese
campo puede tener como mximo, 20 caracteres. Si el usuario ha introducido mas de 20 caracteres,
debemos salir del procedimiento donde se introduce ese dato sin ejecutarlo de forma ntegra:
Private Sub BotonLeerNonbre_Click()
Mivariable = Text1.Text
If Len(Mivariable) > 20 Then
MsgBox "El Campo Nombre debe tener como mximo 20 caracteres"
Text1.Text = ""
Exit Sub
Con esta instruccin saldramos de este procedimiento
Else
'Aqui vendran las lineas de instrucciones donde trataramos
'el contenido de Text1, si tuviese menos de 20 caracteres
End If
End Sub

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 18

NOTA. Los ejemplos anteriores sirven solamente de ilustracin para explicar el cdigo que estamos
estudiando. No pretenda ver una forma mejor de realizar la misma funcin, que seguro que existe.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 19

BASIC DE VISUAL BASIC

(y2)

Funciones de cadena
Se denomina CADENA a una sucesin de caracteres. Una cadena puede tener uno o varios caracteres
alfanumricos. Una cadena es tambin una sucesin de nmeros.
Ejemplo de cadenas:
Curso de Visual Basic
abcdefghijklmnopqrstuvwxyz1234567890
123456789
Hagamos una distincin entre una cadena que contenga nmeros y un nmero. Un nmero tiene un
valor, pero tambin tiene una presentacin escrita. El valor es algo que estar en el ordenador como una
sucesin de bits. Dependiendo de como lo hayamos declarado, tendr mas o menos bits. Pero esa
informacin no es un nmero legible por el usuario. Lo que s es legible por el usuario es la
representacin en numeracin decimal (u octal, o hexadecimal, o incluso en binario) de ese nmero. Esa
representacin del nmero en un determinado sistema de numeracin es una cadena.
As, el nmero nueve, que en la memoria del ordenador ser una sucesin de bits, nos lo podr
presentar como:
9
9
11
1001

En numeracin decimal
En numeracin hexadecimal
En numeracin octal
En numeracin binaria

Esas formas de presentarnos el nmero son CADENAS de caracteres. El valor del nmero dentro del
ordenador es un NUMERO.
Para presentar un nmero en la pantalla, el ordenador debe convertirlo previamente a una cadena.
Cuando introducimos un valor numrico por teclado o pantalla, el ordenador para hacer operaciones con
l, debe transformarlo a un nmero.
Estas consideraciones nos llevan a las dos primeras funciones con cadenas:
Str

(nmero)

Convierte un nmero a una cadena en numeracin


decimal.

Val

(cadena numrica)
Obtiene el valor (el nmero) correspondiente a esa
cadena.

Ejemplos
Variablenumerica = Val (TextBox1.Text)
Este ejemplo convierte la cadena de caracteres (numricos) que hubiese en la caja de texto
TextBox1 en un nmero, y asocia este nmero a la variable Variablenumerica.
Si el contenido de la caja de textos no fuesen caracteres numrico (abcd, por ejemplo),
Variablenumerica tomara el valor 0.

Label1.Caption = Str (Variablenumerica)


Este ejemplo pondra en la etiqueta Label1 los caracteres correspondientes al valor que tuviese la
variable Variablenumerica .
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 20

Nota para recordar: Siempre habr que convertir un nmero a una cadena cuando queramos
presentarlo en la pantalla. Siempre habr que convertir a nmero la cadena de caracteres numricos que
hayamos introducido por teclado o por pantalla, cuando queramos operar con ese nmero. Un Label,
cuando tiene que presentar un nico nmero, no le pedir que se lo convierta a cadena, pues VB hace
automticamente esa conversin. Sin embargo, cuando tiene que presentar un nmero, y adems un
texto en el mismo Label, VB no realizar automticamente ese cambio, por lo que le dar un error. Le
recomiendo que convierta los nmeros a variables de cadena siempre que los quiera presentar en un
Label o TextBox. Cuando tenga mas experiencia en VB ver que esta observacin estar un poco de
ms. Pero de momento, convierta cada dato segn lo vaya a necesitar.
Existe una funcin mas amplia que Str. Se trata de Cstr. Esta funcin no solamente transforma un
nmero a una cadena, como hace Str, sino que convierte cualquier tipo de variable a una variable tipo
String (cadena).
Esta funcin transforma, por ejemplo, una variable tipo Booleana en una variable de cadena, devolviendo
la cadena Verdadero si el valor de la variable booleana es True, y Falso si es False.
Puede tambin transformar a una cadena de caracteres el valor de un CheckBox o de un OptionButton.
En estos casos devuelve 0 y 1 para el CheckBox (Desactivado / Activado) y Verdadero Falso para el
OptionButton (Activado / Desactivado)
label1.Caption = CStr(booleana)

Label1.Caption = Verdadero si booleana es true


Label1.Caption = Falso si booleana es False

Label2 = CStr(Check1.Value)

Label2.Caption = 1
Label2.Caption = 0

Label3 = CStr(Option1.Value)

Label3.Caption = Verdadero si Check1 est activado


Label3.Caption = Falso
si Check1 est desactivado

si Check1 est activado


si Check1 est desactivado

Si se aplica Cstr a una variable tipo Fecha/Hora devuelve la fecha / Hora en formato corto.
Vea mas adelante la coleccin de funciones Cxx
Mas funciones de cadena:
Left (cadena, n)
Extrae los n primeros caracteres de una cadena, comenzando por la izquierda.
Si cadena = Curso de Visual Basic

(Para todos los ejemplos)

Resultado = Left (cadena, 10)

---->

Right (cadena, n)

Resultado = Curso de V

Extrae lo n ltimos caracteres de la cadena

Resultado = Right (cadena, 10)

---->

Resultado = sual Basic

Mid (cadena, m, n)
Extrae n caracteres de la cadena, siendo el primer carcter
extrado el que ocupa el lugar m.
(Vea Instruccin Mid mas abajo)
Resultado = Mid (cadena, 3, 10) ---->

LCase (cadena)

LSB

Visual Basic Gua del Estudiante

Resultado = rso de Vis

Devuelve otra cadena igual, pero con todos los


caracteres en minsculas. (LCase = Lower Case)

Captulo 1

Pgina 21

Resultado = Lcase (cadena)

---->

UCase (cadena)

Devuelve otra cadena igual, pero con todos los


caracteres en maysculas. (UCase = Upper Case)

Resultado = UCase (cadena)

---->

Len (cadena)

Resultado = curso de visual basic

Resultado = CURSO DE VISUAL BASIC

Devuelve la longitud de la cadena

Resultado = Len (cadena)

---->

Resultado = 21

LenB (Cadena)

Devuelve el nmero de Bytes empleados para almacenar la


cadena. Sorprndase, es el doble que Len (Cadena)

String (n, carcter)

Devuelve una cadena de n caracteres como el indicado

Resultado = String (8, "a")

---->

Resultado = aaaaaaaa

Resultado = String (8, Chr(65))

---->

Resultado = AAAAAAAA

Resultado = String (8, 65)

---->

Resultado = AAAAAAAA

Space (n)

Devuelve una cadena formada por n espacios.

Resultado = "A" + Space (6)+ "B"

---->

Resultado = A

LTrim

Elimina los posibles espacios que tenga una cadena por


Su izquierda.

Rtrim

Elimina los posibles espacios que tenga una cadena por


Su derecha.

Trim

Elimina los espacios que tenga una cadena, tanto por su


izquierda como por su derecha. (No elimina los espacios
centrales de la cadena)

Estas tres funciones se emplean para quitar los posibles espacios que pueden resultar de una
entrada de datos. Tienen especial importancia cuando se toman los datos de un archivo o base de datos,
donde fueron introducidos por otro programa.
La funcin Trim hay que usarla cada vez que convertimos un nmero a cadena de caracteres. Cuando
usamos Str(Nmero), la funcin Str introduce un espacio al comienzo de la cadena que, en la mayor
parte de los casos, produce un error cuando lo vamos a comparar, a introducir en una base de datos,
etc.
(Vea Ejercicio Cap11 del disco)
No se pone ningn ejemplo de estas funciones, pues sera difcil verlo impreso.
InStr (cadena, cadena1)
Busca la cadena1 dentro de cadena y devuelve el
nmero de orden dentro de cadena donde se encuentra la primera letra de cadena1
Resultado = InStr (cadena, "sua")

LSB

Visual Basic Gua del Estudiante

Captulo 1

---->

Resultado = 12

Pgina 22

StrConv

Convierte una cadena de caracteres en otra, segn las


instrucciones que le sigan. Puede sustituir a UCase o LCase si la
instruccin es UpperCase o LowerCase respectivamente, o poner la primera
letra de todas las palabras de la cadena en maysculas, si la instruccin es
ProperCase.

Resultado = StrConv (cadena, UpperCase)

----> Resultado = CURSO DE


VISUAL BASIC

Resultado = StrConv (cadena, LowerCase)

----> Resultado = curso de visual


basic

Resultado = StrConv (cadena, ProperCase)

----> Resultado = Curso De Visual


Basic

Instruccin Mid
Mid puede usarse tambin para cambiar el contenido de una cadena. Observe la sutileza entre Mid
como Funcin de cadena y Mid como Instruccin.
La Instruccin Mid reemplaza un nmero especificado de caracteres en una variable de cadena con
caracteres de otra cadena.
Sintaxis

Mid(cadena1, inicio[, longitud]) = cadena2

Mid (cadena, 7,2)=AB

---- > Resultado = Curso AB Visual Basic

Si la cadena que vamos a introducir tuviera ms caracteres, tomar solamente los primeros
Mid (cadena, 7,2)=ABCDE

---- > Resultado = Curso AB Visual Basic

Funciones Asc y Chr


Estas funciones se utilizan para obtener el nmero ASCII de un carcter, y para, sabiendo el nmero
ASCII, hallar el carcter correspondiente.
Funcin Asc
Devuelve el cdigo de carcter correspondiente a la primera letra de una cadena de caracteres.
Sintaxis

MiVariable = Asc (Cadena)

Cadena es cualquier expresin de cadena vlida. Si la cadena no contiene caracteres, ocurrir un error
en tiempo de ejecucin.
Ejemplo :

Label1 = Asc (ABCD)

Label1 presentar 65

Nota Hay otra funcin (AscB) que puede usarse con bytes contenidos en una cadena. En lugar de
devolver el cdigo del carcter para el primer carcter, AscB devuelve el primer byte.

Funcin Chr
Devuelve el carcter asociado con el cdigo de carcter especificado.
Sintaxis

Chr (CdigoCarcter)

El argumento CdigoCarcter es un nmero en el intervalo de 0 a 255, inclusive, que identifica a un


carcter.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 23

Ejemplo

Label1 = Chr (65)

Label1 contendr el carcter A

Como ejemplos de nmeros de caracteres algo especiales se debe sealar el carcter 10 (avance de
lnea) y el carcter 13 (Retroceso de carro). La tecla ENTER produce ambos caracteres cada vez que se
pulsa.
Otros caracteres importantes son, el Backspace (carcter 8), y el espacio (carcter 32)
Nota Se proporciona otra funcin (ChrB) para su uso con datos de byte incluidos en una cadena. En
lugar de devolver un carcter, que puede ser de uno o de dos bytes, ChrB siempre devuelve un solo
byte.
FUNCIONES CON NUMEROS
_________________________
Visual Basic puede operar con nmeros tal como lo hara cualquier persona. Conoce las 4 reglas, y
puede utilizar parntesis de la misma forma que los escribimos sobre el papel.
Los operadores que utiliza para las operaciones bsicas son:
+
*
/
\
Mod
^

Suma
Resta
Multiplicacin
Divisin
Divisin sin decimales
Resto de una divisin
Eleva a un exponente

Ejemplos
Resultado = 12 + 15
Resultado = 15 - 12
Resultado = 15 * 12
Resultado = 15 / 12
Resultado = 15 \ 12
Resultado = 15 Mod 12
Resultado = 12 ^ 2

---->
---->
---->
---->
---->
---->
---->

Resultado = 27
Resultado = 3
Resultado = 180
Resultado = 1.25
Resultado = 1
resultado = 3
Resultado = 144

resultado = ( ( 4 * 3 ) / 2 ) ^ 2

---->

Resultado = 36

Estos operadores se denominan Operadores aritmticos.


Existen otras operaciones que se pueden realizar con nmeros: comparaciones. Los operadores que
realizan comparaciones se denominan Operadores relacionales. El resultado de las operaciones
realizadas con estos operadores solamente admiten dos resultados: True (Cierto) o False (Falso)
Estos operadores son:
=
<>
<
<=
>
>=

Igual que
No igual que
Menor que
Menor o igual que
Mayor que
Igual o mayor que

Estos operadores se suelen utilizar en estructuras de programa donde se tome una decisin.
El operador = puede usarse tambin para comparar cadenas o fechas.
Operadores Lgicos
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 24

Estos operadores podemos usarlos con variables Booleanas, es decir, aquellas que solamente pueden
tomar los valores cero y uno, y con caracteres (un carcter = 1 Byte = 8 bits) realizando la operacin
correspondiente bit a bit con los 8 bits de cada carcter. Pero en este caso, los parmetros deben
introducirse en decimal. Por ejemplo, si quiere realizar la funcin And entre el carcter 15 (00001111) y
el 131 (10000011) , debe ponerlo de la forma Resultado = 15 And 132. El resultado de esta operacin
ser el byte 00000011, pero como Ud. ya se habr dado cuenta, le devolver el valor 3. En el ejercicio
Cap11 puede ver un ejemplo muy explicativo
Operador

Devuelve True si

Devuelve False si

And

A=True y B=True

Cualquier otro caso

Or

A=True o B=True

A=False y B=False

Xor

A=True y B=False
A=False y B=True

A=True y B=True
A=False y B=False

Eqv

A=True y B=True
A=False y B=False

A=True y B=False
A=False y B=True

Imp

A=True y B=True
A=False y B=True
A=False y B=False

A=True y B=False

Not

A=False

A=True

Like

A=True

A=False

Otras Funciones con nmeros


Int , Fix Devuelven la parte entera de un nmero con decimales
Int y Fix eliminan la fraccin de un nmero y devuelven el valor entero resultante. La diferencia entre Int
y Fix es que si el nmero es negativo, Int devuelve el primer entero negativo menor o igual a nmero,
mientras que Fix devuelve el primer entero negativo mayor o igual a nmero. Por ejemplo, Int convierte 8,4 en -9, y Fix convierte -8,4 en -8.
Abs

Devuelve el valor absoluto de un nmero

Sgn

Devuelve el signo de un nmero

Sqr

Devuelve la raz cuadrada de un nmero

Exp

Devuelve el nmero elevado al exponente


indicado

Log

Devuelve el logaritmo natural de ese nmero

Trigonomtricas

LSB

Sin

Devuelve el valor del seno de un ngulo


(Expresado en radianes)

Cos

Devuelve el coseno de un ngulo (En radianes)

Tan

Devuelve la tangente de un ngulo

Atn

Devuelve un arco cuya tangente sea el nmero

Visual Basic Gua del Estudiante

Captulo 1

Pgina 25

(Angulo en radianes)

Funciones para el Cambio de Base de Numeracin


Funcin Hex

Devuelve una cadena, es decir, un string, que representa el valor


hexadecimal de un nmero.

Sintaxis

VariabledeCadena = Hex (nmero)

Si nmero no es un nmero entero, se redondea al nmero entero ms cercano antes de ser evaluado.
Mediante esta funcin se puede convertir un nmero de hasta ocho caracteres hexadecimales.
Se pueden representar nmeros hexadecimales directamente, anteponiendo &H. Por ejemplo, &H10
representa al decimal 16 en la notacin hexadecimal.
Funcin Oct

Sintaxis

Devuelve la cadena (String) que representa el valor octal de un


nmero.
VariabledeCadena = Oct (nmero)

Si nmero no es entero, se redondea al nmero entero ms cercano antes de ser evaluado.


Puede realizarse la conversin hasta el valor de 11 caracteres octales.
Se pueden representar nmeros octales directamente, anteponiendo &O a nmeros en el intervalo
apropiado. Por ejemplo, &O10 representa a 8 en base diez en la notacin octal.
Recuerde que estas dos funciones devuelven una Cadena de caracteres, no un nmero. El
resultado deber tratarlo como una cadena de caracteres.

Funciones Cxxx para conversin del tipo de datos.


Son un tipo de funciones que convierten un dato o expresin a un tipo de datos determinado
Funcin Cbool Convierte una expresin al tipo de datos Boolean.
Sintaxis

VariableBooleana = Cbool (expresin)

El argumento expresin es cualquier expresin numrica o expresin de cadena vlida.


Si expresin es cero, se devuelve False; de lo contrario, se devuelve True Si la expresin no se puede
interpretar como un valor numrico, ocurrir un error de tiempo de ejecucin.
Funcin CByte Convierte una expresin al tipo de datos Byte.
Funcin CCur Convierte una expresin al tipo de datos Currency. (Moneda)
Funcin CLng Convierte un dato a un tipo Long.
CLng se diferencia de las funciones Fix e Int en que trunca, en vez de redondear, la parte fraccionaria
de un nmero. Cuando la parte fraccionaria es exactamente 0,5, la funcin CLng siempre la redondea al
nmero par ms cercano. Por ejemplo, 0,5 se redondea a 0 y 1,5 a 2.
Funcin CInt
LSB

Convierte un dato a un tipo Integer.

Visual Basic Gua del Estudiante

Captulo 1

Pgina 26

CInt se diferencia de las funciones Fix y Int en que trunca, en vez de redondear, la parte fraccionaria de
un nmero. Cuando la parte fraccionaria es exactamente 0,5, la funcin CInt siempre la redondea al
nmero par ms cercano. Por ejemplo, 0,5 se redondea a 0 y 1,5 a 2.
Funcin CDbl Convierte una expresin al tipo de datos Double.
Funcin CSng Convierte una expresin a un tipo de datos Single.
Debe usar las funcin CByte, CCur, CLng, CInt en lugar de Val para proporcionar conversiones que
reconozcan las variantes internacionales, cuando se convierte de cualquier otro tipo de datos. Por
ejemplo, los diferentes separadores decimales se reconocen adecuadamente, dependiendo de la
configuracin de la informacin local de su PC.
Si la expresin a convertir queda fuera del intervalo aceptable para el tipo de datos a obtener, ocurrir un
error.
Funcin CStr Convierte una expresin a un tipo de datos String.
Debe usar la funcin CStr en lugar de Str para proporcionar conversiones que reconozcan las variantes
internacionales, cuando se convierte de cualquier otro tipo de datos a String. Por ejemplo, los diferentes
separadores decimales se reconocen adecuadamente, dependiendo de la configuracin de la
informacin local de su sistema.
Dependiendo del tipo de dato que se va a convertir, CStr devuelve:
Boolean
Date
Null
Empty
Error
Numrico

String conteniendo True o False.


String conteniendo una fecha en el formato de fecha corta de su sistema.
Un error de tiempo de ejecucin.
String de longitud cero ("").
String conteniendo la palabra Error seguida del nmero de error.
String conteniendo el nmero.

Funcin Cvar Convierte una expresin a un tipo de datos Variant.


Funcin Cdate Convierte una expresin al tipo de datos Date. (Fecha / Hora)
Nota curiosa y a tener muy en cuenta
En algunas ocasiones (no siempre, misterios del VB) cuando hacemos una operacin entre nmeros,
cuyas variables que los contienen se han declarado de distinto tipo, puede ocurrir que d un error. Por
ejemplo, queremos obtener una suma que debe ser un Long, a partir de varios nmeros tipo Byte.
Declaramos las variables de la siguiente forma:
Dim Suma as Long, I1 As Byte, I2 As Byte, I3 As Byte, I3 As Byte, I5 As Byte
Suma = I1 + I2 + I3 + I4 + i5
El resultado de esta operacin es que da un error, pues no entiende que sumando varios Byte (nmeros
comprendidos entre 0 y 255) puedan dar un nmero de otro tipo. Dar seguramente el error 6, Overflow.
Para que esto no suceda, haremos el truco de convertir el primero de los nmeros que forman parte en
la operacin matemtica a un Long, y de esta forma, VB ya se da cuenta que el resultado de esa
operacin es un Long:
Suma = CLng(I1) + I2 + I3 + I4 + I5
Tenga en cuenta esa observacin inicial que NO ocurre en todas las ocasiones. (Y me parece que era
un fallo de los muchos que tena VB5)
Otras Funciones
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 27

Una funcin curiosa


Timer

Tiempo acumulado
Devuelve el tiempo (en segundos) que ha
pasado desde las 12 de la noche.

Generacin de nmeros aleatorios


Randomize (Numero) Inicia el generador aleatorio tomando como dato de partida
el Numero. Devuelve el resultado en una variable llamada Rnd.
NOTA MUY IMPORTANTE para versiones de VB anteriores a la 6.- Los nmeros aleatorios
generados de esta forma son siempre iguales, eso s, dependiendo del nmero que se le introduzca
como parmetro. Esta generacin de nmeros no produce nmeros aleatorios pues como se dijo,
dependen del numero que se meta como parmetro, y si este se repite, se repite la sucesin de nmeros
que nos crea el generador aleatorio. (Afortunadamente lo han corregido en la versin 6)
La forma de obtener nmeros realmente aleatorios es introducir como parmetro un nmero que sea
variable con el tiempo. Ese nmero no puede ser otro que el nmero timer visto antes. Y siempre con la
precaucin de que medie mas de un segundo entre dos instrucciones Randomize. La funcin toma
entonces la forma:
Randomize Timer
La funcin Randomize devuelve una variable Rnd con un nmero comprendido entre 0 y 1
(Nunca ser 0 ni 1) Leyendo el valor de la variable sucesivas veces, se puede obtener una sucesin de
nmeros aleatorios. No es necesario ejecutar la instruccin Randomize Timer cada vez que se quiera
obtener un dato de la variable Rnd.
Un ejemplo. Generador de nmeros para la Lotera Primitiva
Supongamos que tenemos un formulario con una etiqueta de nombre Label1, un botn de comando de
nombre Command1. Cuando hagamos click sobre el botn de comando deber generar un nmero
comprendido entre el 1 y el 49. En el procedimiento click de Command1 pondremos el siguiente cdigo:
Private Sub Command1.click
Randomize Timer
A = Rnd * 100
A = CInt(A)
Do While A > 49
A = A - 49
Loop
Do While A < 1
A = A + 49
Loop
Label1.caption = A
End Sub
Realice este pequeo programa, con la instruccin Randomize Timer y sin ella.

Funciones con fechas.


Las fechas son cadenas especiales. Visual Basic sabe obtener y tratar la informacin relativa a la fecha y
la hora. Dispone para ello de una declaracin de variable: Date. Una variable declarada como date
puede contener una fecha, una fecha y una hora o una hora solamente.
Date
LSB

Devuelve la fecha de hoy. Esta fecha la toma del reloj del ordenador.

Visual Basic Gua del Estudiante

Captulo 1

Pgina 28

Time

Devuelve la hora actual.

Now

Devuelve la fecha y hora actual.

WeekDay

Devuelve el da de la semana (En nmero, 1=Domingo, 2=Lunes,...)

Day

Obtiene el da, a partir de una fecha

Month

Obtiene el mes a partir de una fecha.

Year

Obtiene el ao a partir de una fecha.

Hour

Obtiene la hora a partir de una hora

Minute

Obtiene el minuto a partir de una hora.

Second

Obtiene el segundo a partir de una hora.

DateAdd

Aade un intervalo de tiempo a una fecha

DateDiff

Obtiene el intervalo de tiempo entre dos fechas

DatePart

Devuelve una parte de una fecha (semana, trimestre, etc.)

DateSerial

Compone una fecha a partir de parmetros relativos

TimeSerial

Compone una hora a partir de parmetros relativos.

DateValue

Devuelve una fecha a partir de un dato que se le parezca y VB


pueda obtener de l una fecha vlida

Mediante estas instrucciones podemos obtener el dato necesario de una fecha u hora. Por ejemplo, para
obtener el da de hoy solamente:
Da = Day (Now)

Da ser un nmero

El da de la semana lo obtendramos
Diasemana = WeekDay (Now)

Diasemana ser un nmero

DateValue, una instruccin que le sacar mucho provecho


Fecha = DateValue (12-07-96)
Fecha = DateValue (12 07 96)

Fecha =12/07/96

La funcin DatePart merece estudio aparte. Con esta funcin podemos averiguar el mes, trimestre,
semana, da del ao, etc.
La sintaxis de esta funcin es :
VariableNumrica = DatePart (Intervalo, fecha[, primerdasemana[, primerasemanaao]])
Valor para Intervalo
q
m
y
d
w
LSB

Obtendremos el
Trimestre
Mes
Da del ao
Da
Da de la semana

Visual Basic Gua del Estudiante

Captulo 1

Pgina 29

ww
h
n
s

Semana
Hora
Minuto
Segundo

El parmetro Primerdasemana puede ser un nmero o una constante (veremos a lo largo de todo el
curso, que VB usa constantes que son palabras reservadas por VB que generalmente comienzan por
vb) que indica que da es para nosotros el primero de la semana
Constante
vbSunday
vbMonday
vbTuesday
vbWednesday
vbThursday
vbFriday
vbSaturday

Nmero
1
2
3
4
5
6
7

Primer da de la semana
Domingo (predeterminado)
Lunes
Martes
Mircoles
Jueves
Viernes
Sbado

Para el parmetro primerasemanaao podemos emplear uno de los siguientes nmeros o constantes:
Constante

Valor

Descripcin

vbFirstJan1

vbFirstFourDays

vbFirstFullWeek

Empieza con la semana en la que se encuentra el 1 de enero


(predeterminado).
Empieza con la primera semana que tenga al menos cuatro
das en el ao nuevo. (Standard ISO 8086)
Empieza con la primera semana contenida completamente en
el ao nuevo.

Por ejemplo, y tomando como referencia para todos los ejemplos el da 22 de Septiembre de 1998, fecha
en la que se ha escrito este texto, (Now = 22/09/1998), tenemos :
Variable = DatePart (m, Now)
variable = DatePart ("q", Now)
variable = DatePart ("d", Now)
variable = DatePart ("y", Now)
variable = DatePart ("w", Now)

Variable = 10
Variable = 3
Variable = 22
Variable = 265
Variable = 3 (Martes, pues el primer da de la semana
era el domingo - Predeterminado)
variable = DatePart ("w", Now, vbMonday)
Variable = 2 (Primer da semana = lunes)
variable = DatePart ("ww", Now, vbMonday, vbFirstFourDays)
Variable = 39, que indica el nmero de la semana dentro del ao.
Cuidado con como se escriben las fechas. Una posibilidad es la usada en los ejemplos, pero solamente
vale para el da de hoy. Puede expresar la fecha metindola entre dos signos #, pero en ese caso debe
estar expresada en el formato mm/dd/yy (mes/da/ao). Ejemplo :
variable = DatePart("ww", #9/22/98#, vbMonday, vbFirstFourDays)
Pero lo mas fcil para el formato de fecha usado en Espaa es meter la fecha entre comillas dobles, y
usar el formato especificado para el pas :
variable = DatePart("ww", "22/9/98", vbMonday, vbFirstFourDays)
Con las comillas dobles puede incluso no poner el ao. En este caso le pone por defecto, el ao en
curso.
variable = DatePart("ww", "22/9", vbMonday, vbFirstFourDays)
Estas tres formas de expresar la fecha funcionan perfectamente, al igual que cuando lo hacamos con
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 30

Now, y el resultado sigue siendo 39.

Nota para recordar de las variables tipo Date


(No se extrae que esta explicacin la encuentre solamente en esta Gua del Estudiante)
Visual Basic trata las fechas como nmeros. Y precisamente como un nmero Double. Emplea por lo
tanto 8 bytes para representar una fecha. Por ejemplo, al da 12 de Julio de 1999, (Fecha en la que el
autor de este libro alcanz la respetable edad de #9 aos) le corresponde el valor de 36563. Ese es el
nmero de das transcurridos desde el origen de tiempos tomado por VB (Y por muchas otras
aplicaciones de Microsoft y de otras marcas) hasta ese fatdico da. Cual es ese origen del tiempo? El
30 diciembre 1899. Que porqu ese da?. No lo s. Pero es fcil intuir que motivos prcticos para que
cualquier fecha del siglo XX tuviese un nmero positivo. Porque las anteriores a ese da las trata como
nmeros negativos. Por ejemplo, el da 12 de Octubre de 1492, VB lo trata como el da nmero 148.732. Ese numero puede conocerlo utilizando la funcin CDbl sobre una variable tipo Date. Puede
verlo en el ejercicio Cap12 del disco.
Una hora tambin es una variable tipo Date. Y una composicin Da / Hora tambin. Que como trata
los minutos dentro de una variable Date? Pues como decimales de ese nmero Double. Por ejemplo, la
hora 12:00:00 del da 12 de julio de 1999 es para VB
36.563,5
Es decir, la parte decimal representa la fraccin de da transcurrido desde el comienzo del da
(medianoche) hasta la hora en cuestin. No debemos confundir esta fraccin del da (0,5 para las
12:00:00) con el valor de la funcin Timer para ese instante (45.000)) que representa el nmero de
segundos transcurridos desde la 12 de la noche de ese da.
Cuando se tratan variables tipo Date, VB que es un lenguaje inteligente, interpreta como tipo de datos
Date determinados datos que no lo son. Por ejemplo, 12 Julio 1999 es tal y como puede verse, una
sucesin de caracteres. Si ejecutamos el cdigo:
Dim Pepe as Date
Pepe = 12 Julio 1999
A partir de ahora, Pepe contendr el valor 36.563
Para ver ese valor basta con hacer
Label1.Caption = CDbl (Pepe)
Al estar Pepe declarada como variable tipo Date, VB busca todas las posibilidades de extraer una fecha
(o una hora) del dato que le estamos metiendo. Otra cosa ocurrira si la declarsemos como String o
Variant. En cualquiera de estos casos, Pepe contendra el literal introducido, es decir, 12 Julio 1999
De lo anterior se desprende una cosa, dado que la fecha la guarda como un nmero, no importa en que
formato le introduzcamos una fecha. Si ponemos que Fecha1 = 12/7/99 es idntico a poner fecha1 =
12/07/1999 Fecha1 = 1999-07-12. Eso s, debe reconocer el formato, y luego, el dato, lo tratar como
un nmero Double. Lo volveremos a ver cuando estudiemos las bases de datos. Access trata las fechas
de idntica forma.

Funcin FORMAT
Esta funcin permite presentar cadenas numricas o fechas de una determinada forma. Permite
establecer el Formato de esa cadena.
Si recurre a la ayuda de VB acerca de esta funcin se va a enterar muy poco de lo que puede dar de s.
La sintaxis que presenta es :
Format(expresin[, formato[, primerdadesemana[, primerasemanadelao]]])
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 31

Lo mejor que puede hacer con esta definicin de la sintaxis de Format es olvidarla. No le aclara mucho lo
que se puede hacer con Format. La funcin Format se usa para poner una fecha en un determinado
formato. Con la expresin :
FechadeHoy = Format (Now, yyyy-mm-dd)
la variable FechadeHoy tendr el valor 1998-05-21, que se refiere al da 21 de mayo de 1998, segn el
formato recomendado por la norma ISO-8601 para la presentacin de fechas. Si hubisemos puesto la
expresin FechadeHoy = Format (Now, dd/mm/yy) , la variable FechadeHoy contendra el valor
21/05/98 referido al da citado.
Las posibilidades de Format llegan tambin al campo de las cadenas numricas. Por ejemplo la cifra
123456 se transformar en las siguientes expresiones, segn como empleemos la funcin Format
Variable = Format(123456, "Currency")
Variable = Format(123456, "Standard")

Variable = 123.456 Pts


Variable = 123.456,00

Veamos ahora con un poco mas de conocimiento la sintaxis de Format


Variable = Format (expresin[, formato[, firstdayofweek[, firstweekofyear]]])
No se complique la vida con el tema del primer da de la semana ni la primera semana del ao. No lo
usar con frecuencia. Centrmonos mas en el parmetro Formato. Puede tomar muchos valores.
Veamos los principales. Primero para nmeros
Observe que usamos la expresin Variable = Format (1234567,Formato) para todos los ejemplos de
nmeros.
Para poner los nmeros separados por millares :
Variable = Format(1234567, "##,###,###")

Variable = 1.234.567

(Cada carcter # indica que ah va un nmero. El separador debe ser una coma, no un punto, aunque
esto depende del idioma que est usando)
Puede poner una de estas expresiones, eso si, siempre entre comillas dobles :
General Number
Currency
Fixed
Standard
Percent
Scientific
.

Muestra el nmero tal como lo tecle


En formato de la moneda de su sistema operativo
Sin separador de millar y dos decimales (1234567,00)
Con separador de millares y dos decimales (1.234.567,00)
Multiplica el nmero por cien y lo presenta cono
porcentaje(123456700,00%)
Usa notacin cientfica (1,23E+06)

Para fechas
(Observe que usamos el ejemplo Format(Now, Formato) siendo Now la fecha y hora
actual (21/07/98 a las 22:16:00 )
General Date
Long Date
Medium Date
Short Date
yyyy-mm-dd
yy-mm-dd
Long Time
Medium Time
Short Time
LSB

21/07/98 22:16:00
martes 21 de julio de 1998
21-jul-98
21/07/98
1998-05-21
98-07-21
22:19:53
10:20 PM
22:20

Visual Basic Gua del Estudiante

Captulo 1

Pgina 32

hh :mm :ss
hh :mm

22 :21 :29
22 :21

RECOMENDACIN ISO 8601


Va como cultura general. Esta recomendacin dice que el formato de fecha debe ponerse de la forma
yyyy-mm-dd (p.e. 1998-10-05 para referirse al 5 de Octubre de 1998). Para este formato, pondremos :
FechaISO8601 = Format (Now, yyyy-mm-dd)
Tenga presente esta recomendacin. La Administracin Espaola est obligada a exigir su cumplimiento
en todas aquellas aplicaciones que realicen intercambios de fecha y hora.
Format dispone de mas opciones. Sera muy largo explicarlas aqu. Para mas informacin, en la WEB
de Microsoft (www.microsoft.com) puede encontrar mas formatos posibles.
Pero vamos a volver con el tema de las variables tipo Date.
Cuando realizamos el Format sobre una fecha, esta fecha puede ser un literal (un string), o una variable
tipo fecha
Si en Text1 tenemos la expresin 12 Julio 1999, y queremos convertir esa fecha al formato ISO 8601,
podemos hacerlo de cualquiera de estas dos formas:

Private Sub LFormat1_Click()


Dim Pepe As Date
Pepe = Text1.Text
LFormat1 = Format(Pepe, "yyyy-mm-dd")
End Sub

Private Sub LFormato2_Click()


LFormato2 = Format(Text1.Text, "yyyy-mm-dd")
End Sub
La funcin Format es suficientemente inteligente para darse cuenta que con el formato yyyy-mm-dd le
estamos pidiendo una fecha. Si le metemos una fecha no hay problema (caso de meterle Pepe, variable
declarada como Date). Pero si le metemos una cadena de caracteres (caso de Text1.Text) intenta
obtener de esa cadena una fecha vlida. Si lo consigue lo presenta. Si no lo consigue, dar un error.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 33

MATRICES
__________
Cuando utilizamos varias variables que tienen un significado similar para nosotros, pero que son distintas
(Por ejemplo, el nombre de los alumnos de una clase) podemos utilizar una matriz. Esta matriz est
formada por tantos elementos como alumnos tenga la clase. El nombre asociado a cada uno de los
elementos de la matriz puede ser:
Alumno (n)

Donde n es el nmero por orden de lista de ese alumno.

Las matrices normalmente comienzan a numerar por el nmero 0. Este comienzo puede no ser el mas
apropiado para la variable que estamos planteando, pues ningn alumno tiene el nmero de orden 0.
Para hacer que una matriz comience a numerar por el 1 se debe definir mediante la instruccin:
Option Base 1
que debe colocarse al comienzo del mdulo o formulario donde declaremos la matriz.
Para declarar la matriz se hace como con todas las variables, especificando entre parntesis el nmero
de elementos que componen la matriz:
Dim Alumno (25) as String
Hemos declarado que la variable alumno es una cadena, y que hay 25 elementos en esa matriz.
Una matriz tambin se puede declarar de la siguiente forma :
Dim Alumno(1 To 25) as String
Donde le decimos que la variable Alumno tiene 25 elementos, que el primero tiene el ndice 1 y el ltimo
tiene el ndice 25.
Pero imaginemos que queremos meter en la misma matriz el nombre, primer apellido y segundo apellido
del alumno. Necesitaremos declarar una matriz de 25 por 3. Como todos los elementos sern cadenas
de caracteres, podemos declararla de la siguiente forma:
Dim Alumno (1 To 25, 1 To 3) As String
De esta forma, el primer apellido del alumno que ocupa el puesto nmero 15 de la clase, ser el
elemento:
Alumno (15, 2)
Podemos definir matrices de dimensin superior a dos. Podemos llegar a un mximo de 60 dimensiones.
Una matriz de 5 dimensiones se declarara:
Dim Variable ( 1 To N, 1 To M, 1 To P, 1 To Q, 1 To R)
entendiendo que hay N, M, P, Q y R elementos en cada una de las dimensiones respectivamente.
Una variable ya declarada como una matriz puede redimensionarse a lo largo del programa mediante la
instruccin ReDim
ReDim Alumno (1To 25)
Mediante esta instruccin, estamos ReDimensionando una matriz ya declarada. No se puede
redimensionar una matriz inexistente.
Mediante la declaracin 1 To 25 le estamos diciendo que el primer elemento de la matriz es el 1,
independientemente de lo que hayamos puesto en OPTION BASE. Si se redimensiona simplemente
con el nmero de elementos :
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 34

ReDim (25)
le estamos diciendo que tiene 25 elementos, pero que el primero sea el 0 el 1 depende de haber
puesto OPTION BASE 0 u OPTION BASE 1.
Una matriz puede redimensionarse cuantas veces se quiera a lo largo de la aplicacin, pero esa
redimensin no puede afectar al nmero de dimensiones de la matriz. Si redimensionamos la matriz
perder la informacin existente. Para evitar perder la informacin presente en la matriz, debe utilizar
la sentencia ReDim Preserve.
Si usa la palabra clave Preserve en matrices de dimensin superior a 1, va a encontrarse con
comportamientos no esperados. Como podr ver en la Ayuda de VB, usando ReDim Preserve slo
puede cambiar el tamao de la ltima dimensin de matriz y no puede modificar en ningn momento el
nmero de dimensiones. NO es cierto del todo. S lo podr hacer una sola vez.
Respecto a cambiar el nmero de dimensiones, si ha declarado la matriz con unas dimensiones
determinadas, ya no podr cambiar las dimensiones ni con ReDim ni con ReDim Preserve. Le saldr un
error que dice que las dimensiones de la matriz ya han sido declaradas.
Pero si ha declarado la matriz sin dimensiones :
Dim MiMatriz()
puede cambiar las dimensiones
y volver a cambiarlas

ReDim MiMatriz (1 To 5, 1 To 9)
ReDim MiMatriz (1 To 8, 1 To 15, 1 To 6)

Observe que no solamente la hemos cambiado dos veces de dimensiones (la primera a 2 y la segunda a
3), sino que tambin hemos cambiado el nmero de elementos en cada dimensin.
Si hubisemos utilizado ReDim Preserve solamente podramos haber usado la primera de las dos lneas
anteriores :
ReDim Preserve MiMatriz (1 To 5, 1 To 9)
pero ya no podramos volver a cambiar el nmero de dimensiones con la segunda lnea. Nos dara un
error.
Con ReDim podemos cambiar el nmero de elementos de cada dimensin cuantas veces queramos.
Por ejemplo, podemos redimensionar MiMatriz de las siguiente forma :
ReDim MiMatriz (1 To 5, 1 To 9)
ReDim MiMatriz (1 To 15, 1 To 20)
ReDim MiMatriz (1 To 25, 1 To 30)
...........................
Si hubisemos empleado ReDim Preserve, podramos cambiar los elementos de todas las dimensiones
de la matriz una vez :
ReDim Preserve (1 To 5, 1 To 9)
a partir de ahora, solamente podemos cambiar los elementos de la ltima dimensin :
ReDim Preserve (1 To 5, 1 To 20)
ReDim Preserve (1 To 5, 1 To 30)
es decir, no podremos hacer esto :
ReDim Preserve (1 To 10, 1 To 30)
LSB

Visual Basic Gua del Estudiante

donde se seala en negrita el error.

Captulo 1

Pgina 35

Esto no causa ningn error en una matriz de una dimensin, ya que si la matriz tiene slo una dimensin,
puede cambiar el tamao de esa dimensin porque es la nica y la ltima.
Cuando a lo largo de la aplicacin se va redimensionando una matriz, podemos llegar la circunstancia de
que, en un momento determinado, no sepamos las dimensiones de esa matriz.
Para conocer el ndice mximo y mnimo de una matriz se usan las funciones UBound y LBound.
UBound devuelve el mayor subndice disponible para la dimensin indicada de una matriz.
Sintaxis

UBound(nombredelamatriz[, dimensin])

LBound devuelve el mayor subndice disponible para la dimensin indicada de una matriz.
Sintaxis

LBound(nombredelamatriz[, dimensin])

Ejemplo Tengamos una matriz llamada Mimatriz, de tres dimensiones. En un momento de la aplicacin
se ejecut la siguiente instruccin vlida :
ReDim Mimatriz (1 To 100, 0 To 3, 5 To 20)
En otro momento queremos tener el control de los ndices de esa matriz, y queremos averiguar el ndice
menor y mayor de cada una de sus dimensiones :
(IID1= Indice Inferior Dimensin 1, ISD 1 = Indice Superior Dimensin 1, etc. )
IID 1= LBound (Mimatriz, 1)
ISD1 = UBound (Mimatriz, 1)
IID 2= LBound (Mimatriz, 2)
ISD2 = UBound (Mimatriz, 2)
IID 1= LBound (Mimatriz, 3)
ISD1 = UBound (Mimatriz, 3)

IID1 = 1
ISD1 = 100
IID1 = 0
ISD1 = 3
IID1 = 5
ISD1 = 20

Funcin Split
Una vez visto lo que es una matriz, vamos a ver una funcin interesante para el tratamiento de cadenas
de caracteres. La funcin Split
Descripcin
Esta funcin toma una cadena de caracteres compuesta varias subcadenas, separadas entre ellas
mediante un separador, y devuelve una matriz de una dimensin, que contiene esas subcadenas.
Sintaxis

Split (expresin[, delimitador[, contar[, comparar]]])

Donde:
Expresion es la variable que contiene la cadena de caracteres de entrada
Delimitador. Contiene el carcter o caracteres que se usan de delimitador entre subcadenas
Contar es un nmero donde indicamos el nmero de subcadenas que queremos extraer. Si no
se pone nada, extrae todas las cadenas. Si se pone un valor, extrae el nmero de cadenas que
le indiquemos. En este caso, en la ltima cadena, mete el resto de subcadenas que quedaban
sin meter.
Comparar es un valor numrico que nos da cuatro opciones de comparacin para comparar las
subcadenas. Este parmetro es solamente para alumnos avanzados
Ejemplo.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 36

En el siguiente ejemplo veremos como separar distintos datos que estn dentro de un TextBox (Text1)
separados entre ellos por una coma.
Private Sub Command1_Click()
Dim MiVariable() As String
Dim I As Integer
MiVariable = Split(Text1.Text, ",")
For I = 0 To UBound(MiVariable)
List1.AddItem MiVariable(I)
Next I
End Sub

LSB

Visual Basic Gua del Estudiante

Declaramos una matriz (MiVariable) del tipo String


Declaramos una variable auxiliar como numrica
Ejecutamos la funcin Split
Ejecutamos un bucle para introducir las subcadenas
en un ListBox

Captulo 1

Pgina 37

VISUAL BASIC
Tras esta pequea introduccin al lenguaje Basic ya estamos en disposicin de encender el ordenador y
comenzar a trabajar con Visual - Basic. Se supone que su PC tiene instalado el programa Visual Basic
6.0
Entre en el programa VB. Le aparecer en pantalla algo similar a esto : (Para VB Vers. 6)

Fig. 1.2 Aspecto del entorno de desarrollo de aplicaciones VB


Este es el comienzo del VB . Observe que en esta pantalla existen varias cosas. En la parte superior , la
barra de ttulo del programa Visual Basic, con el texto :
Proyect1 - Microsoft Visual Basic (Diseo)
Por debajo de esta barra de Ttulo del VB, encontramos la barra de men de VB, con las leyendas :
Archivo Edicin Ver Proyecto Formato Depuracin Ejecutar Consulta Diagrama Herramientas
Complementos Ventana Ayuda
Por debajo de esta barra de men tenemos la barra de herramientas, donde podr ver varios iconos,
que cada uno representa un determinada operacin que Vd. puede realizar. Estas operaciones est
todas en la lnea de men, y puede acceder a ellas abriendo los mens desplegables que existen en
cada una de las palabras Archivo Edicin Ver ...... de esta lnea de men. El hecho de colocar las
operaciones mas usuales en un icono en la barra de herramientas se hace para mayor comodidad del
usuario.
A la izquierda o derecha de la pantalla tiene una caja rectangular con varias columnas de iconos. Esa
caja es la Caja de Herramientas (No la confunda con la barra de herramientas de la parte superior)
Esta caja de herramientas es, salvando las distancias, lo mismo que una caja de herramientas real que
pueda tener un mecnico para realizar su trabajo. En ella estn los iconos que representan a los
controles con los que Vd. va a desarrollar su aplicacin VB. No estn todos los que pueden estar, al igual
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 38

que en una caja de herramientas de un mecnico no estn todas las herramientas que puede usar.
Estn solamente las mas usuales. Si necesita alguna mas, puede cogerla de otra parte (barra de Men,
Proyecto | Componentes) y agregarlos a esa caja de herramientas, al igual que lo hara un mecnico con
una herramienta especial, que la metera en su caja slo cuando va a realizar un trabajo determinado
para el que la necesite.
Posiblemente esta caja de herramientas no le aparezca tal y como la ve en esta figura. Eso depende de
la versin y la personalizacin. Para aadir un nuevo control haga click en Proyecto | Componentes y le
aparecer una caja con todos los controles existentes. Puede seleccionar nuevos controles para aadir a
la caja de herramientas, marcando la casilla que est a la izquierda del nombre del control que quiere
introducir. Una vez seleccionados todos los nuevos controles, haga click en APLICAR . Salga haciendo
Click en ACEPTAR, y podr observar que esos nuevos controles ya se le han aadido a la caja de
herramientas. Esos controles le aparecern cada vez que cargue el proyecto actual. No es prudente
meter muchos controles en la caja. Ponga solamente los que necesite normalmente en sus aplicaciones.
Ocupar menos memoria y tardar menos tiempo en cargar el programa VB. Adems, cuando realice
una aplicacin y la distribuya una vez compilada, Visual Basic entregar en los disquetes de distribucin
las DLLs u OCXs correspondientes a todos los controles personalizados que Vd. tenga en la caja de
herramientas, los necesite el programa o no los necesite. Esto le va a suponer que est cargando
subprogramas intiles en el ordenador destino de su aplicacin. A la hora de compilar el programa
(Crear archivo .EXE) quite todos los controles personalizados que no necesite su aplicacin. (Slo los
controles personalizados. Los controles comunes - CommandButton, Label, TextBox, etc.-, no se pueden
eliminar de la caja de herramientas)
Para quitar controles de su caja de herramientas, debe proceder de forma anloga, a lo que hizo para
meterlos en la caja de herramientas, pero al revs. No se preocupe a la hora de quitarlos. Si est
utilizando un determinado control, VB no le dejar quitarlo.
En el centro, y ocupando casi toda la pantalla, tenemos el Formulario. Este Formulario es la interface
grfica de su aplicacin, sobre el que podr aadir los controles que necesite. Lo veremos mas adelante
con todo detalle.
Puede tener dos ventanas ms adosadas a la caja de herramientas, una denominada Ventana de
Propiedades, donde puede ver las propiedades del formulario o de cualquier control que tenga dentro
del proyecto, y otra, denominada Ventana de Proyecto, donde puede ver todos los formularios
existentes. Existen otras ventanas, por ejemplo la Ventana de Depuracin. Por cada formulario y cada
control que introduzca en el proyecto, le aparecer otra ventana, denominada Ventana de cdigo.
No se extrae de que esta presentacin grfica del Visual Basic coincida con otros sistemas de
desarrollo (Delphi, p.e.). La lgica de desarrollo de una aplicacin en Windows ha llevado a varios
fabricantes de software a utilizar un entorno grfico similar (diramos idntico). A Visual basic le queda el
orgullo de ser el primero en utilizarlo. (Y el mejor!)
Con lo descrito anteriormente ya tenemos, al menos, fijado el argot con el que expresarnos para
comenzar a estudiar el VISUAL BASIC. Veamos con un poco mas detalle la Ventana de Cdigo.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 39

Fig. 1.3 Ventana de cdigo


Esta figura le muestra un Formulario con su ventana de cdigo. Cada objeto grfico de VB tiene su
propia ventana de cdigo. As, si en este formulario hubisemos introducido un Label y dos
CommandButton, todos ellos tendran su propia ventana de cdigo. La ventana de cdigo la podemos
ver haciendo doble click sobre cualquier objeto de nuestro proyecto. En este caso hemos hecho doble
click sobre el nico objeto que tenamos : el formulario.
Observe las dos cajas de la parte superior, uno con la inscripcin Objeto : que en el momento que le
sacamos la foto tena Form, y el otro con la inscripcin Proc : (procedimiento), que en el momento de la
foto tena Load. A estas cajas les denominamos Lista de Objetos y Lista de Procedimientos
respectivamente.
Haciendo click sobre la flecha de cada lista, se despliega un men, en la lista de objetos se desplegar
una lista con los nombres de cada objeto existente en ese momento dentro del formulario. Haciendo click
sobre uno de los nombres, nos presentar la ventana de cdigo de ese objeto. Todos los objetos
grficos (controles) existentes dentro de un formulario y el propio formulario aparecern en la misma lista
de objetos.
Haciendo click sobre la flecha de la lista de procedimientos, se despliega la lista con todos los
procedimientos posibles para ese objeto. Siempre saldr uno. Si tenemos escrito cdigo en uno de los
procedimientos, saldr por defecto ese procedimiento para el cual hemos escrito el cdigo. Si no hay
cdigo en ninguno de los procedimientos, saldr el que tenga por defecto cada objeto.
Solamente nos queda por decir, para cerrar este captulo, que es un procedimiento.
Para ello vamos a explicar lo que es un evento. Un Evento es algo que le puede ocurrir a un objeto. En
una interface grfica, lo que le puede ocurrir a un objeto es que se le haga click, doble click, que se pase
el cursor del ratn por encima, etc. Este es el Evento. El Procedimiento es la respuesta por parte de
ese objeto, al evento que le est sucediendo.
Esa respuesta, esa forma de Proceder del objeto al evento que le est sucediendo, debemos
programarla segn nuestras necesidades, es decir, debemos escribir el cdigo que necesite nuestra
aplicacin como respuesta al evento que acaba de ocurrir. Posiblemente, no queramos ninguna
respuesta a muchos de los eventos que pueden acaecer a un objeto. Cada objeto tiene muchos eventos
y solamente queremos aprovechar los que nos interesan. Para que un evento no produzca ningn
efecto, basta con dejar sin cdigo el procedimiento correspondiente a ese evento. En los eventos que
queramos que realice alguna operacin, le escribiremos en su procedimiento el cdigo necesario para
que esa operacin se realice. Sin darnos cuenta, hemos comenzado a escribir el cdigo de la aplicacin.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 40

Observar que el primer elemento del men desplegable de la lista de objetos se denomina General.
Este no es en realidad ningn objeto, sino un apartado existente en cada formulario, que, al desplegar su
lista de procedimientos tiene la seccin de declaraciones, donde debemos declarar las variables que
queremos que afecten a todo el formulario y sus controles, y tendr adems, los nombres de todos los
procedimientos que introduzcamos (vase un poco mas adelante). En este men desplegable de la
lista de procedimientos del General ver con frecuencia cosas que Vd. no puso all. Cosas tales como
Command1_click, y en la ventana un determinado cdigo. Esto ocurre cuando se borra algn control que
tena escrito cdigo en alguno de sus procedimientos. Visual Basic sabe lo mucho que cuesta escribir el
cdigo asociado a un control. Si borramos un control de nuestro formulario accidentalmente, despus de
haber introducido todo el cdigo asociado a l, Visual Basic nos sorprende con que ese cdigo no lo tira
inmediatamente, sino que lo reserva como un procedimiento en ese apartado General del formulario. Si
en realidad queramos borrar el control y todo su cdigo, debemos quitarlo de ese apartado General de
nuestro formulario, pues en realidad, si no lo queremos, no har otra cosa que estorbar. Para quitarlo
basta con borrar todo el cdigo que aparece en la ventana de cdigo cuando hacemos click sobre el
nombre del control eliminado. Deberemos borrar todo el cdigo, incluida la cabecera donde figura el
nombre del control eliminado, y la parte final, que siempre termina con End Sub.
El primer estorbo lo observar si crea otro control con el mismo nombre, cosa fcil ya que VB da un
nombre por defecto a cada control (Command1, Command2....). El cdigo asociado al control eliminado
pasar automticamente al nuevo control con el mismo nombre.
Una aplicacin puede tener todo su cdigo escrito en los sucesivos procedimientos del formulario y de
los controles que tenga ese formulario.
Puede ocurrir que un determinado evento no est entre los posibles eventos de los controles de nuestra
aplicacin. Piense por ejemplo, el evento de que la variable A sea igual a la variable B. No existe en
ninguno de los controles ese procedimiento. No se preocupe, puede crear un procedimiento que se
ejecute cuando su programa lo decida. Podemos aadir cuantos procedimientos queramos. Estos
procedimientos se aaden al formulario, y debern definirse por un nombre que Vd. debe elegir. Para
que se ejecuten las instrucciones (cdigo) incluido en ese procedimiento, basta simplemente con
nombrarlo por ese nombre.
Para insertar un procedimiento debe ir a la barra de men, hacer click sobre Herramientas, y en el men
que le desplegar, volver a hacer click sobre Agregar Procedimiento. VB le presentar un cuadro donde
le pedir el nombre, si quiere que sea un procedimiento, una funcin o una propiedad. A lo largo del
curso ir viendo que es cada cosa.
Escribiendo el cdigo en los sucesivos procedimientos, bien en los propios de cada objeto, bien en los
procedimientos que vayamos creando, es posible completar la aplicacin. Pero en una aplicacin larga
esta forma de escribir el cdigo no sera la mas adecuada. Es mas, posiblemente sera demasiado
engorroso escribirla de esta forma, y muy probablemente deberamos escribir el mismo cdigo para
varios procedimientos, lo que alargara intilmente el programa y el tiempo de desarrollo.
Para disponer de un sitio donde escribir parte (o la mayor parte) de su programa, puede introducir uno o
varios mdulos. Expliquemos lo que es un mdulo.
Un Mdulo es una parte del programa donde solamente puede escribir cdigo. Es igual que un
formulario, sin interface grfica. Un profesor de Visual Basic lo expresaba diciendo que un Mdulo es un
Formulario sin cara. En un mdulo pueden existir procedimientos al igual que en los formularios, pero
como un mdulo no tiene interface grfica, esos procedimientos debe introducirlos el programador tal y
como explicamos un poco mas atrs. El mdulo tiene su propia ventana de cdigo, al igual que un
formulario, con un objeto nico, el apartado General. Aqu tambin tenemos la seccin de declaraciones,
al igual que los formularios. En esta seccin de declaraciones se comporta de manera similar a la de los
formularios, pero permite algo que no nos permite la seccin de declaraciones de un formulario :
Declarar variables que se pueden utilizar en todo el programa. Esto ya lo ha visto mas atrs, con la
sentencia de declaracin Public.
Los mdulos se emplean para la declaracin de variables globales, y para escribir el cdigo de la
aplicacin que sea comn a varios formularios. Esto nos evita tener que repetir cdigo intilmente. Ese
cdigo comn se escribir en un procedimiento que previamente habremos insertado en este mdulo, y
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 41

lo citaremos por su nombre desde cualquier parte del programa.


Los procedimientos se pueden introducir en los mdulos o en los formularios. Y les pasa lo mismo que a
las variables en cuanto a su mbito. Para agregar un procedimiento debe abrir una ventana de cdigo
(cualquiera) perteneciente al mdulo o formulario donde quiera insertar ese mdulo, y a continuacin
hacer click sobre Herramientas | Agregar Procedimiento de la Barra de Men.

Fig. 1.4

Agregando un procedimiento

Nos aparecer un cuadro donde le debemos poner el nombre de ese procedimiento y elegir el mbito
(Alcance en la figura) que le queremos dar, pblico o privado.

Fig. 1.5 Cuadro para agregar un procedimiento o funcin


Si un procedimiento es pblico, se podr acceder a l desde cualquier parte de la aplicacin. Si es
privado, solamente desde el mdulo o formulario donde se ha introducido.
Cual es el nombre por el que podemos llamar a ese procedimiento? Sigue las mismas normas que
para las variables. Si se ha declarado como pblico en un mdulo, se le citar por su nombre cualquiera
que sea la parte del programa desde donde le citemos.
p.e.

CalculaGastos

Si se ha declarado como publico en un formulario, deberemos llamarle con el nombre del formulario,
seguido del nombre del procedimiento separado por un punto
p.e.

Formulario1.CalculaGastos

Si se ha declarado como privado, se le llamar por el nombre, pero solamente desde el cdigo del
mdulo o formulario donde se insert, puesto que desde otro mdulo o formulario no se ver.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 42

Fjese en el punto usado como separador entre el nombre del formulario y el nombre del procedimiento.
VB usa como separador un punto. Usa el separador para separar el nombre de un control y una de sus
propiedades (Label1.Caption), para separar el nombre del formulario del nombre de uno de sus
controles (Formulario1.label1.caption) Se ir familiarizando con la terminologa VB segn vayamos
avanzando en el curso.
Call
En Visual Basic, para ejecutar un procedimiento no hace falta usar la sentencia Call, muy propia de otros
lenguajes de programacin. Hay programadores que la usan no s si porque creen que es necesario, o
porque piensan que queda ms bonito. No hace falta pero VB lo soporta. Queda a gusto del
programador usarla o no usarla.

Funciones
Al igual que introducimos Procedimientos, podemos introducir Funciones en nuestra aplicacin. Una
Funcin es un Procedimiento al que le pasamos uno o varios parmetros. (O Ninguno) y nos devuelve
un valor. Ver los Procedimientos y funciones mas adelante (Cap. 15). Al igual que los Procedimientos,
pueden ser pblicas (se vern en toda la aplicacin) o privadas (se vern solamente en el formulario o
mdulo donde estn. Se introducen igual que los procedimientos,
Main
Merece la pena pararse un poco para estudiar el Procedimiento Main. Para verlo con mas detalle,
comentaremos como comienza a trabajar una aplicacin realizada en Visual Basic.
Imaginemos una aplicacin que tiene 3 Formularios. En cada uno de ellos tiene cdigo. Lgicamente la
aplicacin tendr que presentar uno de ellos en primer lugar. Deberemos decirle a Visual Basic cual es el
formulario inicial, y ser ese por el que empiece. En ese formulario dispondremos el cdigo necesario
para que la aplicacin se ejecute en el orden deseado.
Si hacemos click en la Barra de Men de Visual Basic, en Proyecto | Propiedades obtendremos el
siguiente cuadro de dilogo :

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 43

Fig. 1.6 Cuadro de propiedades del Proyecto


Ver que tiene 5 pestaas, y actualmente tiene abierta la pestaa correspondiente a General, y tiene
desplegada una lista donde nos pide el Formulario Inicial. En esa lista figura tambin la expresin Sub
Main. Si ponemos como formulario inicial uno de los formularios, la aplicacin comenzar por ese
formulario. Si en uno de los Mdulos existentes en el proyecto, ponemos un procedimiento llamado
Main, podemos comenzar la ejecucin de la aplicacin justamente por ese procedimiento. En ese
procedimiento pondremos el cdigo necesario para que, posteriormente, se muestre uno de los
formularios. Esto es muy practico cuando queremos hacer una funcin previa a mostrar cualquier
formulario (abrir una base de datos, por ejemplo). Para comenzar la aplicacin por Main se elige esa
opcin en la lista Formulario Inicial.
Recuerde que Main debe estar en un Mdulo !
El cuadro de dilogo anterior sirve adems para otras cosas. Entre ellas poner el nombre del proyecto
(nombre que no aparecer por ninguna parte, solo en los datos internos de la aplicacin) y su
descripcin.
Existe otro cuadro parecido en Herramientas | Opciones donde puede terminar de completar las
condiciones de trabajo. Observe el cuadro Cuando Inicie sus programas. Aqu le permite grabar el
programa antes de ejecutar, cosa que le recomiendo para evitar que, al ejecutarlo, por un cdigo mal
puesto se le cuelgue el PC y tenga que volver a empezar. En este cuadro puede elegir tambin el
formato de la ventana de trabajo formato del editor, etc.

Fig. 1.7 Opciones del entorno de diseo

En la pestaa Avanzado puede cambiar el entorno de trabajo. Le recomiendo el SDI.


Si tenemos la activada la casilla Declaracin de variables requerida nos pondr automticamente
Option Explicit en el encabezamiento de todas las secciones de declaraciones de la aplicacin. Est
en la pestaa Editor (Esto es algo que le recomiendo de una forma especialmente rigurosa)
Podemos elegir tambin las ventanas que queremos que estn siempre visibles, y que verifique
automticamente la sintaxis de una instruccin en el momento de escribirla.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 44

La pestaa de Editor nos permite fundamentalmente 2 cosas :


Ver solamente el cdigo correspondiente al procedimiento que estamos escribiendo Ver el cdigo del
Mdulo (o Formulario) completo. En este ltimo caso es un poco mas difcil de manejar la ventana de
cdigo, sobre todo si el programador no est muy habituado a ello. Le presenta procedimiento tras
procedimiento, separados por una lnea. Para seleccionar una u otra opcin hay que seleccionar o
deseleccionar la casilla Ver mdulo completo.
Cambiar el color de la letra y del fondo del cdigo, segn el tipo que sea (cdigo, comentario, error
devuelto, etc.). Los alumnos mas aventajados y con ganas de marear al profesor, conocen la forma de
poner como invisible una parte del texto del cdigo. Si observa comportamientos raros en el texto
donde escribe el cdigo, revise el cuadro de Colores de Cdigo.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 45

Ejercicios del Captulo 1


Nota acerca de los ejercicios de cada captulo.
Estos ejercicios se proponen a efectos acadmicos solamente, para facilitar al alumno la comprensin
de lo explicado y estimular el autoaprendizaje. No son perfectos y seguramente existir una forma mejor
de realizarlos. No se ha pretendido crear programas perfectos, sino que muestren al alumno parte de lo
explicado en el captulo correspondiente.
Se renen en el ejercicio Cap11 tres pequeos programas. Es importante que el alumno comprenda
perfectamente como se ha programado cada una de las lneas. Son tan sencillos estos ejemplos que
dan ganas de saltrselos. Evite esa tentacin y vaya paso a paso camino de la perfeccin en la
programacin VB (Antesala de la gloria) entendiendo y sacando consecuencias de estos pequeos
ejercicios. Habr platos mas fuertes en pocos das.
En la parte de conversin de nmeros a cadenas de caracteres puede ver el comportamiento de la
funcin Str para convertir nmeros a cadenas de caracteres. Puede observar la longitud de la cadena
resultante contiene un carcter mas de los que cabra esperar. En la etiqueta de desglose de caracteres,
puede observar que el primer carcter es el 32 (espacio), carcter que se elimina al hacerle la funcin
Trim
En la seccin de operadores lgicos puede jugar a aplicar uno de los operadores disponibles a una
pareja de nmero o a un par de datos booleanos. Observe que para invertir los bits de un byte basta con
hacer el Xor con 255
La tercera parte se parece mas a un programa real.
Veamos un ejemplo de como se puede utilizar la funcin Xor. Explicaremos lo que es el Cifrado Xor (Se
us profusamente con los mensajes tlex, con un sistema llamado cinta aleatoria. No entra en este
curso explicar lo que era un teletipo. Era, al correo electrnico, lo que la mquina de vapor al AVE )
Este sistema de cifrado puede utilizarlo en sus aplicaciones para, por ejemplo, cifrar el Password de
entrada y poder guardarlo cifrado en el disco duro de su PC. De cualquier forma, debo indicarle que este
sistema de cifrado al tiempo que simple, es tremendamente vulnerable, pero si lo acompaa de otras
caractersticas, lo convierte en un cifrador intrnsecamente seguro (Vigenere). La explicacin mas
detallada de algoritmos cifradores se sale por completo de la intencin de este curso.
Supongamos que queremos cifrar la palabra Secreto que es el Password de entrada para una
aplicacin. Deberemos usar otra palabra que cifrar a la anterior, que llamaremos Clave. La clave debe
tener, al menos, tantos caracteres como la palabra a cifrar. Imaginemos que clave es ABCDEFGHIJK
Para cifrar usamos la funcin Xor de cada una de las letras de Secreto con las correspondientes letras
de la clave. (La primera letra de Secreto con la primera letra de la clave, la segunda con la segunda, etc.)
Pero debemos efectuar la funcin Xor sobre un nmero, no sobre una letra. Por lo tanto convertiremos la
letra en un nmero usando la funcin Asc Asc (A) = 65, ya que 65 es el nmero Ascii que corresponde
a la A
Para realizar el Xor del carcter introducido en la variable a, con el carcter introducido en la variable b
haremos:
Chr(Asc(a) Xor Asc(b))
De esta forma, si a = S y b = A estaremos haciendo
Resultado = 83 Xor 65
En este caso, Resultado = 18. Vamos a ver por qu
Si representamos en binario el nmero 83
LSB

Visual Basic Gua del Estudiante

Captulo 1

83 = 0 1 0 1 0 0 1 1
Pgina 46

El nmero 65 es
Haciendo Xor bit a bit

65 = 0 1 0 0 0 0 0 1
Resultado = 0 0 0 1 0 0 1 0 = 18

Luego el resultado de realizar el Xor entre S y A es el carcter 18, que no tiene representacin como una
letra.
Si ahora hacemos el Xor entre el resultado y la clave (18 con 65)
65 = 0 1 0 0 0 0 0 1
18 = 0 0 0 1 0 0 1 0
Resultado 2= 0 1 0 1 0 0 1 1 = 83 es decir la letra S
Vemos que descifra usando la misma funcin que para cifrar .
Si A Xor B = C

A = B Xor C

B = A Xor C

No vamos a explicar profundamente el ejercicio. El alumno debe intentar comprender cdigos sencillos
como este. Ver en su trabajo profesional que es difcil meterse en la forma de programar de otra
persona. El desentraar el cdigo de estos ejercicios puede ser una buena prctica para ello.

El ejercicio Cap12 es un entrenamiento con fechas y formatos. Se sugiere al alumno que introduzca
nuevos formatos, utilice DateDiff, etc. Tambin tiene una parte dedicada a la conversin de nmeros.
Son ampliables por parte del alumno.

Visual Basic - Gua del Estudiante Cap. 2


OBJETOS VISUAL BASIC

PROPIEDADES, PROCEDIMIENTOS Y METODOS

Vamos a ver en este captulo como podemos realizar una aplicacin en Visual Basic. Comencemos por
abajo.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 47

Una aplicacin VB es una aplicacin que, generalmente, tiene una interface grfica. Es decir, es una
aplicacin de las tpicas de Windows. Y esa interface grfica est formada por un formulario y dentro de
l, controles. Tanto al formulario como a los controles les denominamos genricamente Objetos. Hay
objetos VB que no los podemos ver en la interface grfica. No podemos verlos porque pese a que son
objetos VB, no tienen ninguna representacin en la ventana. Son por ejemplo, los objetos de acceso a
datos que veremos profusamente ms adelante.
Todos los objetos de Visual Basic tienen Propiedades. (Por ejemplo, el nombre de ese objeto es una de
sus propiedades). Los objetos que tienen parte grfica tienen adems Eventos. Y muchos de ellos
tienen tambin Mtodos
Propiedades, Eventos, Procedimientos y Mtodos
Tpica pregunta de examen de VB elemental. Veamos que es cada una de estas cosas.
Las propiedades son aquellas caractersticas de un objeto que lo define "fsicamente", bien por su forma
o color, por su contenido, por la forma en la que va a trabajar Las propiedades pueden modificarse
cuando estamos diseando la interface grfica, mediante lo que llamamos caja de propiedades, o
durante la ejecucin del programa. En este caso hay que hacerlo con cdigo escrito en el propio
programa. Veamos ya dos definiciones que se repetirn profusamente a lo largo del curso
-

Tiempo de diseo. Es cuando realizamos una operacin durante el diseo. Por ejemplo, podemos
cambiar el color de un control durante el diseo de la aplicacin, accediendo a su propiedad
BackColor en la caja de propiedades.
Tiempo de ejecucin. Es cuando esa operacin se realiza durante la ejecucin del programa. Si
tenemos una lnea de cdigo como esta
MiControl.BackColor =RGB(255,0,0)

al ejecutarse esa lnea, se cambiar el color del control de nombre MiControl. Hemos cambiado la
propiedad BackColor de ese control en tiempo de ejecucin.
Las propiedades pueden ser de lectura y escritura, (se puede cambiar y se puede leer el valor de la
propiedad), slo de lectura (solamente se puede leer el valor de la propiedad) solo de escritura (hay
muy pocas de este tipo). Puede que una propiedad, que es de lectura y escritura en tiempo de diseo,
sea slo de lectura en tiempo de ejecucin (esto es lo que le pasa por ejemplo, a la propiedad Name Nombre)
Un evento es todo aquello que le puede ocurrir a un objeto con parte grfica (Control o Formulario) Por
ejemplo, es un evento el hecho de hacer click sobre ese control, el hecho de pasar el ratn por encima
de l, el hecho de que un control cambie de tamao. Los controles tienen muchos eventos, unos de
ellos comunes a casi todos los controles (Evento click, por ejemplo) y otros exclusivos de un
determinado control (El evento Timer solamente lo tiene el control Timer) Puede ver los eventos de un
control haciendo doble click sobre ese control en tiempo de diseo. Le aparecer la ventana de cdigo.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 48

Fig. 2.1 Ventana de cdigo


La ventana de cdigo es el lugar donde deber escribir el cdigo de su aplicacin. Puede ver que existen
en ella dos listas desplegables, una a la izquierda (sin desplegar) donde se ve el nombre del control del
cual estamos visualizando el cdigo (en este caso Command1) y otra a la derecha, donde se despliegan
todos los eventos que tiene ese control. Haciendo click en la lnea de uno de esos eventos, aparecer la
ventana de cdigo dedicada a ese evento.
Nota. Fjese en la parte inferior izquierda de la ventana de cdigo. Hay dos botones, uno que permite
visualizar el cdigo correspondiente a un solo evento, (el de ms a la izquierda) y otro que permiten ver
en la misma ventana el cdigo de todos los eventos. Cada programador tiene su costumbre para ver uno
o todos. La prctica le dir lo que es ms prctico para Vd.
Un Procedimiento es el cdigo que introducimos dentro de un evento. No pretendo hacer escuela con
definiciones, puesto que el concepto de evento y procedimiento se confunde con mucha frecuencia, y no
pasa nada por ello. El cdigo introducido en la ventana de cdigo del evento click ser el procedimiento
click, el que se introduzca en el evento MouseUp ser el procedimiento MouseUp. No se sorprenda si a
lo largo de este libro nos referimos a evento o a procedimiento de forma equivocada. En el lenguaje
coloquial es muy habitual ese error y como decamos, no pasa nada por ello.
Estos procedimientos forman parte del programa. Podra hacerse una aplicacin que no tuviese mas
cdigo que el introducido en los procedimientos, y muchas veces esa es la realidad.
Un procedimiento puede pasar parmetros. Se dice que pasa parmetros cuando el sistema aporta
datos automticamente al procedimiento. Por ejemplo, el procedimiento MouseUp, que se ejecuta
cuando levantamos el botn del ratn (tambin existe el evento MouseDown), pasa los siguientes
parmetros: Nmero del botn que se ha pulsado, (1=Izdo, 2=Dcho, 3=Central), si est pulsada la tecla
maysculas (Shift, 1 si est pulsada, 0 si no est pulsada) y los valores X e Y de la posicin del cursor
del ratn. Podemos ver los parmetros que pasa en la propia definicin del procedimiento, que nos da
Visual Basic
Private Sub Command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
End Sub
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 49

Observe que los parmetros estn entre parntesis, y que queda definido el tipo de variable que es cada
uno de ellos. Podemos usar ese valor dentro del cdigo del procedimiento como un dato ms.
Un Mtodo es una operacin que la realiza Visual Basic sin necesidad de escribir cdigo para realizarla.
Por ejemplo, si queremos dibujar una lnea en un formulario o en la impresora utilizaremos el mtodo
Line. Si queremos dibujar una circunferencia usaremos el mtodo Circle. Si queremos escribir texto,
utilizaremos el mtodo Print. No necesitamos decirle como lo tiene que haver, puesto que eso ya lo sabe
hacer VB sin necesidad de que se lo expliquemos. A los mtodos les tenemos que pasar datos. A eso le
llamamos tambin pasarle parmetros. Los mtodos solo permiten introducir los parmetros que
necesita el mtodo para ejecutarse. (En el caso de una lnea, el punto inicial y el final, en el caso del
circulo, el radio y las coordenadas del centro. Pueden pedir parmetros optativos, como el puede ser el
color de la lnea o circulo.
Espero que le quede claro cada una de estas definiciones. Tendr tiempo suficiente a lo largo del curso
para verlas, y dentro de muy poco tiempo le sern muy familiares estos conceptos.

EL FORMULARIO
El primer objeto Visual Basic con que nos encontramos es el FORMULARIO. De hecho, cada vez que
iniciamos Visual Basic (VB) nos presenta en pantalla un nuevo formulario, que tiene por defecto el
nombre de Form1
El Formulario es un objeto, que sirve de soporte de otros objetos. El nombre de FORMULARIO lo
toma precisamente porque, al igual que un formulario de papel contiene textos escritos, lugares donde
podemos escribir, figuras, cajas donde podemos elegir una u otra opcin, etc., en este cuadro grfico
que llamamos formulario, podemos introducir textos escritos, lugares donde podemos escribir, figuras,
cajas donde podemos elegir una u otra opcin ....
En realidad un formulario es lo que normalmente conocemos por VENTANA. El nombre de formulario le
viene muy bien cuando ese formulario es una ventana donde vamos a introducir datos alfanumricos.
Cuando en vez de introducir datos, lo que tenemos es, por ejemplo, una ventana donde se reproducen
exactamente los controles de operacin de una mquina, parece en principio que sera mas correcto el
nombre de "ventana". De alguna forma lo hay que llamar, y esa forma es FORMULARIO. Posiblemente
a lo largo de estos apuntes nos referiremos al formulario con el nombre de ventana, o incluso, pantalla.
Procuraremos usar el nombre apropiado: FORMULARIO.

Fig. 2.2 Forma inicial del formulario.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 50

Fig. 2.3 Un formulario que parece un equipo de radio (Programa realizado por el autor)
Ejemplo de un formulario para una aplicacin industrial. Este formulario reproduce el panel de control de
un transmisor - receptor de radio. En este caso, parece que el nombre de ventana le viene mejor que el
de formulario. Observe que dentro del formulario existen gran cantidad de objetos. Botones, que hacen
la misma funcin que el botn real en el equipo de radio, y un par de displays, que muestran un texto, en
este caso las frecuencias de transmisin y recepcin.
Como cualquier objeto Visual Basic, un formulario tiene propiedades, procedimientos y mtodos.
Vamos a ver las propiedades del formulario, pero solo veremos las que son especficas para un
formulario. El resto las podr ver al final del captulo. Aqu haremos referencia a esas propiedades con
un asterisco (*) que significa que esa propiedad no tiene una notacin especial para los formularios.
Seguiremos esta norma con todos los controles.
PROPIEDADES.
Name

Nombre

Define al objeto durante la ejecucin del programa. Se introduce en tiempo de diseo y no se puede
variar durante la ejecucin. Nombre por defecto: Form1 (Form2 y sucesivos) Este nombre por defecto
debe cambiarse, (debera cambiarse por norma en el momento de introducir el formulario), ya que de no
hacerlo corremos el riesgo de borrar el cdigo existente de otro formulario del mismo nombre en el
momento de guardar la aplicacin.
Caption

Ttulo

Es el texto que aparecer en la barra de Ttulo cada vez que aparezca en pantalla este formulario. No
tiene otra funcin dentro del programa. El programa no accede a este formulario por el ttulo, sino por el
nombre. Puede cambiarse en tiempo de ejecucin.
NOTA.- No confundir Nombre (Name) con Ttulo (Caption)
Control Box
LSB

Men de Control en la parte sup. Izda.

Visual Basic Gua del Estudiante

Captulo 1

Valor por defecto : True


Pgina 51

Propiedad Booleana que admite los valores de true (verdadero) o False (Falso). Si esta propiedad es
True, aparecer en la esquina superior izquierda el icono (el "menos" en W-3.11) para desplegar el men
de control de este formulario. Si esta propiedad se pone como False, no aparece dicho icono y por tanto
no se puede desplegar dicho men.
MinButton
MaxButton

Valor por defecto: True

Botones de minimizar y maximizar este formulario. Son igualmente propiedades booleanas, que admiten
el valor True o False. Si estn en true, aparecer la flecha correspondiente. Si estn en False, no
aparecer dicha flecha. Deben configurarse de una u otra forma, dependiendo si se quiere minimizar /
maximizar este formulario durante la ejecucin.
Nota. En los formularios MDI child, es necesario poner a true las propiedades ControlBox, MinButton
y MaxButton para poder maximizar el formulario hijo. De no ponerlas a true, s se pretende maximizar el
formulario hijo, (Propiedad WindowState=2) el formulario no aparece.
BorderStyle

Tipo de borde

Define el tipo de borde que tendr el formulario durante la ejecucin. No se puede cambiar en tiempo de
ejecucin. Admite los siguientes valores:
0 - None

El formulario no tiene borde alrededor

1 - Fixed Single
El formulario tendr un borde fino, y no podr cambiarse su tamao durante el
tiempo de ejecucin. Con este valor, el formulario puede tener un men de
control, barra de ttulo y botones de maximizar y minimizar. Solo podr
cambiarse de tamao utilizando estos botones.
2-Sizable
El formulario tendr borde grueso, y se podr cambiar su tamao en tiempo de
ejecucin mediante los botones de maximizar y minimizar, y mediante el arrastre
de uno de los bordes con el ratn.
3 - Fixed Dialog
El formulario tendr borde grueso, y no se podr redimensionar durante la
ejecucin. No puede tener los botones de maximizar ni minimizar.
4 - Fixed ToolWindow
En las versiones de 16 bits de Windows y Windows NT 3.51 y anteriores se
comporta como Fixed Single. No puede cambiar de tamao. En Windows 95
muestra el botn Cerrar, y el texto de la barra de titulo aparece con un tamao
de fuente reducido. El formulario no aparece en la barra de tareas de W95.
5 - Sizable ToolWindow
En las versiones de 16 bits se comporta como Sizable. En W95 muestra el
botn Cerrar y el texto de la barra de titulo aparece con un tamao de fuente
reducido. El formulario no aparece en la barra de tareas de W95.
Valor por defecto: 2 . Sizable
Nota: Al cambiar a determinados valores, las propiedades MaxButton y
MinButton se ponen a False. Pueden cambiarse a True posteriormente.
Appearance

Apariencia

Valor por defecto: 3D

Admite los valores 0 (=Flat, plano) y 1 (=3D)


efecto tridimensional, y los controles que
esculpidos dentro de l. Con valor 0 (Flat)
ejecucin como una superficie plana. El color
LSB

Visual Basic Gua del Estudiante

Captulo 1

Si tiene el valor 1 (3D), el formulario aparecer con cierto


le introduzcamos a este formulario aparecern como
en esta propiedad, el formulario aparecer durante la
de fondo se ve afectado al cambiar esta propiedad. Si se
Pgina 52

cambia a 3D, el fondo (Backcolor) toma el color definido en Windows en el Panel de Control. Si se
cambia a Flat, toma el color blanco
Autoredraw

Valor por defecto: False

Propiedad Booleana. Esta propiedad, estando en True, permite actualizar el contenido del formulario y
de sus controles incluso cuando no estn visibles. Imaginemos que en este formulario existe un texto,
que se haya cambiado por programa mientras este formulario no estaba visible. Si esta propiedad
Autoredraw est en False, al hacer visible este formulario, aparecer sin reflejar ese cambio. Si esta
propiedad est en True, aparecer actualizado.
Backcolor

Color del fondo

Establece el color del fondo del formulario. Puede cambiarse en tiempo de ejecucin.
Valor por defecto: El establecido en el Panel de Control de Windows.

ClipControls

Valor por defecto: False

Propiedad Booleana. Establece si un evento Paint vuelve a dibujar el objeto entero (True) o si solamente
dibujan las partes que han sufrido cambios (False)
DrawMode
Establece un valor que determina el aspecto de la salida de un mtodo grfico o el aspecto de un control
Shape o Line. Ver mas adelante los efectos de esta propiedad.
DrawStile

(*)

Valor por defecto : 0

DrawWidth

(*)

Valor por defecto: 1

Enabled

(*)

ForeColor

Valor por defecto: Negro

Establece el color del primer plano del formulario. Es el color que tendrn las letras si escribimos en l, o
los dibujos, si lo que hacemos es dibujar. En tiempo de diseo, determina el color de la rejilla,.
FillStyle

Tipo de relleno (*)

FillColor

Color del relleno

Font

Tipo de letra

(*)

Valor por defecto: El determinado en la personalizacin.

Especifica el tipo y tamao de la letra que se usar en el formulario al utilizar el mtodo Print. Al
seleccionar esta propiedad en la ventana de propiedades, aparece un cuadro de dialogo donde se eligen
ambos parmetros.
Cuando introduzca nuevos controles en el Formulario, la propiedad Font de estos controles tomar el
valor que tenga esta propiedad en el Formulario. Puede servirle este pequeo truco para utilizar en
todos los controles una determinada fuente sin tener que teclearla para cada control.
FontTranparent

Texto Transparente

Valor por defecto: True

Establece si el texto o grfico de fondo del formulario se muestra (True) o no se muestra entre los
caracteres de texto escritos en el propio formulario.
FontSize
LSB

Tamao de letra

Visual Basic Gua del Estudiante

Captulo 1

(*)
Pgina 53

FontBold, FontItalic, FontStrikethru, FontUnderline


Height

Altura

HelpContextID

Identificador de contexto de la Ayuda

Icon

Icono

(*)

(*)
(*)

Esta propiedad define el icono que va a representar a este formulario cuando est minimizado. Si el
formulario es el formulario padre o formulario de inicio de una aplicacin, este icono es el que toma el
Asistente de Instalacin para colocarlo como icono de apertura del programa en el grupo de programas
Windows correspondiente. Como valor de esta propiedad se le puede asignar directamente el icono o el
nombre de un archivo (con su path correspondiente) que lo contiene, hacindolo directamente sobre la
caja de propiedades.
Valor por defecto: el icono que se le haya programado en la personalizacin.
KeyPreview

Valor por defecto: False

Propiedad Booleana. Cuando un formulario tiene dentro de s varios controles, uno de ellos es el que
est activo. En estas condiciones, si se pulsa una tecla, esa pulsacin la recibe en primer lugar el
control que est activo, y si ste no la procesa, pasa esa pulsacin al formulario. Para hacer que esa
pulsacin pase previamente por formulario, debe ponerse esta propiedad en True. Esta propiedad la
usar frecuentemente cuando quiera realizar alguna funcin pulsando una letra. Pone KeyPreview a
True, y puede conocer que tecla se ha pulsado en el procedimiento KeyPress del formulario. Si la tiene a
False, ese procedimiento no se ejecuta ya que la pulsacin no pasa por el formulario.
Left

Posicin del Borde Izquierdo

Indica la posicin del borde izquierdo del formulario respecto a la parte izquierda de la pantalla. (Lo ver
mas adelante, la pantalla ser para VB el objeto Screen). Normalmente no se introduce como valor
numrico, sino que lo toma automticamente de la posicin que tenga el formulario en el tiempo de
diseo. Puede cambiarse en tiempo de ejecucin, para mover el formulario.
LinkMode

Valor por defecto: 0

Permite que una aplicacin destino inicie una conversacin DDE con el formulario (origen de datos).
Puede tomar los siguiente valores:
0 - No hay interaccin DDE
1 - Source. Indica que este Formulario es origen de una comunicacin DDE. El dato que se va a
traspasar en esa comunicacin DDE estar en un TextBox, en un Label o en un PictureBox de
este Formulario.
LinkTopic
Establece el tema al que este formulario va a responder a una conversacin DDE, cuando funciona
como origen. Es por este tema por el que se debe llamar a este formulario cuando acta de origen en
una conversacin DDE
MDIChild

Valor por defecto: False

Establece que este formulario es un formulario Hijo dentro de un formulario MDI. No se puede cambiar
en tiempo de ejecucin. Es una propiedad Booleana
True = es formulario hijo
MouseIcon

(*)

MousePointer

(*)

LSB

Visual Basic Gua del Estudiante

False =No lo es

Valor por defecto: flecha


Captulo 1

Pgina 54

Picture

Grfico

Mediante esta propiedad podemos poner un grfico como fondo del formulario. El grfico puede ser un
bit-map o un fichero .ICO
ScaleHeight, ScaleWidth, ScaleMode,
Indican la unidad de medida de dimensin de altura y anchura del Formulario. ScaleMode indica en qu
unidades de medida se van a medir esas dimensiones. Acepta Twips (1), Point(2), Pixel (3), Character
(4), Pulgadas (Inch) (5), Milmetros (6), Centmetros (7). Si colocamos la propiedad ScaleMode en
cualquiera de estos valores, las propiedades ScaleHeight y ScaleWidth nos vendrn dadas
automticamente dependiendo del ancho del Formulario, y no se extrae si encuentra para estas
propiedades valores tan peregrinos como 4815 y 7423. Al haber elegido la unidad de medida, los
valores de ancho (ScaleWidth) y alto (ScaleHeight) sern los que tengan que ser, medidos en la unidad
que hemos elegido. Podemos elegir una cifra para el ancho y el alto del Formulario de forma que
podamos controlar mejor las distintas posiciones que van a ocupar en l los controles, los textos o los
dibujos. Podemos poner, por ejemplo, que el Formulario mida 400 de ancho (ScaleWidth = 400) y 300
de alto (ScaleHeight = 300) forzndole estas propiedades, bien en tiempo de diseo en la caja de
propiedades, o en tiempo de ejecucin mediante cdigo. Entonces sabemos que el formulario,
independientemente de las dimensiones fsicas que tenga sobre la pantalla, medir 400 de ancho y 300
de alto, y si en estas condiciones queremos colocar un control o un dibujo justo en el medio del
Formulario, sabemos que tenemos que colocarle en las coordenadas 200, 150. Que unidad de medida
estaremos utilizando entonces en el Formulario ? Unas definidas por el usuario (distintas para el ancho
y el alto) que sern las necesarias para que el Formulario mida de ancho lo que le hayamos puesto en la
propiedad ScaleWidth y de alto lo que le hayamos puesto en la propiedad ScaleHeight. Observe que la
propiedad ScaleMode se ha cambiado automticamente a User (0) al introducir las dimensiones de
ancho y alto que nosotros queremos.
Estas unidades de medida afectarn a los controles que metamos en este Formulario. Se medirn en su
ancho y alto con la unidad de medida definida para el ancho y alto del Formulario. Lgicamente tambin
afectar a las propiedades Left y Top de los controles, pero estas propiedades se vern afectadas
adems por las propiedades ScaleLeft y ScaleTop del Formulario que se vern a continuacin.
ScaleLeft, ScaleTop
Estas propiedades, medidas en la unidad de medida elegida para el ancho y alto mediante las
propiedades ScaleMode, ScaleWidth y ScaleHeight anteriores, expresan las coordenadas iniciales de
la parte izquierda y de la parte superior respectivamente del Formulario. Estas propiedades no afectan a
la posicin del Formulario en la pantalla (Si est maximizado seguir ocupando toda la pantalla, si est
en Normal ocupar el mismo sitio que se dio en tiempo de diseo). Supongamos que se le asigna a un
Formulario, las propiedades ScaleWidth = 400, y ScaleHeight = 300. Si colocamos un control
justamente en el centro del Formulario tendr sus propiedades Top =150 y Left=200. Si ponemos ahora
las propiedades del Formulario ScaleLeft a 30 y ScaleTop a 10, ese control, para seguir en el centro del
Formulario deber tener sus propiedades Top a 160 (150 + 10) y Left a 230 (200 + 30).
Recuerde que las medidas de un formulario crecen, desde la esquina superior izquierda, segn
avanzamos hacia abajo y hacia la derecha.
Como aclaracin de las relaciones entre distintas unidades de medida, puede ver en la siguiente table la
correspondencia entre cada una de ellas y la unidad imaginaria Twip.
1 Point=20 Twips ; 1Pixel=15 Twips : 1 Charecter=240 Twips ; 1 Inch (pulgada) =1440 Twips
1mm=56,52 Twips 1 cm=566 Twips
Tag
Top

(*)
Posicin del borde superior

Esta propiedad establece la posicin del borde superior del formulario respecto a la parte superior de la
pantalla (Objeto Screen). Normalmente no se introduce como valor numrico sino que lo toma
automticamente de la posicin que tenga el Formulario durante el tiempo de diseo Este valor puede
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 55

cambiarse durante la ejecucin para, conjuntamente con Left, variar la posicin del Formulario. Los
valores de Top y Left definen la esquina superior izquierda del Formulario.
Visible
Width

(*)
Ancho

Valor por defecto: True

(*)

WindowState
Establece el estado en el que aparecer el formulario cuando se activa y presenta en pantalla. Admite
tres opciones:
0 - Normal El formulario recupera la posicin y tamao que tena en el tiempo de diseo.
1 - Minimizado El formulario aparece minimizado, representado por su icono.
2 - Maximizado El formulario aparece maximizado, ocupando toda la pantalla.

EVENTOS DEL FORMULARIO


Se explican a continuacin los eventos de un formulario. Recuerde que un evento es lo que le puede
ocurrir a un formulario o control (p.e. Evento Click) y un procedimiento es el cdigo escrito en ese
evento, que se ejecutar cuando ocurra el evento.
Evento Activate
Activacin
Este evento se ejecuta al convertirse el formulario en formulario activo. Esto sucede mltiples veces
cuando tenemos en el programa mas de un formulario. Slo uno de ellos puede ser el formulario activo.
Este procedimiento no pasa parmetros. No debe emplearse para los parmetros iniciales del
formulario. sese para este fin el evento Load o el Initialize.
Evento Click
Click
Este evento se ejecuta cuando hacemos Click (con cualquier botn del ratn) en una parte del formulario
que no est ocupada por un control. Para que se ejecute el evento Click es necesario que no se ejecute
el procedimiento MouseDown. (Que no tenga cdigo escrito en el evento MouseDown). Existe una
diferencia entre el evento click del formulario y el de cualquier control : en el formulario se ejecuta con
cualquiera de los botones del ratn, y en los controles, solamente con el botn izquierdo. Este evento no
pasa parmetros.
Evento DblClick
Doble click
Este evento se ejecuta cuando hacemos doble click con cualquier botn del ratn sobre una parte del
formulario que no est ocupada por un control. Este evento no se ejecuta si tenemos escrito cdigo en el
procedimiento Click. No pasa parmetros.
Evento Deactivate
Desactivacin
Se produce cuando el formulario deja de ser el formulario activo. Vea Activate. No pasa parmetros.
Evento DragDrop
Evento DragOver

Accin de Soltar durante el Drag & Drop


Pasar el ratn por encima en una operacin de Drag & Drop

Evento GotFocus

El formulario obtiene el foco

(*)
(*)

Este evento ocurre cuando el formulario toma el foco. Cosa un poco difcil, ya que para que el formulario
tome el foco debe ocurrir, o que no tenga ningn control capaz de tomar el foco, o que todos los
controles existentes en el formulario y que puedan tomar el foco, estn desactivados. No se suele usar
este procedimiento.
Evento Initialize

Inicializacin del formulario

Se produce al cargar por primera vez el formulario. Esto significa que si en una aplicacin cargamos ese
formulario una vez (la primera) se realiza este evento, pero si descargamos el formulario (con Unload
Formxx) y luego lo volvemos a cargar (con Formxx.Show), esta segunda vez (y sucesivas) no se
produce este evento
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 56

Evento KeyDown
Evento KeyPress
Evento KeyUp

Pulsar una tecla (Instante en que se ha pulsado)


Pulsar una tecla
Soltar una tecla (Instante en que se levanta)

Estos tres eventos solamente se producirn en el formulario cuando la propiedad KeyPreview est a
True. (Vea propiedad KeyPreview)
Estos tres procedimientos son excluyentes y tienen la jerarqua con el orden siguiente: KeyDown,
KeyPress y KeyUp. Si el procedimiento KeyDown tiene cdigo que pueda realizar una operacin, no se
ejecutar el procedimiento KeyPress ni el KeyUp. Si es el procedimiento KeyPress quien tiene el cdigo
que ejecuta una operacin, no se ejecutar el KeyUp. Para que realice esta exclusin es necesario que
el cdigo pueda realizar alguna operacin.
Pasa los siguientes parmetros:
KeyDown : KeyCode As Integer, Shift As Integer
KeyPress : KeyAscii As Integer
KeyUp
: KeyCode As Integer, Shift As Integer
KeyCode es el cdigo ASCII de la tecla pulsada. KeyAscii es el cdigo ASCII de la tecla pulsada.
La diferencia entre KeyCode y KeyAscii es que el primero se refiere a las teclas del teclado (Todas las
letras y nmeros, teclado numrico, Alt, F1 a F12, etc.) mientras que KeyAscii solamente tiene valor
cuando se pulsa una tecla de letra o nmero. Puede observar que el KeyCode de un nmero tecleado en
el teclado numrico es distinto del KeyCode de ese mismo nmero pulsado en el teclado alfanumrico.
No se confunda con el hecho de que el KeyCode de algunas teclas coincida con el KeyAscii. No es lo
mismo.
Shift indica si est pulsada la tecla Maysculas. Contiene un 1 si est pulsada, 0 si no lo est.
Evento LinkError
Evento LinkExecute
Evento LinkOpen

Error de enlace
Ejecucin de un enlace de datos
Romper el enlace

Estos tres procedimientos ocurren cuando el formulario forma parte de un enlace DDE. Vea el captulo
del DDE para mas detalles.
Evento Load

Cargar el formulario

Este evento es se ejecuta en el momento de la carga del formulario. Es el que presenta en la ventana de
cdigo por defecto, es decir, uno de los mas usados en el formulario. Y es el mas usado porque es el
mas apropiado para introducirle a ese formulario los valores y parmetros iniciales, abrir bases de datos,
etc.
Se ejecuta despus del evento Initialize del formulario, pero este evento Load, al contrario que el
Initialize, se ejecuta cada vez que cargamos el formulario. Para introducir cdigo de inicializacin debe
utilizar este evento Load. Este evento no pasa parmetros.
Evento LostFocus
Perder el foco
Ocurre cuando el formulario pierde el foco. Y un formulario solo puede perder el foco cuando lo tena.
Cosa que no es fcil que ocurra, tal como se explic en el Evento GotFocus.
Evento MouseDown
Pulsar una tecla del ratn
Ocurre cuando se pulsa cualquier botn del ratn, estando el cursor encima de un punto del formulario
libre de controles. Pasa como parmetros Button (Botn pulsado, 1 = Izquierdo, 2 = Derecho, 3 =
Central), Shift (Tecla de Maysculas) y la posicin del puntero del ratn sobre el formulario (X e Y). Este
evento puede usarse para muchas cosas. Una de ellas, muy tpica, iniciar una operacin de Drag & Drop
manual, usando la particularidad de que como pasa la tecla Shift como parmetro, puede obligarse a
pulsar esa tecla para iniciar el D & D, evitando as cualquier activacin accidental.
Evento MouseMove
Mover el ratn (Detecta la posicin del ratn sobre el
formulario)
Se produce cada vez que se mueve el ratn sobre el formulario. Tenga cuidado al usar este evento, ya
que cualquier movimiento del ratn lo va a desencadenar. Por eso, siempre se usa con una condicin
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 57

(que est pulsada la tecla de maysculas, que est pulsado uno de los botones del ratn, etc.). Los
parmetros que pasa son Button As Integer, Shift As Integer, X e Y As Single.
Evento MouseUp
Soltar una tecla del ratn
Este evento sucede cuando se levanta la tecla pulsada del ratn. Pasa como parmetros Button (Botn
pulsado, 1 = Izdo, 2 = Dcho, 3= Central) Shift (Maysculas), X e Y (Single) como posicin del puntero
del ratn
Este evento suele usarse para mostrar PopupMens, deshacer una operacin iniciada con MouseDown,
etc.
Evento Paint
Redibujar tras un cambio de tamao
Se produce al cambiar el tamao del formulario, tras el evento Resize, excepto cuando se minimiza.
Puede aprovecharse para redibujar el contenido del formulario (de ah su nombre) tras un cambio de
tamao. No pasa parmetros
Evento QueryUnload
Confirmacin de descarga
Este procedimiento se ejecuta cuando el formulario recibe la instruccin de descargarse. Todava
estamos a tiempo de evitar que se descargue. Por lo tanto es aqu donde suele colocarse una caja de
mensaje donde se obliga al usuario a ratificar o revocar la orden de descarga del formulario. En caso de
que en realidad no queramos descargarlo, basta con poner Cancel = True (o Cancel = 1) y no se
producir la descarga. Pasa como parmetros Cancel As Integer, UnloadMode As Integer.
Cancel es un parmetro que debemos introducir para abortar la descarga del formulario. Si se pone a un
valor distinto de 0, se detiene la descarga.
UnloadMode es un valor o constante que nos da el sistema, dependiendo de la causa que ha provocado
la descarga del formulario.
Constante
vbFormControlMenu
vbFormCode
vbAppWindows 2
vbAppTaskManager
vbFormMDIForm

Valor
0

El usuario eligi el comando Cerrar del men Control del


formulario o hizo click en el X del mismo.
1
Se invoc la instruccin Unload desde el cdigo.
La sesin actual del entorno operativo Microsoft Windows
est finalizando.
3
El Administrador de tareas de Microsoft Windows est cerrando la
aplicacin.
4
Un formulario MDI hijo se est cerrando porque el
formulario MDI padre tambin se est cerrando.

Este procedimiento no se ejecuta cuando sale de la aplicacin mediante la instruccin End. Solamente
se ejecuta cuando con la instruccin Unload, o con el comando Cerrar del men Control del formulario, o
haciendo click en el X del mismo. El evento QueryUnload se utiliza con frecuencia para guardar la
configuracin actual de la aplicacin.

Evento Resize

Cambio de tamao

Se ejecuta cuando cambia el tamao del Formulario, bien porque le cambia con las flechas del ratn
arrastrando uno de sus bordes, bien porque lo maximizamos, ponemos a tamao intermedio o
minimizamos. Puede usar este evento para redistribuir o cambiar el tamao de los controles. No pasa
parmetros.
Evento Terminate
Este evento se produce al descargar el formulario, despus de QueryUnload y Unload. Aqu ya no
podemos abortar la descarga. Solamente podremos, por ejemplo, guardar la configuracin usada por la
aplicacin, para que vuelva a arrancar con la ltima configuracin usada.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 58

Este evento no se produce si sale de la aplicacin con la instruccin End. Solamente si lo hace mediante
Unload (Unload Me, p.e.) o con el comando Cerrar o el X del formulario. Me permito recomendarle que
No termine sus aplicaciones mediante End. No podr usar los eventos QueryUnload, Unload ni
Terminate.
Evento Unload

Descargar el formulario

Este evento se produce en el momento en el que se descarga el formulario. Pasa como parmetro
Cancel, al igual que lo hace QueryUnload. Es la ltima oportunidad de cancelar la descarga del
formulario, haciendo Cancel = True o Cancel = cualquier valor distinto de 0.
Este procedimiento no se ejecuta cuando sale de la aplicacin mediante la instruccin End. Solamente
se ejecuta cuando con la instruccin Unload, o con el comando Cerrar del men Control del formulario, o
haciendo click en el X del mismo.
Eventos del OLE
Existen varios eventos relacionados con el OLE de Windows. Se estudiarn cuando se estudie el OLE.
De momento se enumeran con los parmetros que pasan.
Evento OLECompleteDrag (Effect As Long)
Evento OLEDragDrop (Data As DataObject, Effect As Long, Button As Integer, Shift As _
Integer, X As Single, Y As Single)
Evento OLEDragOver (Data As DataObject, Effect As Long, Button As Integer, Shift As _
Integer, X As Single, Y As Single, State As Integer)
Evento OLEGiveFeedback (Effect As Long, DefaultCursors As Boolean)
Evento OLESetData (Data As DataObject, DataFormat As Integer)
Evento OLEStartDrag (Data As DataObject, AllowedEffects As Long)

LOS CONTROLES MAS ELEMENTALES DE VISUAL BASIC


Una vez introducido un Formulario, se pueden colocar los objetos (controles) que forman parte de la
aplicacin. Estos controles se irn viendo en prximos captulos.
Los controles, lo mismo que el Formulario, tienen Propiedades, Procedimientos y Mtodos.
Para colocar un control en un Formulario, basta con tomarlo de la caja de herramientas existente en la
parte izquierda de la pantalla de VB y llevarlo al Formulario. Si no existiese el control deseado en la caja
de herramientas, deberemos ir a cogerlo a Proyecto | Componentes de la barra de men de VB. Se
elige el nuevo control, marcando la caja de opcin a la izquierda de su nombre, y haciendo click en
ACEPTAR. Este control ya pasa a la caja de herramientas.
No se deben introducir mas controles de los necesarios. Sobre todo, cuando vaya a compilar el proyecto.
Si tiene metido en la caja de herramientas un control que no necesita, lo introducir en los discos de
distribucin igual que si lo necesitara.
COMMAND BUTTON

BOTON DE COMANDO

El Command Button es un objeto que sirve para introducir datos a travs de la pantalla. El Botn de
Comando tiene la siguiente forma:

El botn de comando puede usarse para la entrada de datos con el ratn, o para validar cualquier
operacin. El tamao puede cambiarse a voluntad, pero la forma siempre es rectangular. En la figura
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 59

anterior vemos dos botones de comando, uno de ellos (el Command2) marcado con unos puntos en su
contorno. Estos puntos nos permiten variar su tamao en tiempo de diseo. Tambin puede cambiarse
su tamao y posicin en tiempo de ejecucin.
(Las propiedades marcadas con (*) no varan de la descripcin general, hecha al final del captulo)
PROPIEDADES
Name

Nombre (*)

Caption
Ttulo (*)
Es el texto que aparece en el botn. Puede cambiarse en tiempo de ejecucin. No tiene otra funcin
dentro del programa.
Appearance

Apariencia

(*)

Backcolor
Color de fondo (*)
Esta propiedad permite cambiar el color del botn cuando la propiedad Style est puesta a Graphycal. Si
la propiedad Style esta puesta a Standars, esta propiedad solamente controla el color de un pequeo
cuadrado que aparece rodeando el ttulo. Puede cambiarse en tiempo de ejecucin.
Cancel
Establece un valor que indica si un botn de comando es el botn Cancelar de un formulario. Es una
propiedad booleana, y admite los valores True o False. Puede utilizar la propiedad Cancel para dar al
usuario la opcin de cancelar los cambios que no se han hecho efectivos y devolver el formulario a su
estado anterior. En un formulario slo puede haber un botn de comando con la propiedad Cancel =
True.
Causes Validation
Esta propiedad habilita o deshabilita la ejecucin del evento Validate del control que tena el foco antes
de cambiar el foco a este control. El evento Validate de un control se ejecuta inmediatamente antes de
que pierda el foco. (Se dice que un control tiene el foco cuando es ese control el que est activado). Al
hacer click sobre el botn de comando, siempre habr algn control que pierda el foco para que lo tome
el botn de comando. Si el botn de comando tiene la propiedad Causes Validation a True, se ejecutar
el evento validate de ese control que acaba de perder el foco. Si est a false, no se ejecutar. Observe
que esta propiedad afecta a un control diferente del que ostenta la propiedad.
Default
Establece un valor que determina el control CommandButton que es el botn de comando
predeterminado de un formulario. Slo un botn de comando de un formulario puede ser el botn de
comando predeterminado. Cuando Default se define a True para un botn de comando, se define
automticamente a False para el resto de los botones de comando del formulario. Cuando la propiedad
Default del botn de comando est establecida a True y su formulario primario est activo, el usuario
puede elegir el botn de comando (invocando su evento Click) presionando ENTRAR. Cualquier otro
control que tuviera el enfoque no recibe evento de teclado (KeyDown, KeyPress o KeyUp) de la tecla
ENTRAR a menos que el usuario haya movido el enfoque a otro botn de comando del mismo
formulario. En este caso, al presionar ENTRAR se elige el botn de comando que tiene el enfoque en
lugar del botn de comando predeterminado.
DisabledPicture, DownPicture
Estas propiedades solamente estn disponibles cuando se pone
la propiedad Style a Graphycal. Permiten poner un icono diferente para el estado de deshabilitacin del
botn (Cuando est la propiedad Enabled = False) o cuando el botn est pulsado respectivamente.
Juntamente con la propiedad Picture permite hacer un juego de imgenes sobre el botn que varan de
acuerdo a su estado o posicin.
DragIcon

Icono en la operacin de arrastre

(*)

DragMode

Modo de iniciar el Drag & Drop

(*)

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 60

Enabled

Habilitado

(*)

Font

Fuente

(*)

Height

Altura

(*)

HelpContextID

Nmero de Contexto para la Ayuda

Index

Indice

Left

Posicin de su parte izquierda.

(*)

(*)
(*)

MaskColor
Establece cual es el color de la imagen del botn que actuar como mscara para
producir zonas transparentes. Para ello, la propiedad UseMaskColor debe estar a true. ()
MouseIcon

Icono para el puntero del ratn

(*)

MousePointer Puntero ratn

(*)

Picture.
Solamente est disponible cuando la propiedad Style est puesta a Graphical. Pone un
icono sobre el botn.
Style
Define el estilo del botn, aceptando dos valores: Graphycal y Standard. Poniendo
esta propiedad a Graphycal podemos cambiar el color del botn 8con la propiedad Backcolor) e
incluso introducir un frfico (en la propiedad Picture, DownPicture o DisabledPicture.
UseMaskColor Determina si el color asignado en la propiedad MaskColor se usa como mscara para
crear zonas transparentes. No he sido capaz de sacar partido a esta propiedad.

TabIndex

N de orden para tabulador

(*)

TabStop

Sale del control de la tecla TAB

(*)

Tag

Valor auxiliar

(*)

ToolTipText

Etiqueta de informacin (W95)

(*)

Top

Posicin de la parte superior

(*)

Visible

Visible

(*)

WhatsThisHelpID
Width

(Propiedad, Windows 95)

Ancho

(*)
(*)

PROCEDIMIENTOS DEL BOTON DE COMANDO


Click
KeyDown
MouseDown

DragDrop
KeyPress
MouseMove

DragOver
KeyUp
MouseUp

GotFocus
LostFocus

El botn de Comando no tiene el procedimiento DbClick !

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 61

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 62

LABEL

ETIQUETA

Una etiqueta es un control que nos permite presentar un texto. La etiqueta debe usarse en aquellos
casos en los que exista una informacin esttica o dinmica que no deba ser cambiada por el operador.
Puede adoptar estas formas: con borde tridimensional, borde plano o sin borde, y el texto justificado a
la izquierda, a la derecha o centrado.

Se ha incluido la trama para poder observar los lmites de la etiqueta sin borde.

PROPIEDADES
Alignment

Justificacin

Establece si el texto se justifica a la izquierda, a la derecha, o se centra sobre la etiqueta.


Appearance

Apariencia

Plana o tridimensional. (*)

Autosize
Caption

Si est a True, el tamao de la etiqueta se ajusta al tamao del texto de su propiedad

Backcolor

Color de fondo

(*)

BackStyle

Tipo de fondo

Opaco o transparente.

Cuando se selecciona transparente, se ve solamente el texto de la etiqueta, dejando ver como fondo
entre las letras, el color o Picture del formulario. Cuando se selecciona opaco, este texto se v sobre un
fondo gris.
BorderStyle

Tipo de borde

Sin borde o con borde. En caso de haber elegido en la propiedad Appearance el modo tridimensional, y
eligiendo con borde en esta propiedad, el aspecto adopta una forma como incrustada en el formulario.
Caption

Ttulo

DataSource

DataField

(*)

Establecen el control data asociado y el campo de la base de datos que se presentar en la propiedad
Caption. Estas propiedades permiten presentar los datos de una Base de Datos mediante un
procedimiento muy sencillo, con la ayuda de un control Data (Se ver mas adelante)
DragIcon
LSB

DragMode

Enabled

Visual Basic Gua del Estudiante

Captulo 1

Font

ForeColor

Height
Pgina 63

Index

Left

(*)

LinkItem LinkMode LinkTimeout LinkTopic


Estas propiedades establecen la forma en que debe llevarse a cabo una conexin DDE con otra
aplicacin. Se vern con mas detalle al estudiar los enlaces DDE
MouseIcon
Top

MousePointer
(*)

Name

TabIndex

Tag

ToolTipText

UseMneumonic
Es una propiedad Booleana. Devuelve o establece un valor que indica si al incluir el signo (&) en el texto
de la propiedad Caption del control Label se define una tecla de acceso.
Los valores que puede tomar son True o False.
True (Predeterminado) Los caracteres (&) que aparezcan en el texto de la propiedad Caption definen
al carcter siguiente como tecla de acceso. El signo (&) no aparece en el Caption del control Label.
False Los caracteres (&) que aparezcan en el texto de la propiedad Caption aparecen como tales en el
Caption del control Label.
En tiempo de ejecucin, al presionar ALT+ la tecla de acceso definida en la propiedad Caption del control
Label, el enfoque se desplaza al control siguiente al control Label en el orden de tabulacin.
Visible

WhatsThisHelpID

Width

(*)

WordWrap
Devuelve o establece un valor que indica si un control Label con el valor True en su propiedad AutoSize
se expande vertical u horizontalmente para adaptarse al texto especificado en su propiedad Caption. Es
una propiedad Booleana.
True El control Label se expande o contrae horizontal y verticalmente para adaptarse al texto y al
tamao de la fuente. Contempla para la expansin horizontal la colocacin de los espacios del texto.
False (Predeterminado) El texto no se ajusta a la siguiente lnea; el control Label se expande o contrae
horizontalmente para adaptarse a la longitud del texto y verticalmente para adaptarse al tamao de la
fuente y al nmero de lneas.
Nota
Si se establece False en AutoSize, el texto siempre se ajustar a la lnea siguiente,
independientemente del tamao del control Label y del valor de la propiedad WordWrap. Esto puede
ocultar parte del texto, ya que el control Label no se expande en ninguna direccin.

PROCEDIMIENTOS DEL LABEL


Click
DragOver

TEXT BOX

Change
LinkClose

DbClick
LinkError

DragDrop
LinkNotify

CAJA DE TEXTO

Las cajas de texto son los controles en los que Visual Basic presenta o introduce textos. Es por tanto un
control bidireccional. Normalmente se usan para introducin de textos, o para la presentacin de
aquellos que el operador pueda cambiar. Para cambiar o escribir un texto en una caja de texto, basta
con conseguir que esa caja de texto tenga el foco y teclear el texto en el teclado. Esto se puede lograr,
bien haciendo click con el ratn en esa caja de texto, bien con la tecla TAB, bien por programa.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 64

La caja de texto no se debe usar nunca para presentar textos que el operador de la aplicacin no deba
cambiar. sese para ello la etiqueta, control no bidireccional, que adems tiene la ventaja de ocupar
menos memoria de programa.
Las cajas de texto pueden tener una o varias lneas, segn est la propiedad Multiline. La capacidad
mxima de una caja de textos es de 64 Kbytes.
La forma de una caja de texto es la siguiente, dependiendo de las propiedades BorderStyle y
Appearance:

PROPIEDADES
Alignment

Justificacin

Establece si el texto se justifica a la izquierda, a la derecha, o se centra sobre la etiqueta. Esta propiedad
solamente tiene efecto cuando la propiedad Multiline est a True, ignorndose en caso contrario. Es
decir, permite colocar el texto justificado a la derecha cuando ese texto puede ser de varias lneas. Si la
propiedad Multiline est a False, se justifica siempre a la izquierda.
Esta propiedad no puede cambiarse en tiempo de ejecucin, pero s puede leerse en que condicin est.
Appearance

Backcolor

BorderStyle

Tipo de borde

(*)

Sin borde o con borde. En caso de haber elegido en la propiedad Appearance el modo tridimensional, y
eligiendo con borde en esta propiedad, el aspecto adopta una forma como incrustada en el formulario.
DataField
Nombre de un Campo
DataSource
Nombre de un control Data
Establecen el control Data y el campo donde est el texto que se llevar a la propiedad Text. Estas
propiedades permiten presentar de una forma muy sencilla datos de una Base de Datos. Se vern
cuando se estudie el control Data y el motor de bases de datos
DragIcon

DragMode

(*)

Enabled
Habilitado
Propiedad Booleana que habilita o deshabilita la etiqueta Cuando est deshabilitado (Enabled = False),
no tienen efecto los eventos que se produzcan sobre el TextBox. No se puede escribir el l ni pasarle el
foco, pero s se le puede cambiar el texto mediante el programa. Puede ser una buena alternativa para
impedir que el usuario pueda cambiar un determinado texto. Esta propiedad puede variarse en tiempo de
ejecucin.
Font

LSB

ForeColor

Height

Visual Basic Gua del Estudiante

Captulo 1

HelpContextID

Index Left

(*)

Pgina 65

LinkItem LinkMode LinkTimeout LinkTopic


Estas propiedades establecen la forma en que debe llevarse a cabo una conexin DDE con otra
aplicacin. Se vern con mas detalle al estudiar los enlaces DDE
Locked
Establece si el texto se puede editar, es decir, cambiar. Cuando se pone esta propiedad a True, el texto
existente en la caja puede resaltarse con el ratn, e incluso copiarlo al portapapeles, pero no puede
variarse tecleando un nuevo texto. Se puede cambiar por programa, cambiando la propiedad Text.
Si est en False, puede cambiarse el texto mediante teclado.
MaxLenght
Indica, si se establece, la longitud mxima del texto. Si no se establece o si se pone valor 0, permite
cualquier longitud de texto.
MouseIcon
Puntero del ratn personalizado
(*)
MousePointer Puntero ratn
Lo tpico para esta propiedad es el I-Beam (barra vertical)
Name

Nombre (*)

PasswordChar
En ocasiones, es conveniente que no se pueda leer lo que se escribe en la caja de texto, caso por
ejemplo de la entrada de un password o palabra de paso. Esta propiedad nos permite indicar un carcter
que sustituye a cualquier carcter que tenga la caja de texto. (Tpicos el * o ?). El texto que tenga en la
propiedad Text no cambia por el hecho de presentar en pantalla un carcter distinto. Esta propiedad
puede cambiarse en tiempo de ejecucin. Para quitar el PasswordChar basta con forzarlo al carcter
nulo :
Text1.PasswordChar =
La propiedad PasswordChar se ignora cuando la propiedad Multiline est a True.
ScrollBars
Cuando la propiedad Multiline de la caja de texto est a True, se pueden colocar barras de
desplazamiento del texto hacia arriba y abajo, o hacia los lados. Esto nos permite tener una caja de texto
de tamao reducido y poder leer en ella un texto mayor que la propia caja. Esta propiedad puede tomar
los siguiente valores :
0 - No salen barras
1 - Barras de desplazamiento horizontal
2 - Barras de desplazamiento vertical
3 - Ambas barras.
TabIndex

Tag

(*)

Text
Texto
La caja de texto no tiene la propiedad Caption. Su equivalente es la propiedad Text que es el texto que
tiene en su interior.
Top

Visible

WhatsThisHelpID

Width

(*)

PROCEDIMIENTOS DE LA CAJA DE TEXTO


Click
KeyDown

FRAME

Change
KeyPress

DblClick
KeyUp

DragDrop
LinkClose

DragOver

GotFocus

RECUADRO

Se obtiene directamente de la caja de herramientas


LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 66

Tiene la siguiente forma :

Un control Frame proporciona un agrupamiento identificable para controles. Tambin puede utilizar un
Frame para subdividir un formulario funcionalmente por ejemplo, para separar grupos de controles
OptionButton.
Para agrupar controles, en primer lugar trace el control Frame y, a continuacin, meta los controles
dentro de Frame. De este modo podr mover al mismo tiempo el Frame y los controles que contiene. Si
traza un control fuera del Frame y, a continuacin, intenta moverlo dentro de ste, el control se colocar
sobre el Frame, pero no pertenecer a el. Es decir, si es un OptionButton este se comportar como si
estuviese fuera del Frame, aunque fsicamente est dentro de el.
Cuando un control Frame tiene dentro otros controles, y hacemos invisible al Frame, mediante su
propiedad Visible = False, los controles interiores al Frame quedan tambin invisibles. Los controles
Frame se utilizan para poner dentro de ellos diversos controles, que solo aparecern en el programa
cuando se cumpla una determinada condicin. Cuando esa condicin se cumpla, se pone la propiedad
Visible del Frame a True y se vern todos los controles que tiene dentro. Si no se cumple esa condicin,
se pone la propiedad Visible del Frame a False y no se ver ni el Frame, ni los controles que contiene.
PROPIEDADES
Las sealadas con (*) no presentan novedades respecto a las ya comentadas
para los controles precedentes.
Appearance

Backcolor

Caption

(*).

ClipControls
Si esta propiedad est a True, los mtodos grficos en eventos Paint vuelven a dibujar el objeto entero.
Antes del evento Paint se crea una zona de recorte alrededor de los controles no grficos del formulario.
Si esta propiedad est a False dibujarn solamente las reas ltimamente expuestas. En tiempo de
ejecucin, esta propiedad es de slo lectura.
DragIcon

DragMode

(*)

Enabled
Cuando esta propiedad est a False, tanto los procedimientos asociados al propio control Frame como
todos los controles dentro del Frame estarn inhabilitados. Si esta propiedad est a True, todos ellos
estn habilitados.
Font
(*)
ForeColor
Color de las letras del ttulo del Frame.
Height
LSB

HelpContextID

Visual Basic Gua del Estudiante

Index
Captulo 1

Left

MouseIcon

MousePointer
Pgina 67

Name

TabIndex

Tag

Top

(*)

Visible
Cuando un Frame est con la propiedad Visible = False, tanto el propio Frame como todos los controles
interiores a el sern invisibles.
WhatsThisHelpID

Width

(*)

PROCEDIMIENTOS DEL FRAME


Click
MouseMove

LSB

DblClick
MouseUp

DragDrop

Visual Basic Gua del Estudiante

Captulo 1

DragOver

MouseDown

Pgina 68

CHECK BUTTON Y OPTION BUTTON (BOTONES DE ELECCION Y OPCION)


Se obtienen directamente de la caja de herramientas.

Dada la similitud de ambos controles, se comentan conjuntamente.


El control CheckBox, o casilla de verificacin, permite elegir una opcin (activada/desactivada,
True/False) que el usuario puede establecer o anular haciendo click. Una X en una casilla de
verificacin indica que est seleccionada, activada, o con valor True. Cada casilla de verificacin es
independiente de las dems que puedan existir en el formulario, pudiendo tomar cada una de ellas el
valor True o False, a voluntad del operador.
Un control OptionButton muestra una opcin que se puede activar o desactivar, pero con dependencia
del estado de otros controles OptionButton que existan en el formulario.
Generalmente, los controles OptionButton se utilizan en un grupo de opciones para mostrar opciones
de las cuales el usuario slo puede seleccionar una. Los controles OptionButton se agrupan
dibujndolos dentro de un contenedor como un control Frame, un control PictureBox o un formulario.
Para agrupar controles OptionButton en un Frame o PictureBox, dibuje en primer lugar el Frame o
PictureBox y, a continuacin, dibuje dentro los controles OptionButton. Todos los controles
OptionButton que estn dentro del mismo contenedor actan como un solo grupo, e independientes de
los controles OptionButton de otros grupos distintos.
Aunque puede parecer que los controles OptionButton y CheckBox funcionan de forma similar, hay
una diferencia importante: Cuando un usuario selecciona un OptionButton, los otros controles del
mismo grupo OptionButton dejan de estas disponibles automticamente. Por contraste, se puede
seleccionar cualquier nmero de controles CheckBox.

En el ejemplo de la figura, existen tres grupos de OptionButton, uno en un PictureBox, que acta, al
tiempo que como cuadro de imagen, como contenedor de controles OptionButton. Otro grupo est en
el interior de un control Frame, y el otro grupo est en el formulario. Los tres grupos son independientes
entre s, pero interiormente al grupo solamente puede seleccionarse uno de los OptionButton que lo
componen.
En el formulario tambin existen tres CheckBox, que como puede verse, se pueden seleccionar los que
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 69

se desee, sin ningn tipo de exclusin entre ellos.

PROPIEDADES
Las sealadas con (*) son comunes a ambos controles y no presentan novedades respecto a las ya
comentadas para los controles precedentes.
Alignment

Comn a ambos controles.


Admite los siguientes valores :
0 - Left Justify
1 - Right Justify

Cuando se elige el valor 0, justificado a la izquierda, el ttulo del control aparece a la derecha del botn,
pegado a la figura del botn. Cuando se elige el valor 1, justificado a la derecha, el ttulo (Caption)
aparece a la izquierda del botn, comenzando en la parte izquierda del cuerpo total del control, es decir,
no tiene porqu aparecer con su parte derecha pegado al botn, caso que el cuerpo total del control se
haya hecho mas largo que la palabra del ttulo.
Appearance

Backcolor

Caption

(*).

DataField DataSource
Propiedades del CheckBox solamente.
Establecen el control Data asociado y el campo donde estn los datos (True / False) que se llevarn a la
propiedad Value . Al igual que en los controles Label y TextBox esta propiedad nos permite visualizar
datos de una base de datos de una forma muy sencilla. En este caso, el CheckBox solamente permite
presentar (logicamente) datos de tipo Booleano.
DragIcon

DragMode

Enabled

Font

ForeColor

(*)

Height
Comn a ambos controles.
La altura del control solamente afecta a la colocacin del Titulo (Puede ponerse un ttulo largo en varias
lneas), no al tamao del botn, que es invariable.
HelpContextID
TabIndex

Index
TabStop

Left
Tag

MouseIcon
Top

MousePointer
(*)

Name

Value
Comn a ambos controles
El valor de esta propiedad indica si el control est seleccionado (Value = 1) o no seleccionado (Value = 0
Value = False). Esta propiedad puede cambiarse en tiempo de ejecucin. Mediante esta propiedad,
podemos tanto forzar el valor como leerlo.
Atencin. Presenta una diferencia entre uno y otro control respecto a la forma de expresarse respecto a
su valor cuando est seleccionado. Para forzar que el control NO est seleccionado, o para leer el Value
cuando no est seleccionado, podemos utilizar tanto Value = 0 como Value = False. Sin embargo,
cuando lo que se quiere es poner la propiedad a True hay una diferencia entre ambos controles.
Para el OptionButton podemos utilizar indistintamente las siguiente formas :
Option1.Value = True

Option1.Value = 1

Con cualquiera de ellas seleccionaremos ese control por programa.


Para el CheckBox solamente se podr usar para este propsito la instruccin :
Check1.value = 1
El poner como Value el valor True nos dar en este control un error.
Para la lectura del Value, existe una diferencia entre el valor devuelto por el CheckBox y el devuelto por
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 70

el OptionButton.
Para leer el dato existente en un CheckBox es necesario utilizar la forma :
variable = Check1.Value donde variable tomar el valor 1 (no True)
Para el control OptionButton emplearemos una instruccin igual :
variable = Option1.Value
Visible

WhatsThisHelpID

donde variable tomar el valor True (no 1)

Width

(*)

PROCEDIMIENTOS

Click
KeyDown

LSB

DblClick (Solo OptionButton)


KeyPress
KeyUp

Visual Basic Gua del Estudiante

Captulo 1

DragDrop
LostFocus

DragOver

GotFocus

Pgina 71

LIST BOX Y COMBO BOX


Estos dos controles, debido a su similitud, se estudian conjuntamente.
Se obtienen directamente de la caja de herramientas :

Un control ListBox muestra una lista de elementos en la que el usuario puede seleccionar uno o ms. Si
el nmero de elementos supera el nmero que puede mostrarse, se agregar automticamente una
barra de desplazamiento al control ListBox.
Un control ComboBox combina las caractersticas de un control TextBox y un control ListBox. Los
usuarios pueden introducir informacin en la parte del cuadro de texto y seleccionar un elemento en la
parte de cuadro de lista del control. En resumen, un ComboBox es la combinacin de un ListBox, que
se comporta como si de un ListBox se tratase, y de un TextBox, con comportamiento anlogo a un
TextBox sencillo, con la particularidad aqu de que el texto se le puede introducir por teclado, o elegir
uno de los que figuran en la parte ListBox del Combo.
Estos controles toman la siguiente forma :

Puede verse en la figura un ejemplo de presentacin de un ListBox (izquierda), un ComboBox con la


lista desplegada (Centro) y un ComboBox con la lista sin desplegar (Combo2 a la derecha).
La lista tiene varios elementos. Cada lnea de esta lsta es un elemento de la lista. Como el nmero de
elementos de la lista tiene mas elementos de los que le podan caber, gener automticamente la barra
de desplazamiento vertical.
El ComboBox est normalmente sin desplegar. Se despliega cuando se hace click con el ratn en la
flecha que tiene en su parte derecha (vase fig. Anterior). Al desplegarse, muestra la lista con todos sus
elementos. Haciendo click con el ratn en cualquiera de sus elementos, el elemento elegido pasa a la
parte TextBox del Combo y la lista vuelve a replegar.
El ListBox (y por tanto el ComboBox) tiene unas propiedades y mtodos particulares que solamente se
pueden aplicar durante el tiempo de ejecucin :
Propiedades
ListCount - Indica el nmero de elementos que tiene la lista
ListIndex - Indica el nmero de orden del elemento seleccionado dentro de la lista.
Text - Obtiene el elemento seleccionado.
List (n) - Obtiene el elemento cuyo orden dentro de la lista es n.
Mtodos
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 72

AddItem - Aade un elemento a la lista.


RemoveItem - Elimina un elemento de la lista.
Clear Borra todos los elementos de la lista
ListCount valdr 0 si la lista no tiene ningn elemento, y n si tiene n elementos.
Para seleccionar un elemento de la lista, basta con hacer click con el ratn sobre l. Ese elemento se
resaltar con fondo en azul. Una vez seleccionado un elemento, la propiedad ListIndex tomar el valor
del nmero de orden que ocupa ese elemento en la lista, comenzando por el 0 para el elemento que
ocupa el primer lugar. Si no se selecciona ningn elemento, el valor de la propiedad ListIndex ser -1. El
primer elemento de la lista es ListIndex 0, y el valor de la propiedad ListCount siempre es uno ms que
el valor mayor de ListIndex.
En el ComboBox la propiedad Text contiene el texto que contenga la parte TextBox del Combo, bien
haya sido introducida desde teclado o mediante la recuperacin de un elemento la parte ListBox del
mismo.

Ejemplos
Supongamos que tenemos un ListBox llamado List1, y un ComboBox llamado Combo1. Se enumeran
distintas formas de obtener informacin de ellos.
Variable = List1.Listcount
Variable contendr un nmero con el nmero total de elementos de la lista List1.
Variable = List1.ListIndex
Variable contendr un nmero con el nmero de orden del elemento de la lista
seleccionado en ese momento.
List1.AddItem ELEMENTO NUEVO
Aade un elemento a List1. En este caso, el elemento aadido es la palabra
ELEMENTO NUEVO.
Variable = VISUALBASIC
List1.AddItem Variable
Aade un elemento a List1. En este caso, el elemento aadido es la palabra
VISUALBASIC.
Variable = List1.Text
Variable contendr el elemento que estaba seleccionado en List1. (Variable ser una
cadena de caracteres)
Variable = List1.List (n)
Variable contendr el elemento que ocupa el nmero de orden n dentro de la lista.
Variable = List1.List (List1.ListIndex)
Variable contendr el elemento que estaba seleccionado en List1. Se ha utilizado la
propiedad List para obtener el elemento, y en vez de introducir un nmero para definir el
elemento que se desea, se introdujo el valor ListIndex de List1, que es concretamente, el
nmero de orden del elemento seleccionado en ese momento. Observe que poner
List1.List (List1.ListIndex) es idntico a poner List1.Text.
List1.RemoveItem (n)
Elimina el elemento n de List1.
List1.RemoveItem (List1.ListIndex)
Elimina el elemento que estaba seleccionado en ese momento.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 73

List1.listIndex = n
Selecciona el elemento n de List1 (Se resalta en azul el elemento n)
PROPIEDADES DE ListBox y de ComboBox
Las sealadas con (*) son comunes a ambos controles y no presentan novedades respecto a las ya
comentadas para los controles precedentes.
Appearance

Backcolor

(*)

Columns

Propiedad de ListBox solamente.

Determina si los elementos se presentan en una sola columna o en varias columnas, y la forma de
presentar los elementos en el ListBox. Si esta propiedad se pone a 0 la lista tendr solamente una
columna, y presentar los elementos uno debajo de otro. Cuando los elementos sean mas que los que
se pueden presentar en la lista, aparecen automticamente unas barras de desplazamiento vertical.
Si la propiedad se pone a un nmero distinto a 0, el ListBox es de tipo multicolumna, presentar en
cada columna los elementos que le quepan dependiendo de su dimensin vertical, y tendr tantas
columnas como sea necesario para albergar el nmero de elementos que tenga. Presentar en su
cuadro tantas columnas como se le indique en el valor de esta propiedad, y si no puede presentar todos
los elementos en las columnas que muestra, le aparecern barras de desplazamiento horizontales para
poder movernos por todas las columnas que tenga.
Recuerde : El nmero que se le asigna a la propiedad Columns no indica el nmero de columnas que
tendr el ListBox sino el nmero de columnas que presenta.
Esta propiedad puede asignarse en diseo, mediante la caja de propiedades, o en tiempo de ejecucin
mediante una instruccin como esta :
Nombrelista.Columns = nmero
.
Esta propiedad no puede definirse a 0 o cambiada desde 0 en tiempo de ejecuciones decir, no se puede
convertir en tiempo de ejecucin un ListBox de mltiples columnas en un ListBox de columna nica o un
ListBox de columna nica en un ListBox de mltiples columnas. Sin embargo, s es posible cambiar
durante la ejecucin el nmero de columnas de un ListBox de mltiples columnas.
DataField DataSource
.
Establecen el control Data asociado y el campo donde estn los datos que se llevarn al TextBox o
ComboBox para presentar datos procedentes de una Base de Datos.
DragIcon
ItemData

DragMode
Enabled
Font
(*)
Propiedad muy importante.

ForeColor

Height

HelpContextIDIndex

Devuelve o establece un nmero especfico para cada elemento de un control ComboBox o ListBox.
Sintaxis

NombreDeLaLista.ItemData(ndice) [= nmero]

NombreDeLaLista
Nombre del ListBox o ComboBox.
ndice
El nmero de un elemento concreto del objeto.
nmero
El nmero que se asocia con el elemento especificado.
La propiedad ItemData es una matriz de valores enteros largos cuyo nmero de elementos es el valor de
la propiedad ListCount del control. Los nmeros asociados con cada elemento se pueden usar para
cualquier fin. Por ejemplo, se puede usar en la confeccin de una lista de telfonos, el nmero de
identificacin de un empleado, etc. Cuando se rellena el ListBox, tambin se rellena los elementos
correspondientes de la matriz ItemData con los nmeros correspondientes.
La propiedad ItemData se usa a menudo como ndice de una matriz de estructuras de datos asociados
con los elementos de un control ListBox.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 74

Nota Cuando se inserta un elemento en una lista con el mtodo AddItem, el elemento tambin se
inserta automticamente en la matriz ItemData. Sin embargo, el valor no se reinicializa a cero; retiene el
valor que estaba en esa posicin antes agregar el elemento a la lista. Cuando se usa la propiedad
ItemData, asegrese de establecer su valor al agregar nuevos elementos a la lista.
Left

(*)

List
Es el contenido de la lista.
Si la lista de elementos es corta e invariable, pueden introducirse los elementos en el cuadro de
propiedades durante el diseo.
MouseIcon

MousePointer

Name

(*)

Sorted
Establece o devuelve un valor que indica si los elementos de un ListBox o ComboBox se
colocan automticamente en orden alfabtico. Los valores que puede adoptar son True o
False.
True Los elementos de la lista se ordenan alfabticamente (sin distinguir entre maysculas y
minsculas).
False (Predeterminado) Los elementos de la lista no se ordenan alfabticamente.
Cuando esta propiedad tiene el valor True, Visual Basic se encarga de casi todo el
procesamiento de cadenas necesario para mantener el orden alfabtico, incluyendo el cambio
de los nmeros de ndice cuando se agregan o eliminan elementos.
Nota El uso del mtodo AddItem para agregar un elemento en una posicin especfica de la
lista puede romper el orden alfabtico, y los elementos agregados con posterioridad pueden no
ordenarse correctamente.
TabIndex

TabStop

Tag

Top

Visible

WhatsThisHelpID

Width

(*)

PROCEDIMIENTOS

Click
Change (Solo ComboBox)
DblClick
DropDown (Solo ComboBox)
GotFocus
KeyUp
LostFocus
MouseDown (Solo ListBox)
MouseUp (Solo ListBox)

DragDrop
DragOver
KeyDown
KeyPress
MouseMove (Solo ListBox)

NOTA MUY IMPORTANTE


El procedimiento Change del ComboBox solamente se efecta cuando el cambio se produce mediante
la entrada de un texto DESDE EL TECLADO, no por un cambio en la parte Text de este control,
producido al llevar un elemento desde la parte List a la parte Text.

CONTROLES HScrollBar y VScrollBar


Son dos controles similares, para introducir un dato cuasi-analgico en una aplicacin. Se toman
directamente de la caja de herramientas, y tienen un aspecto parecido al de un control de volumen de un
equipo de msica. El HScrollBar est en posicin horizontal, y el VScrollBar en posicin vertical.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 75

Mediante estos controles se pueden introducir datos variando la posicin del cursor.
PROPIEDADES de HScrollBar y VScrollBar
Las sealadas con (*) son comunes a ambos controles y no presentan novedades respecto a las ya
comentadas para los controles precedentes.

DragIcon

DragMode

Enabled

Height

HelpContextID

Index

(*)

LargeChange
Esta propiedad establece la variacin de la propiedad Value cada vez que se hace click en el interior de
la barra de desplazamiento, en la parte por donde pasa el cursor.
Left

(*)

Max
Esta propiedad establece el valor mximo para la propiedad Value, es decir, el valor de esta propiedad
cuando el cursor est en su parte mxima. (Recuerde que el cursor est en el mximo, cuando est mas
a la derecha, caso del HScrollBar, o cuando est en la parte mas baja, caso del HScrollBar.
Min
Esta propiedad establece el valor mnimo para la propiedad Value, es decir, el valor de esta propiedad
cuando el cursor est en su parte mnima. (Recuerde que el cursor est en el mnimo, cuando est mas
a la izquierda, caso del HScrollBar, o cuando est en la parte mas alta, caso del HScrollBar.
MouseIcon

MousePointer

Name

(*)

SmallChange
Esta propiedad establece la variacin de la propiedad Value cada vez que se hace click en las flechas
superior o inferior de la barra de desplazamiento.
TabIndex

TabStop

Tag

Top

(*)

Value
Esta propiedad lee o establece el valor dado por la posicin del cursor. Este valor tiene un mnimo,
establecido por Min y un mximo, establecido por Max. Esta propiedad es la que se debe leer para
conocer la posicin del cursor.
Visible

WhatsThisHelpID

Width

(*)

PROCEDIMIENTOS DE HScrollBar y VScrollBar


Change
KeyUp
LSB

DragDrop
LostFocus

DragOver
Scroll

Visual Basic Gua del Estudiante

Captulo 1

GotFocus

KeyDown

KeyPress

Pgina 76

Comentario
El Procedimiento Change se produce cuando, tras mover el cursor, se suelta el botn
del ratn. Esto produce el efecto de que el cambio que se tenga que producir con el movimiento del
cursor no se realiza de una manera continua. El procedimiento Scroll se realiza en el instante que se
est moviendo el cursor. Por lo tanto, es este procedimiento el que se debe usar para conseguir el efecto
de un cambio continuo mientras se est moviendo el cursor.

TIMER

TEMPORIZADOR

Este objeto permite establecer temporizaciones. Presenta una novedad respecto a los controles
estudiados hasta ahora. El control Timer solamente se ve durante el tiempo de diseo. En tiempo de
ejecucin, el control permanece invisible.
La temporizacin producida por el Timer es independiente de la velocidad de trabajo del ordenador.
(Casi independiente. El timer no es un reloj exacto, pero se le parece)
Se toma directamente de la caja de herramientas, y tiene el aspecto siguiente :

PROPIEDADES
Enabled

Index

(*)

Interval
El valor de esta propiedad nos dar el intervalo de tiempo (en milisegundos) en que se producir un
evento Timer y consecuentemente, realizar el procedimiento asociado a este evento. Si el valor de la
propiedad Interval est a 0 (Predeterminado), no se produce el evento Timer. (El control Timer est
deshabilitado cuando la propiedad Interval = 0)
Left

Name

Tag

Top

(*)

PROCEDIMIENTOS
Timer
Se produce cada vez que se cumple un intervalo completo.

CONTROL

SHAPE

Se toma directamente de la caja de herramientas :

Shape es un control grfico que se muestra como un rectngulo, un cuadrado, una elipse, un crculo, un
rectngulo redondeado o un cuadrado redondeado.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 77

Un control Shape no acta como contenedor de controles. (Esto quiere decir que un control Shape
nunca le servir, por ejemplo, para albergar varios OptionButton y pretender que sean independientes
de otros controles OptionButton que se encuentren fuera del control Shape.
Este control no tiene Procedimientos. En realidad, solamente sirve para mostrar un determinado grfico,
envolver grficamente a otros controles, pero no tiene ninguna aplicacin en cuanto a programa. Es un
adorno para sus aplicaciones.
PROPIEDADES
Backcolor

(*)

BackStyle
Esta propiedad establece si Shape permite ver a su travs (Transparent) o n lo permite (Opaque)
BorderColor
Establece el color del borde.
BorderStyle
Establece el tipo de borde. Puede ser : Transparent, (No se ve el borde), Solid, (Borde de lnea
continua),Dash, (lnea a rayas), Dot, (lnea a puntos), Dash-Dot, (lnea de raya - punto), dash-Dot-Dot,
(lnea de raya - punto - punto), InsideSolid, (raya continua)
El efecto de establecer la propiedad BorderStyle depende del valor de la propiedad BorderWidth. Si
BorderWidth no es 1 y BorderStyle no es 0 o 6, BorderStyle se establece como 1.
BorderWidth
Establece el ancho de la lnea.
DrawMode

FillColor

FillStyle

Height

Index Left

Name (*)

Shape
Establece la forma del control. Puede ser : Rectangular, cuadrado, redondo, ovalado, cuadrado con
esquinas redondeadas y rectangular con esquinas redondeadas.
Tag

Top

PROCEDIMIENTOS

Visible

Width

(*)

No tiene.

CONTROL LINE
Se toma directamente de la caja de herramientas

Line, al igual que Shape, es un control grfico que solamente sirve para poner una lnea en un
formulario. Del mismo modo, no tiene procedimientos, por lo que no sirve para aportar cdigo al
programa. Solo sirve para aportar una caracterstica grfica, es un adorno.
PROPIEDADES
BorderColor
Establece el color de la lnea.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 78

BorderStyle
Establece el tipo de lnea : Puede ser : Transparent, (No se ve la lnea), Solid, (Lnea continua),Dash,
(lnea a rayas), Dot, (lnea a puntos), Dash-Dot, (lnea de raya - punto), dash-Dot-Dot, (lnea de raya punto - punto), InsideSolid, (raya continua)
BorderWidth
Establece el ancho de la lnea.
DrawMode
X1, X2

Index
Y1, Y2

Left
Name
Tag
Visible
Establece las coordenadas y del inicio y final

(*)

PROCEDIMIENTOS
No tiene.
AADIR CONTROLES A LA CAJA DE HERRAMIENTAS
Los controles descritos hasta ahora son parte de los que aparecen en la caja de herramientas mas
elemental de Visual Basic. Estos, otros que se estudiarn en el captulo 4 (Controles para mostrar
imgenes), el control Data y el contenedor OLE que se estudiarn en la segunda parte del curso, son los
que estn incluidos en la caja de herramientas mas elemental. La razn es que estos controles vienen
como lo ms elemental de Visual Basic, como lo que es imprescindible para que funcione una aplicacin
realizada en VB. La pregunta es ahora, qu es lo ms elemental de VB?
Son tres DLLs, Visual Basic For Aplications (MSVBVM60.DLL), Visual Basic Runtime Objets And
Procedures (MSVBVM60.DLL\3) y Visual Basic Objets And Procedures (VB6.OLB). Una aplicacin, por
muy elemental que sea, necesita esos tres ficheros. Pero posiblemente no haya ninguna aplicacin
prctica que se pueda realizar con esos controles. Hay ms. Lo que ocurre es que hay que introducirlos
en la caja de herramientas. Para ello, basta con desplegar el men de Proyecto de la barra de men:

Eligiendo el elemento Componentes de este men desplegado nos muestra todos los componentes
existentes en el disco, que podremos sacar a nuestra caja de herramientas para poder utilizarlos. En la
siguiente figura puede ver el cuadro con los controles existentes en el PC del autor. Puede observarse
que est seleccionado el control Calendar, y en la parte de abajo puede verse la ubicacin y nombre del
fichero que contiene ese control (MSCAL.OCX). No todos los controles son de Microsoft. Observe que
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 79

hasta Kodak realiza (o le realizan) controles. Existen muchas empresas que venden controles, unas con
mejor calidad que otras. En este tema debe tener especial precaucin con los controles que se
distribuyen de forma gratuita por Internet. No utilice nunca un control adquirido por este procedimiento si
no tiene plena confianza en el origen del mismo y lo ha probado concienzudamente. Suelen fallar con
bastante frecuencia y, lgicamente, no tienen ninguna garanta. Sea prudente y utilice solamente
aquellos controles de firmas de reconocido prestigio, y que le puedan aportar garanta de
funcionamiento. Obviamente estos controles suelen ser de pago.

Estos controles que adquiere con posterioridad a la instalacin del Visual Basic hay que registrarlos.
No se asuste. No se trata de registrarlos ante el fabricante para poder utilizarlos. Se trata de introducirlos
en el registro de Windows. Con ello Windows conoce el CLSID de ese control, su ubicacin en el disco
duro (los controles suelen estar en C:\Windows\System, pero pueden estar en cualquir otra carpeta).
Windows necesita registrarlos para poder encontrarlos. Para registrar un control se utiliza el programa
Regsvr32.exe. Para registrar un control basta con ejecutar este programa, pasandole como parmetro el
nombre y ubicacin del control a registrar. Esto se hace en Inicio | Ejecutar. Por ejemplo, para registrar
el conjunto de controles VB_GuiaEst.Ocx introduciramos ese fichero Ocx en C:\Windows\System y a
continuacin ejecutamos:
regsvr32 c:\windows\system\ VB_GuiaEst.Ocx

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 80

El conjunto de todos los controles es la coleccin Controls


Ver a lo largo del curso que Visual Basic utiliza mucho las colecciones. Una de ellas es la coleccin
Controls, que es el conjunto de todos los controles existentes en un formulario.
Visual Basic trata a las colecciones como un objeto ms. As, las colecciones tienen sus propiedades.
No vamos a entrar en demasiados detalles de momento, pero una de las propiedades de todas las
colecciones en Count, que es precisamente el nmero de elementos que componen esa coleccin.
La numeracin de los elementos de una coleccin siempre va del 0 al n-1, siendo n el nmero de
elementos de esa coleccin.
Vamos a ver una expresin que nos puede ayudar mucho. Sirve para saber a que tipo de control
pertenece un determinado elemento. Esa expresin es TypeOf y siempre se debe usar con una
sentencia condicional If y aplicarla solamente sobre una variable tipo objeto. (No se preocupe al leer
esto, es muy fcil) (No se puede utilizar con Select Case)
Una variable tipo objeto es una variable que no contiene un dato numrico o string. Contiene un objeto.
Por ejemplo, un control.
Podemos declarar una variable como Control
Dim Pepe as Control
Pepe ser un control. Ahora podemos poner
Para cada valor que tome Pepe haciedole recorrer todos
los elementos de la coleccin Controls
' Si pepe es un TextBox .
' lo bloquea

For Each Pepe in Controls


If TypeOf Pepe Is TextBox Then
Pepe.Locked = True
End If
Next Pepe

Puede usar este cdigo para bloquear todos los TextBox de un formulario. Se mete en un procedimiento
llamado Bloquear (p.e.) y cada vez que queramos bloquear todos los TextBox del formulario basta con
citar a este procedimiento. Un cdigo similar sera
Dim I As Integer
For I = 0 To Controls.Count - 1
If TypeOf Controls(I) Is TextBox Then
Controls(I).Locked = True
End If
Next
(Observe que en la segunda versin, trabajamos directamente sobre los elementos de la coleccin, que
se distinguen unos de otros mediante el Indice colocado entre parntesis. En este caso, la variable I que
tomar los valores entre 0 y n-1)

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 81

Resumen de Propiedades de los controles Visual Basic


Caption

Ttulo

Es el texto del control o lo que figura en la barra de men del formulario. Puede cambiarse en tiempo de
ejecucin.
DragMode
Modo de iniciar una operacin de Drag & Drop
Establece un valor que determina si se usa el modo de arrastre manual o automtico en una operacin
de arrastrar y colocar. Los valores posibles de esta propiedad son:
0
1
DrawStile

Manual
Automtico

Estilo de dibujo

Establece el estilo de lnea de la salida de mtodos grficos:


Valores:
0 - Lnea continua
1 - Rayas
2 - Puntos
3 - Raya - Punto
4 - Raya - Punto - Punto
5 - Transparente
6 - Continuo interior.
DrawWidth

Ancho de la lnea

Establece el ancho de una lnea dibujada. El valor debe expresarse en pixeles.


Enabled

Activado

Propiedad Booleana. Si est en True, el formulario o control est activado y se puede interactuar con l.
Si est en False, se desactiva, impidiendo de esta forma, que se pueda trabajar con l. Puede variarse
en tiempo de ejecucin. Cuando un control est deshabilitado (Enabled = False), el control no tiene
efecto, y su apariencia vara, presentando un tono plido tanto en su cuerpo como en su ttulo.
FillStyle

Tipo de relleno

Establece el modo de rellenar controles Shape, o figuras (crculos o cuadrados) creados con los
mtodos grficos Circle y Line.
Valores:

FillColor

0 - Continuo
1 - Transparente
2 - Lnea Horizontal
3 - Lnea Vertical
4 - Diagonal hacia arriba
5 - Diagonal hacia abajo
6 - Cruzado
7 - Diagonal cruzada

Color de relleno

Especifica el color del relleno contemplado en FillStyle.


Font
Fuente
Es el tipo de letra para el ttulo o el texto del control. Puede cambiarse en tiempo de ejecucin.

FontSize

LSB

Tamao de letra

Visual Basic Gua del Estudiante

Captulo 1

Pgina 82

Establece el tamao de la letra que se usar en ese formulario o control (U otro objeto VB, p.e. el
Printer). Esta propiedad puede variarse en tiempo de ejecucin. El tamao debe expresarse en puntos.
Mximo, 2160 puntos.
FontBold, FontItalic, FontStrikethru, FontUnderline
Permiten, en tiempo de ejecucin, cambiar un texto a negrita, cursiva, tachado y subrayado. Son
propiedades Booleanas True / False
Height

Altura

Define la altura de un formulario o control. El valor de esta propiedad no se introduce normalmente como
un dato numrico, sino que toma el valor automticamente, dependiendo de las dimensiones del objeto
durante el tiempo de diseo. Puede cambiarse durante el tiempo de ejecucin.
HelpContextID

Nmero de Contexto

Establece un nmero de contexto asociado para este formulario. Este nmero se aplica para determinar
la ayuda interactiva asociada a este formulario o control. Vea mas adelante, el tema Ayuda de Windows.
Puede tomar los siguientes valores :
Index

0 - No se especifica nmero de contexto


>0 Un entero que especifique un contexto vlido.

Indice

En el caso de que se tengan varios controles que realicen una funcin similar (Las teclas numricas de
una calculadora, p.e.) puede hacerse un array con estos controles. Todos tendrn el mismo nombre, y se
diferencian por un ndice. La propiedad Index de ese control toma el nmero de ese ndice.
Left

Posicin de su parte izquierda.

Indica la posicin del control, concretamente de la parte izquierda del mismo. Normalmente esta
propiedad no se introduce numricamente, sino que la toma automticamente de la posicin que se le
de al control en tiempo de diseo. Puede cambiarse en tiempo de ejecucin.
MouseIcon

Valor por defecto: ninguno

Establece un icono personalizado para el puntero del ratn cuando est encima del Formulario o control.
Este icono puede ser un Bitmap de los existentes en el directorio Icons de Visual Basic o cualquiera que
tengamos. Si se pone 99 como valor de la propiedad MousePointer (siguiente), cada vez que el puntero
del ratn pase por este Formulario o control, cambiar su forma y adoptar la del icono elegido.
MousePointer

Valor por defecto: flecha

Determina la forma del puntero del ratn cuando se coloca encima del formulario o control. Puede
elegirse uno de los punteros preestablecidos (15 en total) o el personalizado visto en la propiedad
anterior. Para elegir ese icono personalizado, debemos poner en esta propiedad el valor 99.
TabIndex

N de orden para tabulador

Cuando disponemos de varios controles en un mismo formulario, solamente uno de ellos tiene el foco.
Esta expresin de tener el foco significa que ese control est remarcado y en esa condicin, si pulsamos
la tecla ENTER hara el mismo efecto que hacer click con el ratn en ese control, o, en el caso de un
TextBox, las letras pulsadas en el teclado van a ese TextBox.
Podemos variar el foco de un control a otro mediante la tecla TAB (TABulador).Esto es necesario, ya que
existen ordenadores que no disponen de ratn (tpico de algunos porttiles). En estos casos, para elegir
uno u otro control debemos pulsar repetidas veces la tecla TABulador. El foco ir cambiando de uno a
otro control (pueden ser controles de distinto tipo) cada vez que pulsemos la tecla TABulador. Esta
propiedad TabIndex marca el orden que seguir el foco a travs de cada control.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 83

TabStop

Sale del control de la tecla TAB

Propiedad Booleana. Cuando esta propiedad est a False, el botn no tomar el foco cuando se pulse la
tecla del Tabulador. Sin embargo sigue manteniendo el ndice de la propiedad TabIndex descrita
anteriormente. Puede cambiarse en tiempo de ejecucin. Esto nos permite descartar algn botn de
tomar el foco, cuando por facilidad para el usuario, sea conveniente en determinados puntos del
programa.
Tag

Valor auxiliar

Esta propiedad no la usa directamente Visual-Basic. Sirve para asociar al formulario informacin
adicional para fines externos a la programacin. Pero tambin le puede servir para almacenar en ella
una variable para que la use un cdigo ajeno al formulario. El autor de esta Gua del Estudiante tiene por
costumbre utilizar la propiedad Tag del formulario inicial para guardar el parmetro que se le pasa a
algunos programas para acceder a ellos con unos determinados privilegios. Resumiendo, est ah para
lo que el programador quiere.
Top

Posicin de la parte superior

Indica la coordenada de la parte superior del control. Puede variarse durante el tiempo de ejecucin.
Esta propiedad, juntamente con Left definen la esquina superior izquierda del botn de comando.
Normalmente esta propiedad no se introduce numricamente, sino que la toma automticamente de la
posicin que se le den al botn en tiempo de diseo. Puede cambiarse, cambiando el valor a esta
propiedad, en tiempo de ejecucin.
Visible
Propiedad Booleana. Asignndole el valor True al control o formulario, ser visible, y asignndole el
valor False, no se ver. Este valor puede cambiarse durante el tiempo de ejecucin para ocultar y hacer
visible el formulario o control correspondiente.
WhatsThisHelpID

(Propiedad, Windows 95)

Devuelve o establece un nmero de contexto asociado a un objeto. Se utiliza para dotar a las
aplicaciones de Ayuda interactiva con el men emergente Qu es esto? de la Ayuda de W 95.
Width

Ancho

Define la anchura del formulario o control. Normalmente no se introduce como valor numrico sino que lo
toma automticamente del tamao que tenga el formulario o control durante el tiempo de diseo.
Juntamente con Height define el tamao del objeto. Puede cambiarse durante el tiempo de ejecucin

RESUMEN DE LOS EVENTOS DE LOS OBJETOS VISUAL BASIC

Evento Click

Hacer Click con el botn izquierdo del ratn

Lo tienen casi todos los controles y el formulario. Es el evento habitual para introducir el cdigo que
queremos que realice el programa al hacer click sobre un determinado control. No es el nico evento
donde podemos hacerlo, pues tambin tenemos otros muy parecidos (MouseDown, MouseUp), pero que
funcionan de distinta forma. El evento Click en el formulario se efecta cada vez que pulsamos uno de
los botones del ratn. En los controles, slo con el botn izquierdo.
Si un control tiene el foco, se ejecutar su evento Click al pulsar ENTER o la barra espaciadora.
El evento Click no pasa parmetros
Evento DragDrop
LSB

Accin de Soltar durante el Drag & Drop

Visual Basic Gua del Estudiante

Captulo 1

Pgina 84

Se produce cuando se suelta el ratn sobre un formulario o control, durante una operacin de Drag &
Drop. Pasa los parmetros Source As Control, X As Single, Y As Single, donde Source es el control
donde se origin el Drag & Drop, y X e Y las coordenadas del puntero del ratn en el momento de soltar.
Vea el captulo de Drag & Drop
Evento DragOver
Arrastrar por encima
Ocurre cuando se pasa por encima de un formulario o control durante la operacin de Drag & Drop.
Pasa los parmetros Source As Control, X As Single, Y As Single, State As Integer. Los parmetros son
los mismos que en el procedimiento anterior. State es un entero que indica el estado de transicin del
puntero sobre el formulario. Toma los siguientes valores :
0 = Entra (El puntero del ratn est entrando al formulario o control).
1 = Deja (El puntero del ratn est saliendo del formulario o control).
2 = Sobre (El puntero del ratn se desplaza de una posicin a otra dentro del formulario o
control). Vea el captulo de Drag & Drop

Evento GotFocus Tomar el Foco


Ocurre este evento cuando el control toma el foco. Tomar el foco significa que se acaba de convertir en
el control activo. (por ejemplo, cuando llevamos el cursor y hacemos click sobre un Text Box. Hay
algunos controles que no tienen procedimiento GotFocus porque nunca toman el foco (Label, p.e.)
Evento KeyDown Pulsar una tecla (Ocurre cuando el control tiene el foco)
Se produce sobre el control que tiene el foco al pulsar una tecla, justo en el instante que llega a su
posicin inferior. Pasa como parmetros el KeyCode As Integer y el Shift As Integer. El KeyCode es el
cdigo de la tecla (no confundir con Keyascii, que es el cdigo de la letra. Hay teclas que no tienen
Keyascii y s tienen KeyCode F1, F2, ...Insert, ) Shift es la posicin de la tecla Maysculas (1=pulsada,
0=levantada)
Evento KeyPress Pulsar una tecla (Ocurre cuando el control tiene el foco)
Este evento se produce despus del KeyDown, y pasa como parmetro el KeyAscii As Integer, que es el
cdigo Ascii de la letra cuya tecla se ha pulsado.
Evento KeyUp Levantar la tecla pulsada (Ocurre cuando el control tiene el foco)
Ocurre al levantar la tecla, despus del KeyPress. Pasa como parmetros los mismos que KeyDown,
KeyCode As Integer, Shift As Integer
Estos tres eventos se producen tambin en el formulario (y antes que en el control), si el formulario tiene
la propiedad KeyPreview = True
LinkClose
LinkError
LinkNotify
LinkOpen
Son eventos relacionados con el DDE (Intercambio Dinmico de Datos). Ocurren respectivamente
cuando se cierra el enlace DDE, cuando ocurre un error en el enlace, cuando han cambiado los datos en
origen y en destino se ha establecido la propiedad LinkMode a Notify, y cuando se inicia una
conversacin DDE. Vea el captulo dedicado al DDE para mas detalles.
LostFocus
Ocurre cuando el control pierde el foco. Este evento es muy importante, por ejemplo en un Text Box,
para dar el formato adecuado al texto contenido en ese Text Box, o para comprobar que es correcto, etc.
MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Se ejecuta en el instante de apretar el botn de mouse, cuando est el puntero encima del formulario o
control correspondiente. Pasa como parmetros el botn pulsado (1= izquierdo, 2 = derecho, 3 = centro),
la tecla maysculas (Shift=1 significa pulsada, =0 no pulsada) y las coordenadas X e Y del puntero del
ratn.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 85

MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)


Se ejecuta cuando pasa por encima del formulario o0 control el puntero del ratn
MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Similar a MouseDown, pero cuando se levanta el botn.

Existen mas eventos. No se van a mencionar aqu todos, pues se irn viendo segn avance el curso.

Y no se preocupe si este capitulo le ha resultado muy pesado. Les pasa a todos. El prximo va a ser
mas divertido.

Visual Basic - Gua del Estudiante Cap. 3


Controles (Continuacin) El CommonDialog
CONTROLES DE BUSQUEDA DE FICHEROS

El CommonDialog es un control del que se libran muy pocas aplicaciones. Dada la importancia de este
control, se le dedicaba en versiones anteriores de la Gua del Estudiante un capitulo nico. En esta
edicin se le a anexado el estudio sobre los controles para la bsqueda de ficheros. El conocimiento de
este captulo es fundamental si desea llegar a ser un buen programador de VB.
CUADRO DE DIALOGO

CommonDialog

Normalmente se encuentra en la caja de herramientas

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 86

Este control no se presenta en tiempo de diseo mas que con un simple icono :

El cuadro de dilogo, CommonDialog se utiliza para varias funciones :


Abrir Ficheros
Guardar Ficheros
Elegir colores
Seleccionar Impresora
Seleccionar Fuentes

CommonDialog mostrando la funcin Abrir. Ntese el icono para crear nueva carpeta, objeto del
comentario siguiente.
En realidad el cuadro de dilogo permite conocer datos con los cuales, y mediante el cdigo adecuado,
abriremos o guardaremos ficheros, elegiremos colores o seleccionaremos fuentes. Es decir, el
CommonDialog NO realiza mas funciones que mostrar ficheros existentes, fuentes disponibles, colores,
para que, mediante cdigo, abramos esos ficheros o usemos una determinada fuente.
La expresin anterior se ha recuadrado porque ya no es completamente cierta. El CommonDialog no es
un control propio de Visual Basic, sino de Windows. Y la versin de este control que Windows pone en
W98 permite que pueda crear una nueva carpeta. Ya hace algo directamente. No se extrae que el
CommonDialog empleado en su aplicacin pueda crear una nueva carpeta sin que Vd. lo haya diseado
para eso. Al introducir el control en la aplicacin est introduciendo la versin ms moderna del mismo.
Dependiendo de la aplicacin para la que vaya a usarse se deber activar de distintas formas. Si el
cuadro de dilogo se va a usar para seleccionar la impresora y para otras aplicaciones, es
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 87

recomendable usar uno exclusivamente para seleccionar la impresora.


Esta ltima recomendacin se debe a que, para el control de la impresora, el CommonDialog SI realiza
las funciones de seleccin de impresora predeterminada. Esta diferencia operativa hace que si usamos
el mismo CommonDialog para seleccionar impresora y abrir ficheros, por ejemplo, se cuelgue el
CommonDialog.
El control CommonDialog es un control personalizado (Microsoft CommonDialog Control
COMDLG32.OCX), y como casi todos los controles personalizados presenta un asistente de
propiedades propio. Puede accederse a las propiedades mediante el cuadro de propiedades tpico de
otros controles, o mediante el asistente, pulsando el botn derecho del ratn con el puntero colocado
encima del icono del cuadro de dilogo.
Analizando las propiedades, vemos que tiene gran cantidad de ellas. Esto es porque agrupa todas las
propiedades correspondientes a la cinco funciones que puede desarrollar. Se detalla a continuacin la
forma de usar el CommonDialog para cada aplicacin.
Se entiende que el nombre - Name - que se ha puesto para el cuadro de dilogo en todos los ejemplos
es CD1)
CUADRO DE DIALOGO MOSTRANDO FUENTES
Para mostrar el cuadro de dilogo correspondiente a Tipos de Letra ( Fonts ), debe ejecutarse la
instruccin:
CD1.ShowFont
y haber puesto, en la propiedad Flags del cuadro de dilogo, el valor de 1, 2 3, correspondiente
respectivamente a los tipos de letra de la pantalla, de la impresora o ambos. (Vase la propiedad Flags
mas adelante) Si no pone uno de estos valores, le dir que no tiene fuentes instaladas.

Los valores que se pueden obtener de este cuadro de dialogo son:


CD1.FontName
Indica el nombre de la fuente
CD1.FontSize
Indica el tamao de la fuente
CD1.Color
Indica el color de la fuente (Abrir con Flags=256+1, 2 3)
CD1.FontBold = (True / False) Si es True, se ha elegido "Negrita"
CD1.FontItalic = (True / False) Si es True, se ha elegido "Cursiva"
CD1.FontStrikethru = (True / False)
Si es True, se ha elegido "Tachada "
CD1.FontUnderline = (True / False)
Si es True, se ha elegido "Subrayada"
Si se elige una versin Negrita Cursiva seran True las opciones FontBold y FontItalic
El cuadro de dilogo que se presenta es el siguiente: (CommonDialog Mostrando fuentes, con la

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 88

propiedad Flags = 263)

El objeto Font no puede aplicarse al CommonDialog. Es decir, no podemos poner :


Variable = CD1.Font.Size
sino
Variable = CD1.Fontsize
En el ejemplo que acompaa a este captulo, puede ver como se introducen las caractersticas de una
determinada fuente elegida en un cuadro de texto.
Programa de ejemplo. Mediante un CommonDialog elegimos el tipo de letra de un TextBox (TbPrueba)
y escribimos un texto de prueba con todas las letras del abecedario.
Private Sub BMostrarFonts_Click()
CD1.Flags = 259
'Muestra las fuentes de la pantalla (1), las de la impresora (2)y muestra las opciones de
'tachado, subrayado y color (256) 1 + 2 + 256 = 259
CD1.ShowFont
TbPrueba.FontName = CD1.FontName
TbPrueba.FontSize = CD1.FontSize
TbPrueba.FontBold = CD1.FontBold
TbPrueba.FontItalic = CD1.FontItalic
TbPrueba.FontUnderline = CD1.FontUnderline
TbPrueba.FontStrikethru = CD1.FontStrikethru
If TbPrueba = "" Then
TbPrueba = "Texto de prueba" & vbCrLf & vbCrLf
TbPrueba = TbPrueba & "The Quick Brown Fox Jumps Over The Lazy Dog 1234567890"
End If
End Sub

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 89

CUADRO DE DIALOGO MOSTRANDO COLOR


Para mostrar el cuadro de dilogo correspondiente al color, se deber ejecutar la instruccin:
CD1.ShowColor
El cuadro de dilogo puede tener una de estas dos formas (Dependiendo de su propiedad Flags):

(Si la parte derecha del cuadro no sale, se saca haciendo click en Definir colores personalizados.)
El nmero correspondiente al color elegido se puede conocer analizando la propiedad color de cuadro de
dilogo. En nuestro ejemplo, lo obtendramos con
Variablecolor = CD1.Color
donde Variablecolor contendr un nmero correspondiente al color elegido. Variablecolor debe
declararse como tipo Long
Programa de ejemplo. Mediante un CommonDialog elegimos el color de fondo de un TextBox
(TbPrueba).
Private Sub BColores_Click()
CD1.Flags = 2
'Hace que el cuadro de dilogo se muestre completo
CD1.ShowColor
TbPrueba.BackColor = CD1.Color
End Sub

Nota acerca del nmero del color.


Para establecer un color por medio de cdigo, se pondr un valor de color a la propiedad
correspondiente de ese objeto. El valor del color puede establecerse de tres formas que se comentan a
continuacin.
Colores en Visual Basic.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 90

Visual Basic acepta para especificar un color, tres procedimientos: Mediante el nmero de color,
mediante la sentencia RGB ( rojo, verde, azul ) o mediante la funcin QBColor.
Por nmero
El nmero que representa el color en VB est formado por la suma de la componente roja, la
componente verde y la componente azul. Podramos verlo muy bien en numeracin Hexadecimal:
Color = Hex XX YY ZZ
Donde ZZ es un nmero Hexadecimal que representa la cantidad del color rojo. El mnimo estara en 0
(H00) y el mximo en 255 (HFF)
YY representara la cantidad de color verde y XX la de color azul, ambos con los mismos lmites
explicados para el rojo.
Por ejemplo:

el rojo puro sera:


el verde puro sera:
el azul puro sera:

Hex(0000FF) = 255
Hex(00FF00) = 652280
Hex(FF0000) = 16711680

Una mezcla de un poco de rojo (HB1), otro poco de verde (H56) y otro poco de azul (H1F) dara el
siguiente nmero:
Hex(1F56B1) = 2053809
El nmero de color puede estar comprendido entre 0 (correspondiente al negro) y el 16777215
(correspondiente al blanco. Observe que esa cantidad, 16.777.215 (FFFFFF en hexadecimal)
corresponde a los famosos 16 millones de colores de las tarjetas grficas.
Si queremos poner el color de fondo a un control Label, usaremos la propiedad Backcolor. Si el Label se
llama Label1, pondramos la instruccin
Label1.Backcolor = 12345678
Por la sentencia RGB
Se puede expresar el color, poniendo simplemente RGB (rojo, verde, azul), donde rojo es un nmero
entre 0 y 255 que indica la cantidad de color rojo que se aporta al color, verde un nmero comprendido
entre 0 y 255 indicando la cantidad de verde, y lo mismo para azul.
Esta es la forma mas sencilla de poner la propiedad color, y con la que mejor controlaremos el mismo.
Si queremos poner al Label anterior un color mediante la sentencia RGB, ejecutaramos la sentencia :
Label1.Backcolor = RGB (128, 30, 100)
Mediante la Funcin QBColor (Obsoleta. Se introduce por motivos de compatibilidad)
Esta funcin se ha puesto en Visual Basic para compatibilidad con los colores que se usan en QuickBasic y Qbasic. Mediante esta funcin se obtienen solamente 16 colores.
Sintaxis

Objeto.QBColor(color)

El argumento color es un nmero entero entre 0 a 15, segn la siguiente lista:


Nmero Color

Nmero Color

0
1
2

8
9
10

LSB

Negro
Azul
Verde

Gris
Azul claro
Verde claro

Visual Basic Gua del Estudiante

Captulo 1

Pgina 91

3
4
5
6
7

Aguamarina
Rojo
Fucsia
Amarillo
Blanco

11
12
13
14
15

Aguamarina claro
Rojo claro
Fucsia claro
Amarillo claro
Blanco brillante

Para el mismo Label anterior, usaramos la sentencia :


Label1.Backcolor = QBColor (12)
Fin de la nota acerca del nmero del color

CUADRO DE DIALOGO MOSTRANDO IMPRESORAS


Nota: Si utiliza un CommonDialog para impresoras y otras aplicaciones, puede tener problemas. Utilice
un CommonDialog exclusivamente para impresoras.
Para presentar el cuadro de eleccin de impresora, ejecute la instruccin:
CD2.ShowPrinter
(A este cuadro de dialogo le hemos llamado CD2 para evitar los problemas referidos en la nota).
Aparecer el siguiente cuadro de dilogo:

La impresora elegida puede conocerla llamando a la propiedad DeviceName de un objeto que an no


hemos visto: el objeto Printer. Este objeto es el encargado de pasar al Administrador de Impresin todos
los trabajos de impresin que generen las aplicaciones Visual Basic:
Nombredelaimpresora = Printer.DeviceName
Para que la impresora quede como impresora por defecto de Windows, debe tener a True la propiedad
PrinterDefault del cuadro de dilogo.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 92

El cuadro mostrado para la impresora depender de la impresora que tenga instalada en su ordenador,
por lo puede observar diferencias respecto a la figura mostrada anteriormente.
Programa Ejemplo. Muestra el cuadro de dialogo de impresoras
Private Sub BImpresora_Click()
CD1.ShowPrinter
End Sub

EL COMMONDIALOG PARA ABRIR Y GUARDAR ARCHIVOS


Posiblemente las opciones mas usadas del cuadro de dilogo. Para presentar el cuadro de dilogo
correspondiente a Abrir Archivo, debe ejecutar la instruccin:
CD1.ShowOpen
Si lo que necesita es abrir el cuadro de dilogo para guardar un fichero, debe ejecutar la instruccin :
CD1.ShowSave
pero antes deber introducir el filtro o filtros de archivos que necesite. Ojo, ANTES !
Un filtro sirve para que en el cuadro de dilogo se presenten solamente los ficheros de nuestro inters.
Se pueden seleccionar por el nombre, la extensin o las dos cosas. La sintaxis para introducir un filtro es
la siguiente:
CD1.Filter = "Descripcin del fichero|nombre.extensin"
donde "nombre" puede ser un nombre o usar caracteres comodn. Lo mismo para "extensin"
Por ejemplo, para buscar archivos ejecutables, con cualquier nombre y extensin .EXE
CD1.Filter = "Ficheros ejecutables |*.exe"
Observe el carcter separador entre la descripcin de los ficheros (Ficheros ejecutables) y el parmetro
de busca (*.EXE). No ponga ningn espacio entre el separador y los caracteres de busca. El separador
es el carcter ASCII 124.
Puede buscar varios tipos de ficheros, separando los caracteres de busca por medio del carcter punto y
coma (;)
CD1.Filter = "Ficheros ejecutables |*.EXE;*.COM;*.BAT"
Puede tambin introducir dos filtros, separados por el separador | (En una lnea solamente).
CD1.Filter=Ficheros de un tipo |*.EXE |Ficheros de otro |*.COM |Otros ficheros |*.BAT
Por ejemplo :

CD1.Filter = "Ficheros Word |*.DOC|Ficheros Write |*.WRI"

No se pueden poner dos lneas con filtros, se quedara solamente con la ltima !
En este caso, cuando se presente el cuadro de dilogo, solamente presentar uno de los filtros, y deber
seleccionar manualmente el otro en un cuadro situado en la parte inferior izquierda del cuadro de
dilogo. Para predeterminar cul de los dos filtros saldr sin tener que seleccionarlo, deber ejecutar
esta instruccin, ANTES de invocar el cuadro de dilogo
CD1.FilterIndex = 2
En este caso, aparecer por defecto el filtro escrito en segundo lugar. El orden de los filtros comienza
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 93

por 1.
El cuadro de dilogo deber presentar un directorio. Este directorio con el que, por defecto, aparece el
cuadro de dilogo, se puede introducir mediante la propiedad InitDir, que deber contener el nombre del
directorio y su path. Si no se especifica, comenzar por el directorio actual.
Para conocer el nombre del fichero elegido, se emplea la propiedad FileName :
Nombrefichero= CD1.filename
El nombre del fichero, Nombrefichero en la sentencia anterior, viene con su path, es decir, nombre y
direccin completa, por lo que puede emplearse directamente la salida del CommonDialog para abrir un
fichero.
El cuadro de dilogo de abrir o cerrar tiene esta forma :

El cuadro de guardar es similar. Observe que en este caso hemos desplegado la segunda opcin de
filtro de ficheros :

Como ve ambos cuadros son prcticamente iguales. Solamente se difieren en que uno pone Abrir y el
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 94

otro Guardar como en su barra de ttulo. Tambin en que el cuadro Guardar como presenta los
nombres de los ficheros con un tono apagado. Funcionalmente difieren. Por ejemplo, si quiere guardar
un fichero con un nombre ya existente, y dependiendo de la propiedad Flags que ver mas adelante, le
aparecer la siguiente advertencia :

Si desea otra leyenda en la barra de ttulo, puede cambiarla usando el asistente de propiedades, que lo
obtendr colocando el cursor del ratn sobre el icono del CommonDialog y pulsando el botn derecho.
Haga click sobre Propiedades en el popmen que se presenta. Aparecer esto :

PRESENTAR AYUDAS
Mediante el CommonDialog se puede presentar un fichero de ayuda. (Ficheros del tipo .HLP de
Windows)
Pese a que se pueden presentar estos ficheros basndonos en el CommonDialog, es preferible
usar directamente el programa WinHelp.Exe, que puede ejecutarlo mediante la funcin Shell :
VariableID = Shell (WinHelp.Exe FicheroAyuda.hlp,1)
Para mostrar el fichero de ayuda debe poner el nombre (y Path) del fichero de ayuda en la propiedad
HelpFile del CommonDialog
CD1.HelpFile = "C:\MiCarpeta\MiFicheroAyuda.HLP"
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 95

Puede mostrar el ndice, o una pgina concreta de ese fichero. Para ello debe jugar con la propiedad
HelpCommand, que le va a indicar al CommonDialog qu ayuda debe mostrar.
CD1.HelpCommand =Valor
Las opciones para valor son:
1

2
3

4
5
5

257

258
261

&H1
cdlContext
Muestra la Ayuda de un contexto determinado. Cuando se usa esta valor, tambin se debe
especificar un contexto con la propiedad HelpContext.
&H2
cdlQuit
Notifica a la aplicacin Ayuda que el archivo de Ayuda especificado ya no se est utilizando.
&H3
cdlContents
Muestra el tema de contenido de ayuda, definido con la opcin Contents de la seccin
[OPTION] del archivo .HPJ.
&H3
cdlIndex
Muestra el ndice del archivo de Ayuda especificado. Las aplicaciones slo deben utilizar este
valor para un archivo de Ayuda con ndice nico.
&H4
cdlHelpOnHelp
Muestra la Ayuda para utilizar la propia aplicacin Ayuda.
&H5
cdlSetContents
Determina el tema de contenido a mostrar cuando el usuario presiona la tecla F1.
&H5
cdlSetIndex
Establece el contexto especificado en la propiedad HelpContext como ndice actual para el
archivo especificado en la propiedad HelpFile. Este ndice seguir siendo el actual hasta que el
usuario acceda a un archivo de Ayuda distinto. Utilice este valor slo para los archivos de Ayuda
con ms de un ndice.
&H8
cdlContextPopup
Muestra en una ventana emergente un tema de Ayuda determinado, identificado por un nmero
de contexto definido en la seccin [MAP] del archivo .HPJ.
&H9
cdlForceFile
Asegura que WinHelp muestre el archivo de Ayuda correcto. Si se muestra el archivo correcto,
no sucede nada. Si se muestra un archivo incorrecto, WinHelp abrir el correcto.
&H101 cdlKey
Muestra la Ayuda sobre una palabra reservada determinada. Al usar esta opcin, deber
especificar tambin una palabra reservada con la propiedad HelpKey.
&H102 cdlCommand
Ejecuta una macro de Ayuda.
&H105 cdlPartialKey
Muestra el tema de la lista de palabras claves que coincide con la palabra pasada en el
parmetro dwData, si slo se encuentra uno. Si se encuentra ms de uno, aparecer el cuadro
de dilogo Buscar mostrando los temas encontrados en el cuadro de lista Ir a. Si no se
encuentra ninguno, se mostrar el cuadro de dilogo Buscar. Para que aparezca el cuadro de
dilogo Buscar sin pasar una palabra reservada, utilice un puntero largo a una cadena vaca.

Si queremos que se muestre el ndice de la ayuda, pondramos esta propiedad de la forma :


CD1.HelpCommand = cdlHelpIndex
Para mostrar la pgina que se ha puesto en el fichero de ayuda como Contexto 2 (En Seccin [MAP] del
fichero .HPJ (Vea Creacin de Ficheros de Ayuda),
CD1.HelpCommand = cdlHelpContext
CD1.HelpContext = 2
Para mostrar la Ayuda de la Ayuda de Windows :
CD1.HelpCommand = cdlHelpHelpOnHelp
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 96

Una vez establecidas estas propiedades, mostraremos la ayuda con el Mtodo ShowHelp
CD1.ShowHelp
Repitindole que no se debe usar el CommonDialog para mostrar ayudas, pero para cumplir el objetivo
de plasmar en este texto la mayor informacin acerca de cada control, se enumeran a continuacin el
resto de propiedades que afectan a la presentacin de ayuda :
HelpFile
HelpContext
HelpKey

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 97

PROPIEDADES DEL CommonDialog


La Propiedad Action
La propiedad Action se incluye en la versin 4 de VB solamente por motivos de compatibilidad con
anteriores versiones. Realiza las mismas funciones que ShowFont, ShowColor, ShowPrinter,
ShowOpen y ShowSave. No debe usarse esta propiedad, sino los equivalentes citados, en previsin de
que pueda ser eliminada en futuras versiones.
La sintaxis de Action es :

Nombre.Action [= valor]

Valor

Descripcin

0
1
2
3
4
5
6

Ninguna accin.
Muestra el cuadro de dilogo Abrir.
Muestra el cuadro de dilogo Guardar como.
Muestra el cuadro de dilogo Color.
Muestra el cuadro de dilogo Fuente.
Muestra el cuadro de dilogo Impresora.
Ejecuta WINHELP.EXE.

NO utilice la propiedad Action. Utilice en su lugar ShowFont, ShowPrinter, ShowSave, ShowOpen ,


ShowColor y ShowHelp
CancelError
Devuelve o establece un valor que indica si se genera un error cuando el usuario elige el botn
Cancelar.
Sintaxis :
True
False

objeto.CancelError = (True / False)

Se genera un error.
(Predeterminado) No se genera ningn error.

Cuando se establece True en esta propiedad, se producir el error nmero 32755 (cdlCancel)
cada vez que el usuario elija el botn Cancelar.
Debe poner esta propiedad a true cuando quiera detectar que se ha pulsado el botn
CANCELAR. Luego, debe detectar con la rutina de deteccin de errores adecuada, si el error
producido ha sido el 32755. De ser as, es que han pulsado ese botn, y Vd. proceder en
consecuencia.
Color
Esta propiedad es de lectura / escritura
De escritura :Establece el color predeterminado con que aparecer el CD para elegir
color. Puede introducirse como RGB o numricamente, como se explic mas atrs. Para que
aparezca este color predeterminado, debe poner la propiedad Flags a 1.
De lectura : Entrega el color elegido, bien en el cuadro de eleccin de color, bien en el
cuadro de eleccin de fuente.
Copies
Establece el valor predeterminado para nmero de copias que aparecer en el CD cuando se
abra para elegir impresora.
DefaultExt
Devuelve o establece la extensin de archivo predeterminada para el cuadro de dilogo.
Sintaxis
LSB

objeto.DefaultExt [= cadena]

Visual Basic Gua del Estudiante

Captulo 1

Pgina 98

Puede utilizar esta propiedad para especificar una extensin de archivo predeterminada, como
por ejemplo .TXT o .DOC.
Importante para el CommonDialog de Guardar: Cuando se guarde un archivo sin extensin,
se le agregar automticamente la especificada en esta propiedad.
DialogTitle
Devuelve o establece la cadena mostrada en la barra de ttulo del cuadro de dilogo.
Sintaxis

Nombre.DialogTitle [= ttulo]

Esta propiedad puede introducirse en la ventana de propiedades, o por programa. Puede utilizar
esa propiedad para mostrar el nombre del cuadro de dilogo en la barra de ttulo.
Nota El control CommonDialog ignora el valor de la propiedad DialogTitle cuando muestra los
cuadros de dilogo Color o Fuente.
El ttulo predeterminado para un cuadro de dilogo Abrir es Abrir, y para un cuadro de dilogo
Guardar como es Guardar como.
FileName
Devuelve o establece la ruta y el nombre de archivo de un archivo seleccionado. La lectura de
esta propiedad devuelve el nombre del archivo seleccionado actualmente en la lista. Si no hay
ningn archivo seleccionado, FileName devuelve una cadena vaca.
Filter
(Explicada mas atrs)
Devuelve o establece los filtros que aparecen en el cuadro de lista Tipo de un cuadro de dilogo.
Sintaxis

CD1.Filter [= descripcin1 |filtro1 |descripcin2 |filtro2...]

Utilice el smbolo de canalizacin ( | , (ASCII 124) ) para separar los valores de descripcin y de
filtro. No incluya espacios antes ni despus del smbolo de canalizacin, pues apareceran en los
valores de descripcin y valor.
Al especificar ms de un filtro en un cuadro de dilogo, utilice la propiedad FilterIndex para
especificar el filtro predeterminado.
Nota para los que no tiene teclado de 102 teclas. Para obtener el carcter ASCII 124, pulse la tecla ALT
y, sin dejar de pulsarla, teclee 124 en el teclado numrico.
FilterIndex
Devuelve o establece un filtro predeterminado para un cuadro de dilogo Abrir o Guardar Como.
Sintaxis

CD1.FilterIndex [= nmero]

Esta propiedad indica el filtro predeterminado cuando se han especificado varios filtros para un
cuadro de dilogo Abrir o Guardar. El ndice del primer filtro definido es 1.
Flags

Propiedad que tiene distintos significados para cada tipo de cuadro de dilogo.
Tiene la misma sintaxis para todos los cuadros.
Sintaxis

CD1.Flags [= valor]

El parmetro valor establece distintas alternativas, dependiendo de cada cuadro.

Para el cuadro de dilogo Color


LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 99

Las opciones para valor son:

&H1& cdlRGBInit
Establece como valor de color inicial para el cuadro de dilogo el indicado en su propiedad
Color.

&H2& cdlFullOpen
Hace que el cuadro de dilogo se muestre completo al crearlo, incluyendo la seccin que
permite al usuario crear colores personalizados. Sin esta opcin, el usuario debe elegir el botn
de comando Definir colores personalizados para mostrar tal seccin.

&H4& cdlPreventFullOpen
Desactiva el botn de comando Definir colores
colores.

personalizados, evitando que el usuario defina

&H8& cdlShowHelp
Hace que el cuadro de dilogo muestre un botn Ayuda.

Se pueden poner varias de estas condiciones, poniendo como valor Flags la suma de los valores de
cada una de las condiciones a poner.
Para los cuadros Abrir y Guardar
Las opciones para valor son:
1

4
8

16
256

512

1024

2048

4096
LSB

&H1& cdlReadOnly
Hace que la casilla de verificacin Slo lectura aparezca marcada inicialmente al crear el cuadro
de dilogo. Este indicador tambin seala el estado de la casilla Slo lectura cuando el cuadro
de dilogo est cerrado.
&H2& cdlOverwritePrompt
Hace que el cuadro de dilogo Guardar como genere un cuadro de mensaje si el archivo
seleccionado ya existe. El usuario deber confirmar que desea sobrescribir el archivo.
&H4& cdlHideReadOnly
Oculta la casilla de verificacin Slo lectura.
&H8& cdlNoChangeDir
Hace que el cuadro de dilogo restablezca como directorio actual el que lo era en el momento de
abrirse.
&H10& cdlShowHelp
Hace que el cuadro de dilogo muestre el botn Ayuda.
&H100&
cdlNoValidate
Especifica que el cuadro de dilogo comn permita caracteres no vlidos en el nombre de
archivo devuelto. Funciona tanto con el cuadro de Abrir como con el de Cerrar. Tenga cuidado a
la hora de crear un archivo con nombre no vlido !
&H200&
cdlAllowMultiselect
Especifica que el cuadro de lista Nombre de archivo admita selecciones mltiples. El usuario
puede seleccionar ms de un archivo en tiempo de ejecucin presionando la tecla MAYS y
utilizando las teclas FLECHA ARRIBA y FLECHA ABAJO para seleccionar los archivos
deseados. Al hacerlo, la propiedad FileName devolver una cadena con los nombres de todos
los archivos seleccionados. Los nombres estn delimitados en la cadena con espacios.
&H400&
cdlExtensionDifferent
Indica que la extensin del nombre de archivo devuelto es distinta de la especificada en la
propiedad DefaultExt. Este indicador no estar activado si la propiedad DefaultExt es Null, si las
extensiones coinciden, o si el archivo no tiene extensin. El valor de este indicador puede
comprobarse al cerrar el cuadro de dilogo.
&H800&
cdlPathMustExist
Especifica que el usuario slo pueda introducir una ruta de acceso vlida. Si se establece este
indicador y el usuario introduce una ruta no vlida, aparecer un mensaje de advertencia.
&H1000&
cdlFileMustExist
Visual Basic Gua del Estudiante

Captulo 1

Pgina 100

Especifica, para el cuadro de Abrir, que el usuario slo pueda escribir en el cuadro de texto
Nombre de archivo nombres de archivos existentes. Si este indicador est activado y el usuario
introduce un nombre de archivo no vlido, aparecer una advertencia. Este indicador activa
automticamente cdlPathMustExist.
8192 &H2000&
cdlCreatePrompt
Especifica, para el cuadro de dilogo de abrir, que si no existe el fichero consulte al usuario
antes de crear un archivo que no existe actualmente. Esta advertencia dice : Este Archivo no
existe desea crearlo ? y aparecen los botones de ACEPTAR y CANCELAR. Si el usuario pulsa
aceptar el CommonDialog se cierra normalmente, si se le pulsa CANCELAR desaparece esta
advertencia y el CommonDialog espera a que se le escriba o seleccione otro fichero. Este
indicador establece automticamente los indicadores cdlPathMustExist y cdlFileMustExist.
16384 &H4000&
cdlShareAware
Especifica que se ignoren los errores al compartir archivos.
32768 &H8000&
cdlNoReadOnlyReturn
Especifica que el archivo devuelto no tenga el atributo de Slo lectura ni est en un directorio
protegido contra escritura. Presenta un aviso (tanto en el cuadro de abrir como en el cerrar) que
impide elegir un fichero de estas caractersticas.
Se pueden poner varias de estas condiciones, poniendo como valor Flags la suma de los valores de
cada una de las condiciones a poner.
Para el cuadro Mostrar Fuentes:
Las opciones para valor son:
1
2

4
256
1024

2048

&H1& cdlScreenFonts
Hace que el cuadro de dilogo muestre solamente las fuentes de pantalla que admite el sistema.
&H2& cdlPrinterFonts
Hace que el cuadro de dilogo muestre solamente las fuentes que admite la impresora,
especificadas por la propiedad hDC.
&H3& cdlBoth
Hace que el cuadro de dilogo muestre las fuentes de impresora y de pantalla disponibles. La
propiedad hDC identifica el contexto de dispositivo asociado a la impresora
&H4& cdlShowHelp
Hace que el cuadro de dilogo muestre un botn Ayuda.
&H100&
cdlEffects
Especifica que el cuadro de dilogo permita efectos de tachado, subrayado y color.
&H400&
cdlANSIOnly
Especifica que el cuadro de dilogo slo permita seleccionar las fuentes que utilizan el juego de
caracteres de Windows. Si se establece este indicador, el usuario no podr seleccionar una
fuente que slo contenga smbolos.
&H800&
cdlNoVectorFonts
Especifica que el cuadro de dilogo no permita seleccionar fuentes vectoriales.

4096

&H1000&
cdlNoSimulations
Especifica que el cuadro de dilogo no permita simulaciones de fuente de interfaz de dispositivo
grfico (GDI).

8192

&H2000&
cdlLimitSize
Especifica que el cuadro de dilogo seleccione slo los tamaos de fuente comprendidos en el
rango especificado por las propiedades Min y Max.

16384 &H4000&
cdlFixedPitchOnly
Especifica que el cuadro de dilogo seleccione slo fuentes de espaciado fijo.
32768 &H8000&
cdlWYSIWYG
Especifica que el cuadro de dilogo permita seleccionar solamente fuentes disponibles al la vez
en la pantalla y en la impresora. Si se establece este indicador, tambin deben establecerse
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 101

cdlBoth (sume 3 a este nmero) y cdlScalableOnly (sume 131072 a este nmero)


65536 &H10000&
cdlForceFontExist
Especifica que aparezca un cuadro de mensaje cuando el usuario intente seleccionar una fuente
o un estilo que no existan.
131072 &H20000&
cdlScalableOnly
Especifica que el cuadro de dilogo permita seleccionar solamente fuentes escalables.
262144 &H40000&
cdlTTOnly
Especifica que el cuadro de dilogo permita seleccionar solamente fuentes TrueType.
Nota Antes de mostrar el cuadro de dilogo Fuentes, debe establecer cdlScreenFonts,
cdlPrinterFonts o cdlBoth en la propiedad Flags. En caso contrario, se producir el error No hay fuentes.
(O dicho de otra forma, Flags=1, 2 3)
Se pueden poner varias de estas condiciones, poniendo como valor Flags la suma de los valores de
cada una de las condiciones a poner.
Para el Cuadro de Dilogo Imprimir
(Observar seguramente que lo que se describe a continuacin no se cumple siempre. Depende de las
impresoras que tenga Vd. instaladas)
Las opciones para valor son:
0
1

2
4
8
16
32

64

128

&H0& cdlAllPages
Devuelve o establece el estado del botn de opcin Todas las pginas.
&H1& cdlSelection
Devuelve o establece el estado del botn de opcin Seleccin. Si no se especifica
cdlPageNums ni cdlSelection, el botn de opcin Todas estar seleccionado.
&H2& cdlPageNums
Devuelve o establece el estado del botn de opcin Pginas.
&H4& cdlNoSelection
Desactiva el botn de opcin Seleccin.
&H8& cdlNoPageNums
Desactiva el botn de opcin Pginas y el control de edicin asociado.
&H10& cdlCollate
Devuelve o establece el estado de la casilla de verificacin Intercalar.
&H20& cdlPrintToFile
Devuelve o establece el estado de la casilla de verificacin Imprimir a un archivo.
&H40& cdlPrintSetup
Hace que el sistema muestre el cuadro de dilogo Configurar impresora en lugar de
Imprimir. Use este Flag cuando lo que desea es cambiar la impresora predeterminada.
&H80& cdlNoWarning
Evita que aparezca una advertencia cuando no hay una impresora predeterminada.

256

&H100&
cdlReturnDC
Devuelve un contexto de dispositivo para la impresora seleccionada en el cuadro de
dilogo. El contexto se devuelve en la propiedad hDC del cuadro de dilogo.
512
&H200&
cdlReturnIC
Devuelve un contexto de informacin para la impresora seleccionada en el cuadro de
dilogo. Un contexto de informacin proporciona un mtodo rpido de obtener
informacin sobre el dispositivo sin crear un contexto de dispositivo. El contexto de
informacin se devuelve en la propiedad hDC del cuadro de dilogo.
2048 &H800&
cdlShowHelp
Hace que el cuadro de dilogo muestre el botn Ayuda
262144
&H40000&
cdlUseDevModeCopies
Si un controlador de impresora no admite copias mltiples, al establecer este indicador
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 102

se desactiva el control de edicin de nmero de copias. Si el controlador s admite


mltiples copias, al establecer este indicador el cuadro de dilogo almacenar el nmero
de copias solicitado en la propiedad Copies.
524288
1048576

&H80000&
cdlDisablePrintToFile
Desactiva la casilla de verificacin Imprimir a un archivo.
&H100000&
cdlHidePrintToFile
Oculta la casilla de verificacin Imprimir a un archivo.

Propiedades que afectan al tipo de letra.


Las seis propiedades siguientes nos dan las caractersticas especiales de la fuente elegida (negrita,
cursiva, etc.). Una vez seleccionado el tipo de letra, el valor de estas propiedades contiene la opcin
elegida para la letra (si FontBold=True es que hemos elegido negrita, etc.)
FontBold
Propiedad Booleana que establece o devuelve que el tipo de letra usado es Negrita.
Sintaxis

Variable = CD1.FontBold

Los valores de Variable son:


True

Se ha elegido negrita

False (Predeterminado) No se ha elegido negrita.

FontItalic
Propiedad Booleana que establece o devuelve que el tipo de letra usado es Cursiva.
Sintaxis

Variable = CD1. FontItalic

Los valores de Variable son:


True si se ha elegido cursiva, False (Predeterminado) en caso contrario.

FontStrikethru
Propiedad Booleana que establece o devuelve que el tipo de letra usado es Tachada.
Sintaxis

Variable = CD1. FontStrikethru

Los valores de Variable son:


True si se ha elegido tachado, False (Predeterminado) en caso contrario.
FontUnderline
Propiedad Booleana que establece o devuelve que el tipo de letra usado es Subrayado.
Sintaxis

Variable = CD1.FontUnderline

Los valores de Variable son:


True, si se ha elegido subrayado, False (Predeterminado) en caso contrario
FontName
Devuelve el nombre de la fuente elegida. Es una variable tipo String
Sintaxis
LSB

Variable = CD1.FontName

Visual Basic Gua del Estudiante

Captulo 1

Pgina 103

(Variable toma el valor del nombre de la fuente. Por ejemplo, Variable = Arial
En general, deber modificar FontName antes de establecer los atributos de tamao y estilo con
las propiedades FontSize, FontBold, FontItalic, FontStrikethru y FontUnderline.
Nota En tiempo de ejecucin puede obtener informacin sobre las fuentes disponibles a travs
de las propiedades FontCount y Fonts. Lo ver mas adelante
FontSize
Devuelve de la fuente elegida. Debe ser una variable tipo Integer o Long
Sintaxis

Variable = CD1.FontSize

donde Variable ser una expresin numrica que especifica el tamao de fuente a utilizar, en
puntos.
Nota
Las fuentes disponibles en Visual Basic varan dependiendo de la configuracin del
sistema y de los dispositivos de presentacin e impresin. En las propiedades relacionadas con
las fuentes slo pueden establecerse valores para los que exista una fuente.
En general, deber modificar FontName antes de establecer los atributos de tamao y estilo con
las propiedades FontSize, FontBold, FontItalic, FontStrikethru y FontUnderline. Sin
embargo, cuando especifique un tamao inferior a 8 puntos para una fuente TrueType, primero
deber establecer el tamao en puntos con la propiedad FontSize, luego especificar la
propiedad FontName y despus establecer de nuevo el tamao con FontSize. El entorno
operativo Microsoft Windows utiliza una fuente distinta para las fuentes TrueType con un
tamao inferior a 8 puntos.

Index
Igual que el ya estudiado para otros controles.
InitDir
Devuelve o establece el directorio de archivos inicial.
Sintaxis

objeto.InitDir [= cadena]

La sintaxis de la propiedad InitDir consta de las siguientes partes:


objeto Nombre que define al CommonDialog
cadena Expresin de cadena que especifica el directorio de archivos inicial.
Si no se especifica esta propiedad, se utilizar el directorio actual.
Left y Top
Estas propiedades solamente afectan a la colocacin del icono en el formulario. No afectan a la
colocacin del CommonDialog durante la ejecucin. La posicin del CommonDialog en tiempo
de ejecucin no puede controlarse.
Esta afirmacin de que la posicin del CommonDialog no es controlable es vlida para
sistemas a 32 bytes. En VB 4 de 16 bits, el CommonDialog aparece aproximadamente en la
parte superior izquierda del formulario que lo contiene. Algunos programadores han optado por
poner un formulario para contener solamente al CommonDialog, y as, controlando la posicin de
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 104

ese formulario, poder controlar la posicin (aproximada) en la que aparece el CD.


Esto no ocurre para sistemas a 32 bytes, en los que el CD aparece siempre en la parte superior
izquierda de la pantalla, independientemente de donde est el formulario que lo contiene.

MaxFileSize
Devuelve o establece el tamao mximo del nombre de archivo abierto con el control
CommonDialog.
Sintaxis

objeto.MaxFileSize [= valor]

La sintaxis de la propiedad MaxFileSize consta de las siguientes partes:


objeto = Nombre que define al CommonDialog
valor = Nmero entero que especifica el tamao mximo del nombre de archivo en bytes. El
rango de esta propiedad es 132KB. El valor predeterminado es 256.
Name
Nombre que define al CommonDialog
PrinterDefault
Devuelve o establece una opcin que determina si la configuracin elegida por el usuario en el
cuadro de dilogo Imprimir se utiliza para modificar la configuracin predeterminada de
impresora del sistema.
Sintaxis

CD1.PrinterDefault = True / False

True Las opciones que elija el usuario en el apartado Configurar del cuadro de dilogo
Imprimir (seleccin de la impresora, orientacin, etctera) se utilizan para modificar la
configuracin de impresora almacenada en el Registro).
False Las opciones que elija el usuario no se utilizan para modificar la configuracin de
impresora predeterminada del sistema.
Utilice esta propiedad, que por defecto est a True, para poner o no poner como impresora
predeterminada, la impresora seleccionada con el CommonDialog. Puede por ejemplo, querer
imprimir un texto en una impresora determinada, pero solo ese texto, y no quiere cambiar la
impresora predeterminada por el hecho de haber seleccionado en este momento otra impresora.
Ponga esta propiedad a False (recuerde que por defecto est a True) para que la impresora
seleccionada no se quede como impresora por defecto.
Tag
Lo mismo que se ha explicado para otros controles.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 105

CONTROLES DE BUSQUEDA DE FICHEROS


CONTROLES DE BUSQUEDA DE FICHEROS Y DIRECTORIOS
Estos controles apenas si se usan. La razn es que el CommonDialog ya estudiado sustituye con creces
a estos tres controles en su conjunto. Sin embargo, para determinadas necesidades s son muy
prcticos. Estdieselos con el mismo entusiasmo que si no existiese el CommonDialog.
Al tratarse de controles tipo Lista, le recomiendo que lea el captulo correspondiente al ListBox.
Le aclarar sobre todo los trminos empleados para definir los elementos de la lista, que en este
caso, son los ficheros de una carpeta, las carpetas de un disco o los discos visibles desde la
mquina.

DriveListBox, DirListBox Y FileListBox.

Se obtienen directamente de la Caja de Herramientas, en los iconos siguientes:

DriveListBox permite elegir una unidad de disco.


DirListBox muestra los directorios existentes en un rbol.
FileListBox muestra los ficheros existentes en un determinado directorio.

Tal como indica su nombre, estos controles son listas. Repase el control ListBox para recordar sus
propiedades.
DriveListBox
Este control permite elegir una unidad de disco vlida en tiempo de ejecucin. Utilice este control para
mostrar una lista de todas las unidades vlidas del sistema de un usuario. Puede crear cuadros de
dilogo que permitan al usuario abrir un archivo de una lista en cualquier unidad disponible.

DriveListBox desplegado y sin desplegar Name (nombre) por defecto List1


Posee las propiedades tpicas de cualquier control VB respecto a su geometra y color. Las propiedades
mas destacables de este control son : Drive, List, ListCount y ListIndex
Drive devuelve el nombre de la unidad de disco seleccionada :
Variable = List1.Drive

Variable = a :

( c :[MS-DOS_6] D )

Este control se trata de una lista como su nombre indica, y posee las propiedades List, ListCount y
ListIndex para permitir al usuario tener acceso a elementos de la lista.
List (n) devuelve el texto que define a la unidad colocada en el lugar n. El nmero n comienza por 0. Por
ejemplo, en la figura anterior, List1.list(1) devolver c :[MS-DOS_6]
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 106

ListCount proporciona informacin acerca del nmero de unidades de disco disponibles (En el ejemplo,
List1.ListCount ser 3, que corresponde a los tres discos disponibles - disco C :, disco A : y disco D : )
ListIndex devuelve el ndice del disco seleccionado en la lista (0 para el primero, n-1 para el ltimo)
Utilizando el control DriveListBox en combinacin con DirListBox y FileListBox, podr realizar un
explorador de ficheros en cualquier disco de su ordenador.

DirListBox.
Presenta un cuadro de la siguiente forma:

donde puede verse el rbol completo de un directorio. El DirListBox solamente presenta directorios. No
presenta ficheros.
Aparte de las propiedades geomtricas de todos los controles, el DirListBox presentas las siguientes
propiedades particulares :
Path
Devuelve o establece la ruta de acceso actual. No est disponible en tiempo de diseo.
Sintaxis

Nombre.Path [= pathname]

donde
Nombre
es el nombre del DirListBox
pathname Una expresin de cadena que evala en el nombre de va de acceso del directorio por
defecto del DirListBox..
El valor de la propiedad Path es una cadena que indica una ruta de acceso, como
C:\WINDOWS\SYSTEM. El valor predeterminado es la ruta de acceso actual
Cuando se cambia la propiedad Path en tiempo de ejecucin se genera un evento Change.
Nota El valor que devuelve Path es distinto del de List (ListIndex). Path devuelve siempre un mismo
camino, bien el que se le haya impuesto mediante esta misma propiedad Path, y si no se le ha impuesto
con anterioridad, el que tenga por defecto. List (ListIndex) devuelve el camino completo del directorio
seleccionado, y, como era de esperar, cambia cada vez que cambiamos la seleccin del directorio.
List, ListCount y ListIndex
Al igual que cualquier lista, el DirListBox tiene las propiedades List, ListCount y ListIndex.
ListIndex devuelve el valor del ndice del directorio seleccionado. El valor devuelto es cero cuando est
seleccionado el primer directorio de los situados al final del rbol, 1 para el siguiente, etc. Toma el valor
-1 cuando se selecciona el directorio inmediatamente superior al ltimo nivel, el valor -2 cuando se
selecciona el directorio situado 2 niveles jerrquicos por encima del ltimo nivel, etc.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 107

ListCount devuelve un valor numrico igual al nmero de directorios existentes en el ltimo nivel,
independientemente de los directorios que tuviesen por arriba.
List (n) devuelve una cadena de caracteres con el camino completo del elemento cuyo orden sea el
sealado entre parntesis. Si en vez de n colocamos el ListIndex nos devolver, logicamente, el camino
del elemento seleccionado.
FileListBox
Esta lista nos presenta los ficheros existentes en un directorio.

Como se puede apreciar, cuando el nmero de ficheros supera el nmero que puede presentar,
aparecen automticamente las flechas de scroll verticales.
Esta lista de ficheros tiene las siguientes propiedades destacables :
Path
Devuelve o establece la ruta de acceso de su directorio actual. No est disponible en tiempo de diseo.
Este directorio puede ser el que se le haya impuesto mediante esta propiedad Path, o el que tenga por
defecto. (El directorio por defecto sera el del ejecutable de la aplicacin)
Si le ponemos el nombre por defecto, List1, para todos los ejemplos :
variable = List1.Path

Variable = C:\Archivos de programa\Microsoft Visual Basic32

(p. e.)

ListCount
Devuelve el nmero total de ficheros que hay en ese directorio.
Variable = List1.ListCountVariable = 19

(p. e.)

ListIndex
Devuelve un nmero con el ndice del elemento seleccionado. Como todas las listas, devuelve -1 si no
hay ningn elemento seleccionado. El primer elemento de una lista tiene el ndice = 0.
Filename
Devuelve el nombre del fichero seleccionado.
List (n)
Devuelve el nombre del fichero que ocupa el lugar n en la lista.
Variable = List1.List (5)

Variable = nombre del fichero que ocupa el 5 lugar en la lista.

Si en lugar de n ponemos el valor de ListIndex :

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 108

variable = List1.List (List1.ListIndex)

obtendremos el nombre del fichero seleccionado.

Observe que en este ltimo caso, el resultado es el mismo que el de List1.Filename


Veamos otras propiedades del FileListBox
Pattern
Devuelve o establece un valor que indica los nombres de archivo mostrados en un control
FileListBox en tiempo de ejecucin.
Sintaxis

objeto.Pattern [= valor]

La sintaxis de la propiedad Pattern consta de las siguientes partes:


objeto : Nombre del Control FileListBox
valor: Expresin de cadena que indica una especificacin de archivo, como *.* o *.FRM. La cadena
predeterminada es *.*, que obtiene una lista de todos los archivos. Adems de utilizar caracteres
comodn, tambin puede especificar varios modelos, separndolos
con caracteres punto y coma
(;). Por ejemplo, con *.EXE; *.BAT se obtendra una lista con todos los archivos ejecutables y todos los
archivos por lotes de MS-DOS.
Comentarios
La propiedad Pattern juega un papel clave en el diseo de las funciones de examen y tratamiento de
archivos de una aplicacin. Puede utilizar Pattern en combinacin con otras propiedades de control de
archivos para proporcionar al usuario formas de explorar archivos o grupos de archivos similares. Por
ejemplo, en una aplicacin dedicada a iniciar otros programas, podra hacer que slo apareciesen los
archivos .EXE en el cuadro de lista de archivos (*.EXE).
Al modificar el valor de la propiedad Pattern se genera un evento PatternChange.

Archive, Hidden, Normal, System


Devuelven o establecen un valor que determina si un control FileListBox presenta los archivos con los
atributos Archive, Hidden, Normal o System.
El atributo Archive de un fichero indica si se ha variado ese fichero despus de la ltima copia de
seguridad.
El atributo Hidden indica si el fichero se trata de un fichero oculto.
El atributo Normal indica que el fichero es un fichero normal (No est oculto ni es de sistema).
El atributo System de un fichero indica que el fichero es un fichero de sistema.
Sintaxis
objeto.Archive [= booleano]
objeto.Hidden [= booleano]
objeto.Normal [= booleano]
objeto.System [= booleano]
Las sintaxis de la propiedades Archive, Hidden, Normal y System tiene la siguiente partes:
objeto :Nombre del FileListBox
booleano :Una expresin booleana (True / False) que especifica el tipo de archivos presentados.
El valor booleano puede presentar los siguientes valores :
True :(Predeterminado para Archive y Normal) Presenta archivos con el atributo de la propiedad en el
control FileListBox.
False : (Predeterminado para Hidden y System) Presenta archivos sin el atributo de la propiedad en el
control FileListBox.
Use estas propiedades para especificar el tipo de archivos a presentar en un control FileListBox,
basndose en los atributos de archivos estndar usados en el entorno operativo. La definicin de estas
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 109

propiedades en el cdigo en tiempo de ejecucin hace que el control FileListBox presente slo aquellos
archivos con los atributos especificados.
Por ejemplo, en una operacin de buscar y reemplazar se podran presentar solamente archivos del
sistema estableciendo la propiedad System a True y las dems propiedades a False. Tambin, como
parte del procedimiento de copia de seguridad, se podra establecer la propiedad Archive a True para
relacionar solamente aquellos archivos modificados a partir de la ltima copia de seguridad.
PROCEDIMIENTOS del FileListBox
Click
KeyDown

Change
KeyPress

DragDrop
KeyUp

DragOver

GotFocus

SENTENCIAS DE MANEJO DE DIRECTORIOS Y FICHEROS

El Directorio Actual
Se llama directorio Actual al directorio que est actualmente en uso, bien porque haya sido forzado el
control correspondiente a tener ese directorio en su propiedad Path, bien porque, al no haberse forzado
ninguno, utilice el directorio por defecto.
El directorio por defecto es el ltimo que se ha seleccionado por algn procedimiento. Por ejemplo, al
arrancar una aplicacin, el directorio por defecto ser el mismo donde se encuentra el ejecutable. Pero si
a lo largo de la aplicacin cambiamos el directorio, seleccionando otro mediante un CommonDialog, ese
directorio es el que queda por defecto. Asegrese en sus aplicaciones que siempre elige la propiedad
Path antes de presentar ficheros o directorios a travs de los controles anteriores, para evitar que pueda
mostrarle ficheros de un directorio no deseado.
Puede comprobar cual es el directorio actual. La funcin CurDir nos devuelve el directorio actual.
Ejemplo : Introduzca una lnea de cdigo con la siguiente sentencia
Variable = CurDir

Al ejecutarla la variable Variable contendr la informacin :

Variable = C:\Archivos de programa\Microsoft Visual Basic32

(p. e.)

Puede darse el caso de que desee conocer el directorio actual de varias unidades de disco. Por ejemplo,
puede estar trabajando en el directorio C:\CursoVB\Ejemplos y ser este el directorio actual en el disco
C :, y tener un disquete en la unidad A : en el que la ltima vez que trabaj fue en el directorio
A :\ApVB\Tema1 y ese es su directorio por defecto en el disco A. Para conocer el directorio actual del
disco C : no necesit especificar la unidad, ya que era precisamente la unidad C la unidad actual. Para
conocer el directorio actual de la unidad A empleara la expresin :
Variable = CurDir (A)

Variable tomar entonces el valor Variable = A :\ApVB\Tema1

Decamos que el disco C era la unidad actual. Tambin podemos cambiar la unidad actual, mediante la
sentencia ChDrive seguida de una letra (entre comillas dobles)
Ejemplo

ChDrive A

cambia la unidad actual a la unidad A. Observe que el


parmetro A no tiene que llevar los dos puntos ( : ), aunque si
lo desea, puede ponerlos. Tambin es indiferente que la letra
sea mayscula o minscula.

Tambin podemos forzar a que un directorio sea el directorio por defecto. La sentencia que tendremos
que usar en ChDir.
Ejemplo : ChDir C :\Windows\System cambiara el directorio actual al especificado.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 110

Podemos incluso crear un directorio. Usaremos para ello la sentencia MkDir. Esta sentencia crea el
directorio con el nombre indicado, sobre el directorio actual.
Si el directorio actual es el C:\VB\Icons y ejecutamos la sentencia :
MkDir Varios

crearamos el directorio C:\VB\Icons\Varios

Podemos incluso eliminar un directorio. La sentencia para eliminar un directorio es RmDir


Cuidado ! Visual-Basic no le advertir que puede borrar algo que no desea. Asegrese muy bien
mediante un aviso al usuario cada vez que elimine un directorio.
Vamos a ver ahora como podemos ver los nombres de los ficheros existentes en un determinado
directorio. Muy sencillo, con un FileListBox. Efectivamente, as podra ser para presentarlos en pantalla.
Sin embargo, si deseamos imprimir la lista de ficheros existentes, guardarla en un fichero, etc., tenemos
una forma que facilita esta labor. Igual que en DOS. La funcin Dir
A esta funcin le debemos aadir como parmetro el criterio de bsqueda, criterio formado por los
caracteres o comodines que deseemos. Dir devuelve solamente el nombre de un fichero, por lo que
tendremos que repetirla tantas veces como ficheros tenga el directorio. Pero solamente tendremos que
introducir el criterio de bsqueda la primera vez.
En el siguiente ejemplo, sacaremos por impresora los nombres de los ficheros existentes en el directorio
actual : (Este cdigo lo meteremos en el procedimiento click de un botn de comando)
fichero = Dir("*.*")
Le decimos que imprima todos (*.*)
Do Until fichero = "" Hasta que fichero sea una cadena de longitud cero..
Printer.Print fichero
Imprime la variable fichero en la impresora
fichero = Dir
Toma el nombre de otro fichero
Loop
Vuelve a Do Until .....
Termina la impresin y saca la hoja de la impresora

Printer.EndDoc

Ya sabemos sacar el directorio. Vamos a ver que otras cosas se pueden hacer con ficheros.
Funcin Kill. A poco Ingls que sepa se habr dado cuenta que esta funcin sirve para quitarse algo de
enmedio. Esta funcin borra un fichero del disco.
Kill C:\CursoVB\Ejemplos\Ejemplo1.txt
borra el fichero Ejemplo1.txt, que se encuentra en el disco C, directorio \ CursoVB\Ejemplos
Funcin FileCopy. Copia un fichero. La sintaxis de esta funcin es la siguiente :
FileCopy Origen, Destino
Si tenemos un TextBox llamado Text1 donde vamos a introducir el nombre (con su Path) del fichero
origen, otro TextBox donde introduciremos el nombre (con su Path) que queremos dar a la copia, para
copiar ese fichero ejecutaremos la sentencia :
FileCopy Text1.Text, Text2.Text
Si queremos copiar un fichero del disco A, en el directorio CursoVB y de nombre Ejemplo1 al disco y
directorio C:\CursoVB\Ejemplos y con el mismo nombre que tena en el disco A, es decir, Ejemplo1,
ejecutaremos la sentencia :
FileCopy A :\CursoVB\Ejemplo1 , C:\CursoVB\Ejemplos\Ejemplo1
Observe la necesidad de dobles comillas para especificar que es, precisamente lo escrito en el cdigo, lo
que indica el origen y el destino. En el caso anterior no llevaba dobles comillas, debido a que era el
contenido de un TextBox lo que se usaba para indicar el origen y el destino.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 111

La instruccin Name cambia el nombre de un fichero. No solamente puede cambiar un nombre, puede
incluso moverlo de sitio, pero siempre en la misma unidad de disco.
La sintaxis de Name es la siguiente :
Name nombrerutaantiguo As nombrerutanuevo
Donde nombrerutaantiguo es una expresin de cadena que indica el nombre del fichero (con su path)
al que se le quiere cambiar el nombre, y nombrerutanuevo es una expresin de cadena que especifica
el nombre nuevo y, si se desea mover de directorio, la nueva ubicacin del archivo y la unidad de disco.
El nombre y ubicacin especificados en nombrerutanuevo no pueden ser los de un archivo existente.
Tanto nombrerutanuevo como nombrerutaantiguo deben encontrarse en la misma unidad de disco. Si
la ruta de acceso especificada en nombrerutanuevo existe y es distinta de la ruta de acceso especificada
en nombrerutaantiguo, la instruccin Name coloca el archivo en el nuevo directorio o carpeta y cambia el
nombre del archivo, de ser necesario. Si nombrerutanuevo y nombrerutaantiguo tienen distintas rutas de
acceso y el mismo nombre de archivo, Name coloca el archivo en la nueva ubicacin, sin cambiar el
nombre del archivo. Por medio de Name se puede mover un archivo de un directorio o carpeta a otro,
pero no se puede mover un directorio o carpeta.
Si se utiliza Name con un archivo abierto se produce un error. Antes de cambiar el nombre de un
archivo, se debe cerrar.
En el ejemplo, vamos a cambiar el nombre del fichero C:\CursoVB\Ejemplos\Ejemplo1 por el de
C :\CursoVB\Ejemplos\Prueba1
Name C:\CursoVB\Ejemplos\Ejemplo1 As C :\CursoVB\Ejemplos\Prueba1
En el siguiente, aparte de cambiarlo de nombre, le cambiamos de directorio.
Name C:\CursoVB\Ejemplos\Ejemplo1 As C :\CursoVB\Ejercic\Prueba1

Existe una funcin que le permite conocer el volumen de un fichero : FileLen. Mediante esta instruccin
podr saber, por ejemplo, si un fichero le va a caber en lo que le queda libre de un disquete, el tiempo
previsto para enviarlo por mdem, etc.
La sintaxis es la siguiente :
Variable = FileLen("C:\CursoVB\Ejemplos\Ejemplo1")
Variable tomar un valor numrico igual al nmero de bytes del fichero.
Otra funcin para el tratamiento de ficheros es FileDateTime, que le permite conocer la fecha y hora de
creacin o de la ltima modificacin de un fichero.
La sintaxis es, para el caso del ejemplo :
Variable = FileDateTime ("C:\CursoVB\Ejemplos\Ejemplo1")
Variable puede tomar un valor como el siguiente : Variable = 13/02/97 14:59:20
(Observe que de esta funcin se obtiene una variable de cadena.) Puede aprovechar esta funcin para
borrar o hacer Backup de determinados ficheros que tengan mas de un tiempo de permanencia, sustituir
ficheros por versiones mas recientes, etc.
Podemos obtener y modificar los atributos de un fichero. Los atributos de un fichero se refieren a si son
de solo lectura, ficheros ocultos, de sistema, si ha sido modificado desde la ltima vez que se ha
realizado un Backup,
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 112

Para conocer los atributos de un fichero, utilizaremos la funcin GetAttr. Esta funcin devuelve un
nmero, que representa la suma de los atributos de un archivo, directorio o carpeta o una etiqueta de
volumen.
Sintaxis

Variable = GetAttr (nombreruta)

Donde nombreruta es una expresin de cadena que especifica un nombre de archivo, con su Path y
unidad de disco.
El valor devuelto por GetAttr es un nmero, igual a la suma de los siguientes valores de atributos:
Valor

Constante

Descripcin

0
1
2
4
16
32

vbNormal
vbReadOnly
vbHidden
vbSystem
vbDirectory
vbArchive

Normal.
Slo lectura.
Oculto.
Archivo de sistema.
Directorio o carpeta.
El archivo ha sido modificado despus de efectuar la ltima copia
de seguridad.

Si la expresin nombreruta representa un directorio, se lo indicar devolviendo el valor 16.


Para cambiar un atributo utilizaremos la funcin SetAttr. La sintaxis de esta funcin es la siguiente
Sintaxis

SetAttr nombreruta , atributos

Donde nombreruta es una expresin de cadena que especifica un nombre de archivo, con su Path y
unidad de disco, y atributos es una o varias de las constantes o valores anteriores, cuya suma especifica
los atributos de archivo.
Dado que el valor 16 indica que lo expresado en nombreruta es un directorio, no puede pretenderse
darle a ese directorio atributos que solamente se pueden aplicar a un fichero, ni puede pretender darle a
un fichero un valor en el que entre el 16 como sumando. Estos casos le producirn un error en tiempo de
ejecucin.
Si pretende establecer los atributos de un archivo abierto, se producir un error en tiempo de ejecucin.
Existe una funcin, que no tiene nada que ver con la anterior, aunque puede parecerlo por su parecido
semntico y que tambin devuelve atributos, pero de otro tipo. Esta funcin es FileAttr
Funcin FileAttr
Devuelve el modo de apertura de un archivo. Logicamente debe referirse a un archivo abierto en el
momento de ejecutar esta funcin. Vea para mas detalles la sentencia Open.
Sintaxis

variable = FileAttr (numerocanal , tipoinformacin)

Donde numerocanal es el nmero del canal de apertura de ese archivo, y tipoinformacin es el tipo de
informacin que deseamos de ese fichero. Si tipoinformacin = 1 nos devuelve el modo de apertura del
fichero, segn la siguiente lista

LSB

Valor

Modo del archivo

1
2
4
8
32

Entrada
Salida
Aleatorio
Aadir
Binario

Visual Basic Gua del Estudiante

Captulo 1

Pgina 113

La Ayuda de VB dice que tipoinformacin puede ser =2 para que FileAttr devuelva informacin sobre el
selector de archivos del sistema operativo. Algunas veces la informacin de ayuda de VB promete cosas
que, sin dudar de que sean ciertas, son difciles de comprobar.
Esta funcin no tiene una gran aplicacin prctica, ya que comprueba la forma en la que hemos abierto
un archivo. Informacin que conocemos desde el mismo momento de abrirlo.

Visual Basic - Gua del Estudiante Cap. 4


CONTROLES PARA MOSTRAR IMGENES
CREAR CONTROLES EN TIEMPO DE EJECUCIN
EL EXAMINADOR DE OBJETOS
_________________________________________________________________
Una imagen representa una figura, bien natural (tipo fotografa) o sinttica. Para presentar una imagen
es necesario hacerlo sobre un objeto que la admita. Los objetos que admiten una imagen son:

Formularios
PictureBox
Image

Existen mas controles grficos que se irn viendo a lo largo del curso. Estos tres son los mas usados y
con los que comenzaremos a trabajar.
Para mostrar una imagen en cualquiera de estos objetos, es necesario especificarlo en su propiedad
Picture. La forma de especificarle al objeto la imagen que debe presentar puede hacerse de dos
formas:

En la caja de propiedades, si no se va a variar la imagen durante la aplicacin.


Mediante una instruccin para cambiar esta propiedad. La instruccin es la siguiente:
Nombreobjeto.Picture = LoadPicture (Path, Fichero)

Por ejemplo, si tenemos un formulario llamado Form1 y queremos rellenarlo con una imagen contenida
en el fichero de Windows metafile DOLLAR.WMF que se encuentra en el directorio
C:\VB\METAFILE\BUSINESS, deberemos ejecutar la instruccin:
Form1.Picture = LoadPicture (C:\VB\METAFILE\BUSINESS\DOLLAR.WMF)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 114

Para "descargar" esa imagen de ese formulario, basta con ejecutar la misma instruccin sin fichero
alguno:
Form1.Picture = LoadPicture ( )
Tambin pueden tomar la imagen desde otro control de imagen, mediante un procedimiento de
Intercambio Dinmico de Datos (DDE) (Solo el PictureBox)
Puede tambin meter una imagen en una variable, y luego poner en uno de los controles citados
anteriormente la imagen guardada en la variable. Este mtodo es muy rpido, ya que no necesita
acceder al disco para buscar una imagen, pero emplea mucha memoria RAM, ya que la variable )o
variables conteniendo la(s) imgenes estn en la RAM.
Para ello debemos declarar una o varias variables tipo Picture, y meter en ellas una imagen mediante el
mtodo LoadPicture. Vea en el capitulo 7 (Mtodos Grficos - Mtodo LoadPicture) un ejemplo muy
ilustrativo.
EL FORMULARIO
Ya hemos visto lo que es el Formulario. Simplemente podemos aadir a lo ya dicho, que un formulario
tiene la propiedad Picture, con lo que podemos poner como fondo un bit-map, un fichero de icono ( .ICO)
o un Metarchivo (.WMF). Un fondo grfico sobre el Formulario puede convertir una aplicacin de buena
a excelente. No intente nunca mejorar una aplicacin mediocre con un fondo artstico en un Formulario.
Adems de presentar imgenes, se puede escribir texto en un formulario. Para ello se utiliza el mtodo
grfico Print que veremos en el captulo de mtodos grficos
CONTROL PICTURE BOX
Este objeto se encuentra en la caja de herramientas estndar:

Este objeto permite presentar todo tipo de ficheros grficos (.BMP, WMF, .ICO, .CUR)
Las dimensiones del PictureBox se establecen en el diseo o mediante programa, variando las
propiedades Height y Width. Tambin puede cambiarse su posicin mediante las propiedades Top y
Left. Dispone de una propiedad, Align que permite colocarlo adosado en la parte superior. Inferior o a
uno de los lados del formulario que lo contiene.
El Control PictureBox puede ser destino de los datos de un enlace DDE. (Los datos sern, lgicamente,
grficos. Por ello, tiene las propiedades LinkMode, LinkItem, LinkTimeout y LinkTopic.
Tambin puede tomar el dato del grfico de una Base de Datos. (A travs de un control Data o un objeto
Recordset o rdoResultset)
Las propiedades de un PictureBox son:
Align
ClipControls
DrawWidth
ForeColor
LinkMode
Negotiate
ScaleWidth
LSB

Appearance
DataField
Enabled
Height
LinkTimeout
Picture
TabIndex

Autoredraw
DataSource
FillColor
HelpContextID
LinkTopic
ScaleHeight
TabStop

Visual Basic Gua del Estudiante

Captulo 1

Autosize
DragIcon
FiilStyle
Index
MouseIcon
ScaleLeft
Tag

Backcolor
DragMode
Font
Left
MousePointer
ScaleMode
Top

BorderStyle
DrawStile
Fontransparent
LinkItem
Name
ScaleTop
Visible
Pgina 115

WhatThisHelp Width

Un PictureBox puede disponer de los siguientes procedimientos :


Click
KeyDown

Change
KeyPress

DblClick

DragDrop

DragOver

GotFocus

Al igual que en el formulario, se puede escribir texto en un PictureBox, utilizando el mtodo Print.
El control Picture puede ser contenedor de otros controles. Esto quiere decir que puede poner otros
controles dentro del picture, y esos controles tendrn un comportamiento especial en ciertos casos. (Ver
ms adelante el control Option)

CONTROL IMAGE
Este control se encuentra en la caja de herramientas estndar:

Este control permite presentar todo tipo de ficheros grficos (.BMP, WMF, .ICO, .CUR)
El control Image no puede ser destino de una comunicacin DDE. Puede tomar la imagen de una base
de datos, bien a travs de un control Data o a travs de un objeto Recordset.
El control Image utiliza menos recursos del sistema y repinta con ms rapidez que un control PictureBox,
pero slo admite una parte de las propiedades, los eventos y los mtodos de PictureBox. Use la
propiedad Stretch para determinar si el grfico se escala para que se ajuste al control o viceversa.
Poniendo esta propiedad a True el grfico se adaptar a las dimensiones del control Image. Si se pone a
False, el control Image tomar las medidas del grfico que contenga. Si el grfico es un bit-map (Fichero
.BMP), con la propiedad Stretch a True podemos variar el tamao del bit-map, variando las propiedades
Width y Height del control Image, propiedades que se pueden cambiar en tiempo de ejecucin. Si esta
propiedad est a False, el tamao del bit-map no cambiar, presentndose solamente una porcin del bitmap, caso que el control Image sea menor que el tamao del bit-map, o sobrar espacio en el control, en
caso contrario.
Un Image es transparente, es decir, deja ver el fondo del formulario en las partes no ocupadas por su
grfico. Por lo tanto, no tendran sentido en este control propiedades como Backcolor, FillColor, o
FillStyle.
Las propiedades de un Image son:
Appearance
Enabled

BorderStyle
Height
Picture
WhatThisHelp Width

Datafield
Index
Stretch

DataSource
Left
Tag

DragIcon
MouseIcon
Top

DragMode
MousePointer Name
Visible

GotFocus

MouseDown

Un Image puede disponer de los siguientes procedimientos :


Click
MouseMove
LSB

DblClick
DragDrop
MouseUp

Visual Basic Gua del Estudiante

Captulo 1

DragOver

Pgina 116

PROPIEDADES DE LOS CONTROLES PictureBox e Image


Align

(PictureBox solamente)
Permite colocar el control en el borde superior (Align Top), en el inferior (Align Bottom), en
el izquierdo (Align Left) o en el derecho (Align Right) del formulario que lo contiene. Para
no alinearlo con ningn borde basta con poner la propiedad Align a 0-None.
Cuando se adosa a uno de los bordes, el tamao del control se ajusta automticamente a la
anchura o altura del formulario.
Sintaxis
NombrePictureBox.Align [= nmero]
nmero
Un entero que especifica cmo se presenta el control. Puede tomar los
siguientes valores :
0-None
(Predeterminado cuando el control se coloca en un formulario no MDI).
Con este valor, el control mantiene el tamao y la posicin asignada en
tiempo de diseo.
1-Top
(Predeterminado cuando el control se coloca en formularios MDI) El control
se coloca en la parte superior del formulario y su anchura es igual a la
anchura del formulario.
2-Bottom El control se coloca en la parte inferior del formulario y su anchura es igual
a la anchura del formulario.
3-Left
El control se coloca en la parte izquierda del formulario y su altura es igual
a la altura del formulario.
4-Right
El control se coloca en la parte derecha del formulario y su altura es igual a
la altura del formulario.
Se puede usar propiedad Align para crear rpidamente una barra de herramientas o una
barra de estado en la parte superior o inferior de un formulario. Cuando un usuario cambie el
tamao del formulario, un control con la propiedad Align establecida a 1 2 modificar su
tamao de forma automtica para ajustarse a la anchura del formulario.
De la misma forma se puede crear barras de herramientas a los lados izquierdo o derecho
de un formulario. Si en un formulario hay dos barras de herramientas, una en la parte
superior (o inferior) y otra en un lateral, la de la parte superior o inferior es la que se extiende
hasta la esquina, teniendo preferencia sobre las colocadas verticalmente a la izquierda o a la
derecha.
Al ser el PictureBox un contenedor, puede poner un PictureBox en la parte superior de un
Formulario, y colocar en este PictureBox varios controles Image, a los que se les puede
poner un icono. De esta forma realizamos una barra de herramientas.

Negotiate

(PictureBox solamente)
Esta propiedad le permite mostrar o no mostrar el PictureBox dentro de un formulario donde
tiene una barra de herramientas. No est disponible en tiempo de ejecucin.
Esta propiedad no es muy usual, por lo que omitimos una mayor explicacin. Recurra a la
ayuda para obtener mas detalles

Appearance

(PictureBox e Image) 3D o Flat, como en otros controles

Autoredraw

(PictureBox solamente)

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 117

Permite que el Formulario o PictureBox (El control Image no tiene esta propiedad), mantenga
siempre la imagen o el texto presente. Si Autoredraw est a False, el control no presentar
las imgenes o texto que no se hayan dibujado realmente (caso por ejemplo de un formulario
minimizado) o que se hayan borrado por haber sido puestas tras otro control.

Autosize

(PictureBox solamente)
Si esta propiedad es True se cambia automticamente el tamao del PictureBox para
acomodarse al tamao de la imagen. Si es False, si la imagen es mayor que el PictureBox
la recortar, y si es menor, presentar una zona sin imagen.

BackColor

(PictureBox solamente)
Color de fondo. Igual que otros controles

BorderStyle

(PictureBox e Image)
Tipo de borde. Ninguno o fijo. Igual que otros controles.

ClipControls

(PictureBox solamente)

Devuelve o establece un valor que determina si los mtodos grficos en eventos Paint
vuelven a dibujar el objeto entero o solamente las reas ltimamente expuestas. Si esta
propiedad es True, un mtodo grfico repintar todo el Picture. Si es False, solamente
repintar la zona de la imagen que ha variado.
DataField
DataSource

(PictureBox e Image)
(PictureBox e Image)
Ver con mas detalles estas propiedades cuando estudie los Objetos enlazados a Datos. Le
van a permitir presentar una imagen desde una base de datos. Le permitir tambin
introducirla de una forma muy sencilla en la base de datos.

DragIcon
DragMode

(PictureBox e Image)

DrawMode
DrawStyle
DrawWidth

(PictureBox solamente)
(PictureBox solamente)
(PictureBox solamente)

Enabled

Igual que otros controles

Formas de responder a los mtodos grficos. Lo ver en el captulo correspondiente


(PictureBox e Image)
Habilitado. Igual que otros controles.

FillColor, FillStyle, Font, Fontransparent, ForeColor (PictureBox solamente)


Igual que otros controles.
Height, Width , Left, Top

(PictureBox e Image)

Definen el tamao y la posicin del control. En el control Image el tamao puede depender
del grfico que se introduzca y del valor de la propiedad Stretch.
HelpContextID

(PictureBox solamente)

Igual que otros controles

Index

(PictureBox e Image)

Igual que otros controles

LinkItem, LinkMode, LinkTimeout, LinkTopic


LSB

Visual Basic Gua del Estudiante

Captulo 1

(PictureBox solamente)
Pgina 118

Propiedades que afectan al comportamiento de este control como DESTINO de una


conversacin DDE. Se estudiar con mas detalles al estudiar el Intercambio Dinmico de
Datos.
MouseIcon, MousePointer

(PictureBox e Image)

MouseIcon Establece un icono de mouse personalizado.


(Una vez que comenzamos a estudiar las propiedades grficas, se comenta cmo se puede cambiar el
icono de la propiedad MouseIcon de todos los controles)
Sintaxis
objeto.MouseIcon = LoadPicture(ruta)
objeto.MouseIcon = imagen

donde :
objeto
Nombre del objeto PictureBox o Image
ruta
Expresin de cadena que especifica la ruta y el nombre del archivo que contiene
el icono personalizado. As podemos cargar un icono de los existentes en el disco. Ej.
Image1.MouseIcon = LoadPicture("C:\vb\icons\computer\disk05.ico")
imagen
Propiedad Picture de un objeto Form, de un control PictureBox o de un control
Image, o nombre de una variable tipo Picture. De esta forma podemos cargar como un icono
el grfico que tengamos en otro objeto o en una variable tipo Picture.
Ej. Image1.MouseIcon = Picture1.picture
La propiedad MouseIcon proporciona un icono de mouse personalizado que se utiliza
cuando el valor de la propiedad MousePointer es 99.

MousePointer. Establece el tipo de puntero de mouse que aparece cuando se pasa el


puntero del ratn por encima de un objeto en tiempo de ejecucin.
Sintaxis

objeto.MousePointer [= valor]

objeto
Nombre del objeto PictureBox o Image
valor
Nmero entero que especifica el tipo de puntero de mouse que aparece, segn
se describe mas adelante.
Las opciones para valor son:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
99
Name
LSB

(Predeterminado) Forma que determine el objeto.


Flecha.
Cruz (puntero en forma de cruz).
Forma de I.
Icono (pequeo cuadrado dentro de otro cuadrado).
Tamao (flecha de cuatro puntas: norte, sur, este y oeste).
Tamao NE SO (flecha doble apuntando al nordeste y al sudoeste).
Tamao N S (flecha doble apuntando al norte y al sur).
Tamao NO SE (flecha doble apuntando al noroeste y al sudeste).
Tamao O E (flecha doble apuntando al oeste y al este).
Flecha hacia arriba.
Reloj de arena (espera).
No soltar.
Flecha y reloj de arena.
Flecha e interrogacin.
Tamao de todo (personalizable en Microsoft Windows NT 3.51)
Icono personalizado especificado en la propiedad MouseIcon explicada anteriormente.
(PictureBox e Image)

Visual Basic Gua del Estudiante

Captulo 1

Nombre del control


Pgina 119

Picture

(PictureBox e Image)
Devuelve o establece un grfico mostrado en un control.
Ya se ha estudiado mas atrs como cambiar la propiedad Picture.

ScaleHeight, ScaleWidth, ScaleLeft, ScaleTop, ScaleMode


Propiedades del PictureBox solamente.
Todas las propiedades Scale ? ? ? afectan a la medida de las coordenadas, no a la escala !

ScaleHeight, ScaleWidth
Establecen el nmero de unidades de medida horizontal (ScaleWidth) y vertical
(ScaleHeight) del interior de un objeto al utilizar mtodos grficos o al colocar controles.
Sintaxis

objeto.ScaleHeight [= valor]
objeto.ScaleWidth [= valor]

objeto
valor

Nombre del Control


Expresin numrica que especifica la medida horizontal o vertical.

Nota Las propiedades ScaleHeight y ScaleWidth son distintas de las propiedades Height y
Width.
ScaleLeft, ScaleTop
Devuelven o establecen las coordenadas horizontal (ScaleLeft) y vertical (ScaleTop) de los
bordes izquierdo y superior de un objeto al utilizar mtodos grficos o al situar controles.
Estas coordenadas estn medidas de acuerdo con la unidad de medida establecida en las
propiedades ScaleHeight y ScaleWidth
ScaleMode
Devuelve o establece un valor que indica la unidad de medida de las coordenadas de un
objeto al utilizar mtodos grficos, o al situar controles.
Sintaxis

objeto.ScaleMode [= valor]

Nombre del Control


objeto
Nombre del Control
valor
Nmero entero que especifica la unidad de medida, segn se describe a
continuacin.
0 Indica que una o ms de las propiedades ScaleHeight, ScaleWidth, ScaleLeft y ScaleTop
tienen valores personalizados. Se usa entonces una unidad de medida definida por el
usuario (User)
1 (Predeterminado) Twip (1440 twips por pulgada lgica; 567 twips por centmetro lgico).
2 Punto (72 puntos por pulgada lgica).
3 Pxel (la unidad mnima de la resolucin del monitor o la impresora).
4 Carcter (horizontal = 120 twips por unidad; vertical = 240 twips por unidad).
5 Pulgada.
6 Milmetro.
7 Centmetro.
Utilizando las propiedades relacionadas ScaleHeight, ScaleWidth, ScaleLeft y ScaleTop,
puede configurar un sistema de coordenadas completo, con coordenadas positivas y
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 120

negativas. Estas cuatro propiedades de escala se relacionan con la propiedad ScaleMode de


la siguiente forma:
Al establecer un valor en cualquier otra propiedad de escala, en ScaleMode se establece
automticamente 0.
Al establecer en ScaleMode un nmero mayor que 0, ScaleHeight y ScaleWidth cambian a la
nueva unidad de medida, y en ScaleLeft y ScaleTop se establece 0. Adems, los valores de
CurrentX y CurrentY cambian para reflejar las nuevas coordenadas del punto actual.
Stretch

(Solo control Image)


Devuelve o establece un valor que indica si un grfico cambia su tamao para ajustarlo al de
un control Image.
Sintaxis

objeto.Stretch [= lgico]

objeto
Nombre del control Image
lgico
Expresin booleana que especifica si el grfico adapta su tamao, segn se
describe a continuacin.
True
False

El grfico cambia su tamao para ajustarlo al del control.


(Predeterminado) El control cambia su tamao para ajustarlo al del grfico.

Si Stretch tiene el valor True, al cambiar el tamao del control tambin se cambiar el del
grfico que contenga. Cuando aumenta el tamao del control, mantiene las nuevas medidas
aunque se le introduzca un grfico de menor tamao. Debe controlarse por programa el
tamao del mismo.
TabIndex, TabStop

(Solo control PictureBox)

Igual que otros controles


Tag
Top
Visible
WhatsThisHelpID
Width

Comunes a ambos. Igual que resto de controles.

Otros controles que pueden manejar imgenes

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 121

IMAGE LIST
Lo ver mucho mas ampliamente en un captulo posterior. Se incluye en este captulo para que lo pueda
ir usando.
Este control no est normalmente en la caja de herramientas. Hay que introducirlo mediante los
Proyecto | Componentes y pertenece al grupo Microsoft Windows Common Controls
(COMCTL32.OCX) (Vea Nota 1)

Este control nos permite almacenar varias imgenes. Es, tal como indica su nombre, como un ListBox
pero que en vez de contener textos, contiene imgenes.
La utilidad de este control es para almacenar en l distintas imgenes, y servirlas desde l a otro control,
un PictureBox o un control Image, sin necesidad de tener que acceder a leerlas en el disco, que
conllevara una importante prdida de tiempo si el cambio de imgenes debe ser rpido.
Este control es necesario para almacenar las imgenes que se mostrarn en los iconos de la barra de
herramientas. Ver mas adelante como se realiza una barra de herramientas (La barra de herramientas
solo est disponible para la versin de 32 Bits)
Un ImageList permite tener varias imgenes dentro de l, pero este control no las presenta. Solamente
sirve de almacn para pasarlas rpidamente a otro control (PictureBox, p.e.) que ser el que las
presenta en pantalla.
En la siguiente figura, pueden verse las propiedades de un ImageList con varias imgenes cargadas.

Nota 1. El grupo de controles Microsoft Windows Common Controls (COMCTL32.OCX) incluye


adems de este los controles TabStrip, Toolbar, StatusBar, ProgressBar, TreeView, ListView y Slider. Se
ver con ms detalle en un prximo captulo (Cap. 16)
Para introducir imgenes en el control ImageList deberemos acceder a sus propiedades, bien mediante
F4 y luego haciendo click sobre Personalizado, bien pulsando el botn derecho del ratn sobre el icono
del control. Aparecer un cuadro donde podemos insertar imgenes

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 122

El tipo de imgenes pueden ser mapas de bits :BMP o iconos .ICO


El control ImageList tiene una coleccin llamada ListImages. Esta coleccin contiene todas las
imgenes introducidas en el ImageList y las propiedades de cada imagen. Como toda coleccin, ser un
array donde podemos elegir uno de sus elementos designndolo por su nombre seguido de su nmero
(Index) encerrado entre parntesis. As la imagen nmero 3 ser :
ImageList1.Listimages (3)
Si tenemos un control Picture llamado Picture1 y queremos poner en su propiedad Picture la imagen
cargada en el ImageList1, en su posicin 3, usaramos la expresin :
Set Picture1.Picture = ImageList1.ListImages (3) . Picture
Observe que tras ListImages ( ) es necesario poner la propiedad Picture, ya que Picture es una propiedad
de la coleccin ListImages
Como cualquier coleccin, ListImages tiene la propiedad Count, que nos servir para contar el nmero de
imgenes que guarda.
Numerodeimgenes = ImageList1. ListImages.Count
Dado que al guardar imgenes en un ImageList, estas imgenes estn guardadas en la memoria RAM,
es fcil realizar una animacin. Para ello necesitamos varias imgenes que poniendo una tras otra, d la
sensacin de movimiento. Imaginemos un nmero indeterminado de imgenes dentro de un ImageList, y
un control Picture llamado Picture1 donde queremos presentar la animacin. En el procedimiento Timer
de un Timer pondramos
Static pepe As Integer
pepe = pepe + 1
If pepe > ImageList1.ListImages.Count Then pepe = 1
Set Picture1.Picture = ImageList1.ListImages(pepe).Picture
Una de las mayores aplicaciones del ImageList es proporcionar imgenes para otros controles. Entre
ellos el TOOLBAR
Barra de Herramientas. Control Toolbar

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 123

Este control permite realizar una barra de herramientas. La barra de herramientas es, como ya conocer,
una barra donde existen varios iconos. Estos iconos realizan una determinada funcin. Normalmente se
ponen en la barra de herramientas los iconos que representan las acciones mas frecuentes de una
aplicacin. Esto facilita la operacin al no tener que desplegar mens para buscar la operacin a realizar.
Como el espacio que ocupan los iconos es grande, es tambin bastante normal que no estn
representados en la barra de herramientas todas las funciones posibles de la aplicacin, sino como
decamos, solamente las mas frecuentes. Pero ocurre que la funcin que para un usuario es muy
frecuente, para otro no lo es, por lo que tambin es habitual poder programar los iconos que aparecen en
la barra de herramientas.
Todo ello lo puede hacer el control Toolbar.
Para introducir el Toolbar es necesario que est presente en la caja de herramientas el control
personalizado Microsoft Windows Common Controls (COMCTL32.OCX).
El control Toolbar es un contenedor de un array de iconos. Estos iconos forman botones sobre los que
se puede insertar cdigo en sus procedimientos. A cada botn se le denomina Button y a la coleccin
de botones se le denomina Buttons. Cada Button es un elemento de la coleccin Buttons y por lo tanto
podemos referirnos a cada uno de ellos por el ndice que tiene dentro de la coleccin.
Los iconos de cada uno de los botones del Toolbar debe introducirse previamente en un control
ImageList. Como se recordar, un control ImageList es un almacn de imgenes, que podemos usar
en cualquier parte de la aplicacin. Una de esas partes es la confeccin de la barra de herramientas. Por
lo tanto, es necesario introducir un control ImageList en cualquier aplicacin que use un control Toolbar.
Todas las imgenes del Toolbar deben estar en un nico ImageList. Y este ImageList debe estar en el
mismo formulario que el Toolbar
La barra de herramientas puede realizarse en tiempo de diseo (este sera el caso para cuando no
existiese variacin ni eleccin de botones a lo largo de la ejecucin de la aplicacin)
o en tiempo de ejecucin (caso que correspondera con una aplicacin que tuviese una barra de men
programable o que variase esta barra de men dependiendo de cada operacin que se est ejecutando
en la aplicacin).
Para realizar la barra de herramientas en tiempo de diseo, basta con visualizar el cuadro de
propiedades que aparece pulsando el botn derecho del ratn sobre el control Toolbar. Aparecer un
cuadro de dilogo como este :

Puede ver que en el cuadro ImageList aparece el nombre de un ImageList. Al desplegar la lista
aparecern todos los ImageList que existan en el formulario. El ImageList debe estar en el mismo
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 124

formulario que el Toolbar. Deber elegirse el ImageList que contenga las imgenes de los iconos que
queremos introducir en el Toolbar.
Este cuadro nos permite tambin introducir la forma que adoptar el puntero del ratn cuando entre en el
Toolbar (MousePointer), si el Toolbar aparece por defecto habilitado o deshabilitado (Enabled) y si
muestra o no un rtulo programable al pasar el ratn por encima de cada botn del Toolbar. (ShowTips).
(El uso de estos pequeos rtulos pueden hacer una aplicacin muy bonita) La propiedad
AllowCustomize permite, si es True, cambiar el orden de los botones e introducir separadores (vea
evento DobleClick).
En el cuadro botones podemos introducir los datos deseados para cada uno de los botones que
compondrn la coleccin Buttons.

Para insertar un nuevo botn hay que hacer click sobre Insertar botn e insertar un nuevo botn
inmediatamente despus del que figura en la propiedad Index (en la figura del ejemplo, lo insertara en
segundo lugar, no en el ltimo lugar como podra creerse). Tambin podemos eliminar un botn
haciendo click sobre Eliminar botn.
El Caption (opcional) es la palabra que figurar debajo del icono del botn.
Un botn se identifica por su ndice. ( Toolbar1.buttons(1) )
La propiedad Key es un nombre que se puede aadir a cada botn. Esta propiedad sirve para identificar
el botn que se ha pulsado, pero no para nombrar al botn.
La propiedad Value es el valor por defecto, con el que aparecer el botn al comienzo de la aplicacin.
(Unpressed, no pulsado, Pressed, pulsado).
La propiedad Style define el tipo de botn :
0 - Default
1 - Check
2 - Button Group

3 - Separator
4 - PlaceHolder

Botn monostable. (Se pulsa, pero no se mantiene pulsado)


Botn Biestable. (Se mantiene pulsado y se levanta con otro click)
Solo uno de los botones del grupo puede estar pulsado. Esta
propiedad lleva implcito que los botones que forman un grupo son
biestables. Pueden hacerse varios grupos independientes introduciendo
un botn que no pertenezca a un grupo (tipos 0, 1, 3 4) entre los dos
grupos que se independientes que se pretenden formar
El botn se convierte en un separador de anchura fija.
El botn se convierte en un separador de anchura variable.

ToolTipText es el texto que aparecer al lado del botn cada vez que se ponga el cursor del ratn sobre
el botn. Para que aparezca debe estar habilitada la propiedad ShowTips.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 125

Image es el nmero de la imagen en el ImageList.


El control Toolbar tambin puede realizarse en tiempo de ejecucin. Para introducir u botn en el Toolbar
hay que crear el botn y aadirlo a la coleccin Buttons de Toolbar. Podemos hacerlo en una sola
instruccin :
Set NombreBotn = NombreToolbar.Buttons.add ( [Indice], [Key], [Caption], [Style], [Imagen])
NombreBotn puede ser cualquier nombre (es el nombre del objeto botn)
NombreToolbar es el nombre del Toolbar
Indice es el nmero de orden de ese botn dentro del Toolbar
Key es el valor de la propiedad Key del botn. Este valor debe ser nico para cada botn.
Style es un nmero del 0 al 4 con el tipo de botn. Vea lista mas arriba
Imagen es el nmero de la imagen para ese botn, dentro del ImageList que las contiene.
Los botones pueden habilitarse y deshabilitarse usando la propiedad Enabled (True / False). Recuerde
que los botones se identifican por su ndice :
Toolbar1.Buttons(Indice).Enabled = False
Para saber que botn se ha pulsado, puede leerse la propiedad Key :
Text1.Text = Button.Key

presenta en Text1 el texto introducido en la propiedad


Key del ltimo botn pulsado.

Con la lectura de la propiedad Key, y la sentencia Case o If ... Then podemos iniciar la parte de la
aplicacin asociada a cada botn.
El control Toolbar tiene los siguientes eventos :
ButtonClick
Este evento se produce cada vez que se hace click sobre un botn del Toolbar. Pasa como parmetro el
ndice del botn pulsado. Podremos saber que botn se ha pulsado mediante sentencias condicionales :
Private Sub Toolbar1_ButtonClick(ByVal Button As Button)
If Button.Index = 1 Then . . . .
If Button.Index = 2 Then . . . .
Tambin podramos usar la propiedad Key como se dijo mas atrs.
Click
Este evento se produce cuando se hace click sobre cualquier botn del Toolbar, pero no pasa
parmetros. (No distingue sobre que botn se ha hecho click) Podemos utilizarlo cuando se quiera
realizar una operacin comn para todos los botones (Que suene un Beep, por ejemplo)
DobleClick
Este evento solamente se produce cuando se hace doble click en la parte del Toolbar donde no hay
botones, y la propiedad AllowCustomize est a True. Si se hace doble click sobre un botn se produce
solamente el evento click (dos veces). Haciendo doble click en una zona libre de botones, con la
propiedad AllowCustomize = True nos permite cambiar el orden de los botones e introducir separadores.
Change
Se produce solamente cuando se ha realizado algn cambio del orden por el procedimiento anterior.
DragDrop, DragOver
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 126

Igual que cualquier control.


MouseMove, MouseUp, MouseDown
Igual que el resto de los controles Pasa como parmetro el ndice del botn, la tecla de maysculas, y las
posiciones x e y del ratn.
Private Sub Toolbar_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
Este control solamente funciona en la versin de VB de 32 Bits. Pero para 16 bits puede hacerse una
cosa parecida (y mas sencilla) utilizando un control Picture como contenedor de tantos controles Image
como necesitemos. Dado que el control Picture dispone de propiedad Align y puede servir como
contenedor de otros controles, puede realizarse una barra de herramientas similar a esta, y posiblemente
de forma mas sencilla.
El control Toolbar NO sirve de contenedor de otros controles, a excepcin de sus botones ! ! !

LA BARRA DE ESTADO
Este control es muy parecido a la barra de herramientas, y suele usarse, colocndolo en la parte inferior
de la ventana, para indicar el proceso que est en curso en la aplicacin. La barra de estado, control
StatusBar se introduce en la caja de herramientas al mismo tiempo que el control Toolbar, mediante el
control personalizado mltiple Microsoft Windows Common Controls (COMCTL32.OCX).
La barra de estado puede albergar hasta 16 paneles, que pueden contener texto o grficos. Tambin
pueden contener informacin del Hardware, tal como el estado de la tecla Bloqueo de Maysculas,
Bloqueo del teclado numrico, tecla Insert activada, tecla Scroll Lock activada, o mostrar la fecha y
la hora
La barra de estado puede configurarse como de un solo panel o de mltiples paneles. (Propiedad Style.
0=mltiples paneles, 1= panel nico)
Las dimensiones de cada panel pueden configurarse como fijas o ajustadas al tamao del texto o
imagen que presentan.
Las propiedades pueden establecerse en tiempo de diseo, mediante el siguiente cuadro.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 127

En este control las imgenes no es necesario introducirlas previamente en un ImageList. Pueden


introducirse directamente sobre el cuadro de dilogo que sale pulsando el botn derecho del ratn propiedades - en la ventana correspondiente a paneles. Acepta imgenes tipo Bit-map o .ICO. Los
paneles pueden combinar una grfico y un texto.
La barra de estado puede realizarse en tiempo de diseo o en tiempo de ejecucin. Para realizarla en
tiempo de ejecucin basta con visualizar la ventana de propiedades, muy similar a la del control Toolbar.
Para aadir un panel en tiempo de ejecucin basta con aadirlo a la coleccin Panels del control
StatusBar mediante la sentencia :
Set PanelNuevo = Nombrebarraestado.Panels.Add.( [ndice],[key],[Text],[estilo],[grfico]
Donde PanelNuevo es el nombre con el que se va a conocer ese panel que acabamos de crear.
PanelNuevo debe declararse como variable objeto Panel donde sea necesario segn el mbito que le
queramos dar. De esta forma, una vez creado, nos podremos referir a ese panel simplemente citndolo
por su nombre (En este caso, PanelNuevo)
Los trminos [ndice],[key],[Text],[estilo],[grfico]
del panel se explican a continuacin.

que entran a formar parte en la sintaxis de creacin

Indice - Necesario. Es el ndice que define al panel dentro del StatusBar.


Key - Opcional. Es la propiedad Key de ese panel (El contenido de esta propiedad lo podemos
leer desde cada panel
Variable = statusbar1.Panels(Panel.Index).Key
Text - El texto que queremos figure en el panel (Solo si la propiedad Estilo est en sbrText
Estilo - Propiedad estilo del panel.
0 - sbrText
El panel mostrar el Texto de la propiedad Text de ese panel
1 - sbrCaps
El panel muestra el estado de la tecla Bloqueo Maysculas
2 - sbrNum
El panel muestra el estado de la tecla Bloq. Nmeros
3 - sbrIns
El panel muestra el estado de la tecla Insert
4 - sbrScrl
El panel muestra el estado de la tecla Scroll / Lock
5 - sbrTime
El panel muestra la hora
6 - sbrDate
El panel muestra la fecha
Grfico - Es el grfico que va a tener el panel. Este grfico puede obtenerse desde un ImageList,
ImageList1.ListImages(n).Picture - o directamente desde el disco duro, mediante el
mtodo LoadPicture - LoadPicture("C:\vb\icons\comm\net09a.ico") -

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 128

Si no se pone alguna de las propiedades opcionales intermedias, deben mantenerse las comas
separadoras.
Como ejemplo, podemos aadir varios paneles de la siguiente forma :
Dim PanelNuevo As Panel
Dim pepe As Integer

Donde deba declararse a efectos del mbito

Set PanelNuevo = statusbar1.Panels.Add(pepe, "Contenido del Key " & Str(pepe), "Texto " & Str(pepe), ,
LoadPicture("C:\vb\icons\comm\net09a.ico"))

Estos son los controles grficos mas importantes. Ver a lo largo del curso que existen otros, y ms que
podr encontrar entre diferentes suministradores de controles, ya que VB ha dejado una puerta abierta
para realizar controles a medida. Existen varias empresas de software dedicadas a la fabricacin de
controles personalizados, y en el aspecto de controles grficos, podr encontrar una amplia gama de
fabricantes y controles. Puede obtener muchos controles en el CD-ROM que acompaa a varias revistas
especializadas en programacin VB, y a travs de Internet.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 129

Visual Basic - Gua del Estudiante - Ademdum 1 al Capitulo 4


CREAR CONTROLES EN TIEMPO DE EJECUCIN
Los ademdums se fueron introduciendo una vez que la Gua del Estudiante estuvo casi terminada. Los
temas tratados en los ademdums no constituyen en s mismos materia suficiente para un nuevo
captulo, ni se acoplan lgicamente a ninguno de los captulos escritos. Por lo tanto, se ha decidido
alojarlos en captulos que no eran demasiado gruesos, aunque el contenido de los ademdums no
encaje ni por su contenido, ni por los conocimientos anteriores. No se preocupe que algunos ademdums
no los entienda. Posiblemente estemos usando un lenguaje que no se ha visto todava en los captulos
estudiados. Los podr repasar cuando lo considere oportuno, una vez vaya avanzando en el curso.

Desde mis comienzos en la actividad educativa de esta asignatura, los alumnos siempre me preguntaron
por la posibilidad de crear controles en tiempo de ejecucin. Supongo que exista alguna razn que yo
desconozco para ello. Y digo esto porque no he tenido la necesidad de ello en ninguno de mis proyectos,
y no han sido precisamente pocos.
Quiero decir con esto que la creacin de controles en tiempo de ejecucin es algo muy llamativo, pero de
escaso sentido prctico. Sean los alumnos los que busquen utilidad a ello, y yo me limito a mi obligacin
de enserselo.

En anteriores versiones de VB era un proceso un poco tedioso. Haba que crear una matriz de controles
y aadir en tiempo de ejecucin tantos controles nuevos a esa matriz como necesitemos. Era
complicado. Haba que meter un control y ponerle Index = 0. Se le pone la propiedad Visible = False y ya
tenemos una matriz de controles. Una matriz de un solo control, pero al tener la propiedad Index = 0 ya
era una matriz. Ya en ejecucin, se utilizada el mtodo Load para crear los controles que necesitamos.
Los nuevos elementos de la matriz tendrn todas las propiedades del elemento inicial, es decir, las del
elemnto que tienen indice 0. Al ser una matriz, todos los controles comparten el cdigo de sus
procedimientos.
Para crear por ejejmplo, varios botones de comando, introduciremos primero uno con Index = 0
cmdBotonInicial(0) y cuando queramos crear un botn nuevo, invocamos el mtodo Load. Recuerde que
el nuevo botn tendr las mismas propiedades que el objeto inicial, por lo tanto sus mismas propiedades
Left y Top. Resultado: el nuevo botn queda completamente solapado con el inicial, por lo que habr que
cambiarle de posicin y coocarlo en las coordenadas deseadas.
Una de las propiedades que no se pasan al nuevo control es la propiedad Visible. Esta siempre
comienza a False. Por lo tanto tambin hay que ponerla a True para que veamos el nuevo control. Este
podra ser un cdigo para crear un botn de comando
Load cmdBotonInicial(1)
cmdBotonInicial(1).Visible = True
cmdBotonInicial(1).Left = cmdBotonInicial(0).Left + 1000
Es un poco complicado. Se suele hacer esto para que aparezca un control justamente donde hacemos
clic con el ratn sobre el formulario. Dejo al alumno la posibilidad de jugar con este mtodo.
Veamos un mtodo ms sencillo.
Add (Mtodo de la coleccin Controls)
Agrega un control a la coleccin Controls y devuelve una referencia al mismo.
Sintaxis
Set NombredelControl = NombredelFormulario.Controls.Add (progID, name, container)

Donde:
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 130

NombredelControl

Es la referencia del nuevo control devuelta por el mtodo Add. Debe ser
una variable tipo Control declarada previamente. Le recomiendo que esta
variable tipo objeto tenga el mismo nombre que le va a dar al control en su
parmetro Name. Le ahorrar muchas confusiones.

NombredelFormulario

Es el formulario donde se va a meter el nuevo control. (Puede ser Me)

ProgID

Es una cadena que identifica al control. Se obtiene del Examinador de


Objetos de Visual Basic. Consiste en una cadena que indica la biblioteca
donde se encuentra, seguido del nombre que puede ver en el citado
analizador de Objetos, separados ambos por un punto.

Name
Es el nombre que va a tener el control. Le repito lo de ms atrs. Ponga aqu la
misma cadena que en NombredelControl.
Container
Es el nombre del contenedor de ese control si es que se quiere meter
dentro de un contenedor que a su vez est dentro del formulario. Un
contenedor de controles puede ser un PictureBox o un Frame. Aqu se
pondra el nombre del ese contenedor que debe existir en el formulario.
Vamos a ver como se puede declarar una variable tipo Control. Puede hacerlo segn estos tres
ejemplos, en el primero se declara que NuevoBoton es un control, (declaracin suficientemente vlida
ya que posteriormente al crearlo, le diremos que ese control es precisamente un CommandButton) , en
la segunda ya lo declaramos como objeto CommandButton, y la tercera es la declaracin de un Objeto
TextBox:
Dim NuevoBoton As Control
Dim NuevoBoton As CommandButton
Dim NuevoTextBox As TextBox
Esta declaracin es suficiente si no va a poner cdigo en los procedimientos de ese control. El problema
es que con esa declaracin no se puede introducir cdigo. Para ello debe declararse de otra forma:
Private WithEvents NuevoBoton As CommandButton
Mediante esta declaracin (Que debe ponerse en la seccin de declaraciones del formulario), no
solamente estamos declarando que NuevoBoton es un CommandButton, sino que tendr los mismos
eventos (WithEvents) que un CommandButton.
El cdigo para crear estos dos controles es el siguiente:
(En el ejemplo se ha puesto en el procedimiento click de un botn de comando)
Set NuevoBoton = Me.Controls.Add("VB.CommandButton", "NuevoBoton1", Picture1)
Set NuevoTextBox = Me.Controls.Add("VB.TextBox", "NuevoTextBox", Picture1)
NuevoBoton.Visible = True
NuevoBoton.Left = 100
NuevoBoton.Top = 120
NuevoBoton.Caption = Soy un Botn
NuevoTextBox.Visible = True
NuevoTextBox.Left = 2000
NuevoTextBox.Top = 100
Ahora vamos a introducir el cdigo en el procedimiento Click del botn de comando. Para ello vamos a
Herramientas | Agregar Procedimiento y tecleamos el nombre del procedimiento: NuevoBoton_Click.
Continuamos escribiendo el cdigo deseado en ese nuevo procedimiento que acabamos de crear.
MsgBox "Esto Funciona"
Ejecutamos el programa y vemos que efectivamente, una vez creado el botn, al hacer click sobre l
sale el Mensaje Box. Volvamos a ver el cdigo. Cuando introducimos un procedimiento nuevo creado por
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 131

nosotros, ese procedimiento aparece en el desplegable de la derecha de la ventana de cdigo. En el


desplegable de la parte izquierda aparecen solamente los nombres de los controles existentes en el
formulario. Pero Oh sorpresa!, el procedimiento NuevoBoton_Click no est en el desplegable de la parte
derecha. Est en la parte izquierda, y como si fuese un botn que realmente existe en tiempo de diseo.
Ya hemos introducido cdigo en el botn recin creado.
Para el TextBox no ha hecho falta declararlo con la segunda declaracin, ya que no va a contener
cdigo. Podemos cambiarle las propiedades, estre ellas su propiedad Text:
NuevoTextBox.Text = "Hola Mi Amor, yo soy tu Lobo"
Texto que aparecer en el TextBox como si se tratase de un TextBox introducido durante el diseo.
Lgicamente, si ejecutamos la linea anterior antes de crear el TextBox dar un error.
Hay formas ms complicadas de crear controles, pero creo que con esta le basta. E insisto que nunca
me he visto en la necesidad de crear controles (lo cual no demuestra nada, lo reconozco)
Quitar controles
Para quitar controles agregados dinmicamente, se utiliza el mtodo Remove. Solamente se pueden
quitar los controles agregados con el mtodo Add (a diferencia de los controles agregados con la
instruccin Load, que se quitan mediante Unload ).
El siguiente ejemplo quita el control NuevoTextBox agregado dinmicamente:
Me.Controls.Remove "NuevoTextBox"

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 132

Visual Basic - Gua del Estudiante - Ademdun 2 al Capitulo 4


EL EXAMINADOR DE OBJETOS
El Examinador de objetos es una herramienta que tienen Visual Basic para ver los objetos de las
colecciones, las propiedades, mtodos y eventos de los controles, los mtodos del proyecto, las
constantes . Lo entenderemos mejor abrindolo. Para abrirlo, basta con pulsar F2

Este es el analizador de objetos. Puede ver que tienen varias partes. Comencemos por arriba.
El desplegable donde pone Todas sirve para elegir una parte de todo lo que nos puede mostrar. En este
caso est mostrando todo lo que tienen el proyecto. Si observa la figura de la pgina siguiente ver que
est desplegado, mostrando todas las referencias y controles que tienen en ese momento. Puede ver
que tienen el MSCommDlg, porque a ese proyecto le habamos introducido el CommonDialog. Si
seleccionamos ese control, nos aparecen en la ventana Classes todas las colecciones que tiene el
CommonDialog, entre ellas el propio control, que si lo seleccionamos, en la ventana de la derecha,
(Miembros) aparecern todas la propiedades, los mtodos, y los eventos (Claro que un CommonDialog
no tienen eventos, pero s aparecern si mostramos cualquier otro control)
Si le aadimos ahora una referencia (El acceso a una base de datos mediante DAO, por ejemplo)
aparecer esa referencia en la lista desplegable.
Los controles bsicos aparecen en la referencia VB. Aparecen concretamente los controles que figuran
en la barra de herramientas al abrir un nuevo proyecto. Si aadimos ms componentes (Haciendo clic
en la barra de men Proyecto | Componentes) veremos que aparecen nuevos controles en el
desplegable.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 133

En la casilla Miembros aparecen los mtodos, procedimientos y eventos de la clase seleccionada. Al


hacer click sobre cualquiera de estas propiedades, mtodos y eventos, en la parte inferior aparece la
explicacin del elemento elegido.
Parece que es un poco complicado. Nada ms lejos de la realidad. Ver que es una herramienta que le
va a ser muy til, y que la va a comprender una vez se decida a usarla, mucho antes que el tiempo que
necesitara para lerselo en este libro. Adelante.

Visual Basic - Gua del Estudiante Cap. 5


LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 134

PORTAPAPELES
INTERCAMBO DINAMICO DE DATOS
EL DRAG AND DROP (Drag & Drop) Arrastrar y Soltar
EL OLEDRAGDROP Drag & Drop con otras aplicaciones
MENS - MENUS EMERGENTES

EL PORTAPAPELES. EL OBJETO CLIPBOARD

El objeto Clipboard Proporciona acceso al Portapapeles del sistema.


El portapapeles es una herramienta de windows que permite transportar texto o imgenes de una
parte a otra dentro de la misma aplicacin, o entre dos aplicaciones distintas. Quin no ha
cortado y pegado en Windows? Pues al hacerlo est introduciendo texto en el portapaleles y
copindolo en otra parte.

El objeto Clipboard se usa para manipular el texto y los grficos del Portapapeles. Este objeto puede
usarse para permitir que el usuario corte, copie y pegue texto y grficos en la aplicacin.
El objeto Clipboard puede contener varias unidades de datos siempre y cuando cada una tenga un
formato diferente. Por ejemplo, se puede usar el mtodo SetData para poner un mapa de bits en el
Clipboard con el formato CF_BITMAP y despus usar el mtodo SetText con el formato CF_TEXT para
poner texto en el Clipboard. Despus se puede usar el mtodo GetText para recuperar el texto o el
mtodo GetData para recuperar el grfico. Los datos del Clipboard se pierden cuando se colocan otros
datos con el mismo formato en el Clipboard desde el cdigo o mediante un comando de men.
SetText
Pone una cadena de texto en el objeto Clipboard usando el formato del objeto Clipboard especificado.
No acepta argumentos con nombre.
Sintaxis

Clipboard.SetText datos, formato


datos

Requerido. Cadena de datos que se va a colocar en el Portapapeles.

formato Opcional. Una constante o valor que especifica uno de los formatos del Portapapeles
reconocidos por Visual Basic, como se describe a continuacin :
Los valores de formato son:
Constante

Valor

Descripcin

vbCFLink
vbCFRTF
vbCFText

&HBF00
&HBF01
1

Informacin de conversacin DDE


Formato de texto enriquecido
(Predeterminado) Texto

Estas constantes se enumeran en la biblioteca de objetos de Visual Basic (VB) del Examinador
de objetos.
SetData
Pone una imagen en el objeto Clipboard usando el formato grfico especificado. No acepta
argumentos con nombre.

LSB

Sintaxis

Clipboard.SetData datos, formato

datos

Requerido. El grfico que se va colocar en el objeto Clipboard.

formato

Opcional. Una constante o valor que especifica uno de los formatos del

Visual Basic Gua del Estudiante

Captulo 1

Pgina 135

objeto Clipboard reconocidos por Visual Basic, como se describe mas adelante.
Si formato se omite, SetData determina el formato grfico automticamente.
Los valores de formato son:
Constante

Valor

Descripcin

vbCFBitmap
vbCFMetafile
vbCFDIB
vbCFPalette

2
3
8
9

Mapa de bits (archivos .BMP)


Metarchivo (archivos .WMF)
Mapa de bits independiente del dispositivo (DIB)
Paleta de colores

Estas constantes se enumeran en la biblioteca de objetos de Visual Basic (VB) del Examinador
de objetos.
El grfico que se va colocar en el objeto Clipboard se define mediante la funcin LoadPicture o la
propiedad Picture de los objetos Form, Image o PictureBox.

GetData
Devuelve un grfico del objeto Clipboard. No acepta argumentos con nombre.
Sintaxis

Clipboard.GetData (formato)

formato
Opcional. Una constante o valor que especifica el formato grfico de Clipboard, como se
describe mas adelante. La constante o valor debe ir entre parntesis. Si formato es 0 o se omite,
GetData usa automticamente el formato apropiado.
Los valores de formato son:
Constante

Valor

Descripcin

vbCFBitmap
vbCFMetafile
vbCFDIB
vbCFPalette

2
3
8
9

Mapa de bits (archivos .BMP)


Metarchivo (archivos .WMF)
Mapa de bits independiente del dispositivo (DIB)
Paleta de colores

Si en el objeto Clipboard no hay ningn grfico que coincida con el formato esperado, no se
devuelve nada. Si en el objeto Clipboard slo hay una paleta de colores, se crea un DIB de
tamao mnimo (1 x 1).

GetText
Devuelve una cadena de texto del objeto Clipboard. No acepta argumentos con nombre.
Sintaxis

Clipboard.GetText (formato)

formato
Opcional. Un valor o constante que especifica el formato del objeto Clipboard, como se describe
mas adelante. La constante o valor debe ir entre parntesis.
Los valores de formato son:
Constante

Valor

Descripcin

vbCFLink
vbCFText

&HBF00
1

Informacin de conversacin DDE


(Predeterminado) Texto

Si en el objeto Clipboard no hay ninguna cadena de texto que coincida con el formato esperado,
se devuelve una cadena vaca ("").
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 136

Paste
Copia datos desde el Portapapeles del sistema en un control contenedor OLE.
Sintaxis

objeto.Paste

Objeto es el nombre del Panel Contenedor OLE donde se quiere depositar el contenido del
Portapapeles.
Comentario
Para usar este mtodo, defina la propiedad OLETypeAllowed y despus verifique el valor de la
propiedad PasteOK. No se puede pegar con xito a menos que PasteOK devuelva True.
Si se ha ejecutado el mtodo Paste, la propiedad OLEType es vbOLELinked (0) o
vbOLEEmbedded (1). Si no se ha ejecutado el mtodo Paste, la propiedad OLEType es
vbOLENone (3).
Este mtodo puede usarse para implementar un comando Edicin Pegar en un men.
Si el valor de la propiedad PasteOK es True y Visual Basic no puede pegar el objeto, el control
contenedor OLE elimina cualquier objeto existente en el control.
PasteOK
Devuelve un valor booleano que determina si el contenido del Portapapeles del sistema se
puede pegar en el control contenedor OLE.
Sintaxis

VariableBooleana = objeto.PasteOK

Objeto es el nombre del contenedor OLE donde se quiere pegar el contenido del portapapeles.

Cuando el valor de esta propiedad es True, el contenido del Portapapeles del sistema se puede
pegar en el control contenedor OLE.
La propiedad OLETypeAllowed se usa para especificar el tipo del objeto (vinculado o incrustado)
que se quiere pegar en el control contenedor OLE. Una vez que un objeto se ha pegado en el
control contenedor OLE, se puede verificar el valor de la propiedad OLEType para determinar el
tipo de objeto que ha sido creado.
Esta propiedad puede usarse si se quiere que la aplicacin implemente un comando Pegar en un
men Edicin. Si PasteOK es False, el comando del men se deshabilita; si no, puede
habilitarse. Los comandos de men se habilitan y se deshabilitan estableciendo su propiedad
Enabled a True o False, respectivamente.
Los objetos se pegan en el control contenedor OLE con el mtodo Paste.
Para ofrecer mayor flexibilidad al usuario, presente un cuadro de dilogo Pegado especial
cuando el usuario elija el comando Edicin Pegar
. (Establezca OLETypeAllowed = 2 y despus use el mtodo PasteSpecialDlg). Cuando se
presenta este cuadro de dilogo, el objeto del Portapapeles del sistema se pega basndose en
las selecciones del usuario en el cuadro de dilogo.
GetFormat
Devuelve un entero que indica si un elemento del objeto Clipboard coincide con un formato
especificado. No acepta argumentos con nombre.
Sintaxis

VariableLong = Clipboard.GetFormat (formato)

formato
Requerido. Un valor o constante que especifica el formato del objeto Clipboard, como se
describe mas adelante. La constante o valor debe ir entre parntesis.
Los valores de formato son:
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 137

Constante

Valor

Descripcin

vbCFLink
vbCFText
vbCFBitmap
vbCFMetafile
vbCFDIB
vbCFPalette

HBF00
1
2
3
8
9

Informacin de conversacin DDE


Texto
Mapa de bits (archivos .BMP)
Metarchivo (archivos .WMF)
Mapa de bits independiente del dispositivo (DIB)
Paleta de colores

El mtodo GetFormat devuelve True si algn elemento del objeto Clipboard coincide con el
formato especificado. Si no, devuelve False.
Para los formatos vbCFDIB y vbCFBitmap, la paleta de colores que se encuentre en el Clipboard
se usa para presentar el grfico.
Clear
Borra el contenido del Portapapeles del sistema.
Sintaxis

Clipboard.Clear

Con Clear se borra todo el contenido del portapapeles, texto y grficos.


Copy
Copia el objeto de un control contenedor OLE al Portapapeles del sistema.
Sintaxis

objeto.Copy

Objeto es el nombre del contenedor OLE cuyo contenido queremos copiar


Cuando se copia un objeto en el Portapapeles del sistema, todos los datos y la informacin de
vinculacin asociados con el objeto se copian en el Portapapeles del sistema. En el Portapapeles del
sistema se pueden copiar objetos vinculados y objetos incrustados.
Este mtodo puede usarse para implementar un comando Edicin | Copiar en un men.
EJERCICIO
Se propone el siguiente ejercicio, donde pueden verse todas las posibilidades del Portapapeles.
Cree un formulario de la siguiente forma :

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 138

El grfico que tiene el Picture de la izquierda puede ser cualquiera.


El cdigo de este formulario es el siguiente:
Option Explicit
Private Sub Check1_Click()
End Sub
Private Sub Command1_Click()
Clipboard.SetData Picture1.Image
End Sub
Private Sub Command2_Click()
Dim ClpFmt As Integer
Dim Msg As String
On Error Resume Next ' Configura el controlador de errores.
If Clipboard.GetFormat(vbCFText) Then ClpFmt = ClpFmt + 1
If Clipboard.GetFormat(vbCFBitmap) Then ClpFmt = ClpFmt + 2
If Clipboard.GetFormat(vbCFDIB) Then ClpFmt = ClpFmt + 4
If Clipboard.GetFormat(vbCFMetafile) Then ClpFmt = ClpFmt + 8
Select Case ClpFmt
Case 1
Msg = "El Portapapeles slo contiene texto."
Case 2
Msg = " El Portapapeles slo contiene un archivo de mapa de bits."
Case 3
Msg = " El Portapapeles contiene texto y un archivo de mapa de bits."
Case 5
Msg = " El Portapapeles contiene texto y un archivo DIB."
Case 8
Msg = " El Portapapeles contiene solamente un archivo MetaFile."
Case 9
Msg = " El Portapapeles contiene texto y un archivo MetaFile."
Case Else
Msg = "No hay nada en el Portapapeles."
End Select
Label1.Caption = Msg ' Muestra el mensaje.
End Sub
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 139

Private Sub Command3_Click()


Clipboard.Clear
End Sub
Private Sub Command4_Click()
Clipboard.SetText Label2.Caption
End Sub
Private Sub Command5_Click()
Label3.Caption = Clipboard.GetText
End Sub
Private Sub Command6_Click()
Picture2.Picture = Clipboard.GetData()
End Sub
Private Sub Command7_Click()
Picture2.Picture = LoadPicture
End Sub
Private Sub Command8_Click()
Text1.Text = Trim(Text1.Text)
If UCase(Right(Text1.Text, 3)) = "BMP" Then
Check1.Value = 1
Else
Check1.Value = 0
End If
If Check1.Value = 1 Then
Clipboard.SetData LoadPicture(Text1.Text), 8
Else
Clipboard.SetData LoadPicture(Text1.Text)
End If
End Sub

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 140

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 141

INTERCAMBO DINAMICO DE DATOS (Dinamic Data Exchange) DDE


El intercambio dinmico de datos es una utilidad de Windows que utiliza Visual Basic, y nos permite
crear aplicaciones que tomen datos una de otras.
Para pasar datos de una aplicacin a otra se necesitan al menos, dos aplicaciones (lgico), una que se
deje leer, y la otra (u otras), que quieran leer la informacin en aquella.
Puede darse el caso que una aplicacin est recibiendo datos de otra aplicacin, y a su vez enve datos
a una tercera.
A la aplicacin que enva la informacin se le llama aplicacin servidor, y a la que la recibe, aplicacin
cliente.
La aplicacin servidor debe estar funcionando antes de que la aplicacin cliente le pida la informacin. Si
no es as, se generar un error.
Los datos a traspasar de una aplicacin a otra pueden ser:
Textos, de un Label o un TextBox.
Imgenes, de un PictureBox.
El origen de un intercambio DDE siempre es un formulario. Dentro de este formulario origen estar el
Label, TextBox o PictureBox que contiene la informacin a enviar.
Para indicar que un formulario es origen de informacin para un intercambio DDE debemos decrselo en
sus propiedades LinkMode y LinkTopic.
El destino de un texto ha de ser necesariamente un Label, un TextBox, y el destino de un grfico debe
ser un PictureBox.
Cuando queremos que uno de estos controles sea el destino de un intercambio DDE debemos indicarlo
en sus propiedades LinkMode, LinkTopic, LinkItem, e indicarle el tiempo de espera para un
intercambio en la propiedad LinkTimeout.

Propiedad LinkMode
Tiene distinta forma si se trata de un control (Label, TextBox y PictureBox) un formulario.
Para un formulario tiene dos valores posibles :
0 = None
1= Source

No puede existir comunicacin DDE con ese formulario


El formulario permite que exista una comunicacin DLL entre uno de
sus controles y otra aplicacin.

Si se establece el valor de esta propiedad a 0 en tiempo de diseo, no podr cambiarse en tiempo de


ejecucin. Si se establece a 1 en tiempo de diseo, se podr cambiar a 0 y volver a ponerla a 1 en
tiempo de ejecucin.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 142

Para un control, la propiedad LinkMode le permite que inicie una conversacin DDE con una aplicacin
servidor, (origen), y cmo iniciarla. Tiene 4 valores posibles :
0=None.

No existe comunicacin DDE con ese control

1=Automtico

Los datos se traspasarn desde la aplicacin servidor a este control de


la aplicacin cliente cada vez que cambie el dato en la aplicacin
servidor (origen)

2=Manual

Los datos se traspasarn cuando lo pida la aplicacin cliente (destino),


mediante la orden LinkRequest.

3=Notify

Cuando existe un cambio en los datos de la aplicacin origen, sta


notifica a la aplicacin destino que el dato ha cambiado, pero no le enva el dato
nuevo. En el control de la aplicacin destino donde debe llevarse la informacin,
se genera el evento LinkNotify, en cuyo procedimiento podremos escribir el
cdigo necesario dependiendo de nuestra aplicacin. Para traer la informacin,
debe ejecutarse la orden LinkRequest. (Vase mas adelante)

En tiempo de ejecucin, para un control, esta propiedad es de lectura y escritura, es decir, se puede usar
para saber que valor tiene esta propiedad en un determinado control, o para forzar esa propiedad a un
determinado valor.
La sintaxis de esta propiedad es :
objeto.LinkMode [= nmero]
donde nmero es un entero que especifica el tipo de conexin. (0, 1, 2 3 segn se ha visto)
y objeto es el nombre del control.
Propiedad LinkTopic
Esta propiedad es de lectura y escritura, tanto para los controles como para los formularios.
Cuando un control destino quiere establecer una comunicacin DDE llama a la aplicacin origen, y
dentro de ella, al formulario que contiene el control cuya informacin debe ser traspasada. (Ntese que
la aplicacin origen puede tener varios formularios). Al ese formulario podra llamarle por su nombre,
(por su Name), pero no lo hace as. Le llama por un nombre que le debemos poner al formulario en su
propiedad LinkTopic. A este nombre se le denomina Tema.
La propiedad LinkTopic, para un formulario de origen, devuelve o establece el tema al que el formulario
responde en una conversacin DDE.
Sintaxis

NombredelFormulario.LinkTopic [= tema]

Para un control destino, La propiedad LinkTopic contiene el nombre de la aplicacin y el tema, ambos
separados mediante el carcter | (carcter 124)
Sintaxis

NombredelControl.LinkTopic [= aplicacionorigen|tema]

El nombre de la aplicacin origen ser el nombre del de proyecto de Visual Basic sin la extensin .VBP
(si la aplicacin se est ejecutando en el entorno de desarrollo de Visual Basic), o el nombre de la
aplicacin de Visual Basic sin la extensin .EXE (si se ejecuta como un archivo ejecutable
independiente).
El tema ser el mismo al que responde el formulario donde se encuentra el control que contiene la
informacin a traspasar.
(DDE es una utilidad de Windows. Windows establece que el estndar de un vinculo DDE es
Aplicacin | Tema | elemento. Vase para mas detalles el manual de Windows, enlaces DDE)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 143

Propiedad LinkItem
La propiedad LinkItem solamente la tiene el control destino de la informacin. No la tiene el formulario
origen. En esta propiedad deber expresarse el nombre del control origen de la informacin.
Esta propiedad es de lectura y escritura, es decir, tanto sirve para saber el nombre del control origen de
los datos, como para establecerlo en tiempo de ejecucin.
Sintaxis

objeto.LinkItem = cadena

donde cadena es el nombre del control origen que tiene los datos y objeto es el nombre del control al que
le estamos poniendo la propiedad LinkItem.

Propiedad LinkTimeout
Devuelve o establece la cantidad de tiempo que un control espera una respuesta a un mensaje DDE.
Sintaxis

objeto.LinkTimeout = nmero

donde nmero es una expresin numrica que especifica el tiempo de espera en dcimas de segundo.
El tiempo de respuesta DDE desde aplicaciones origen vara. Use esta propiedad para ajustar el tiempo
que un control destino espera la respuesta de una aplicacin origen. Si se usa LinkTimeout de forma
correcta se puede evitar la generacin de un error por Visual Basic si una aplicacin origen tarda mucho
en responder.
Nota La plazo mayor de tiempo que un control puede esperar es 65.535 dcimas de segundo, es decir,
sobre 1 hora y 49 minutos. Al establecer LinkTimeout a 1 se indica al control que espere la respuesta
en una conversacin DDE durante el mayor plazo de tiempo. El usuario puede forzar que el control deje
de esperar presionando la tecla ESC..

Evento LinkNotify
Ocurre cuando el origen ha cambiado el dato definido por el vnculo DDE si la propiedad LinkMode del
control destino est establecido a 3 (Notificar).
Private Sub objeto_LinkNotify([ndice As Integer])

End Sub
En este procedimiento se puede escribir el cdigo necesario para nuestra aplicacin, a sabiendas de que
este evento se produce cuando cambia la informacin en origen. Posiblemente no quiera depositarlo de
inmediato en el control destino, puesto que si fuese as habra puesto la propiedad LinkMode a 1.
Cuando quiera colocar el dato en el control destino, puede utilizar el mtodo LinkRequest para obtener el
nuevo dato de la fuente.

Mtodo LinkRequest
Pide a la aplicacin origen de una conversacin DDE que actualice el contenido de un control Label,
PictureBox o TextBox.
Sintaxis

objeto.LinkRequest

Siendo objeto el nombre del control destino de la aplicacin.

Objeto es el nombre de un control Label, PictureBox o TextBox involucrado en una conversacin DDE
como destino. LinkRequest provoca que la aplicacin origen enve los datos actuales al objeto,
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 144

actualizando la propiedad Caption si objeto es un control Label, la propiedad Picture si objeto es un


control PictureBox o la propiedad Text si objeto es un control TextBox.
Si la propiedad LinkMode del objeto est definida como 1 (Automtico), la aplicacin origen actualiza
objeto automticamente y LinkRequest no es necesario. Si la propiedad LinkMode del objeto est
definida como 2 (Manual) , la aplicacin origen actualiza objeto slo cuando se usa LinkRequest.
Si la propiedad LinkMode del objeto est definida como 3 (Notify), el origen notifica al destino que los
datos han cambiado invocando el mtodo LinkNotify. El destino debe entonces usar el mtodo
LinkRequest para actualizar los datos.

Mtodo LinkSend
Transfiere el contenido de un control PictureBox a la aplicacin destino de una conversacin DDE.
Sintaxis

objeto.LinkSend

Objeto debe ser un control PictureBox de un objeto Form que sea origen de una conversacin DDE.
Cuando otras aplicaciones establecen vnculos automticos con un objeto Form de su aplicacin, Visual
Basic las notifica cuando el contenido de un control TextBox o Label origen cambia. Sin embargo, Visual
Basic no notifica automticamente a una aplicacin destino DDE cuando el valor de la propiedad Picture
de un control PictureBox origen cambia. Como la cantidad de datos de un grfico pueden ser muy
grande y como no tiene sentido actualizar la aplicacin destino por cada cambio de pxel de la imagen,
Visual Basic requiere el uso del mtodo LinkSend para notificar explcitamente a las aplicaciones
destino DDE cundo cambia el contenido de un control PictureBox.

Mtodo LinkPoke
Transfiere el contenido de un control Label, PictureBox o TextBox a la aplicacin origen de una
conversacin DDE.
Sintaxis

objeto.LinkPoke

Objeto es el nombre del control Label, PictureBox o TextBox involucrado en la conversacin DDE como
destino. Si objeto es un control Label, LinkPoke transfiere el contenido de la propiedad Caption al origen.
Si objeto es un control PictureBox, LinkPoke transfiere el contenido de la propiedad Picture al origen. Si
objeto es un control TextBox, LinkPoke transfiere el contenido de la propiedad Text al origen.
Normalmente, en una conversacin DDE la informacin fluye de origen a destino. Sin embargo,
LinkPoke permite que un objeto destino suministre datos al origen. No todas las aplicaciones origen
aceptan informacin de esta forma; si la aplicacin origen no acepta los datos, se produce un error.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 145

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 146

EL DRAG & DROP

(Arrastrar y Soltar)

El Drag & Drop es una forma visual de representar el movimiento de algo. Para ello se toma algo de una
parte de la interface grfica, mediante la operacin de colocar el puntero del ratn y pulsar su botn
izquierdo sobre ese algo que se quiere tomar. Sin dejar de pulsar el botn izquierdo del ratn se desliza
(se arrastra) el puntero del ratn hasta el punto de la interface grfica donde lo queremos dejar. Ese
punto puede ser un control o un formulario. Una vez en el punto de destino se suelta el botn del ratn y
se deja caer lo que habamos tomado en el punto de origen. El efecto de tomar algo de un control le
denominaremos Drag. Si durante la operacin de arrastre pasamos por encima de un control, se
producir en ese control el evento DragOver Al efecto de dejar caer le denominaremos DragDrop.
El Drag & Drop tiene un efecto visual muy didctico. Pero NO HACE otra cosa. Es decir, no toma nada
del control origen ni lo suelta al llegar a destino. Esa accin de tomar algo en el origen o soltarlo al llegar
al destino debemos realizarla mediante cdigo en los eventos adecuados (MouseDown, DragOver ,
DragDrop), dando los valores adecuados a las propiedades DragMode y DragIcon, y utilizando el
mtodo Drag.

Propiedad DragMode
Es una propiedad de lectura y escritura. Devuelve o establece un valor que determina si se usa el modo
de arrastre manual o automtico en una operacin de arrastrar y soltar.
Sintaxis

NombreControlOrigen.DragMode = nmero

Donde nmero puede tomar los valores 0 (Manual) 1 (Automtico).


El valor predeterminado es el 0.
Cuando esta propiedad est a 0 (Manual) se debe emplear el Mtodo Drag para iniciar una operacin
Drag & Drop. Si est a 1, la operacin de arrastrar y soltar se inicia automticamente cada vez que
hacemos click sobre el botn izquierdo del ratn, teniendo el puntero del mismo sobre el control. Los
controles contenedores OLE slo se arrastran automticamente cuando no tienen el enfoque.
Parece en principio mas prctico tener esta propiedad a 1. Sin embargo la realidad es distinta. Se
controla mucho mejor el Drag & Drop poniendo esta propiedad a 0 (Manual), pese a que en este caso
deberemos utilizar el mtodo Drag para iniciar el proceso.
El poner esta propiedad en automtico conlleva tambin el hecho de que el control no toma el foco
haciendo click sobre l, ya que no sabe si lo que quiere hacer es llevarle el foco o iniciar una operacin
de Drag & Drop.

Propiedad DragIcon
Devuelve o establece el icono que se presenta como puntero del ratn durante una operacin de
arrastrar y soltar.
Sintaxis

NombreControlOrigen.DragIcon = icono

Donde Icono es cualquier referencia a un icono vlido.


Esta propiedad va a marcar el icono que aparezca durante la operacin Drag & Drop desplazndose a lo
largo de la ventana. Si no se especifica esta propiedad, el desplazamiento se expresa mediante un
rectngulo del tamao del control origen, cosa que resulta bastante desagradable en cualquier
aplicacin. Debe ponerse por lo tanto un icono en esta propiedad.
El valor de esta propiedad puede establecerse en tiempo de diseo, eligiendo el icono en el cuadro de
Propiedades del control origen, o en tiempo de ejecucin. En este caso, la referencia a un icono vlido
puede darse igualando el valor de esta propiedad a un icono ya existente en la aplicacin
(NCO.DragIcon = Form1.Icon pondra como icono el del formulario Form1, NCO.DragIcon =
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 147

Text1.DragIcon pondra el mismo icono de Text1 para esta propiedad),


funcin LoadPicture :

o cargndolo mediante la

(NCO.DragIcon = LoadPicture (C :\Iconos\Icono1.ICO)


El archivo que se cargue debe tener la extensin .ICO y formato de icono.
Para Nota. Cuando quiera colocar un icono animado en la propiedad DragIcon (una hoja de papel que
oscila al moverse, una hoja de papel que se destruye - ejemplos tomados de W95-), debe usar varios
iconos en secuencia. Por lo tanto debe cambiar la propiedad DragIcon a lo largo del tiempo que dura el
arrastre. Puede utilizar para ello un temporizador (control Timer) o basarse en las coordenadas del
formulario por donde se mueve (para eso introducen en el evento DragOver del Formulario). Dado que el
cambio debe ser rpido, no es conveniente acceder al disco (mediante la funcin LoadPicture) cada vez
que tiene que cambiar la imagen del icono. Como para simular un movimiento tan sencillo son
suficientes pocas imgenes, (8 por ejemplo) puede crear otras tantas variables tipo Picture, cargar las
imgenes al comienzo de la aplicacin (con la funcin LoadPicture) y cuando necesite el movimiento
animado del icono, cargar las 8 imgenes secuencialmente desde esas variables, para simular el
movimiento
NCO.DragIcon = Variable1
NCO.DragIcon = Variable2
......
NCO.DragIcon = Variable8
Esto le ocupar mas memoria. Es el precio a pagar por la rapidez y la buena presentacin de una
aplicacin.
Mtodo Drag
Inicia, termina o cancela una operacin de arrastre de cualquier objeto excepto los controles Line, Menu,
Shape o Timer.
Sintaxis

NombreControlOrigen.Drag TipoAccin

NombreControlOrigen es el nombre del control donde se inici la operacin Drag & Drop.
TipoAccin es un valor o una constante que especifica la accin a realizar, segn se describe a
continuacin :
Constante

Valor

Descripcin

vbCancel
vbBeginDrag
vbEndDrag

0
1
2

Cancela la operacin de arrastre.


Inicia el arrastre del objeto.
Termina el arrastre y suelta el objeto.

Si se omite TipoAccin, la accin predeterminada es iniciar el arrastre del objeto.


El uso del mtodo Drag para controlar una operacin de arrastrar y soltar slo se requiere cuando la
propiedad DragMode del control origen tiene el valor Manual (0). Sin embargo, Drag puede usarse con
objetos cuya propiedad DragMode tenga el valor 1 (o vbAutomatic).
En versiones anteriores de Visual Basic, Drag era un mtodo asncrono y las instrucciones siguientes se
ejecutaban incluso aunque la accin de arrastre no hubiera terminado. En Visual Basic versin 4.0, Drag
es un mtodo sncrono y las instrucciones siguientes no se ejecutan hasta que la accin de arrastre no
haya terminado.
Usando el mtodo Drag puede controlar exactamente cuando quiere que se produzca el inicio del Drag &
Drop y el final. El autor de esta Gua del Estudiante vuelve a recomendar que ponga la propiedad
DragMode = 0 (Manual). Entre otras razones por la siguiente :

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 148

Cuando tenemos la propiedad DragMode de un TextBox a 1 (automtico) ese TextBox no podr coger el
foco, (al menos de forma fcil) y si lo consigue no puede seleccionar el texto que tiene actualmente, ya
que VB no puede saber si lo que est ocurriendo es que queremos seleccionar el texto o si deseamos
iniciar la operacin D & D.
Como decamos al principio, el Drag & Drop solamente es una manifestacin visual de algo que se est
produciendo, pero ese algo deberemos programarlo. Por ejemplo, es muy tpico llevar un dato de una
casilla a otra (de un TextBox a otro p.e.) mediante una operacin D & D.
El dato debemos llevarlo a una variable que nos permita, al final de la operacin, introducir ese dato en el
TextBox final. (No olvide declarar la variable en el lugar correspondiente para que sea vlida en ambos
controles). La accin de llevar el dato a la variable debemos hacerla en el procedimiento mas adecuado.
Puede ser por ejemplo, el procedimiento MouseDown del control origen, ya que cualquier operacin de
D & D comienza haciendo click en el control origen. Si tiene la propiedad DragMode de ese control en
Manual, en el momento de hacer Click, ese control toma el foco y, caso de un TextBox, puede arrastrar
con el ratn para cambiar el texto, cosa que no podra hacer si pone DragMode=1.

Evento DragOver
Cuando una operacin de arrastrar y soltar est en progreso y el cursor del ratn pasa por encima de un
control o un formulario, se produce el evento DragOver de ese control o formulario.
Dependiendo si se trata de un Formulario convencional, un Formulario MDI o un control, el
procedimiento DragOver captura distintos parmetros :
Private Sub Form_DragOver(origen As Control, x As Single, y As Single, estado As Integer)
Private Sub MDIForm_DragOver(origen As Control, x As Single, y As Single, estado As Integer)
Private Sub Control_DragOver([ndice As Integer,]origen As Control, x As Single, y As Single, estado As
Integer)
Donde :
origen = Control que se est arrastrando. O dicho de forma mas ortodoxa, control en el que se inici la
operacin de Drag & Drop. Dentro de este procedimiento puede hacer referencia a sus propiedades y
mtodos con este argumento. Por ejemplo, Source.Visible = False. Caso de que el Control Origen fuese
parte de un array de controles, el Index de ese control se tiene en ndice
x, y
Nmero que especifica la posicin horizontal (x) y vertical (y) actual del puntero del mouse
dentro del control o formulario destino. Estas coordenadas se expresan siempre en trminos del sistema
de coordenadas del destino tal y como se establece en las propiedades ScaleHeight, ScaleWidth,
ScaleLeft y ScaleTop.
estado Entero que nos indica el estado de transicin del control que se est arrastrando en relacin al
formulario o control destino:
0 = Entra. Este valor se produce en el instante en el que entra el cursor del ratn a
este control o Formulario. Se genera tambin en el control origen en el instante que se
pulsa el botn del ratn, inicindose de esta forma el D & D.
1 = Deja Este valor se produce cuando el cursor sale del control o Formulario.
2 = Sobre Este valor se produce cuando el cursor se est moviendo sobre el control o
el Formulario destino.

Mediante el parmetro origen (completado con ndice si el origen se trata de un array) podemos
conocer el control desde el que se inici la operacin de Drag & Drop. Debemos tener siempre presente
que el procedimiento DragOver se realiza cada vez que pasamos por encima de un control o formulario
durante una operacin de Drag & Drop, independientemente que ese control o formulario sea o no sea
origen ni destino de esa operacin. Puede emplearse el procedimiento DragOver para comprobar si ese
valor que transportamos puede depositarse sobre el control o formulario por el que estamos pasando, si
el valor que llevamos est dentro de los mrgenes que admite la aplicacin, etc. Es muy llamativo por
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 149

ejemplo, cambiar el color del control que va a recibir el valor traspasado si este valor se sale de los
mrgenes aceptables. O cambiar la propiedad DragIcon del control origen cuando ese dato no se puede
depositar en ese control. Es tpico poner la seal de trafico de Prohibido cuando el dato transportado no
se puede soltar sobre el control sobre el que estamos pasando el cursor del ratn. (Como el control
origen se pasa como parmetro al procedimiento DragOver con el nombre Origen basta con poner
Origen.Dragicon = ..... ) Recuerde en este caso que al abandonar ese control debe restaurar el icono
original. Para ello es til cargar varias variables con los distintos iconos que se van a usar y luego igualar
la propiedad DragIcon del control origen a una u otra variable, dependiendo de los valores u otros
factores de la aplicacin.
En el siguiente ejemplo, se declaran 6 variables tipo Picture que van a almacenar seis iconos distintos :
En General - Declaraciones
Dim pepe as string
Dim icono1 As Picture, Icono2 As Picture, Icono3 As Picture
Dim Icono4 As Picture, Icono5 As Picture, Icono6 As Picture
El Form1.Load se cargan los valores de estas variables con seis iconos existentes en el disco. El icono
asignado al control origen (Text1) es Icono4.
Set icono1 = LoadPicture("C:\vb\icons\dragdrop\drag1pg.ico")
Set Icono2 = LoadPicture("C:\vb\icons\dragdrop\drag2pg.ico")
Set Icono3 = LoadPicture("C:\vb\icons\dragdrop\drag3pg.ico")
Set Icono4 = LoadPicture("C:\vb\icons\dragdrop\drop1pg.ico")
Set Icono5 = LoadPicture("C:\vb\icons\dragdrop\dragfldr.ico")
Set Icono6 = LoadPicture("C:\vb\icons\dragdrop\dropfldr.ico")
Text1.DragIcon = Icono4
En el control destino se cambia el icono si el valor de la variable transportada (pepe) es mayor de 999 :
En el procedimiento DragOver
If Val(pepe) > 999 Then Source.DragIcon = icono1
Al salir de Text1 se recupera el icono original
If State = 1 Then Source.DragIcon = Icono4

Evento DragDrop
Ocurre cuando se completa una operacin de arrastrar y soltar como resultado de arrastrar un control
sobre un formulario o control y liberar el botn del mouse o utilizar el mtodo Drag con su argumento
accin establecido a 2 (Drop).
Dependiendo de si soltamos sobre un Formulario convencional, Formulario MDI o Control, este evento
captura los siguientes parmetros :
Private Sub Form_DragDrop(origen As Control, x As Single, y As Single)
Private Sub MDIForm_DragDrop(origen As Control, x As Single, y As Single)
Private Sub Control_DragDrop([ndice As Integer,]origen As Control, x As Single, y As Single)
Estos parmetros son idnticos a los del Procedimiento DragOver ya comentados
Utilice un procedimiento de evento DragDrop para controlar qu ocurre tras completarse una operacin
de arrastrar. Por ejemplo, puede mover el contenido del control origen a un nuevo lugar o copiar un
archivo de un lugar a otro, depositar un valor sobre un control etc.
Recuerde que la operacin Drag & Drop no hace otra cosa que lo que se puede ver en la interface
grfica. Debe poner en este Procedimiento (DragDrop) el cdigo necesario para que se realice la
operacin deseada.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 150

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 151

EL OLE Drag & Drop


El Drag & Drop visto hasta ahora permite llevar datos desde un control a otro siempre dentro de la
misma aplicacin, incluyendo una interface grfica muy didctica para presentar ese movimiento de
informacin. El DDE permite llevar informacin desde una aplicacina otra, pero de forma rgida, es
decir, desde un control a otro control, sin intervencin del usuario, o al menos, sin una intervencin
realizada de forma grfica con el ratn.
Cuando veamos las propiedades de los controles relacionadas con el Drag & Drop, veamos otras que
hablaban de Drag y Drop, que eran OLEDragMode y OLEDropMode, y en el Formulario veamos
solamente esta ltima: OLEDropMode. Entre los procedimientos observbamos algo parecido:
OLECompleteDrag,
OLEDragDrop,
OLEDragOver,
OLEGiveFeedback,
OLESetData
y
OLEStartDrag. Tambin existe el Mtodo OLEDrag.
Mediante estas propiedades, procedimientos y mtodo, podemos hacer que desde una aplicacin (Word
por ejemplo) pase informacin a una aplicacin hecha por nosotros, utilizando la misma interfase grfica
para ver el movimiento de los datos. Lo mismo ocurre en sentido contrario. Desde una aplicacin
nuestra podemos llevar texto o imgenes a Word. A ese mecanismo se le denomina OLE Drag & Drop.
Parece como si el OLE Drag & Drop reuniera las dos ventajas de DDE y de Drag & Drop. Esa fue la idea
con la que Microsoft creo esta herramienta.
Mediante el OLE Drag & Drop ya podemos enlazar nuestras aplicaciones a las aplicaciones compradas.
Pero piense que lo que va a conseguir con el OLE Drag & Drop ya lo tiene prcticamente igual con el
portapapeles. Por lo tanto, no se haga demasiadas ilusiones. Y adems recuerde que el mecanismo de
arrastrar y soltar no es tan fcil como copiar y pegar, al menos para personas poco hbiles.
El Objeto DataObjet
El objeto DataObjet es un contenedor que utiliza OLE para transportar datos. Recuerde, cuando
hacamos Drag & Drop normal, en el Drag tenamos que meter lo que queramos transportar (Texto o
imagen) en una variable y en el Drop ponamos el contenido de esa variable en el control final. Esto
puede hacerse cuando se trata de una misma aplicacin, en la que el valor de la variable se mantiene
mientras estuvisemos dentro del mbito donde se ha declarado. Cmo haramos esto para pasar un
texto a Word? Debe haber una variable que mantenga su contenido entre dos aplicaciones. Esa
variable debe ser un objeto superior a las dos aplicaciones que van a intercambiar datos. Es
concretamente el DataObjet
El objeto DataObject es un contenedor de datos donde se pueden transportar datos desde un
componente de origen a un componente de destino.
El DataObject tiene sus propiedades y mtodos.
Mtodos del DataObject
Mtodo SetData
Inserta datos en un objeto DataObject con el formato de datos especificado.
Sintaxis

objeto.SetData [datos], [formato]

objeto es un objeto tipo DataObjet. Este objeto no es necesario declararlo, ya que aparece en todos los
procedimientos donde es posible introducir o sacar datos del DataObject.
Por ejemplo, en el mtodo OLEStartDrag se pasa como parmetro un objeto DataObject llamado Data.
Private Sub Text1_OLEStartDrag(Data As DataObject, AllowedEffects As Long)
Data.SetData Text1.Text, vbCFText
End Sub

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 152

Data es un objeto tipo DataObject donde se ha metido el texto que contienen el Text1. Ese objeto
llamado Data lo ha pasado el procedimiento (Data As DataObject) por lo que podemos meterle los datos
sin necesidad de crearlo previamente. Este objeto es nico para Windows, por lo que a partir de la
ejecucin de ese procedimiento OLEStartDrag el texto introducido en Data est disponible para cualquier
aplicacin Windows que sepa recogerlo.
datos es el dato a introducir en el DataObject. En el ejemplo anterior, era el texto contenido en Text1
formato es un valor o constante que especifica el tipo de datos introducidos. Este argumento es
opcional. Vea valores posibles en el cuadro ms abajo.

Mtodo GetData
Devuelve datos de un objeto DataObject en forma de Variant.
Sintaxis

objeto.GetData (formato)

objeto es el objeto tipo DataObject


formato es un valor o constante, que determina el formato de los datos que se van a obtener. Los
valores para formato se pueden ver en el cuadro ms abajo.
Un ejemplo de GetData. En el procedimiento OLEDragDrop de un RichTextBox con la propiedad
OLEDropMode existe este cdigo para poner el texto que llevaba el DataObject en el RichTextBox.
Observe que tambin se pasa en este procedimiento, un parmetro llamado Data del tipo DataObject.
Private Sub RTB1_OLEDragDrop(Data As RichTextLib.DataObject, Effect As Long, Button As Integer,
Shift As Integer, x As Single, y As Single)
RTB1.SelText = Data.GetData(vbCFText)
End Sub

Loa valores o constantes para formato en ambos mtodos son:


Constante
vbCFText
vbCFBitmap
vbCFMetafile
vbCFEMetafile
vbCFDIB
vbCFPalette
vbCFFiles
vbCFRTF

Valor
1
2
3
14
8
9
15
-16639

Descripcin
Texto (archivos .txt)
Mapa de bits (Archivos .bmp)
Metaarchivo (archivos .wmf)
Metarchivo mejorado (archivos .emf)
Mapa de bits independiente del dispositivo (DIB)
Paleta de colores
Lista de archivos
Formato de texto enriquecido (archivos .rtf)

Mtodo Clear
Elimina el contenido del objeto DataObject.
Sintaxis

objeto.Clear

Puede ejecutar este mtodo antes de introducir nuevos datos en el DataObject para asegurarse que ha
borrado los datos existentes
Private Sub Text1_OLEStartDrag(Data As DataObject, AllowedEffects As Long)
Data.Clear
Data.SetData Text1.Text
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 153

End Sub
Este mtodo slo est disponible para los orgenes de operaciones de arrastre de componentes. Si se
invoca Clear desde un destino de la operacin de colocacin de componentes, se producir un error.
Mtodo GetFormat
Devuelve un valor booleano que indica si un elemento del objeto DataObject coincide con un formato
especificado.
Sintaxis

objeto.GetFormat formato

Ejemplo
Puede asegurarse que el formato contenido en el DataObject es el deseado antes de
proceder a colocarlo en un control en la operacin de Drop:
Private Sub RTB1_OLEDragDrop(Data As RichTextLib.DataObject, Effect As Long, Button As Integer,
Shift As Integer, x As Single, y As Single)
If Data.GetFormat(vbCFText) = True Then
RTB1.SelText = Data.GetData(vbCFText)
End If
End Sub
Propiedades del DataObject
Deberamos decir mejor, propiedad, ya que solamente tiene una:
Propiedad Files
Devuelve una coleccin DataObjectFiles, que a su vez contiene una lista con todos los nombres de
archivo utilizados por un objeto DataObject (por ejemplo los nombres de los archivos que un usuario
arrastra hacia o desde el Explorador de archivos de Windows).
Sintaxis

NombredelObjetoDataObject.Files(ndice)

La coleccin Files slo se puebla con nombres de archivo cuando el objeto DataObject contiene datos
de tipo vbCFFiles. La coleccin Files puede rellenarse para permitir a las aplicaciones de Visual Basic
actuar como origen de operaciones de arrastre de una lista de archivos.
Coleccin DataObjectFiles
Es la coleccin de cadenas con los nombres de ficheros de la propiedad Files del objeto DataObject.
Sintaxis

NombredelObjetoDataObject.DataObjectFiles

La coleccin DataObjectFiles es una coleccin de cadenas que representan un conjunto de archivos


seleccionados mediante el mtodo GetData o en una aplicacin, como el Explorador de Windows.
Aunque la coleccin DataObjectFiles tiene sus propios mtodos y propiedades, debe usar la propiedad
Files del objeto DataObject para ver y manipular el contenido de la coleccin DataObjectFiles.
Aunque se ha pretendido realizar un ejemplo de esta propiedad, el autor cede ese honor al alumno
interesado en el tema. No he podido obtener los elementos de la coleccin DataObjectFiles.

Volvamos sobre las propiedades y mtodos de los controles involucrados en un OLE Drag & Drop

Propiedad OleDragMode
Esta propiedad establece la forma en la que comienza a realizarse la operacin de Drag. Si est en
Automtico basta con seleccionar el texto o la imagen a pasar a otra aplicacin y una vez seleccionado,
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 154

al volver a marcarlo con el ratn, se inicia el Drag. En ese instante se ejecuta el procedimiento
OLEStartDrag donde deberemos colocar el cdigo para que VB haga lo que nosotros queramos. Ya se
ver al estudiar este procedimiento.
A diferencia del Drag & Drop estudiado anteriormente, donde recomendbamos poner la propiedad
similar a manual, en este caso es mucho ms prctico ponerlo en automtico y adems no es molesto,
ya que el Drag no se inicia si no se ha seleccionado previamente parte del texto o la imagen a enviar a la
otra aplicacin.
La propiedad DragMode de ese control debe estar ahora a Manual, ya que si est en automtico se
genera antes el Drag & Drop ordinario y no se producir el OLE Drag & Drop.
Si se pone esta propiedad a Manual es necesario iniciar el drag mediante el mtodo OLEDrag, que
ejecuta el procedimiento OLEStartDrag, y colocar en este el cdigo correspondiente. No es prctico,
pero cada aplicacin y cada programador es una caso distinto.

Propiedad OLEDropMode
Esta propiedad va a determinar la forma en la que el componente destino toma los datos transportados
medainte OLE Drag & Drop. Acepta tres valores:
0

vbOLEDropNone

El componente no acepta operaciones de Drop. Cuando pasa el


cursor del ratn sobre l durante una operacin de OLE Drag &
Drop, muestra el icono de No Colocar
vbOLEDropManual
Manual. El componente de destino desencadena los eventos
OLE de colocar, (Evento OLEDragDrop) lo que permite al
programador controlar la operacin en el cdigo.
vbOLEDropAutomatic Automtico. El componente de destino acepta automticamente
las operaciones OLE de colocar si el objeto DataObject
contiene datos en un formato que reconoce. En este caso, en el
destino no se producen los eventos del mouse ni eventos OLE
de arrastrar y colocar.

Es normal poner esta propiedad a manual, para poder controlar lo que ocurre con la informacin tanto en
destino como en origen. Estando en Automtico, la informacin en el origen se mueve al destino, es
decir, desaparece del origen al tiempo que se pone en el destino. Esto puede que no sea lo deseado por
el programador. Si pone esta propiedad en Manual, puede controlar lo que hace la informacin tanto en
destino como en origen.
Eventos relacionados con el OLE Drag & Drop.
Una cosa que podemos advertir en todos los eventos relacionados con el OLE Drag & Drop es la
ausencia del parmetro Source que tenamos en los eventos DragDrop y DragOver del Drag&Drop
convencional. Parece normal, ya que no tenemos porque saber el nombre del control origen si ste es
de una aplicacin externa (Word por ejemplo). Ese parmetro Source lo emplebamos para saber si un
control poda recibir o no la informacin, dependiendo del origen de la misma. En el OLE Drag & Drop
solamente podemos basarnos para eso en el tipo de informacin que transporta el DataObject, tipo que
podemos determinar mediante el mtodo GetFormat.
Evento OLEStartDrag
Se produce cuando se ejecuta el mtodo OLEDrag de un componente o cuando un componente inicia
una operacin OLE de arrastrar y colocar, y su propiedad OLEDragMode est establecida a Automatic.
Sintaxis
Private Sub objeto_OLEStartDrag(datos As DataObject, efectosPermitidos As Long)
Vemos que pasa como parmetro el objeto datos que es del tipo DataObject. Por lo tanto podemos
realizar sobre este objeto el mtodo SetData visto anteriormente, para introducir en l los datos
deseados. Veamos un ejemplo:
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 155

Private Sub Text1_OLEStartDrag(Data As DataObject, AllowedEffects As Long)


Data.Clear
Data.SetData Text1.Text
AllowedEffects = 1
End Sub
El parmetro EfectosPermitidos va a determinar lo que ocurre con el dato en el control origen. Acepta 3
valores:
0
1

vbDropEffectNone
vbDropEffectCopy

vbDropEffectMove

No se inicia el OLE Drag & Drop


Los datos se copian en el destino y no se modifican en el
control origen.
Los datos se colocan en el destino y desaparecen del control
origen. Ocurre el efecto de mover los datos.

Evento OLEDragOver
Se produce cuando el puntero del ratn pasa por encima de un control durante una operacin de OLE
Drag & Drop.
Sintaxis
Private Sub nombredelcontrol_OLEDragOver(datos As DataObject, efecto As Long, botn As Integer,
maysculas As Integer, x As Single, y As Single, estado As Integer)
Este evento solamente ocurre cuando la propiedad OLEDropMode est en manual
nombredelcontrol

datos
efecto
boton
mayusculas

x, y
estado

Nombre del control sobre el que pasa el puntero del ratn, en el que se
produce el evento OLEDragOver.

Objeto tipo DataObject que transporta los datos


Este parmetro es similar al AllowedEffects del evento OLEStartDrag y
tiene los mismos valores.
Indica el botn que se est pulsando: 1 = izdo. 2 = Dcho. 4 = Central.
Si est pulsado ms de uno, ser la suma de los valores de cada uno.
Indica el estado de pulsacin de las teclas MAYUSCULAS, CTRL y ALT
1 = MAY, 2 = CTRL, 4 = ALT. Si hay ms de una tecla pulsada, ser
la suma de los valores de cada una.
Posicin del puntero del ratn dentro del control destino, medidas en las
unidades de medida del formulario.
Valor que indica uno de los tres estados siguientes:
0
1
2

vbEnter
vbLeave
vbOver

El ratn est entrando al control


El ratn est saliendo del control
El ratn est dentro del control

Evento OLEDragDrop
Se produce cuando se termina la operacin de OLEDrag&Drop sobre el control. Para que se pueda
terminar la operacin de OLEDrag&Drop el componente destino tienen que permitirlo.
Nota Este evento slo se produce cuando OLEDropMode est establecido a 1 (Manual).
Sintaxis
Private Sub objeto_OLEDragDrop(datos As DataObject, efecto As Long, botn As Integer,
maysculas As Integer, x As Single, y As Single)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 156

En este evento podemos escribir el cdigo necesario para que el dato se coloque de la forma deseada
(por ejemplo, puede analizar el tipo de dato y proceder de acuerdo al contenido del DataObject).
Los parmetros pasados por este evento son iguales al del evento anterior.

Evento OLECompleteDrag
Se produce en el origen cuando se ha completado la operacin de arrastre (cuando se levanta el botn
del ratn), e informa al componente de origen de que se ha completado o cancelado dicha operacin.
Sintaxis

Private Sub objeto_OLECompleteDrag([efecto As Long])

Efecto es idntico a los eventos anteriores.


En el ejemplo siguiente, el control origen (Text1) se pone rojo cuando se termina el OLEDrag&Drop:
Private Sub Text1_OLECompleteDrag(Effect As Long)
Text1.BackColor = 255
End Sub

Evento OLEGiveFeedback
Este evento se produce en el control Origen. Se produce despus de cada evento OLEDragOver.
OLEGiveFeedback permite al componente de origen proporcionar al usuario una indicacin visual, como
cambiar el cursor del mouse para indicar lo que ocurrir si coloca el objeto o sealar visualmente la
seleccin (en el componente de origen) para indicar lo que va a ocurrir.
Sintaxis
Private Sub objeto_OLEGiveFeedback(efecto As Long, cursoresPredeterminados As Boolean)
efecto

igual a los eventos anteriores.

CursoresPredeterminados
Valor booleano que determina si Visual Basic utiliza el cursor
predeterminado del mouse que indica el componente o si utiliza un cursor definido por el usuario.
True (predeterminado) = utiliza el cursor predeterminado.
False = no utiliza el cursor predeterminado. Debe haber establecido un cursor de mouse con la
propiedad MousePointer del objeto Screen.

En este captulo hemos visto tres formas de transvasar informacin, bien de una aplicacin a otra, bien
dentro de la misma aplicacin.
Es posible que le haya llamado la atencin estas herramientas. Y posiblemente piense en un enorme
nmero de posibilidades de aplicacin. La realidad le va a demostrar que se aplican muy pocas veces.
Exceptuando el OLEDrag&Drop, que le permite exportar texto a / desde Word, y eso le vienen muy bien
al usuario porque le ahorra tiempo de teclear, los dems no se usan con la profusin que se debera,
vistas a priori las ventajas que tienen.
Como siempre en programacin, lo bueno es lo que acepta y le gusta al usuario. Y el realizar un arrastre
con el ratn es una operacin que no todos terminan con xito. Quizs sea esa la razn de no usarlo tan
profusamente.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 157

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 158

EL EDITOR DE MENUS
El Men o Barra de Men es la segunda lnea de cualquier ventana Windows, donde pueden verse
distintos nombres. La Barra de Men es un componente de un Formulario.
La Barra de Men puede tener tantas palabras como se desee, y sobre cada palabra, puede desplegarse
un Men desplegable con mas palabras. Sobre cada una de estas puede a su vez desplegarse otro
conjunto de palabras, etc. con lo que se puede conseguir una cantidad de palabras tan grande como
necesitemos.

Para cada palabra se produce el evento click. Cada palabra de la Barra de Men lleva anexo un nico
procedimiento, que se ejecutar al hacer click sobre la palabra. Pero en las palabras que sirven para
desplegar un men no tiene sentido que se ponga ningn cdigo en su procedimiento, ya que estn ah
justamente para desplegar otras palabras. Ser en las palabras finales donde se colocar el cdigo
correspondiente.
En las figuras anteriores pueden verse tres formas distintas de ver el mismo Men. En la primera figura
el Men est sin desplegar. En la segunda figura puede verse un rbol de Men largo, desplegado en su
totalidad. En la tercera puede verse el Men desplegable de la palabra Archivo de la Barra de Men.
Puede apreciarse en este men desplegable una lnea que separa las palabras Guardar Como y
SALIR. Esta lnea separadora es muy prctica para separar dos temas distintos dentro de un Men
desplegable. Tan distintos como las operaciones de Abrir y Guardar respecto a la ltima orden del men
desplegable que es SALIR de la aplicacin.
Para crear un men debe usarse el Editor de Men, que se encuentra en la Barra de Men de VB en
Herramientas | Editor de mens. Le aparecer el siguiente cuadro. (En principio vaco)

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 159

Cada palabra del men tiene su Caption (La palabra que aparece en el men), su Name (Nombre), y
puede tener Index (si existen varias palabras con el mismo Name). Para introducir estas propiedades
basta con teclearlas directamente en cada una de las casillas al efecto del cuadro del editor de mens.
Para colocar el cursor de escritura en una u otra casilla, puede hacerse bien con el cursor del ratn, bien
con el tabulador. Para pasar a la siguiente lnea de edicin (crear una nueva palabra), basta con pulsar
ENTER.
Existen otras propiedades aparte del Caption y Name que se introducen directamente en las casillas al
efecto.
HelpContextID Igual que esta propiedad en el resto de los controles, permite introducir un nmero de
contexto para la ayuda de Windows.
Enabled.
Habilitado. Si se quita la marca de esa casilla, esa palabra aparecer por defecto
deshabilitada. Esta propiedad puede leerse y cambiarse en tiempo de ejecucin, por lo que esta
propiedad puede usarse para deshabilitar ciertas funciones de la aplicacin, dependiendo de la evolucin
de la propia aplicacin. La presentacin en el men cuando est deshabilitada es con color plido.
Visible.
ejecucin.

Como su nombre indica, que sea visible o no lo sea. Puede cambiarse en tiempo de

WindowList
Indica si esa palabra es la que va a mostrar todos los formularios abiertos en una
aplicacin de documentos mltiples (MDI). Al hacer click sobre esta palabra, se desplegar un
submen con todos los Caption de los Formularios hijo abiertos en ese momento. Solamente puede
existir una palabra en un men con esta propiedad activada. Esta propiedad no puede variarse en
tiempo de ejecucin.
Para cambiar una de estas propiedades en tiempo de ejecucin, basta con citar por su nombre a esa
palabra (por su Name, no por su Caption), e igualar a True o False su valor :
nmuDocumentos.Visible = False
El nombre usado para nombrar a una de las palabras del men puede ser cualquiera. Sin embargo es
prudente usar un nombre que nos pueda identificar, por una parte, que ese nombre corresponde a una
de las palabras del men, y por otra, a que palabra se refiere. La solucin puede ser cualquiera. El autor
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 160

de estos apuntes propone poner las letras mnu (o menu - recomiendo no usar acentos e los Names de
VB), seguido del Caption de esa palabra.
Otras propiedades
Shortcut
Atajo. Esta propiedad admite varias combinaciones de teclas para acceder al
procedimiento click de esa palabra sin necesidad de usar el ratn. Las combinaciones de teclas posibles
se muestran haciendo click en la flecha hacia abajo que tiene esa casilla. Se desplegar una lista con
todas ellas. Para elegir una de estas combinaciones, basta con hacer click sobre la lnea que la contiene.
Esta combinacin de teclas aparecer en el men, al lado de la palabra (Vase figura siguiente, SALIR
Ctrl + X)
NegotiatePosition.
Establece un valor que determina si los controles Menu de nivel superior se
muestran en la barra de mens mientras un objeto vinculado o incrustado de un formulario est activo y
mostrando sus mens. No est disponible en tiempo de ejecucin. Puede tener los valores 0
(Predeterminado) Ninguno. El men no se muestra en la barra de mens cuando el objeto est activo.
1 Izquierda. El men se muestra a la izquierda de la barra de mens cuando el objeto est activo.
2 Medio. El men se muestra en medio de la barra de mens cuando el objeto est activo.
3 Derecha. El men se muestra a la derecha de la barra de mens cuando el objeto est activo.
El men editado con los datos de la figura anterior tendr esta forma en tiempo de ejecucin :

Observe que tiene cuatro palabras en la lnea superior, y que colgando de la primera aparece un men
desplegable. Para conseguir un men desplegable fjese en la figura del Editor, en la parte de abajo
donde estn todos los Caption de las palabras del men. Observar que algunas de ellas (&Edicion,
Documentos, Ayuda - Hay otra que no se v, &Archivo) estn completamente a la izquierda de la
ventana, y las dems estn separadas de la parte izquierda por unos guiones. Las palabras que estn
completamente a la izquierda son las que figurarn en la barra de men de forma permanente. Las que
estn separadas (tabuladas) corresponden a las que aparecern en los mens desplegables. Como es
lgico, un men desplegable debe colgar de una palabra de las de la barra de men. La palabra de la
que cuelga el submen es la palabra sin tabular inmediatamente anterior.
Para tabular las palabras, hay que hacer click en el botn en forma de flecha a la derecha que est sobre
la ventana de edicin:

Situandonos sobre una de las lneas ya editadas, y haciendo click sobre el botn con flecha hacia la
izquierda, quitamos la tabulacin.
Los botones con flecha hacia arriba o abajo nos permiten variar el orden de las lneas ya editadas.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 161

Podemos hacer varios niveles de submens a base de introducir varias tabulaciones. Al comienzo de
este captulo puede ver un ejemplo de ello.
Quedan un par de cosas. Una de ellas es el carcter & que est delante de los Caption de Archivo y
Edicin. Este carcter nos permite acceder al procedimiento click de esa palabra pulsando la tecla Alt +
la tecla correspondiente a la letra que est detrs del carcter &. Justamente la letra que est subrayada
en la palabra del men.
El carcter & no tiene porqu ir precisamente al comienzo de la palabra. Puede ir en el medio de la
palabra. De esta forma se subrayar una letra intermedia.
Otra cosa. Puede verse en el men desplegado de la figura anterior una lnea entre Guardar Como y
SALIR. Esta lnea, que solamente tiene efectos estticos, se logra introduciendo como Caption un guin
( - ). El editor de mens solamente le permite el guin en una palabra de men desplegable (Tabulada).
No se olvide de poner el Name incluso para este guin.

NOTA MUY IMPORTANTE


Siempre se recomienda poner la orden de SALIR en la primera palabra de la barra de Men. Bien que
esa primera palabra sea Salir o que est en el men desplegable de la primera palabra de la Barra de
Men, en este ltimo caso, separada mediante una lnea separadora. (Vea The Windows Interface
Guidelines for Software Design, pg.124)

POPUP MENS
Un PopUpMen o Men Emergente es un men que despliega en cualquier punto de un Formulario (MDI
o normal) con varias opciones. Es normal en los procesadores de texto que se obtenga un men
emergente pulsando el botn derecho del ratn, donde aparecen las tres palabras mgicas de Copiar,
Cortar y Pegar.
Para crear un men emergente o PopUpMenu es necesario tener en el men de ese formulario una
palabra de la que se despliegue un submen con las mismas palabras que queremos que aparezcan en
el PopUpMenu.
Por ejemplo, en el men que hemos editado como ejemplo anteriormente, exista una palabra Edicin,
de la que se desplegaba el Submen Copiar, Cortar y Pegar. Si analizamos la edicin realizada, las
palabras tenan el siguiente Caption y Name :

Caption

Name

Tabulada

Edicin
Copiar
Cortar
Pegar

mnuEdicion
mnuCopiar
mnuCortar
mnuPegar

NO
SI
SI
SI

Recuerde que las palabras del men que estaban tabuladas son las que aparecan en el men
desplegable. Esas mismas sern las que aparezcan en el PopUpMenu.
Para ello utilizaremos el Mtodo PopupMenu. Este mtodo pesenta un men emergente en un objeto
MDIForm o Form en la posicin actual del mouse o en las coordenadas especificadas.

La sintaxis de este mtodo es la siguiente :


NombreFormulario.PopupMenu nombremen, indics, x, y, negrita
Donde NombreFormulario es el nombre del formulario donde presentamos el PopUpMenu. Puede
omitirse.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 162

Nombremen. Este parmetro es requerido. Es el Name de la palabra del men de donde cuelga el
men desplegable. La palabra del men a que se refiere Nombremen debe tener al menos un
submen.
Indics. Parmetro opcional. Un valor o constante que especifica la posicin y el comportamiento del
men emergente, como se describe a continuacin :
Constante (posicin)

Valor

Descripcin

vbPopupMenuLeftAlign

vbPopupMenuCenterAlign 4
vbPopupMenuRightAlign 8

(Predeterminado) El lado izquierdo del men se


sita en x.
El men emergente se centra en x.
El lado derecho del men se sita en x.

Constante (comportamiento)

Valor

Descripcin

vbPopupMenuLeftButton

vbPopupMenuRightButton

(Predeterminado) Los elementos del


men emergente slo reaccionan a los
clic del mouse cuando se use el botn
primario del mouse.
Los elementos del men emergente
reaccionan a los clic del mouse cuando se
usen los botones primario o secundario.

Para combinar la los valores de indics de posicin y comportamiento basta con sumar los valores.
Nota El parmetro indics no tiene efecto en las aplicaciones que se ejecuten bajo Microsoft Windows
versin 3.0 o anteriores.
X, y Parmetro(s) opcionales que especifican las coordenadas x e y donde va a aparecer el men
emergente. Si no se especifican, aparecer donde est el puntero del mouse. Las unidades de medida
de las coordenadas x e y se definen mediante la propiedad ScaleMode.
negrita. Parmetro opcional que especifica el nombre de un control men del men emergente para
presentar su ttulo en negrita. Si se omite, ningn control del men aparece en negrita.
Nota. Este argumento funciona solamente en las aplicaciones que se ejecuten bajo Windows 95. La
aplicacin ignora este argumento cuando se ejecute bajo versiones de 16 bits de Windows o Windows
NT 3.51 y anteriores.
La forma mas habitual de presentar un men emergente es mediante el botn derecho del ratn.
Concretamente en el editor Word que estoy utilizando para escribir estos apuntes ocurre cuando se
levanta el botn derecho del ratn. Es decir, en el evento MouseUp, con la condicin de que Button=2.
Imaginemos que queremos presentar en un men emergente las palabras Cortar, Copiar y Pegar del
ejemplo anterior, que colgaban en el men de la palabra Edicin. (Vea mas atrs). Queremos tambin
que la palabra Copiar salga resaltada en negrita. Iramos al procedimiento MouseUp del Formulario y
escribiramos :
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then
PopupMenu mnuEdicion, , , , mnuCopiar
End If
End Sub
Observe que se ha omitido el nombre del Formulario (Opcional), el parmetro indics, y las coordenadas
x e y (el men emergente aparecer donde est situado el cursor del ratn). Observe tambin que las
comas separadoras de los parmetros hay que colocarlas.
Cuando se presenta un men emergente, el cdigo que sigue a la llamada al mtodo PopupMenu no se
ejecuta hasta que el usuario elige un comando del men (en cuyo caso se ejecuta antes el cdigo del
procedimiento de evento Click) o cancela el men. Adems, slo puede presentarse un men emergente
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 163

al mismo tiempo; por lo tanto, las llamadas a este mtodo se ignoran si el men emergente est
presentado actualmente o si un men desplegable est abierto.
Si queremos presentar un men emergente es necesario tener ese men en el men del formulario. El
problema puede ser que no queramos que est en la barra de men. No es problema. Ponga la
propiedad Visible del elemento del men desde el que se va a desplegar el submen a False. No se ver
ya en la barra de men ni esa palabra ni el submen que de ella se despliega. Eso s, las palabras del
submen deben tener la propiedad Visible = True. Si les pone esa propiedad a False, no se vern en el
men emergente. Puede aprovechar esta circunstancia para hacer mens emergentes con mas o
menos elementos, segn las necesidades de su aplicacin. Tambin puede poner la propiedad Enabled
a False si as lo precisa. No puede activar la propiedad WindowList en un elemento que forma parte de
un men emergente.

Ejercicio propuesto: un editor de texto, con un men que diga Copiar | Cortar | Pegar donde
pueda utilizar el portapapeles. Ahora es posible que le cueste un poco de trabajo. Pero este
ejercicio lo va a repetir con casi todas las aplicaciones que realice en su vida profesional.

Visual Basic - Gua del Estudiante Cap. 6


FICHEROS EN VISUAL BASIC
Existen tres tipos de ficheros donde podremos almacenar y leer datos:
- Secuenciales
- Aleatorios (Random)
- Binarios

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 164

Cada uno de ellos tiene sus aplicaciones y particularidades.


FICHEROS SECUENCIALES
Este tipo de ficheros nos permite guardar informacin de cualquier longitud. En este tipo de ficheros, la
informacin se guarda colocando un carcter tras otro. La forma de leerlos es, igualmente, carcter tras
carcter. (Byte tras byte). Son los mas sencillos de manejar, y los utilizados para guardar texto en ASCII.
Permiten guardar datos en un fichero con un determinado nombre, "machacando" la informacin de otro
posible fichero que ya estuviese en el disco con el mismo nombre, o aadir la informacin nueva a
continuacin de la ya existente.
Para abrir un fichero secuencial para guardar informacin, debemos ejecutar la siguiente instruccin:
Open Nombrefichero For Output As # Numerocanal
De esta forma, si ya exista un fichero llamado Nombrefichero, sobreescribiremos dicho fichero
perdiendo la informacin que contuviese. Es la forma tpica de hacerlo cuando modificamos un texto.
Para aadir la nueva informacin tras la ya existente, deberemos abrirlo con la siguiente instruccin:
Open Nombrefichero For Append As # Numerocanal
Numerocanal debe ser un nmero comprendido entre 1 y 255. Representa el nmero del canal por
donde introduciremos los datos. Normalmente se llama tambin nmero de archivo. No puede haber
mas de un archivo abierto con un nmero de canal determinado.
Para cerrar un fichero secuencial, basta con ejecutar la instruccin:
Close # Numerocanal
Si no se especifica Numerocanal (la instruccin Close a secas) se cerrarn todos los ficheros abiertos
actualmente.
Para introducir la informacin, pueden emplearse dos mtodos: Print y Write Nos centraremos de
momento solamente en Print.
Print
Introduce la informacin de forma secuencial, byte tras byte tal como se coment. Sirve
para guardar textos. Por ejemplo si deseamos guardar en ese fichero el contenido de
una caja de texto llamada Text1, basta con ejecutar la siguiente instruccin:

Print #NumerodeCanal, Text1.Text


El texto queda en el fichero en caracteres ASCII, que se pueden leer con el Bloc de
Notas.

Cuando los datos se han introducido con la instruccin Print, la forma de acceder a ese texto es muy
sencilla:
Se abre el archivo con la instruccin Open
Open Nombrefichero For Input As # Numerodecanal
Se utiliza la instruccin Input o Line Input para sacar los datos del fichero.
La instruccin Input tiene en este caso la siguiente sintaxis:
VariableString = Input (Numero de caracteres, # Numero de canal)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 165

Por ejemplo, VariableString = Input (1, #1) extrae un carcter del fichero abierto como #1. El nmero
mximo de caracteres a extraer de un golpe mediante la instruccin Input est limitado a 65.534.
Ver un poco mas adelante la propiedad LOF de los ficheros secuenciales. LOF devuelve un valor igual
a la longitud total del fichero. Si ejecutamos la instruccin :
Para no emplear una palabra tan larga como Numerodecanal, utilizaremos de ahora en adelante el
nmero 1 como nmero de canal. Recuerde que ese nmero puede ser un nmero comprendido entre
el 1 y el 255
VariableString = Input (LOF(1), #1)

LOF(1)=longitud del fichero #1

leeremos el fichero de una nica vez. Este procedimiento puede ahorrarle cierto tiempo a la hora de la
lectura. (Por lo dicho anteriormente, este procedimiento de leer todo el fichero de un golpe solamente se
podr hacer si la longitud del fichero (LOF(1)) es inferior a 65.534 bytes. Tenga esto presente cuando
vaya a leer un fichero que no sabe que longitud tiene. Para curarse en salud, le recomiendo que lea los
ficheros secuenciales carcter a carcter. Input(1,#X) pues tarda poco mas que leyndolo de un golpe.
Claro que para leer un fichero carcter a carcter debe poner un bucle en el que se van leyendo los
caracteres hasta que llaga al final del fichero..
La forma de hacer este bucle es la siguiente:
Dim A As String
A es la variable donde meteremos el carcter que extraemos del fichero.
Dim MiVariable as String
MiVariable es una variable tipo string donde vamos a meter todo el
contenido del fichero
Do Until EOF(1)

El programa ejecutar este bucle hasta que se cumpla que EOF(1) sea
True. EOF(NumerodeCanal) es una propiedad de los ficheros cuando
estn abiertos, que es True cuando la posicin del puntero de lectura
apunta al carcter Fin De Fichero (End Of File) que es el carcter siguiente
al ltimo carcter de texto de ese fichero.

A = Input (1, #1)

Estrae un carcter del fichero abierto por el canal nmero 1. Al leer este
carcter, el puntero de lectura avanza automticamente tantos caracteres
como haya ledo, colocndose sobre el primer carcter no ledo.

MiVariable = MiVariable & A

Con esta lnea vamos anexando el carcter ledo a la variable


MiVariable. En vez de utilizar una variable, podramos poner ese
texto sobre un TextoBox o un RichTextBox (RTB) (Lo ver
proximamente). Si lo ponemos en un RTB esta lnea sera:
RTB.SelText = A

Loop

Vuelve al comienzo del bucle.

Close #1

Cierra el fichero

Slo se utilizar la instruccin Input con archivos abiertos en modo Input o Binary. (Los Binary Se vern
a continuacin) A diferencia de la instruccin Input #, (la veremos a continuacin, pues es la instruccin
que deber utilizar para leer archivos escritos con la instruccin Write ), Input devuelve todos los
caracteres que lee, incluyendo puntos y coma, retornos de carro, avances de lnea, comillas y espacios
iniciales.
Existe una instruccin, Input$ , que asume que el dato a leer es un String. (Cadena de caracteres).
Puede ahorrar un poco de memoria usando esta instruccin en lugar de Input.
Nota Se proporciona otra funcin (InputB) para su uso con datos de byte incluidos en archivos de texto.
En lugar de especificar el nmero de caracteres a devolver, nmero especifica el nmero de bytes.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 166

INSTRUCCION LINE INPUT


La instruccin Line Input se utiliza para extraer una lnea completa. Tiene la siguiente sintaxis:
Line Input # Nmero de canal, VariableString
Mediante esta instruccin se extrae una lnea completa (los caracteres delimitados entre dos retornos de
carro), y se le asigna esa cadena a VariableString
Una lnea es un trozo de texto delimitado por los caracteres 13 (Retorno de carro) y 10 (Avance de lnea)
La instruccin Line Input # lee un carcter cada vez en un archivo hasta que encuentra un retorno de
carro (Chr(13)) o una secuencia retorno de carro - avance de lnea (Chr(13) + Chr(10)). Las secuencias
de retorno de carro - avance de lnea no se tienen en cuenta y no se aaden a la cadena de caracteres
extrada mediante esta instruccin. Cuando lea un archivo mediante Line Input # y lo quiere presentar
en un TextBox o en el Printer, deber introducirlos para evitar que le salga todo el texto en una nica
lnea.
Con lo que se ha explicado, ya puede realizar un pequeo edito de textos. Este sencillo editor tiene un
TextBox llamado TBTexto, donde podemos escribir el texto que queramos (con la propiedad MultiLine =
True y ScrollBars = Vertical), tres botones llamados BAbrir (1), (2 a y b) y (3), para abrir el fichero y
poner su contenido en TBTexto, y dos BGuardar para guardar, uno abriendo el fichero For Append y el
otro abrindolo For Output. En este ltimo, al guardar el texto borramos el contenido que del fichero, si
ya existiera. En el primero, lo anexamos al final del mismo . Para conocer el nombre del fichero,
ponemos un CommonDialog llamado CD1, con un filtro CD1.Filter = Ficheros de Texto |*.txt
Para abrir el fichero, y depositar su contenido en TBTexto pondremos este cdigo en BAbrir :
Private Sub BAbrir1_Click()
Dim VarTexto As String
CD1.Filter = "Ficheros de Texto |*.txt"
CD1.ShowOpen
Open CD1.filename For Input As #1
VarTexto = Input(LOF(1), #1)
'leemos todo el fichero de un golpe
Close #1
TBTexto = VarTexto
End Sub
Cuando el fichero es mayor de 64 kilobytes, el leerlo de un golpe puede dar problemas. Mejor dicho, no
funciona. Deberemos leerlo en ese caso, carcter a carcter o lnea a lnea.
Para leer carcter a carcter :
Private Sub BAbrir_Click()
Dim VarTexto As String
CD1.Filter = "Ficheros de Texto |*.txt"
CD1.ShowOpen
Open CD1.filename For Input As #1
Do Until EOF(1)
Hacemos un bucle de lectura hasta que encontremos EOF(1)
Vea mas adelante la Propiedad EOF en Propiedades de los ficheros Secuenciales
VarTexto = Input(1, #1)
'leemos el fichero carcter a carcter
TBTexto = TBTexto & VarTexto
'vamos aadiendo los caracteres ledos a TBTexto
Loop
Close #1
End Sub
(NOTA.- Lo expuesto funciona perfectamente, pero el hecho de meter en un TextBox carcter a carcter
eterniza la aplicacin. - Meter un texto en un TextBox o en un Label es una operacin que tarda cierto
tiempo. Si esa operacin hay que hacerla una vez por carcter, puede tardar mucho tiempo. Para evitar
esto, cuando vaya a leer un fichero carcter a carcter, mtalo primero en una variable y luego realice un
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 167

volcado nico de esa variable al TextBox o Label)


Y podemos hacerlo tambin leyendo lnea a lnea con Line Input
Dim VarTexto As String
CD1.Filter = "Ficheros de Texto |*.txt"
CD1.ShowOpen
Open CD1.filename For Input As #1
Do Until EOF(1)
Line Input #1, VarTexto
'leemos el fichero Lnea a Lnea
TBTexto = TBTexto & VarTexto & vbCrLf
'vamos aadiendo las lneas ledas a TBTexto
'(Hay que introducir un retorno + avance de lnea con cada lnea (vbCrLf), ya que VarTexto no
contiene los retornos ni avances de lnea.
Loop
Close #1
Los Botones de Guardar tienen el cdigo :
Private Sub BGuardar_Click()
Dim VarTexto As String
CD1.Filter = "Ficheros de Texto |*.txt"
CD1.ShowSave
Open CD1.filename For Output As #1
Print #1, TBTexto.Text
Close #1
End Sub
O para el caso de abrir con For Append
Private Sub BGuardar2_Click()
Dim VarTexto As String
CD1.Filter = "Ficheros de Texto |*.txt"
CD1.ShowSave
Open CD1.filename For Append As #1
Print #1, TBTexto.Text
Close #1
End Sub
Ya hemos visto como se guardan y se leen datos de texto en un fichero secuencial.
INSTRUCCIN WRITE
La otra forma de introducir datos en un fichero secuencial es Write. Mediante esta instruccin, no se
puede introducir texto, sino datos, aunque esos datos sean de texto. Mediante la instruccin Write
puede crear una pequea base de datos. Eso s, una base de datos de escasa calidad. Pero no es
momento de cuestionar la calidad de esta base de datos, sino de explicarla.
Write
Puede introducir varias informaciones, que posteriormente se podrn leer de forma
separada con la instruccin Input #. Esta forma de introducir datos en un fichero
secuencial permite realizar un fichero con distintos datos que se pueden leer en el propio
fichero, puesto que se guardan en ASCII, y leerlos mediante el programa de una forma
muy sencilla. Hacemos, en realidad, una pequea base de datos. (Ver a lo largo de su
vida profesional que lo de pequea no es cierto, pues es la forma mas sencilla de
guardar datos cuando la cantidad de estos datos no es muy grande)
Lo que estamos haciendo en realidad al escribir datos mediante la instruccin Write es escribir estos
datos en un fichero secuencial, utilizando una coma como separador entre los distintos datos. Un fichero
secuencial con datos introducidos mediante la instruccin Write tendr esta forma :
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 168

Luis Surez, VisualBasic - Gua del estudiante,Editorial XX,3200,51


Miguel de Cervantes,El Qijote,Editorial YY,5000,27
Observe que el contenido de este fichero se diferencia algo de una simple sucesin de caracteres. Tiene
varias partes separadas por una coma. Cada una de ellas es un dato.
Imaginemos una aplicacin, con la que introducimos datos de libros. La aplicacin es un nico formulario
donde podemos introducir la informacin mediante varios TextBox. Existe un Botn de comando con el
siguiente cdigo:
Private Sub Command1_Click()
TITULO = LIBRETBTITULO.Text
AUTOR = LIBRETBAUTOR.Text
EDITORIAL = LIBRETBEDITORIAL.Text
PRECIO = LIBRETBPREC.Text
EXISTENCIAS = LIBRETBEX.Text
Donde LIBRETBTITULO, LIBRETBAUTOR, Etc. son los nombres de los TextBox
Ha ledo los datos de los TextBox. Ya estn el las variables TITULO, AUTOR, Etc.
Ahora los metemos en el fichero con la instruccin Write. El nombre del fichero ser el
que hayamos puesto en el TextBox LIBRETBFICHERO, y lo guardar en el directorio
C :\cursoVB
Open TBNombreFichero.Text For Append As #1
Write #1, TITULO, AUTOR, EDITORIAL, PRECIO, EXISTENCIAS
Close #1
End Sub
Si introduce los datos del ejemplo anterior, se crear un fichero que tiene esta apariencia:
Luis Surez, VisualBasic - Gua del estudiante,Editorial XX,3200,51
Si realizamos otra introduccin de datos, con la segunda lnea del ejemplo anterior, los datos existentes
en ese fichero no se borrarn, dado que lo hemos abierto con Append. Quedar de la siguiente forma:
Luis Surez, VisualBasic - Gua del estudiante,Editorial XX,3200,51
Miguel de Cervantes,El Qijote,Editorial YY,5000,27
Que pasara si leemos este fichero con la instruccin Input o Line Input # vista anteriormente ? Pues
simplemente que lo leeramos tal como est, con sus comas y comillas dobles. No sera la forma mas
adecuada, ya que lo que queremos es obtener sucesivos datos de autores, ttulos, editoriales, precios y
existencias.
Para sacar estos datos debemos leerlos con la instruccin Input #. Esta instruccin saca los datos que
hemos metido, es decir, elimina las comillas y la coma que servan de separadores.
En nuestro ejemplo, podramos hacerlo de esta forma, aprovechando los mismos TextBox:
Private Sub Command2_Click()
' Limpiamos los TextBox
LIBRETBTITULO.Text = "" : LIBRETBAUTOR.Text = "" : LIBRETBEDITORIAL.Text = ""
LIBRETBPREC.Text = "" : LIBRETBEX.Text = ""
'Abrimos el fichero
Open TBNombreFichero.Text For Input As #1
Do Until EOF(1)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 169

' Introducimos una parada para poder leer datos


DETENERSE = True
Input #1, TIT, AUT, NED, PRE, EXS
LIBRETBTITULO.Text = TIT
LIBRETBAUTOR.Text = AUT
LIBRETBEDITORIAL.Text = NED
LIBRETBPREC.Text = PRE
LIBRETBEX.Text = EXS
' Refrescamos los TextBox
Refresh
' Esto produce una pequea parada
Do While DETENERSE = True
A=A+1
If A = 100000 Then DETENERSE = False: A = 0
Loop
' termin la parada y vuelve a leer datos
Loop
Close #1
End Sub
Observe que los nombre de las variables en el proceso de lectura tienen distintos nombres a los
utilizados durante la escritura. Como en el fichero no se guarda ninguna referencia al respecto, lo nico
que importa es que el nmero de variables para la lectura sea igual al nmero de variables que se utiliz
para la escritura, y que el orden de las variables sea correcto. Si por ejemplo, el nmero de variables
usadas en la introduccin de datos fuese distinto al nmero de variables usado en la lectura, Visual Basic
nos dara un error.
Observe tambin que se ha introducido un temporizador. Sirve para ver los sucesivos ttulos que
tenemos en nuestra base de datos tan sui generis. Se ha pretendido presentar unos datos de esta
pequea base de datos sin complicarnos mucho la vida. Mas adelante veremos como presentarlos de
una forma correcta. Este tipo de ficheros no es el mas adecuado para construir bases de datos, es
complicado manejar ficheros de mas de unas pocas lneas, por lo que para tener muchos datos, este
tipo de ficheros no es recomendable. No es aconsejable ni para muchos datos ni para pocos datos. Pero
es obligacin del autor explicarlo y de advertirlo.
En esta pequea aplicacin mostrbamos las informaciones sucesivamente segn las bamos leyendo
del fichero. Interrumpamos momentneamente la lectura para presentar cada informacin durante un
instante, ya que como tenemos cinco datos distintos en cada registro y cinco TextBox para presentarlos,
deberemos presentar una informacin tras otra. Esto no parece en principio una solucin prctica para
una base de datos, donde lo que interesa es disponer de todos los datos para usarlos cuando sea
necesario. Esto nos lleva a crear una matriz para albergar todos los datos de la base, ya que los ficheros
secuenciales se leen y se les tiene que extraer toda la informacin de un golpe, ya que no permiten ir a
leer hacia atrs. Por lo tanto, si deseamos disponer de todos los datos, deberemos guardarlos en la
memoria, en una matriz. Imagnese que estamos tratando datos de varios miles de libros en el ejemplo
anterior. Si la informacin de cada campo es medianamente extensa, no tendramos memoria RAM
suficiente en el ordenador para albergarlos. Esto nos lleva a pensar en otro tipo de archivo que veremos
a continuacin, los Random (aleatorios), que permiten leer solamente los registros que nos interesan.
Pero volvamos a nuestra aplicacin de librera, donde hemos hecho una variacin, los campos PRECIO
y EXISTENCIAS los vamos a tratar ahora como nmeros (Integer). Tambin se ha introducido otro
campo tipo texto, para introducir la edicin. El fichero creado tras introducir varios libros qued de la
siguiente forma :
"EL RODABALLO","GUNTER GRASS","PLANETA",1995,2000,12
" VisualBasic - Gua del Estudiante ","LUIS SUAREZ","CEU",PRIMERA,1000,21
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 170

"EL NOMBRE DE LA ROSA","UMBERTO ECO","AGUILAR",28,1000,21


"ENCICLOPEDIA DEL VB","CEBALLOS","RAMA",CUARTA,1200,23
"LA GRANJA ANIMAL","ORWELL","DESTINO",45,12000,78
"LA PASION TURCA","ANTONIO GALA","PLANETA",SEGUNDA,2500,25
"LA METAMORFOSIS","KAFKA","PLAZA&JANES", 4,3400,101
"VB4 PARA WINDOWS95","GARY CORNELL","MCGRAWHILL",1,6500,25
Observe que los dos ltimos campos (correspondientes a PRECIO y EXISTENCIAS) no estn entre
comillas, pues no se trata de texto, sino de nmeros.
(Observe tambin la gran ventaja de tener una base de datos con datos completamente legibles)
Se han introducido alguna variaciones en el programa. Entre ellas, se crea una matriz de variables de 5 x
n (n=nmero de registros). Tambin se le aaden unos botones para poder recorre toda la base de
datos.
La interfaz grfica qued de la siguiente forma :

El programa necesita que le introduzcamos el nombre del fichero que alberga la base de datos. Por
sencillez no se ha usado ningn CommonDialog y se introduce directamente el nombre de este fichero
en un TextBox llamado TBNombreFichero
El fichero anterior podemos leerlo tal y como indicbamos antes :
Open TBNombreFichero.Text For Input As #1
Do Until EOF(1)
Input #1, TITULO, AUTOR, EDITORIAL, EDICION, PRECIO, EXISTENCIAS
Donde las variables TITULO, AUTOR, EDITORIAL y EDICION sern del tipo String y PRECIO y
EXISTENCIAS sern de tipo numrico. Podemos saberlo, ya que en una lnea cualquiera del fichero
anterior :
" VisualBasic - Gua del Estudiante ","LUIS SUAREZ","CEU",PRIMERA,1000,21
los cuatro primeros parmetros van entre comillas dobles, ya que son datos tipo texto, y los dos ltimos
van sin comillas, como corresponde a datos numricos.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 171

Pero existe otra forma mejor (al menos un poco mas complicada) para leer estos datos, y evitar el
problema que tenamos antes de tener que hacer un temporizador para poder ver, aunque solo sea un
momento, los datos. Podemos meter los datos a una matriz que tenga tantas columnas como datos
(campos) (en el ejemplo 6, cuatro String y dos numricos), y tantas filas como apuntes (registros)
tengamos.
Para ello, antes de nada debemos definir un tipo de variable, mediante la instruccin Type. Parece que
no nos basta con los tipos de variable que trae VB (Long, String, Integer ...) y es cierto. La variable que
necesitamos no es de ningn tipo de esos. Est compuesta por varias secciones, y cada una de ellas
puede ser de un tipo distinto. Este tipo de definiciones debe hacerse en un mdulo (Vase instruccin
Type en la ayuda de VB), por lo que se ha creado un mdulo llamado LIBREMD2.BAS, con el siguiente
cdigo :
Type REGISTROLIBRO
AUTOR As String
TITULO As String
EDITORIAL As String
EDICION As String
PRECIO As Integer
EXISTENCIAS As Integer
End Type
Esto es lo que se llama DEFINIR una variable. Es como hacerse un traje a medida. Y dese cuenta de
que es un tipo de variable (REGISTROLIBRO) formado por varias partes (AUTOR, TITULO, Etc.)
Observe que DEFINIR una variable NO es lo mismo que DECLARAR
En el apartado de Declaraciones del General del formulario declaramos las variables, entre ellas una
variable, REGISTROLIBROS, de la cual decimos que va a ser una matriz mediante los parntesis que la
acompaan, y adems declaramos que va a se similar a REGISTROLIBRO ya definida en el mdulo.
Dim NR As Integer
Dim REGISTROLIBROS() As REGISTROLIBRO
Dim NRP As Integer
Observe que al usar parntesis al declarar la variable REGISTROLIBROS le estamos diciendo a VB que
esa variable ser un Array, y adems que es una variable del tipo REGISTROLIBRO, tipo de variable
que ya conoce, puesto que se la hemos definido en un mdulo.
En el ejemplo preparado podemos escribir y leer datos. Veamos de nuevo como se escriben
El cdigo del procedimiento click del botn BIntroducir1 es :
Private Sub BIntroducir1_Click()
TITULO = LIBRETBTITULO.Text
AUTOR = LIBRETBAUTOR.Text
EDITORIAL = LIBRETBEDITORIAL.Text
EDICION = LIBRETBEDICION.Text
PRECIO = Val(LIBRETBPREC.Text)
EXISTENCIAS = Val(LIBRETBEX.Text)

TextBox para introducir el ttulo

autor

editorial

edicin

precio

existencias

(Observe que para introducir el precio y las existencias se transform el contenido del TextBox a un
valor numrico mediante la instruccin Val.)
Open "C:\cursoVB\" + LIBRETBFICHERO.Text For Append As #1
Write #1, TITULO, AUTOR, EDITORIAL, EDICION, PRECIO, EXISTENCIAS
Close #1
End Sub
Tras reiteradas entradas, el fichero de la BD qued como se vio anteriormente.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 172

Al leer los datos, lo primero es que no conocemos el nmero de registros existentes. Como cada registro
va en una lnea del fichero, si contamos el nmero de retornos de carro (Chr(13)) obtendremos el
nmero de registros. Esta operacin es la primera que se realiza en el procedimiento click del botn
LEER :
Private Sub Command2_Click()
LIBRETBTITULO.Text = ""
Pone todos los TextBox en blanco
LIBRETBAUTOR.Text = ""
LIBRETBEDITORIAL.Text = ""
LIBRETBEDICION.Text = ""
LIBRETBPREC.Text = ""
LIBRETBEX.Text = ""
NR = 0
NR=nmero de registros
Abre el fichero, lo lee entero y cuenta el nmero de retornos de carro. Existirn tantos apuntes
(registros) como retornos de carro existan, ya que cada registro ocupa una lnea.
Open TBNombreFichero.Text For Input As #1
Do Until EOF(1)
A = Input(1, #1)
If A = Chr(13) Then NR = NR + 1
Loop
Close #1
Presenta en LNumFich el nmero de registros
LNumFich.Caption = Str(NR) + " Registros)"
'Redimensionamos la matriz de REGISTROLIBROS a NR elementos..
ReDim REGISTROLIBROS(1 To NR)
Volvemos a abrir el fichero
Open TBNombreFichero.Text For Input As #1
Leemos los registros del 1 al NR, y cada campo del fichero lo vamos asignando a los elementos que
componen la matriz.
For I = 1 To NR
Input #1, REGISTROLIBROS(I).TITULO
Input #1, REGISTROLIBROS(I).AUTOR
Input #1, REGISTROLIBROS(I).EDITORIAL
Input #1, REGISTROLIBROS(I).EDICION
Input #1, REGISTROLIBROS(I).PRECIO
Input #1, REGISTROLIBROS(I).EXISTENCIAS
Next I
Close #1
NOTA.- Estas lneas podramos heberlas puesto en una lnea nica :
Input#1,REGISTROLIBROS(I).TITULO,REGISTROLIBROS(I).AUTOR,_
REGISTROLIBROS(I).EDITORIAL,REGISTROLIBROS(I).EDICION,_
REGISTROLIBROS(I).PRECIO,
REGISTROLIBROS(I).EXISTENCIAS

NRP = Nmero del Registro Presentado. Lo hacemos igual a 1 para presentar, de momento, el nmero
1
NRP = 1
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 173

LIBRETBTITULO.Text = REGISTROLIBROS(NRP).TITULO
LIBRETBAUTOR.Text = REGISTROLIBROS(NRP).AUTOR
LIBRETBEDITORIAL.Text = REGISTROLIBROS(NRP).EDITORIAL
LIBRETBEDICION.Text = REGISTROLIBROS(NRP).EDICION
LIBRETBPREC.Text = REGISTROLIBROS(NRP).PRECIO
LIBRETBEX.Text = REGISTROLIBROS(NRP).EXISTENCIAS
End Sub
Copiamos este cdigo de presentacin de datos y lo llevamos a las flechas de incrementar o disminuir el
nmero del registro a presentar.
Private Sub BMas1_Click()
NRP = NRP + 1
If NRP > NR Then
protegemos que salga error de NRP fuera de intervalo
MsgBox "No existen mas registros en esta direccin"
NRP = NR
Else
LIBRETBTITULO.Text = REGISTROLIBROS(NRP).TITULO
LIBRETBAUTOR.Text = REGISTROLIBROS(NRP).AUTOR
LIBRETBEDITORIAL.Text = REGISTROLIBROS(NRP).EDITORIAL
LIBRETBEDICION.Text = REGISTROLIBROS(NRP).EDICION
LIBRETBPREC.Text = REGISTROLIBROS(NRP).PRECIO
LIBRETBEX.Text = REGISTROLIBROS(NRP).EXISTENCIAS
End If
End Sub
Esta es la de incrementar. La de disminuir es igual, pero restando 1 a NRP
Las flechas dobles llevan al registro 1 y al ltimo. Tienen este cdigo
Private Sub BMas2_Click()
NRP = NR
LIBRETBTITULO.Text = REGISTROLIBROS(NRP).TITULO
LIBRETBAUTOR.Text = REGISTROLIBROS(NRP).AUTOR
LIBRETBEDITORIAL.Text = REGISTROLIBROS(NRP).EDITORIAL
LIBRETBEDICION.Text = REGISTROLIBROS(NRP).EDICION
LIBRETBPREC.Text = REGISTROLIBROS(NRP).PRECIO
LIBRETBEX.Text = REGISTROLIBROS(NRP).EXISTENCIAS
End Sub
Observe que es muy sencillo trabajar con ficheros secuenciales para bases de datos. El inconveniente
es la cantidad de memoria necesaria para la matriz de datos. Tambin tienen un gran inconveniente:
solamente se pueden leer de hacia adelante. Un fichero secuencial hay que leerlo de una sola vez. Esto
que no es ningn inconveniente para un fichero de texto, o incluso para un fichero de datos que leemos
una nica vez, es un problema cuando leemos un dato situado en un punto de ese fichero, y luego
tenemos que leer un dato colocado en una posicin anterior. En este caso, deberemos terminar de
leerlo, y volver a comenzar por el principio. Este es un gran inconveniente para hacer bases de datos con
ficheros secuenciales.
No solamente hemos visto una forma de crear una base de datos, sino que hemos visto como movernos
a lo largo de los registros. Ver esto con mucho mas detalle cuando demos bases de datos. Este tipo de
bases de datos son la Tipo Texto que ver mas adelante.
Propiedades de los ficheros Secuenciales:
EOF
Indica el fin del fichero (End Of File). EOF ser False hasta que encuentre el final del fichero
secuencial. Habr observado instrucciones tales como:
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 174

Do until EOF(1)
(Hazlo hasta que encuentres el EOF del canal 1)
Do While Not EOF(1) (Hazlo mientras EOF del canal 1 sea False)
Estas expresiones se usan en un bucle, para ir extrayendo con la instruccin Input o Line Input
los caracteres de un fichero hasta que se encuentre la marca de final de fichero (EOF)
LOC
Devuelve la posicin de lectura/escritura actual en un archivo abierto.
La sintaxis de esta propiedad es: LOC (Numero de canal)
la informacin devuelta para un archivo secuencial es la posicin de byte actual en el archivo,
dividida por 128.
LOF
Devuelve la longitud de un fichero (Lenght Of File) abierto mediante Open.
Sintaxis

LOF(numeroarchivo)

Ejemplo Long = LOF (1)


Observaciones Para obtener la longitud de un archivo que no est abierto utilice la funcin
FileLen. (Vala mas abajo)
SEEK
Devuelve la posicin actual de lectura/escritura de un archivo abierto con la instruccin Open.
Sintaxis

Seek(nmeroArchivo)

Seek devuelve un valor entre 1 y 2,147,483,647 (equivalente a 2^31-1) inclusive. Para archivos abiertos
en modo Output, Append o Input, Seek devuelve la posicin de byte en la que se va a ejecutar la
siguiente operacin. El primer byte de un archivo est en la posicin 1, el segundo en la posicin 2 y as
sucesivamente.
FICHEROS ALEATORIOS (RANDOM)
Un fichero aleatorio es un conjunto de registros, todos ellos de la misma longitud, que nos permite
guardar varias colecciones de datos.
Tal como habamos visto en los ficheros secuenciales, el almacenar una serie de colecciones de datos
en un fichero secuencial era muy fcil, pero bastante difcil de almacenarlas en la memoria cuando el
nmero de estas colecciones superaba una cierta cantidad.
Los ficheros aleatorios permiten almacenar informacin en registros que pueden ser fcilmente ledos,
pudiendo leer los registros uno a uno, sin necesidad de leerlos todos. En los archivos secuenciales, la
informacin de varios datos podamos introducirla mediante la instruccin Write, y conseguamos un
registro de la forma: (Recurdese el ejemplo de los datos de un libro)
"Ttulo","Autor","Editorial","Edicin","Precio","Existencias"
Si desebamos guardar la informacin de muchos libros, no haba mucho problema para guardarla, pero
s para almacenarla en memoria para poder usarla luego. Tenamos que leer todo el fichero, y extraer de
l la coleccin de informaciones y guardarlas en una matriz. Cambiar una informacin dentro del fichero
secuencial tambin implica una complicacin adicional, ya que debemos rehacer el fichero completo,
pues un fichero secuencial no permite remendar el trozo que queremos cambiar.
Los ficheros aleatorios nos permiten guardar una informacin similar a la anterior, referida a cualquier
nmero de libros, y para leerla no es necesario leer todo el fichero, sino simplemente acceder a los
registros que nos interesen. Tambin permite realizar el cambio de un registro de una forma sencilla, sin
alterar los dems.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 175

Todo esto tiene un precio: En los archivos secuenciales, podamos introducir informaciones de cualquier
longitud. En los archivos aleatorios cada dato tiene una longitud asignada, longitud que no se puede
sobrepasar, y si la informacin que debemos almacenar tiene menos que la longitud preestablecida,
perderemos esa capacidad sobrante.
Para abrir un fichero aleatorio debemos emplear la expresin:
Open Nombrefichero For Random As # Numerocanal Len = LongitudRegistro
Nombrefichero es el nombre que queremos dar al fichero
Numerocanal es el nmero del canal (nmero de fichero) que puede ser de 1 a 255
LogitudRegistro es la longitud total del registro.
Un fichero aleatorio (Random), una vez abierto, puede utilizarse para leer o escribir datos.
Para escribir datos en un fichero aleatorio, primero debemos definir el registro, es decir, en el caso de los
libros visto anteriormente, un registro va almacenar los datos del titulo, autor, editorial, etc. Para "saber"
como se colocan estos datos dentro del registro ser necesario definirlo.
En realidad lo que vamos a hacer es definir una variable de las denominadas Definidas por el usuario
Con esto lo que hacemos es crear un nuevo tipo de variable, en el ejemplo, la variable tipo Registro.
Se debbe hacer en la seccin de declaraciones de un mdulo o de un formulario, y siempre antes de
declarar una variable como variable de ese tipo. (La definicin de la variable debe hacerse en la seccin
de declaraciones del mdulo o formulario con mbito suficiente para que sea vlida en todas las partes
de la aplicacin donde se necesite esa variable)
Podemos hacerlo con la instruccin Type:
Type Registro
Titulo As String * 30
Autor As String * 30
Editorial As String * 15
Edicin As String * 6
Precio As String * 4
Existencias As String * 3
End Type

Asignamos 30 caracteres para el ttulo


Otros 30 para el autor
Asignamos 15 caracteres para editorial
Asignamos 6 caracteres para Edicin
Asignamos 4 caracteres para el precio
Tres caracteres para existencias.

Observe la diferencia de esta definicin con la que hacamos en los ficheros secuenciales. En aquellos
no ponamos la longitud de cada seccin. Aqu es necesario, ya que la longitud de un registro (y tambin
de cada campo) es fija.
Ya una vez definido como es Registro, podemos decir que una variable es del tipo definido para
Registro, es decir :
Dim MiVariable as Registro

Entonces MiVariable ya puede almacenar los datos de Titulo, Autor, Editorial, Edicin, Precio y
Existencias, colocando un dato tras otro, sin ninguna separacin, en el mismo orden que lo habamos
definido para Registro. No es necesario utilizar separaciones ya que el programa sabe que longitud
tiene cada dato y el orden de colocacin. Lo sabe porque se lo hemos dicho al definir Registro. Si los
datos a introducir son :
Titulo :
Autor :
Editorial :
Edicin :
Precio :
LSB

Gua del Estudiante


Luis Surez Bernaldo
Ediciones XX
2
3500

Visual Basic Gua del Estudiante

Captulo 1

Pgina 176

Existencias :

25

el registro correspondiente a este libro tendr una forma mas o menos as :


Gua del Estudiante///////////Lus Surez Bernaldo//////////Ediciones XX///2////350025/
donde se ha sustituido el carcter nulo por una barra ( / ) con el fin de hacerlo visible en el texto. Si se
molesta en contar los caracteres que tiene el registro observar que son 88, que es la suma de 30 + 30 +
15 + 6 + 4 + 3 que son los caracteres asignados a cada uno de las partes que forman el registro (Ttulo,
Autor, etc.) Para hablar con propiedad, a esas partes que componen el registro lea vamos a llamar
CAMPOS. Un Registro est formado por varios Campos, y cada Campo contiene una informacin.
Imagnese que introducimos otro libro. El primer campo de ese nuevo registro se colocar en el fichero
inmediatamente despus del ltimo campo existente, sin ningn tipo de separacin. No hace falta esa
separacin, pues VB conoce donde finaliza un registro y comienza otro, ya que la longitud total del
registro se le ha introducido en la instruccin para abrir el fichero, que repetimos aqu por comodidad :
Open Nombrefichero For Random As # Numerocanal Len = LongitudRegistro
(Si se omite el dato LongitudRegistro VB colocar la longitud por defecto, 128 caracteres)
LongitudRegistro deber ser igual o mayor que la suma de caracteres de cada uno de los campos
declarados en la instruccin Type, que tambin reproducimos :

Type Registro
Titulo As String * 30
Autor As String * 30
Editorial As String * 15
Edicin As String * 6
Precio As String * 4
Existencias As String * 3
End Type

Asignamos 30 caracteres para el ttulo


Otros 30 para el autor
Asignamos 15 caracteres para editorial
Asignamos 6 caracteres para Edicin
Asignamos 4 caracteres para el precio
Tres caracteres para existencias.

Deber ser igual o mayor, o estrictamente igual ? La respuesta es igual o mayor. Pero si declaramos
en la instruccin Open que el registro es mayor que la suma de los caracteres de todos los campos que
lo componen, estaremos perdiendo espacio de disco duro, tanto como la diferencia entre lo declarado en
la instruccin Open menos la suma de los caracteres de cada uno de los campos. Y esa cifra,
multiplicada por el nmero de registros existentes. Por lo tanto debe declararse en la instruccin Open
exactamente la suma de los caracteres de todos los campos. En el ejemplo anterior era bastante fcil, ya
que todos los campos eran del tipo String (cadena de caracteres) y cada carcter ocupa un byte. La cosa
se complica si uno o varios de los campos son de tipo numrico, porque nos obligar a recordar cuantos
bytes ocupa un integer, un Long, etc. Si hubisemos declarado en la instruccin Type Precio as Long,
Existencias as Integer deberamos tener en cuenta que un Long (nmero entero entre -2.147.483.648 y
2.147.483.647, inclusive) ocupa 4 bytes y un integer (nmero entero entre -32.768 y 32.767) ocupa 2
bytes. Se reproduce a continuacin la longitud en Bytes de cada uno de los tipos de datos. No se
moleste en aprendrsela de memoria, pues en la Ayuda de Visual Basic puede encontrarla como
Resumen de tipos de datos. Pero fjese en algo tan curioso como que un dato tipo Boolean que
solamente puede tomar 2 valores (S / No) ocupa 2 bytes frente a un dato tipo Byte, que puede tomar
256 valores y ocupa solamente un Byte.

Tipo de Dato
Byte
Boolean
Integer
Long(entero largo)
Single(coma flotante Simple precisin)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Ocupa
1 byte
2 bytes
2 bytes
4 bytes
4 bytes
Pgina 177

Double(coma flotante Doble Precisin)


Currency
Date
Object
String (longitud variable)
String (longitud fija)
Variant (con nmeros)
Variant (con caracteres)

8 bytes
8 bytes
8 bytes
4 bytes
10 bytes + longitud de cadena
longitud declarada de la cadena
16 bytes
22 bytes + longitud de cadena

Ya le estoy viendo tomando buena nota de cuanto ocupa cada variable. Y echando nmeros para saber
la longitud exacta de la variable y no perder ningn byte del disco duro desaprovechndolo sin
informacin. No habr algo que nos lo facilite ? S, lgicamente. La instruccin LEN

LEN nos da la longitud de un texto (Var=Len (Hola que tal), o de una variable Var=Len(Variable)
Podemos usarla para conocer la longitud total de la variable MiVariable
LongitudRegistro = Len (MiVariable)
Pero si quiere reducir mas la cosa, abra el fichero de esta forma :
Open Nombrefichero For Random As # Numerocanal Len = Len (MiVariable)

Ni que decir tiene que si se abre ese fichero en varias partes del programa con distintas instrucciones
Open el valor de LongitudRegistro debe ser igual en todas ellas.
La declaracin del registro mediante la instruccin Type debe hacerse en la seccin de declaraciones de
un Mdulo. Esta instruccin Type en realidad lo que est haciendo es definir un nuevo tipo de variable,
(una variable definida por el usuario) que servir de muestra para que en otra parte del programa le
digamos, mediante una instruccin Dim, que tal variable es del tipo definido anteriormente mediante la
instruccin Type. Por lo tanto, debemos declarar una variable en la parte que corresponda del programa,
dependiendo del mbito que se le quiera dar a esa variable, diciendo que ser del tipo de la declarada
mediante la instruccin Type.
Usando la declaracin de Registro del ejemplo anterior, vamos a retomar el ejemplo de la biblioteca.
Declararemos (posiblemente en la seccin de declaraciones del formulario) una variable que llamaremos
p.e. REGLIBROS de la siguiente forma :
Dim REGLIBROS as Registro
A partir de este momento, el programa sabe que REGLIBROS es una variable que tiene 6 campos
(Titulo, Autor, Editorial, Edicin, Precio y Existencias) y que cada campo tiene los caracteres
especificados en la instruccin Type.
Ahora nos cabe una pregunta Cuantos registros tiene un fichero Random? La respuesta es sencilla.
Basta conocer la longitud del fichero mediante la instruccin LOF si el fichero ya est abierto, o con la
instruccin FILELEN si no lo est, y dividir el dato obtenido con cualquiera de las dos instrucciones
anteriores por el valor LongitudRegistro.
Escribir datos en un fichero Random. Instruccin Put
Una vez abierto el fichero Random podemos leer y escribir datos en l. Para escribir datos utilizaremos la
instruccin Put. La sintaxis de Put es la siguiente:
Put # Numerocanal , NumeroRegistro, Variable
Puede omitirse NumeroRegistro. En este caso, el nmero de registro que se escribir ser el siguiente al
ltimo registro escrito.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 178

NumeroRegistro es el nmero del registro que queremos escribir, y Variable es el contenido de ese
registro. Siguiendo con nuestro ejemplo de biblioteca, Variable tiene en este caso el nombre
REGLIBROS, que no es un String ni un Integer, sino una variable definida por el usuario ya que la
declaramos con Dim REGLIBROS as Registro. Por lo tanto, la variable REGLIBROS contendr los
mismos campos que habamos declarado para Registro en la instruccin Type. Recuerde :

Type Registro
Titulo As String * 30
Autor As String * 30
Editorial As String * 15
Edicin As String * 6
Precio As String * 4
Existencias As String * 3
End Type

Asignamos 30 caracteres para el ttulo


Otros 30 para el autor
Asignamos 15 caracteres para editorial
Asignamos 6 caracteres para Edicin
Asignamos 4 caracteres para el precio
Tres caracteres para existencias.

Luego REGLIBROS tendr 6 campos (Titulo, Autor, Editorial, Edicin, Precio y Existencias), cada uno de
una longitud determinada, la definida en la instruccin Type.
Antes de introducir REGLIBROS en el fichero habr que decir que valor tiene. Pero cada campo que lo
compone tendr un valor. Podramos hacer una aplicacin en la que, a travs de varios TextBox, le
introdujsemos los valores de los campos, y el nmero de registro en el cual queremos escribir. El
nombre de cada uno de los TextBox para cada uno de los datos es el siguiente :
Campo Ttulo : TBTITULO Campo Autor : TBAUTOR Campo Editorial :
TBEDITORIAL
Campo Edicin :TBEDICION Campo Precio : TBPRECIO Campo Existencias : TBEXISTENCIAS
La aplicacin deber introducir en cada campo el valor (string) existente en cada uno de esos TextBox.
El valor de la variable REGLIBROS lo compondremos de la siguiente forma :
REGLIBROS.Titulo = TBTITULO.Text
REGLIBROS.Autor = TBAUTOR.Text
REGLIBROS.Editorial = TBEDITORIAL.Text
REGLIBROS.Edicion = TBEDICION.Text
REGLIBROS.Precio = TBPRECIO.Text
REGLIBROS.Existencias = TBEXISTENCIAS.Text
(Si se hubiese omitido alguna de estas igualdades, el campo correspondiente contendra el valor nulo)
De esta forma, REGLIBROS ya tiene un valor que se puede escribir en el fichero mediante la instruccin
Put.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 179

El formulario de esa aplicacin tendr esta forma :

Observe que ya se le han introducido otros controles (TextBox para introducir el nombre del fichero, otro
para el nmero de registro, botones para leer, escribir, abrir el fichero (EXAMINAR), un par de botones
para subir o bajar el nmero de registro y un botn para salir de la aplicacin. El TextBox para introducir
el nombre del fichero se llama TBNOMBREFICHERO y en el que debemos introducir el nmero de
registro a leer o escribir TBLEERESCR.
El Botn EXAMINAR cierra cualquier fichero que pudiese estar abierto, abre el fichero indicado en
TBNOMBREFICHERO, calcula el nmero de registros y escribe este nmero en el Label con nombre
LNUMFICH. El cdigo de su procedimiento Click es el siguiente :
Private Sub BEXAMINAR_Click()
Close
Open TBNOMBREFICHERO For Random As #1 Len = 88
LONGITUDFICH = LOF(1)
NUMREGS = LONGITUDFICH / 88
LNUMFICH.Caption = NUMREGS
End Sub

Cierra cualquier fichero abierto


Abre el fichero deseado
Obtiene su longitud
Calcula el N. de registros
Pone ese N. en el Label

Veamos como se escribe un registro. Analicemos el cdigo del procedimiento click del botn ESCRIBIR
Private Sub BESCRIBIR_Click()
REGISTROLIBRO.Titulo = TBTITULO.Text
REGISTROLIBRO.Autor = TBAUTOR.Text
REGISTROLIBRO.Editorial = TBEDITORIAL.Text
REGISTROLIBRO.Edicin = TBEDICION.Text
REGISTROLIBRO.Precio = TBPRECIO.Text
REGISTROLIBRO.Existencias = TBEXISTENCIAS.Text
Put #1, Val(TBLEERESCR), REGISTROLIBRO
End Sub

Se asignan los valores de cada


uno de los campos de la variable
REGISTROLIBROS

Se escribe el registro

Observe que el N. de registro es el valor que figure en el TextBox TBLEERESCR


Leer datos en un fichero Random. Instruccin Get
Para leer los datos de un fichero Random utilizaremos la instruccin Get. Su sintaxis es la siguiente :
Get # Numerocanal , NumeroRegistro, Variable
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 180

Puede omitirse NumeroRegistro. En este caso, el nmero de registro que se leer ser el siguiente al
ltimo registro ledo.
La Instruccin Get leer un registro completo. Ese registro contendr varios campos, y seguramente nos
interesar conocer el valor de cada campo dentro de ese registro. Variable es una variable que
contendr todos los campos. En nuestra aplicacin de biblioteca, Variable tiene por nombre
REGISTROLIBRO (El mismo que tena para la instruccin Put de escribir. Es pura comodidad del
programador. Puede tener cualquier otro nombre)
Para obtener el contenido de cada campo, realizaremos un proceso similar al empleado para la escritura,
pero al revs. En nuestra aplicacin, pretendemos poner el contenido de cada campo en los mismos
TextBox que se utilizaron para escribirlos. Veamos el contenido del procedimiento click del botn LEER
Private Sub BLEER_Click()
Get #1, Val(TBLEERESCR), REGISTROLIBRO
TBTITULO.Text = REGISTROLIBRO.Titulo
TBAUTOR.Text = REGISTROLIBRO.Autor
TBEDITORIAL.Text = REGISTROLIBRO.Editorial
TBEDICION.Text = REGISTROLIBRO.Edicin
TBPRECIO.Text = REGISTROLIBRO.Precio
TBEXISTENCIAS.Text = REGISTROLIBRO.Existencias
End Sub

Lee el registro completo


Obtiene el valor del campo Titulo
Autor, Editorial, Edicin, Precio
y Existencias y los pone en los
TextBox correspondientes a cada
dato

Funciones e instrucciones aplicables a los ficheros Random.


Funciones Seek y Loc.
En los ficheros Random tienen especial importancia las funciones Seek y Loc.
Mediante la Funcin Loc podemos conocer la el ltimo registro manipulado, bien por lectura, escritura. Si
abrimos el fichero y no se ha hecho ninguna lectura o escritura de registros, el nmero devuelto por la
funcin Loc es 0.
La sintaxis de la funcin Loc es :
Variable = Loc (Numerocanal)
Variable tomar un valor igual al nmero del registro escrito o ledo por ltima vez.
Mediante la Funcin Seek podemos conocer el prximo registro que ser manipulado en una operacin
de lectura o escritura. Si abrimos el fichero y no se ha hecho an ninguna operacin de lectura o
escritura, Seek devuelve el valor 1.

La sintaxis de la funcin Seek es :


Variable = Seek (Numerocanal)
ATENCION
Seek puede ser una funcin (lee un Dato) o una instruccin (fuerza un dato) ! ! !
Instruccin Seek
La instruccin Seek establece el prximo registro a leer o escribir en un fichero Random.
Sintaxis
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 181

Seek (Numerocanal), posicin


posicin es el nmero de registro que se va a leer o escribir en la siguiente operacin. No acepta el 0
como nmero de registro, el mas bajo debe ser el 1. Si se intenta forzar a la posicin 0 dar un error.
Funciones de los ficheros Random:
EOF
Devuelve un valor que indica si se ha llegado al final de un archivo.
Sintaxis

EOF(Numerocanal)

En archivos Random, EOF devuelve False hasta que se haya ejecutado una instruccin Get y no haya
podido leer el registro completo, en cuyo caso devolver True.
La funcin EOF no suele emplearse en ficheros Random, ya que en estos nos movemos a base de
registros, y es muy fcil controlar cuantos registros existen en el fichero y en que registro nos
encontramos o nos vamos a mover, mediante las funciones LOF, LOC y SEEK

LOF

( Lenght Of File )
Devuelve la longitud de un fichero .
Sintaxis

Variable = LOF(Numerocanal)

Mediante la funcin LOF podemos conocer el nmero de registros existentes en un fichero Random,
dividiendo el valor devuelto por LOF por la longitud del registro declarada en la instruccin Open (LEN =
longitud)
N. Registros = LOF / longitud

Recuerde

LSB

Para obtener la longitud de un archivo que no est abierto utilce la funcin


FileLen.

Visual Basic Gua del Estudiante

Captulo 1

Pgina 182

FICHEROS BINARIOS
Un fichero binario es una sucesin de bytes, uno tras otro, que puede almacenar cualquier tipo de
informacin. Cuando se explicaban los ficheros secuenciales, decamos que eran los mas adecuados
para introducir informacin de un texto, con los Random podamos realizar una base de datos de forma
sencilla, a base de controlar los registros y sus campos. Con un fichero binario podemos almacenar
cualquier informacin. (texto y cualquier tipo de datos) .
Para abrir un fichero secuencial se abre utilizando la instruccin :
Open Nombrefichero For Binary As # Numerocanal
Como siempre en VB, Numerocanal puede ser un nmero comprendido entre 1 y 255, que define ea
fichero. No pueden existir al mismo tiempo 2 ficheros abiertos con el mismo Numero de canal.
Nombrefichero es el nombre completo del fichero, con su Path.
Una vez abierto un fichero se binario, podemos leer o escribir datos en l.
Para escribir uno o varios caracteres en un fichero binario, usaremos la instruccin Put.
Put # Numerocanal, Posicin, Variable
Donde Posicin es el Byte donde comenzar la escritura, y Variable es el nombre de la variable que
contiene el dato a escribir. Este dato puede ser un byte o varios bytes.
Para escribir varios bytes podemos hacerlo de dos formas :
- Si se puede conocer de antemano el nmero de bytes a escribir, puede declararse Variable como un
string de ese nmero de caracteres mediante la instruccin Dim, por ejemplo :
Dim Variable As String * numero de bytes
y en este caso siempre escribir el nmero de bytes declarado. Cuidado ! Si los datos a introducir
sobrepasan el nmero de bytes declarados para Variable, los datos sobrantes no se escribirn en el
fichero. Si los datos a escribir en el fichero fuesen menos que los declarados para Variable, la diferencia
se rellenar con el byte nulo ( 0 ).
- Si no se conoce de antemano el nmero de bytes a escribir, podemos declarar la variable sin
especificar el nmero de bytes que tiene, y de esta forma se escribirn todos los bytes que componen la
variable :
Dim Variable As String
Pero en este caso debemos volver a decir Cuidado !, si no conocemos el nmero de bytes que vamos
a escribir, puede que machaquemos parte de la informacin que ya tenemos en el fichero, pues la
instruccin Put va a colocar los bytes que componen Variable en la posicin especificada por Posicin y
siguientes, hasta que quepa toda la cadena de bytes que le queremos introducir. Si la posicin en la que
introducimos esos bytes es una posicin intermedia, y no controlamos bien el nmero de bytes a
introducir y las informaciones que ya existen en el fichero en las posiciones colindantes con las que
vamos a introducir los datos, es muy probable que perdamos esa informacin al introducir la nueva.
Si se omite el dato Posicin, se tomar como byte de inicio de la escritura el siguiente al ltimo usado
por la instruccin Put. Si quiere omitir este dato, debe conservar las comas que lo separan :
Put # Numerocanal, , Variable
Qu pasar si el dato Posicin indica una posicin mayor que la que tiene realmente el fichero ?
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 183

Simplemente que rellenar las posiciones intermedias que se formarn con un byte (puede verlo con el
Block de Notas )
Un fichero binario es, como se deca al principio, una sucesin de bytes, que no tiene ningn tipo de
separacin entre bytes. Cada dato (byte o conjunto de bytes) que introduzcamos en un fichero binario se
escribir en el fichero tal y como se introducen. Machacando informacin ya existente si no se controla
bien donde se mete. Por lo tanto, aunque parece que los ficheros binarios pueden ser mucho mas
verstiles que los secuenciales y los Random, exigen mucho mas control que los anteriores. Limite el
uso de este tipo de ficheros a las aplicaciones en que sea realmente imprescindible.
Para leer datos de un fichero binario, utilizaremos la instruccin Get.
Get # Numerocanal, Posicin, Variable
Donde Posicin es el nmero del primer byte ledo, que como en el caso de Put, si se omite, tomar
como valor el byte siguiente al usado en la ltima instruccin Get. Variable es el nombre de una variable
que contendr los datos ledos.
Pueden leerse uno o varios Bytes, pero ahora surge un pequeo problema. Como le decimos cuantos
bytes debe leer ? Sencillamente los especificados al declarar la variable . Imaginemos que la
declaracin de la variable fue :
Dim Variable As String * 10
Con Variable declarada de esta forma, leer 10 bytes a partir del byte Posicin. (Incluido)
De esta forma, siempre leeremos un nmero determinado de caracteres (10 en el caso del ejemplo).
Esta es una limitacin para el uso de Get. Esta funcin viene muy bien en aquellas aplicaciones en las
que tenemos que extraer un nmero fijo de bytes (En la prctica, en la mayor parte de las aplicaciones
se extrae de uno en uno)
Pero pueden existir aplicaciones en las que sea necesario leer una vez un nmero de caracteres, y otra
vez otro. Ese problema lo tenemos resuelto con la instruccin Input.
Podemos leer caracteres de un fichero secuencial mediante la instruccin Input :
Variable = Input (Numero de bytes, # Numerocanal)
Mediante la instruccin Input podemos leer el nmero de caracteres que queramos, pero no podemos
controlar el byte de comienzo. Por lo tanto deberemos ayudarnos de la instruccin Seek para posicionar
el puntero de lectura encima del primer byte que queramos leer :
Seek (Numerocanal), Nmero del primer Byte a leer
Por ejemplo, si queremos leer 35 bytes de un archivo binario, abierto con el nmero de canal 1,
comenzando por el byte 48 (el 48 ser el primer byte ledo), ejecutaremos las dos siguientes
instrucciones :
Seek (1), 48
Variable = Input (35, #1)
Variable contendr ahora los 35 bytes deseados.
Al igual que se hizo para los ficheros secuenciales y Random, vamos a ver con un ejemplo prctico
como se manejan los ficheros binarios.
El formulario del ejemplo tiene esta forma :

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 184

Con el botn ABRIR se abre el fichero deseado. Si no existe en el disco, lo crea, ya que la instruccin
Open Nombrefichero For Binary As # Numerocanal
intenta abrir un fichero existente llamado Nombrefichero, y si este no existe, lo crea. Si existe el fichero,
presenta todo su contenido en el TextBox inferior, para poder tener una referencia de que lugar ocupan
los distintos caracteres (un fichero binario puede guardar cualquier byte, por lo que si abre un fichero
generado con cualquier programa puede ser que muchos de los bytes no contengan informacin de un
carcter, por lo que le recomendamos haga esta prctica con un fichero creado por la misma prctica)
El botn CERRAR cierra el fichero. SALIR sale de la aplicacin. El TextBox superior (variable) sirve para
introducir la variable a escribir en el fichero, o para presentar la variable leda en caso de lectura . El
TextBox posicin sirve para indicar la posicin del primer byte. Posicin por defecto presenta la posicin
que se extrae mediante la funcin Seek cada vez que se hace una lectura o escritura en el fichero.
Longitud de la variable permite introducir esa longitud, para leer mediante la instruccin Input.
El botn ESCRIBIR escribe el dato Variable en el fichero, LEER (GET) lee un nico byte, y LEER
(INPUT) lee una cadena de caracteres, de longitud la especificada en el TextBox Longitud de la variable.
Se enumera a continuacin el cdigo de cada uno, dejando para las explicaciones del profesor en clase,
o el estudio del alumno, la interpretacin de cada una de susu partes.
FORMULARIO. DECLARACIONES
Option Explicit
Obliga a declarar todas las variables
Dim LONGVAR As Integer
Se declara la variable LONGVAR
Dim COMIENZA As Long
Se declara la variable COMIENZA
Dim TESTO As String
Se declara la variable TESTO
Dim pospordef As Long
Se declara la variable pospordef
BOTON ABRIR
Private Sub BABRIR_Click()
CD1.ShowOpen
CD1 es un CommonDialog para buscar el fichero
Open CD1.filename For Binary As #1
Abre el fichero indicado en CD1
TESTO = Input(LOF(1), #1)
Lee de un golpe el fichero y lo mete en la variable TESTO
TBFICHERO.Text = TESTO
Presenta el fichero en el TextBox TBFICHERO
End Sub
BOTON CERRAR
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 185

Private Sub BCERRAR_Click()


Close
End Sub
BOTON ESCRIBIR
Private Sub BESCRIBIR_Click()
TBVAR2.BackColor = RGB(255, 0, 0)
Dim escribe As String
escribe = TBVAR1.Text
Put #1, Val(TBVAR3), escribe
pospordef = Seek(1)
Lvar5 = Str(pospordef)
End Sub
BOTON LEER (GET)
Private Sub BLEER_Click()
TBVAR2.BackColor = RGB(255, 0, 0)
TBVAR2.Text = "1"
If Seek(1) >= LOF(1) Then
Seek #1, 1
End If
Dim TEXTO As String * 1
If TBVAR3.Text <> "" Then
COMIENZA = Val(TBVAR3.Text)
ElseIf Lvar5.Caption <> "" Then
COMIENZA = Val(Lvar5.Caption)
Else
COMIENZA = Seek(1)
End If
Get #1, COMIENZA, TEXTO
TBVAR1.Text = TEXTO
pospordef = Seek(1)
Lvar5 = Str(pospordef)
End Sub

La instruccin Close cierra todos los ficheros abiertos

Pone el TB long. De la variable en rojo


Declara la variable escribe como string, sin limitacin
Pasa el contenido de TBVAR a la variable escribe
Instruccin Put. Val(TBVAR3) es la posicin del 1er byte
Analiza donde qued el puntero del fichero
y pone este valor en la etiqueta Lvar5

Pone en rojo el TB TBVAR2 (long. de la variable)


e indica que la longitud leda es 1
Si est al final del archivo
pone el puntero en la posicin 1

Declara la variable TEXTO de un byte


Si se le ha indicado donde tiene que comenzar
le dice que comience en la posicin indicada en TBVAR3
si no, si existe posicin por defecto
le indica que comience en la posicin por defecto
si no
pone el puntero en la posicin 1 (byte 1)
lee un byte
y lo presenta en TBVAR1
busca la nueva posicin por defecto
y pone ese valor en Lvar5

BOTON LEER (INPUT)


Private Sub BLLERINPUT_Click()
TBVAR2.BackColor = RGB(255, 255, 255)
Pone TBVAR2 en blanco
LONGVAR = Val(TBVAR2.Text) pasa el valor para long. de variable a LONGVAR
If TBVAR3.Text <> "" Then
si ese valor existe (TBVAR3 es distinto de nada)
COMIENZA = Val(TBVAR3.Text)
la variable COMIENZA toma ese valor
Seek (1), COMIENZA
coloca el puntero en ese valor
End If

Dim TEXTO As String


Declara la variable TEXTO sin limitacin
TEXTO = Input(LONGVAR, #1)
Lee LONGVAR bytes del canal 1 y los pasa a TEXTO
TBVAR1.Text = TEXTO
y lo presenta en el TB TBVAR1
pospordef = Seek(1)
analiza la nueva posicin por defecto
Lvar5 = Str(pospordef)
y la presenta en Lvar5
End Sub

BOTON SALIR
Private Sub BSALIR_Click()
End
End Sub

Sale de la aplicacin.

Private Sub TBVAR2_Change()


TBVAR2.BackColor = RGB(255, 255, 255)
End Sub
LSB

Visual Basic Gua del Estudiante

Captulo 1

Vuelve a color blanco si introducimos un dato en


este Text Box
Pgina 186

FIN DE LA APLICACIN PARA MANEJO DE FICHEROS BINARIOS


Funciones y propiedades aplicables a todos los ficheros
DIR
Devuelve el nombre de un archivo, directorio o carpeta que concuerda con el patrn o atributo de archivo
especificado o la etiqueta de volumen de una unidad de disco.
Sintaxis

Dir[(nombreruta[, atributos])]

nombreruta

Expresin de cadena que especifica un nombre de archivo. Puede incluir el


directorio o carpeta y la unidad de disco. Si no se encuentra nombreruta, devuelve
Null.

atributos

Constante o expresin numrica, cuya suma especifica atributos de archivo. Si se


omite, devuelve todos los archivos normales que satisfacen el nombreruta.

El argumento atributos tiene estas constantes y valores:


Constante

Valor

Descripcin

vbNormal
vbHidden
vbSystem
vbVolume
vbDirectory

0
2
4
8
16

Normal.
Oculto.
Sistema
Etiqueta de volumen; si se especifica se ignoran todos los atributos
Directorio o carpeta.

En Microsoft Windows, Dir permite el empleo de los caracteres comodn '*' (mltiples caracteres) y '?'
(un solo carcter) para especificar varios archivos.
La primera vez que se llama a la funcin Dir se debe especificar el nombreruta, de lo contrario se
produce un error. Si adems se especifican atributos de archivo, se debe incluir el nombreruta.
Dir devuelve el primer nombre de archivo que coincide con el nombreruta. Para obtener ms nombres de
archivo que coincidan con el nombreruta, se debe volver a llamar a Dir sin argumentos.
Cuando no hay ms nombres de archivo coincidentes, Dir devuelve una cadena de caracteres de
longitud cero. Cuando se devuelve una cadena de longitud cero, en las siguientes llamadas se debe
especificar nombreruta o se producir un error. Se puede cambiar el nombreruta sin haber obtenido
todos los nombres de archivo que coinciden con el nombreruta actual. Sin embargo, no se puede llamar
a la funcin Dir.
FILECOPY
Copia un archivo.
Sintaxis

FileCopy fuente, destino

fuente Expresin de cadena que especifica el nombre de un archivo a copiarse puede incluir el
directorio o carpeta y la unidad de disco..
destino Expresin de cadena que especifica el nombre del archivo de destino se puede incluir el
directorio o carpeta y la unidad de disco.
Si intenta utilizar la instruccin FileCopy en un archivo abierto actualmente, se produce un error.
FILEDATATIME
Devuelve una fecha que indica la fecha y hora en que un archivo fue creado o modificado por ltima vez.
Sintaxis
LSB

Variable = FileDateTime(nombreRuta)

Visual Basic Gua del Estudiante

Captulo 1

Pgina 187

El argumento con nombre nombreRuta es una expresin de cadena que especifica un nombre de
archivo. Se puede incluir el directorio o carpeta y la unidad de disco.
FILELEN
Devuelve la longitud de un archivo en bytes.
Sintaxis
Variable = FileLen(nombreRuta)
El argumento con nombre nombreRuta es una expresin de cadena que especifica un nombre de
archivo se puede incluir el directorio o carpeta y la unidad de disco.
Si el archivo especificado est abierto cuando se llama la funcin FileLen, el valor devuelto representa el
ltimo tamao de ese archivo cuando se guard la ultima vez en el disco.
Para obtener la longitud de un archivo abierto, utilice la funcin LOF.
GETATTR
Devuelve un nmero, que representa los atributos de un archivo, directorio o carpeta o una etiqueta de
volumen.
Sintaxis

Variable = GetAttr(nombreRuta)

El argumento con nombre nombreRuta es una expresin de cadena que especifica un nombre de
archivo se puede incluir el directorio o carpeta y la unidad de disco.
Valores devueltos
El valor devuelto por GetAttr es la suma de los siguientes valores de atributos:
Valor

Constante

Descripcin

0
1
2
4
16
32

vbNormal
vbReadOnly
vbHidden
vbSystem
vbDirectory
vbArchive

Normal.
Slo lectura.
Oculto.
Archivo de sistema.
Directorio o carpeta.
El archivo ha sido modificado despus de efectuar la ltima copia de
seguridad.

SETATTR
Establece los atributos de un archivo.
Sintaxis
nombreRuta
atributos

SetAttr nombreRuta;atributos

Expresin de cadena que especifica un nombre de archivo se puede incluir el


directorio o carpeta y la unidad de disco.
Constante o expresin numrica cuya suma especifica los atributos de
archivo.

Las constantes y valores de atributos son los mismos que para la instruccin GetAttr
Si se trata de establecer los atributos de un archivo abierto, se producir un error en tiempo de
ejecucin.

FREEFILE
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 188

Devuelve el siguiente nmero de archivo disponible para ser usado con la instruccin Open.
Sintaxis

FreeFile[(nmerodeintervalo)]

El argumento nmerodeintervalo especifica el intervalo desde el que el siguiente nmero de archivo libre
se va a devolver. Se especifica 0 (predeterminado) para devolver un nmero de archivo en el intervalo 1
a 255, inclusive. Se especifica 1 para devolver un nmero de archivo en el intervalo 256 a 511.
Observaciones Se usa FreeFile cuando se necesita proveer un nmero de archivo y se quiere asegurar
que el nmero de archivo no est ya en uso.

Visual Basic - Gua del Estudiante Cap. 6


FICHEROS EN VISUAL BASIC
Existen tres tipos de ficheros donde podremos almacenar y leer datos:
- Secuenciales
- Aleatorios (Random)
- Binarios
Cada uno de ellos tiene sus aplicaciones y particularidades.
FICHEROS SECUENCIALES
Este tipo de ficheros nos permite guardar informacin de cualquier longitud. En este tipo de ficheros, la
informacin se guarda colocando un carcter tras otro. La forma de leerlos es, igualmente, carcter tras
carcter. (Byte tras byte). Son los mas sencillos de manejar, y los utilizados para guardar texto en ASCII.
Permiten guardar datos en un fichero con un determinado nombre, "machacando" la informacin de otro
posible fichero que ya estuviese en el disco con el mismo nombre, o aadir la informacin nueva a
continuacin de la ya existente.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 189

Para abrir un fichero secuencial para guardar informacin, debemos ejecutar la siguiente instruccin:
Open Nombrefichero For Output As # Numerocanal
De esta forma, si ya exista un fichero llamado Nombrefichero, sobreescribiremos dicho fichero
perdiendo la informacin que contuviese. Es la forma tpica de hacerlo cuando modificamos un texto.
Para aadir la nueva informacin tras la ya existente, deberemos abrirlo con la siguiente instruccin:
Open Nombrefichero For Append As # Numerocanal
Numerocanal debe ser un nmero comprendido entre 1 y 255. Representa el nmero del canal por
donde introduciremos los datos. Normalmente se llama tambin nmero de archivo. No puede haber
mas de un archivo abierto con un nmero de canal determinado.
Para cerrar un fichero secuencial, basta con ejecutar la instruccin:
Close # Numerocanal
Si no se especifica Numerocanal (la instruccin Close a secas) se cerrarn todos los ficheros abiertos
actualmente.
Para introducir la informacin, pueden emplearse dos mtodos: Print y Write Nos centraremos de
momento solamente en Print.
Print
Introduce la informacin de forma secuencial, byte tras byte tal como se coment. Sirve
para guardar textos. Por ejemplo si deseamos guardar en ese fichero el contenido de
una caja de texto llamada Text1, basta con ejecutar la siguiente instruccin:

Print #NumerodeCanal, Text1.Text


El texto queda en el fichero en caracteres ASCII, que se pueden leer con el Bloc de
Notas.

Cuando los datos se han introducido con la instruccin Print, la forma de acceder a ese texto es muy
sencilla:
Se abre el archivo con la instruccin Open
Open Nombrefichero For Input As # Numerodecanal
Se utiliza la instruccin Input o Line Input para sacar los datos del fichero.
La instruccin Input tiene en este caso la siguiente sintaxis:
VariableString = Input (Numero de caracteres, # Numero de canal)
Por ejemplo, VariableString = Input (1, #1) extrae un carcter del fichero abierto como #1. El nmero
mximo de caracteres a extraer de un golpe mediante la instruccin Input est limitado a 65.534.
Ver un poco mas adelante la propiedad LOF de los ficheros secuenciales. LOF devuelve un valor igual
a la longitud total del fichero. Si ejecutamos la instruccin :
Para no emplear una palabra tan larga como Numerodecanal, utilizaremos de ahora en adelante el
nmero 1 como nmero de canal. Recuerde que ese nmero puede ser un nmero comprendido entre
el 1 y el 255
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 190

VariableString = Input (LOF(1), #1)

LOF(1)=longitud del fichero #1

leeremos el fichero de una nica vez. Este procedimiento puede ahorrarle cierto tiempo a la hora de la
lectura. (Por lo dicho anteriormente, este procedimiento de leer todo el fichero de un golpe solamente se
podr hacer si la longitud del fichero (LOF(1)) es inferior a 65.534 bytes. Tenga esto presente cuando
vaya a leer un fichero que no sabe que longitud tiene. Para curarse en salud, le recomiendo que lea los
ficheros secuenciales carcter a carcter. Input(1,#X) pues tarda poco mas que leyndolo de un golpe.
Claro que para leer un fichero carcter a carcter debe poner un bucle en el que se van leyendo los
caracteres hasta que llaga al final del fichero..
La forma de hacer este bucle es la siguiente:
Dim A As String
A es la variable donde meteremos el carcter que extraemos del fichero.
Dim MiVariable as String
MiVariable es una variable tipo string donde vamos a meter todo el
contenido del fichero
Do Until EOF(1)

El programa ejecutar este bucle hasta que se cumpla que EOF(1) sea
True. EOF(NumerodeCanal) es una propiedad de los ficheros cuando
estn abiertos, que es True cuando la posicin del puntero de lectura
apunta al carcter Fin De Fichero (End Of File) que es el carcter siguiente
al ltimo carcter de texto de ese fichero.

A = Input (1, #1)

Estrae un carcter del fichero abierto por el canal nmero 1. Al leer este
carcter, el puntero de lectura avanza automticamente tantos caracteres
como haya ledo, colocndose sobre el primer carcter no ledo.

MiVariable = MiVariable & A

Con esta lnea vamos anexando el carcter ledo a la variable


MiVariable. En vez de utilizar una variable, podramos poner ese
texto sobre un TextoBox o un RichTextBox (RTB) (Lo ver
proximamente). Si lo ponemos en un RTB esta lnea sera:
RTB.SelText = A

Loop

Vuelve al comienzo del bucle.

Close #1

Cierra el fichero

Slo se utilizar la instruccin Input con archivos abiertos en modo Input o Binary. (Los Binary Se vern
a continuacin) A diferencia de la instruccin Input #, (la veremos a continuacin, pues es la instruccin
que deber utilizar para leer archivos escritos con la instruccin Write ), Input devuelve todos los
caracteres que lee, incluyendo puntos y coma, retornos de carro, avances de lnea, comillas y espacios
iniciales.
Existe una instruccin, Input$ , que asume que el dato a leer es un String. (Cadena de caracteres).
Puede ahorrar un poco de memoria usando esta instruccin en lugar de Input.
Nota Se proporciona otra funcin (InputB) para su uso con datos de byte incluidos en archivos de texto.
En lugar de especificar el nmero de caracteres a devolver, nmero especifica el nmero de bytes.
INSTRUCCION LINE INPUT
La instruccin Line Input se utiliza para extraer una lnea completa. Tiene la siguiente sintaxis:
Line Input # Nmero de canal, VariableString
Mediante esta instruccin se extrae una lnea completa (los caracteres delimitados entre dos retornos de
carro), y se le asigna esa cadena a VariableString
Una lnea es un trozo de texto delimitado por los caracteres 13 (Retorno de carro) y 10 (Avance de lnea)
La instruccin Line Input # lee un carcter cada vez en un archivo hasta que encuentra un retorno de
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 191

carro (Chr(13)) o una secuencia retorno de carro - avance de lnea (Chr(13) + Chr(10)). Las secuencias
de retorno de carro - avance de lnea no se tienen en cuenta y no se aaden a la cadena de caracteres
extrada mediante esta instruccin. Cuando lea un archivo mediante Line Input # y lo quiere presentar
en un TextBox o en el Printer, deber introducirlos para evitar que le salga todo el texto en una nica
lnea.
Con lo que se ha explicado, ya puede realizar un pequeo edito de textos. Este sencillo editor tiene un
TextBox llamado TBTexto, donde podemos escribir el texto que queramos (con la propiedad MultiLine =
True y ScrollBars = Vertical), tres botones llamados BAbrir (1), (2 a y b) y (3), para abrir el fichero y
poner su contenido en TBTexto, y dos BGuardar para guardar, uno abriendo el fichero For Append y el
otro abrindolo For Output. En este ltimo, al guardar el texto borramos el contenido que del fichero, si
ya existiera. En el primero, lo anexamos al final del mismo . Para conocer el nombre del fichero,
ponemos un CommonDialog llamado CD1, con un filtro CD1.Filter = Ficheros de Texto |*.txt
Para abrir el fichero, y depositar su contenido en TBTexto pondremos este cdigo en BAbrir :
Private Sub BAbrir1_Click()
Dim VarTexto As String
CD1.Filter = "Ficheros de Texto |*.txt"
CD1.ShowOpen
Open CD1.filename For Input As #1
VarTexto = Input(LOF(1), #1)
'leemos todo el fichero de un golpe
Close #1
TBTexto = VarTexto
End Sub
Cuando el fichero es mayor de 64 kilobytes, el leerlo de un golpe puede dar problemas. Mejor dicho, no
funciona. Deberemos leerlo en ese caso, carcter a carcter o lnea a lnea.
Para leer carcter a carcter :
Private Sub BAbrir_Click()
Dim VarTexto As String
CD1.Filter = "Ficheros de Texto |*.txt"
CD1.ShowOpen
Open CD1.filename For Input As #1
Do Until EOF(1)
Hacemos un bucle de lectura hasta que encontremos EOF(1)
Vea mas adelante la Propiedad EOF en Propiedades de los ficheros Secuenciales
VarTexto = Input(1, #1)
'leemos el fichero carcter a carcter
TBTexto = TBTexto & VarTexto
'vamos aadiendo los caracteres ledos a TBTexto
Loop
Close #1
End Sub
(NOTA.- Lo expuesto funciona perfectamente, pero el hecho de meter en un TextBox carcter a carcter
eterniza la aplicacin. - Meter un texto en un TextBox o en un Label es una operacin que tarda cierto
tiempo. Si esa operacin hay que hacerla una vez por carcter, puede tardar mucho tiempo. Para evitar
esto, cuando vaya a leer un fichero carcter a carcter, mtalo primero en una variable y luego realice un
volcado nico de esa variable al TextBox o Label)
Y podemos hacerlo tambin leyendo lnea a lnea con Line Input
Dim VarTexto As String
CD1.Filter = "Ficheros de Texto |*.txt"
CD1.ShowOpen
Open CD1.filename For Input As #1
Do Until EOF(1)
Line Input #1, VarTexto
'leemos el fichero Lnea a Lnea
TBTexto = TBTexto & VarTexto & vbCrLf
'vamos aadiendo las lneas ledas a TBTexto
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 192

'(Hay que introducir un retorno + avance de lnea con cada lnea (vbCrLf), ya que VarTexto no
contiene los retornos ni avances de lnea.
Loop
Close #1
Los Botones de Guardar tienen el cdigo :
Private Sub BGuardar_Click()
Dim VarTexto As String
CD1.Filter = "Ficheros de Texto |*.txt"
CD1.ShowSave
Open CD1.filename For Output As #1
Print #1, TBTexto.Text
Close #1
End Sub
O para el caso de abrir con For Append
Private Sub BGuardar2_Click()
Dim VarTexto As String
CD1.Filter = "Ficheros de Texto |*.txt"
CD1.ShowSave
Open CD1.filename For Append As #1
Print #1, TBTexto.Text
Close #1
End Sub
Ya hemos visto como se guardan y se leen datos de texto en un fichero secuencial.
INSTRUCCIN WRITE
La otra forma de introducir datos en un fichero secuencial es Write. Mediante esta instruccin, no se
puede introducir texto, sino datos, aunque esos datos sean de texto. Mediante la instruccin Write
puede crear una pequea base de datos. Eso s, una base de datos de escasa calidad. Pero no es
momento de cuestionar la calidad de esta base de datos, sino de explicarla.
Write
Puede introducir varias informaciones, que posteriormente se podrn leer de forma
separada con la instruccin Input #. Esta forma de introducir datos en un fichero
secuencial permite realizar un fichero con distintos datos que se pueden leer en el propio
fichero, puesto que se guardan en ASCII, y leerlos mediante el programa de una forma
muy sencilla. Hacemos, en realidad, una pequea base de datos. (Ver a lo largo de su
vida profesional que lo de pequea no es cierto, pues es la forma mas sencilla de
guardar datos cuando la cantidad de estos datos no es muy grande)
Lo que estamos haciendo en realidad al escribir datos mediante la instruccin Write es escribir estos
datos en un fichero secuencial, utilizando una coma como separador entre los distintos datos. Un fichero
secuencial con datos introducidos mediante la instruccin Write tendr esta forma :
Luis Surez, VisualBasic - Gua del estudiante,Editorial XX,3200,51
Miguel de Cervantes,El Qijote,Editorial YY,5000,27
Observe que el contenido de este fichero se diferencia algo de una simple sucesin de caracteres. Tiene
varias partes separadas por una coma. Cada una de ellas es un dato.
Imaginemos una aplicacin, con la que introducimos datos de libros. La aplicacin es un nico formulario
donde podemos introducir la informacin mediante varios TextBox. Existe un Botn de comando con el
siguiente cdigo:
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 193

Private Sub Command1_Click()


TITULO = LIBRETBTITULO.Text
AUTOR = LIBRETBAUTOR.Text
EDITORIAL = LIBRETBEDITORIAL.Text
PRECIO = LIBRETBPREC.Text
EXISTENCIAS = LIBRETBEX.Text
Donde LIBRETBTITULO, LIBRETBAUTOR, Etc. son los nombres de los TextBox
Ha ledo los datos de los TextBox. Ya estn el las variables TITULO, AUTOR, Etc.
Ahora los metemos en el fichero con la instruccin Write. El nombre del fichero ser el
que hayamos puesto en el TextBox LIBRETBFICHERO, y lo guardar en el directorio
C :\cursoVB
Open TBNombreFichero.Text For Append As #1
Write #1, TITULO, AUTOR, EDITORIAL, PRECIO, EXISTENCIAS
Close #1
End Sub
Si introduce los datos del ejemplo anterior, se crear un fichero que tiene esta apariencia:
Luis Surez, VisualBasic - Gua del estudiante,Editorial XX,3200,51
Si realizamos otra introduccin de datos, con la segunda lnea del ejemplo anterior, los datos existentes
en ese fichero no se borrarn, dado que lo hemos abierto con Append. Quedar de la siguiente forma:
Luis Surez, VisualBasic - Gua del estudiante,Editorial XX,3200,51
Miguel de Cervantes,El Qijote,Editorial YY,5000,27
Que pasara si leemos este fichero con la instruccin Input o Line Input # vista anteriormente ? Pues
simplemente que lo leeramos tal como est, con sus comas y comillas dobles. No sera la forma mas
adecuada, ya que lo que queremos es obtener sucesivos datos de autores, ttulos, editoriales, precios y
existencias.
Para sacar estos datos debemos leerlos con la instruccin Input #. Esta instruccin saca los datos que
hemos metido, es decir, elimina las comillas y la coma que servan de separadores.
En nuestro ejemplo, podramos hacerlo de esta forma, aprovechando los mismos TextBox:
Private Sub Command2_Click()
' Limpiamos los TextBox
LIBRETBTITULO.Text = "" : LIBRETBAUTOR.Text = "" : LIBRETBEDITORIAL.Text = ""
LIBRETBPREC.Text = "" : LIBRETBEX.Text = ""
'Abrimos el fichero
Open TBNombreFichero.Text For Input As #1
Do Until EOF(1)
' Introducimos una parada para poder leer datos
DETENERSE = True
Input #1, TIT, AUT, NED, PRE, EXS
LIBRETBTITULO.Text = TIT
LIBRETBAUTOR.Text = AUT
LIBRETBEDITORIAL.Text = NED
LIBRETBPREC.Text = PRE
LIBRETBEX.Text = EXS
' Refrescamos los TextBox
Refresh
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 194

' Esto produce una pequea parada


Do While DETENERSE = True
A=A+1
If A = 100000 Then DETENERSE = False: A = 0
Loop
' termin la parada y vuelve a leer datos
Loop
Close #1
End Sub
Observe que los nombre de las variables en el proceso de lectura tienen distintos nombres a los
utilizados durante la escritura. Como en el fichero no se guarda ninguna referencia al respecto, lo nico
que importa es que el nmero de variables para la lectura sea igual al nmero de variables que se utiliz
para la escritura, y que el orden de las variables sea correcto. Si por ejemplo, el nmero de variables
usadas en la introduccin de datos fuese distinto al nmero de variables usado en la lectura, Visual Basic
nos dara un error.
Observe tambin que se ha introducido un temporizador. Sirve para ver los sucesivos ttulos que
tenemos en nuestra base de datos tan sui generis. Se ha pretendido presentar unos datos de esta
pequea base de datos sin complicarnos mucho la vida. Mas adelante veremos como presentarlos de
una forma correcta. Este tipo de ficheros no es el mas adecuado para construir bases de datos, es
complicado manejar ficheros de mas de unas pocas lneas, por lo que para tener muchos datos, este
tipo de ficheros no es recomendable. No es aconsejable ni para muchos datos ni para pocos datos. Pero
es obligacin del autor explicarlo y de advertirlo.
En esta pequea aplicacin mostrbamos las informaciones sucesivamente segn las bamos leyendo
del fichero. Interrumpamos momentneamente la lectura para presentar cada informacin durante un
instante, ya que como tenemos cinco datos distintos en cada registro y cinco TextBox para presentarlos,
deberemos presentar una informacin tras otra. Esto no parece en principio una solucin prctica para
una base de datos, donde lo que interesa es disponer de todos los datos para usarlos cuando sea
necesario. Esto nos lleva a crear una matriz para albergar todos los datos de la base, ya que los ficheros
secuenciales se leen y se les tiene que extraer toda la informacin de un golpe, ya que no permiten ir a
leer hacia atrs. Por lo tanto, si deseamos disponer de todos los datos, deberemos guardarlos en la
memoria, en una matriz. Imagnese que estamos tratando datos de varios miles de libros en el ejemplo
anterior. Si la informacin de cada campo es medianamente extensa, no tendramos memoria RAM
suficiente en el ordenador para albergarlos. Esto nos lleva a pensar en otro tipo de archivo que veremos
a continuacin, los Random (aleatorios), que permiten leer solamente los registros que nos interesan.
Pero volvamos a nuestra aplicacin de librera, donde hemos hecho una variacin, los campos PRECIO
y EXISTENCIAS los vamos a tratar ahora como nmeros (Integer). Tambin se ha introducido otro
campo tipo texto, para introducir la edicin. El fichero creado tras introducir varios libros qued de la
siguiente forma :
"EL RODABALLO","GUNTER GRASS","PLANETA",1995,2000,12
" VisualBasic - Gua del Estudiante ","LUIS SUAREZ","CEU",PRIMERA,1000,21
"EL NOMBRE DE LA ROSA","UMBERTO ECO","AGUILAR",28,1000,21
"ENCICLOPEDIA DEL VB","CEBALLOS","RAMA",CUARTA,1200,23
"LA GRANJA ANIMAL","ORWELL","DESTINO",45,12000,78
"LA PASION TURCA","ANTONIO GALA","PLANETA",SEGUNDA,2500,25
"LA METAMORFOSIS","KAFKA","PLAZA&JANES", 4,3400,101
"VB4 PARA WINDOWS95","GARY CORNELL","MCGRAWHILL",1,6500,25
Observe que los dos ltimos campos (correspondientes a PRECIO y EXISTENCIAS) no estn entre
comillas, pues no se trata de texto, sino de nmeros.
(Observe tambin la gran ventaja de tener una base de datos con datos completamente legibles)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 195

Se han introducido alguna variaciones en el programa. Entre ellas, se crea una matriz de variables de 5 x
n (n=nmero de registros). Tambin se le aaden unos botones para poder recorre toda la base de
datos.
La interfaz grfica qued de la siguiente forma :

El programa necesita que le introduzcamos el nombre del fichero que alberga la base de datos. Por
sencillez no se ha usado ningn CommonDialog y se introduce directamente el nombre de este fichero
en un TextBox llamado TBNombreFichero
El fichero anterior podemos leerlo tal y como indicbamos antes :
Open TBNombreFichero.Text For Input As #1
Do Until EOF(1)
Input #1, TITULO, AUTOR, EDITORIAL, EDICION, PRECIO, EXISTENCIAS
Donde las variables TITULO, AUTOR, EDITORIAL y EDICION sern del tipo String y PRECIO y
EXISTENCIAS sern de tipo numrico. Podemos saberlo, ya que en una lnea cualquiera del fichero
anterior :
" VisualBasic - Gua del Estudiante ","LUIS SUAREZ","CEU",PRIMERA,1000,21
los cuatro primeros parmetros van entre comillas dobles, ya que son datos tipo texto, y los dos ltimos
van sin comillas, como corresponde a datos numricos.
Pero existe otra forma mejor (al menos un poco mas complicada) para leer estos datos, y evitar el
problema que tenamos antes de tener que hacer un temporizador para poder ver, aunque solo sea un
momento, los datos. Podemos meter los datos a una matriz que tenga tantas columnas como datos
(campos) (en el ejemplo 6, cuatro String y dos numricos), y tantas filas como apuntes (registros)
tengamos.
Para ello, antes de nada debemos definir un tipo de variable, mediante la instruccin Type. Parece que
no nos basta con los tipos de variable que trae VB (Long, String, Integer ...) y es cierto. La variable que
necesitamos no es de ningn tipo de esos. Est compuesta por varias secciones, y cada una de ellas
puede ser de un tipo distinto. Este tipo de definiciones debe hacerse en un mdulo (Vase instruccin
Type en la ayuda de VB), por lo que se ha creado un mdulo llamado LIBREMD2.BAS, con el siguiente
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 196

cdigo :
Type REGISTROLIBRO
AUTOR As String
TITULO As String
EDITORIAL As String
EDICION As String
PRECIO As Integer
EXISTENCIAS As Integer
End Type
Esto es lo que se llama DEFINIR una variable. Es como hacerse un traje a medida. Y dese cuenta de
que es un tipo de variable (REGISTROLIBRO) formado por varias partes (AUTOR, TITULO, Etc.)
Observe que DEFINIR una variable NO es lo mismo que DECLARAR
En el apartado de Declaraciones del General del formulario declaramos las variables, entre ellas una
variable, REGISTROLIBROS, de la cual decimos que va a ser una matriz mediante los parntesis que la
acompaan, y adems declaramos que va a se similar a REGISTROLIBRO ya definida en el mdulo.
Dim NR As Integer
Dim REGISTROLIBROS() As REGISTROLIBRO
Dim NRP As Integer
Observe que al usar parntesis al declarar la variable REGISTROLIBROS le estamos diciendo a VB que
esa variable ser un Array, y adems que es una variable del tipo REGISTROLIBRO, tipo de variable
que ya conoce, puesto que se la hemos definido en un mdulo.
En el ejemplo preparado podemos escribir y leer datos. Veamos de nuevo como se escriben
El cdigo del procedimiento click del botn BIntroducir1 es :
Private Sub BIntroducir1_Click()
TITULO = LIBRETBTITULO.Text
AUTOR = LIBRETBAUTOR.Text
EDITORIAL = LIBRETBEDITORIAL.Text
EDICION = LIBRETBEDICION.Text
PRECIO = Val(LIBRETBPREC.Text)
EXISTENCIAS = Val(LIBRETBEX.Text)

TextBox para introducir el ttulo

autor

editorial

edicin

precio

existencias

(Observe que para introducir el precio y las existencias se transform el contenido del TextBox a un
valor numrico mediante la instruccin Val.)
Open "C:\cursoVB\" + LIBRETBFICHERO.Text For Append As #1
Write #1, TITULO, AUTOR, EDITORIAL, EDICION, PRECIO, EXISTENCIAS
Close #1
End Sub
Tras reiteradas entradas, el fichero de la BD qued como se vio anteriormente.
Al leer los datos, lo primero es que no conocemos el nmero de registros existentes. Como cada registro
va en una lnea del fichero, si contamos el nmero de retornos de carro (Chr(13)) obtendremos el
nmero de registros. Esta operacin es la primera que se realiza en el procedimiento click del botn
LEER :
Private Sub Command2_Click()
LIBRETBTITULO.Text = ""
Pone todos los TextBox en blanco
LIBRETBAUTOR.Text = ""
LIBRETBEDITORIAL.Text = ""
LIBRETBEDICION.Text = ""
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 197

LIBRETBPREC.Text = ""
LIBRETBEX.Text = ""
NR = 0

NR=nmero de registros

Abre el fichero, lo lee entero y cuenta el nmero de retornos de carro. Existirn tantos apuntes
(registros) como retornos de carro existan, ya que cada registro ocupa una lnea.
Open TBNombreFichero.Text For Input As #1
Do Until EOF(1)
A = Input(1, #1)
If A = Chr(13) Then NR = NR + 1
Loop
Close #1
Presenta en LNumFich el nmero de registros
LNumFich.Caption = Str(NR) + " Registros)"
'Redimensionamos la matriz de REGISTROLIBROS a NR elementos..
ReDim REGISTROLIBROS(1 To NR)
Volvemos a abrir el fichero
Open TBNombreFichero.Text For Input As #1
Leemos los registros del 1 al NR, y cada campo del fichero lo vamos asignando a los elementos que
componen la matriz.
For I = 1 To NR
Input #1, REGISTROLIBROS(I).TITULO
Input #1, REGISTROLIBROS(I).AUTOR
Input #1, REGISTROLIBROS(I).EDITORIAL
Input #1, REGISTROLIBROS(I).EDICION
Input #1, REGISTROLIBROS(I).PRECIO
Input #1, REGISTROLIBROS(I).EXISTENCIAS
Next I
Close #1
NOTA.- Estas lneas podramos heberlas puesto en una lnea nica :
Input#1,REGISTROLIBROS(I).TITULO,REGISTROLIBROS(I).AUTOR,_
REGISTROLIBROS(I).EDITORIAL,REGISTROLIBROS(I).EDICION,_
REGISTROLIBROS(I).PRECIO,
REGISTROLIBROS(I).EXISTENCIAS

NRP = Nmero del Registro Presentado. Lo hacemos igual a 1 para presentar, de momento, el nmero
1
NRP = 1
LIBRETBTITULO.Text = REGISTROLIBROS(NRP).TITULO
LIBRETBAUTOR.Text = REGISTROLIBROS(NRP).AUTOR
LIBRETBEDITORIAL.Text = REGISTROLIBROS(NRP).EDITORIAL
LIBRETBEDICION.Text = REGISTROLIBROS(NRP).EDICION
LIBRETBPREC.Text = REGISTROLIBROS(NRP).PRECIO
LIBRETBEX.Text = REGISTROLIBROS(NRP).EXISTENCIAS
End Sub
Copiamos este cdigo de presentacin de datos y lo llevamos a las flechas de incrementar o disminuir el
nmero del registro a presentar.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 198

Private Sub BMas1_Click()


NRP = NRP + 1
If NRP > NR Then
protegemos que salga error de NRP fuera de intervalo
MsgBox "No existen mas registros en esta direccin"
NRP = NR
Else
LIBRETBTITULO.Text = REGISTROLIBROS(NRP).TITULO
LIBRETBAUTOR.Text = REGISTROLIBROS(NRP).AUTOR
LIBRETBEDITORIAL.Text = REGISTROLIBROS(NRP).EDITORIAL
LIBRETBEDICION.Text = REGISTROLIBROS(NRP).EDICION
LIBRETBPREC.Text = REGISTROLIBROS(NRP).PRECIO
LIBRETBEX.Text = REGISTROLIBROS(NRP).EXISTENCIAS
End If
End Sub
Esta es la de incrementar. La de disminuir es igual, pero restando 1 a NRP
Las flechas dobles llevan al registro 1 y al ltimo. Tienen este cdigo
Private Sub BMas2_Click()
NRP = NR
LIBRETBTITULO.Text = REGISTROLIBROS(NRP).TITULO
LIBRETBAUTOR.Text = REGISTROLIBROS(NRP).AUTOR
LIBRETBEDITORIAL.Text = REGISTROLIBROS(NRP).EDITORIAL
LIBRETBEDICION.Text = REGISTROLIBROS(NRP).EDICION
LIBRETBPREC.Text = REGISTROLIBROS(NRP).PRECIO
LIBRETBEX.Text = REGISTROLIBROS(NRP).EXISTENCIAS
End Sub
Observe que es muy sencillo trabajar con ficheros secuenciales para bases de datos. El inconveniente
es la cantidad de memoria necesaria para la matriz de datos. Tambin tienen un gran inconveniente:
solamente se pueden leer de hacia adelante. Un fichero secuencial hay que leerlo de una sola vez. Esto
que no es ningn inconveniente para un fichero de texto, o incluso para un fichero de datos que leemos
una nica vez, es un problema cuando leemos un dato situado en un punto de ese fichero, y luego
tenemos que leer un dato colocado en una posicin anterior. En este caso, deberemos terminar de
leerlo, y volver a comenzar por el principio. Este es un gran inconveniente para hacer bases de datos con
ficheros secuenciales.
No solamente hemos visto una forma de crear una base de datos, sino que hemos visto como movernos
a lo largo de los registros. Ver esto con mucho mas detalle cuando demos bases de datos. Este tipo de
bases de datos son la Tipo Texto que ver mas adelante.
Propiedades de los ficheros Secuenciales:
EOF
Indica el fin del fichero (End Of File). EOF ser False hasta que encuentre el final del fichero
secuencial. Habr observado instrucciones tales como:
Do until EOF(1)
(Hazlo hasta que encuentres el EOF del canal 1)
Do While Not EOF(1) (Hazlo mientras EOF del canal 1 sea False)
Estas expresiones se usan en un bucle, para ir extrayendo con la instruccin Input o Line Input
los caracteres de un fichero hasta que se encuentre la marca de final de fichero (EOF)
LOC
Devuelve la posicin de lectura/escritura actual en un archivo abierto.
La sintaxis de esta propiedad es:
LSB

Visual Basic Gua del Estudiante

LOC (Numero de canal)

Captulo 1

Pgina 199

la informacin devuelta para un archivo secuencial es la posicin de byte actual en el archivo,


dividida por 128.
LOF
Devuelve la longitud de un fichero (Lenght Of File) abierto mediante Open.
Sintaxis

LOF(numeroarchivo)

Ejemplo Long = LOF (1)


Observaciones Para obtener la longitud de un archivo que no est abierto utilice la funcin
FileLen. (Vala mas abajo)
SEEK
Devuelve la posicin actual de lectura/escritura de un archivo abierto con la instruccin Open.
Sintaxis

Seek(nmeroArchivo)

Seek devuelve un valor entre 1 y 2,147,483,647 (equivalente a 2^31-1) inclusive. Para archivos abiertos
en modo Output, Append o Input, Seek devuelve la posicin de byte en la que se va a ejecutar la
siguiente operacin. El primer byte de un archivo est en la posicin 1, el segundo en la posicin 2 y as
sucesivamente.
FICHEROS ALEATORIOS (RANDOM)
Un fichero aleatorio es un conjunto de registros, todos ellos de la misma longitud, que nos permite
guardar varias colecciones de datos.
Tal como habamos visto en los ficheros secuenciales, el almacenar una serie de colecciones de datos
en un fichero secuencial era muy fcil, pero bastante difcil de almacenarlas en la memoria cuando el
nmero de estas colecciones superaba una cierta cantidad.
Los ficheros aleatorios permiten almacenar informacin en registros que pueden ser fcilmente ledos,
pudiendo leer los registros uno a uno, sin necesidad de leerlos todos. En los archivos secuenciales, la
informacin de varios datos podamos introducirla mediante la instruccin Write, y conseguamos un
registro de la forma: (Recurdese el ejemplo de los datos de un libro)
"Ttulo","Autor","Editorial","Edicin","Precio","Existencias"
Si desebamos guardar la informacin de muchos libros, no haba mucho problema para guardarla, pero
s para almacenarla en memoria para poder usarla luego. Tenamos que leer todo el fichero, y extraer de
l la coleccin de informaciones y guardarlas en una matriz. Cambiar una informacin dentro del fichero
secuencial tambin implica una complicacin adicional, ya que debemos rehacer el fichero completo,
pues un fichero secuencial no permite remendar el trozo que queremos cambiar.
Los ficheros aleatorios nos permiten guardar una informacin similar a la anterior, referida a cualquier
nmero de libros, y para leerla no es necesario leer todo el fichero, sino simplemente acceder a los
registros que nos interesen. Tambin permite realizar el cambio de un registro de una forma sencilla, sin
alterar los dems.
Todo esto tiene un precio: En los archivos secuenciales, podamos introducir informaciones de cualquier
longitud. En los archivos aleatorios cada dato tiene una longitud asignada, longitud que no se puede
sobrepasar, y si la informacin que debemos almacenar tiene menos que la longitud preestablecida,
perderemos esa capacidad sobrante.
Para abrir un fichero aleatorio debemos emplear la expresin:
Open Nombrefichero For Random As # Numerocanal Len = LongitudRegistro
Nombrefichero es el nombre que queremos dar al fichero
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 200

Numerocanal es el nmero del canal (nmero de fichero) que puede ser de 1 a 255
LogitudRegistro es la longitud total del registro.
Un fichero aleatorio (Random), una vez abierto, puede utilizarse para leer o escribir datos.
Para escribir datos en un fichero aleatorio, primero debemos definir el registro, es decir, en el caso de los
libros visto anteriormente, un registro va almacenar los datos del titulo, autor, editorial, etc. Para "saber"
como se colocan estos datos dentro del registro ser necesario definirlo.
En realidad lo que vamos a hacer es definir una variable de las denominadas Definidas por el usuario
Con esto lo que hacemos es crear un nuevo tipo de variable, en el ejemplo, la variable tipo Registro.
Se debbe hacer en la seccin de declaraciones de un mdulo o de un formulario, y siempre antes de
declarar una variable como variable de ese tipo. (La definicin de la variable debe hacerse en la seccin
de declaraciones del mdulo o formulario con mbito suficiente para que sea vlida en todas las partes
de la aplicacin donde se necesite esa variable)
Podemos hacerlo con la instruccin Type:
Type Registro
Titulo As String * 30
Autor As String * 30
Editorial As String * 15
Edicin As String * 6
Precio As String * 4
Existencias As String * 3
End Type

Asignamos 30 caracteres para el ttulo


Otros 30 para el autor
Asignamos 15 caracteres para editorial
Asignamos 6 caracteres para Edicin
Asignamos 4 caracteres para el precio
Tres caracteres para existencias.

Observe la diferencia de esta definicin con la que hacamos en los ficheros secuenciales. En aquellos
no ponamos la longitud de cada seccin. Aqu es necesario, ya que la longitud de un registro (y tambin
de cada campo) es fija.
Ya una vez definido como es Registro, podemos decir que una variable es del tipo definido para
Registro, es decir :
Dim MiVariable as Registro

Entonces MiVariable ya puede almacenar los datos de Titulo, Autor, Editorial, Edicin, Precio y
Existencias, colocando un dato tras otro, sin ninguna separacin, en el mismo orden que lo habamos
definido para Registro. No es necesario utilizar separaciones ya que el programa sabe que longitud
tiene cada dato y el orden de colocacin. Lo sabe porque se lo hemos dicho al definir Registro. Si los
datos a introducir son :
Titulo :
Autor :
Editorial :
Edicin :
Precio :
Existencias :

Gua del Estudiante


Luis Surez Bernaldo
Ediciones XX
2
3500
25

el registro correspondiente a este libro tendr una forma mas o menos as :


Gua del Estudiante///////////Lus Surez Bernaldo//////////Ediciones XX///2////350025/
donde se ha sustituido el carcter nulo por una barra ( / ) con el fin de hacerlo visible en el texto. Si se
molesta en contar los caracteres que tiene el registro observar que son 88, que es la suma de 30 + 30 +
15 + 6 + 4 + 3 que son los caracteres asignados a cada uno de las partes que forman el registro (Ttulo,
Autor, etc.) Para hablar con propiedad, a esas partes que componen el registro lea vamos a llamar
CAMPOS. Un Registro est formado por varios Campos, y cada Campo contiene una informacin.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 201

Imagnese que introducimos otro libro. El primer campo de ese nuevo registro se colocar en el fichero
inmediatamente despus del ltimo campo existente, sin ningn tipo de separacin. No hace falta esa
separacin, pues VB conoce donde finaliza un registro y comienza otro, ya que la longitud total del
registro se le ha introducido en la instruccin para abrir el fichero, que repetimos aqu por comodidad :
Open Nombrefichero For Random As # Numerocanal Len = LongitudRegistro
(Si se omite el dato LongitudRegistro VB colocar la longitud por defecto, 128 caracteres)
LongitudRegistro deber ser igual o mayor que la suma de caracteres de cada uno de los campos
declarados en la instruccin Type, que tambin reproducimos :

Type Registro
Titulo As String * 30
Autor As String * 30
Editorial As String * 15
Edicin As String * 6
Precio As String * 4
Existencias As String * 3
End Type

Asignamos 30 caracteres para el ttulo


Otros 30 para el autor
Asignamos 15 caracteres para editorial
Asignamos 6 caracteres para Edicin
Asignamos 4 caracteres para el precio
Tres caracteres para existencias.

Deber ser igual o mayor, o estrictamente igual ? La respuesta es igual o mayor. Pero si declaramos
en la instruccin Open que el registro es mayor que la suma de los caracteres de todos los campos que
lo componen, estaremos perdiendo espacio de disco duro, tanto como la diferencia entre lo declarado en
la instruccin Open menos la suma de los caracteres de cada uno de los campos. Y esa cifra,
multiplicada por el nmero de registros existentes. Por lo tanto debe declararse en la instruccin Open
exactamente la suma de los caracteres de todos los campos. En el ejemplo anterior era bastante fcil, ya
que todos los campos eran del tipo String (cadena de caracteres) y cada carcter ocupa un byte. La cosa
se complica si uno o varios de los campos son de tipo numrico, porque nos obligar a recordar cuantos
bytes ocupa un integer, un Long, etc. Si hubisemos declarado en la instruccin Type Precio as Long,
Existencias as Integer deberamos tener en cuenta que un Long (nmero entero entre -2.147.483.648 y
2.147.483.647, inclusive) ocupa 4 bytes y un integer (nmero entero entre -32.768 y 32.767) ocupa 2
bytes. Se reproduce a continuacin la longitud en Bytes de cada uno de los tipos de datos. No se
moleste en aprendrsela de memoria, pues en la Ayuda de Visual Basic puede encontrarla como
Resumen de tipos de datos. Pero fjese en algo tan curioso como que un dato tipo Boolean que
solamente puede tomar 2 valores (S / No) ocupa 2 bytes frente a un dato tipo Byte, que puede tomar
256 valores y ocupa solamente un Byte.

Tipo de Dato
Byte
Boolean
Integer
Long(entero largo)
Single(coma flotante Simple precisin)
Double(coma flotante Doble Precisin)
Currency
Date
Object
String (longitud variable)
String (longitud fija)
Variant (con nmeros)
Variant (con caracteres)

Ocupa
1 byte
2 bytes
2 bytes
4 bytes
4 bytes
8 bytes
8 bytes
8 bytes
4 bytes
10 bytes + longitud de cadena
longitud declarada de la cadena
16 bytes
22 bytes + longitud de cadena

Ya le estoy viendo tomando buena nota de cuanto ocupa cada variable. Y echando nmeros para saber
la longitud exacta de la variable y no perder ningn byte del disco duro desaprovechndolo sin
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 202

informacin. No habr algo que nos lo facilite ? S, lgicamente. La instruccin LEN

LEN nos da la longitud de un texto (Var=Len (Hola que tal), o de una variable Var=Len(Variable)
Podemos usarla para conocer la longitud total de la variable MiVariable
LongitudRegistro = Len (MiVariable)
Pero si quiere reducir mas la cosa, abra el fichero de esta forma :
Open Nombrefichero For Random As # Numerocanal Len = Len (MiVariable)

Ni que decir tiene que si se abre ese fichero en varias partes del programa con distintas instrucciones
Open el valor de LongitudRegistro debe ser igual en todas ellas.
La declaracin del registro mediante la instruccin Type debe hacerse en la seccin de declaraciones de
un Mdulo. Esta instruccin Type en realidad lo que est haciendo es definir un nuevo tipo de variable,
(una variable definida por el usuario) que servir de muestra para que en otra parte del programa le
digamos, mediante una instruccin Dim, que tal variable es del tipo definido anteriormente mediante la
instruccin Type. Por lo tanto, debemos declarar una variable en la parte que corresponda del programa,
dependiendo del mbito que se le quiera dar a esa variable, diciendo que ser del tipo de la declarada
mediante la instruccin Type.
Usando la declaracin de Registro del ejemplo anterior, vamos a retomar el ejemplo de la biblioteca.
Declararemos (posiblemente en la seccin de declaraciones del formulario) una variable que llamaremos
p.e. REGLIBROS de la siguiente forma :
Dim REGLIBROS as Registro
A partir de este momento, el programa sabe que REGLIBROS es una variable que tiene 6 campos
(Titulo, Autor, Editorial, Edicin, Precio y Existencias) y que cada campo tiene los caracteres
especificados en la instruccin Type.
Ahora nos cabe una pregunta Cuantos registros tiene un fichero Random? La respuesta es sencilla.
Basta conocer la longitud del fichero mediante la instruccin LOF si el fichero ya est abierto, o con la
instruccin FILELEN si no lo est, y dividir el dato obtenido con cualquiera de las dos instrucciones
anteriores por el valor LongitudRegistro.
Escribir datos en un fichero Random. Instruccin Put
Una vez abierto el fichero Random podemos leer y escribir datos en l. Para escribir datos utilizaremos la
instruccin Put. La sintaxis de Put es la siguiente:
Put # Numerocanal , NumeroRegistro, Variable
Puede omitirse NumeroRegistro. En este caso, el nmero de registro que se escribir ser el siguiente al
ltimo registro escrito.
NumeroRegistro es el nmero del registro que queremos escribir, y Variable es el contenido de ese
registro. Siguiendo con nuestro ejemplo de biblioteca, Variable tiene en este caso el nombre
REGLIBROS, que no es un String ni un Integer, sino una variable definida por el usuario ya que la
declaramos con Dim REGLIBROS as Registro. Por lo tanto, la variable REGLIBROS contendr los
mismos campos que habamos declarado para Registro en la instruccin Type. Recuerde :

Type Registro
Titulo As String * 30
LSB

Visual Basic Gua del Estudiante

Asignamos 30 caracteres para el ttulo


Captulo 1

Pgina 203

Autor As String * 30
Editorial As String * 15
Edicin As String * 6
Precio As String * 4
Existencias As String * 3
End Type

Otros 30 para el autor


Asignamos 15 caracteres para editorial
Asignamos 6 caracteres para Edicin
Asignamos 4 caracteres para el precio
Tres caracteres para existencias.

Luego REGLIBROS tendr 6 campos (Titulo, Autor, Editorial, Edicin, Precio y Existencias), cada uno de
una longitud determinada, la definida en la instruccin Type.
Antes de introducir REGLIBROS en el fichero habr que decir que valor tiene. Pero cada campo que lo
compone tendr un valor. Podramos hacer una aplicacin en la que, a travs de varios TextBox, le
introdujsemos los valores de los campos, y el nmero de registro en el cual queremos escribir. El
nombre de cada uno de los TextBox para cada uno de los datos es el siguiente :
Campo Ttulo : TBTITULO Campo Autor : TBAUTOR Campo Editorial :
TBEDITORIAL
Campo Edicin :TBEDICION Campo Precio : TBPRECIO Campo Existencias : TBEXISTENCIAS
La aplicacin deber introducir en cada campo el valor (string) existente en cada uno de esos TextBox.
El valor de la variable REGLIBROS lo compondremos de la siguiente forma :
REGLIBROS.Titulo = TBTITULO.Text
REGLIBROS.Autor = TBAUTOR.Text
REGLIBROS.Editorial = TBEDITORIAL.Text
REGLIBROS.Edicion = TBEDICION.Text
REGLIBROS.Precio = TBPRECIO.Text
REGLIBROS.Existencias = TBEXISTENCIAS.Text
(Si se hubiese omitido alguna de estas igualdades, el campo correspondiente contendra el valor nulo)
De esta forma, REGLIBROS ya tiene un valor que se puede escribir en el fichero mediante la instruccin
Put.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 204

El formulario de esa aplicacin tendr esta forma :

Observe que ya se le han introducido otros controles (TextBox para introducir el nombre del fichero, otro
para el nmero de registro, botones para leer, escribir, abrir el fichero (EXAMINAR), un par de botones
para subir o bajar el nmero de registro y un botn para salir de la aplicacin. El TextBox para introducir
el nombre del fichero se llama TBNOMBREFICHERO y en el que debemos introducir el nmero de
registro a leer o escribir TBLEERESCR.
El Botn EXAMINAR cierra cualquier fichero que pudiese estar abierto, abre el fichero indicado en
TBNOMBREFICHERO, calcula el nmero de registros y escribe este nmero en el Label con nombre
LNUMFICH. El cdigo de su procedimiento Click es el siguiente :
Private Sub BEXAMINAR_Click()
Close
Open TBNOMBREFICHERO For Random As #1 Len = 88
LONGITUDFICH = LOF(1)
NUMREGS = LONGITUDFICH / 88
LNUMFICH.Caption = NUMREGS
End Sub

Cierra cualquier fichero abierto


Abre el fichero deseado
Obtiene su longitud
Calcula el N. de registros
Pone ese N. en el Label

Veamos como se escribe un registro. Analicemos el cdigo del procedimiento click del botn ESCRIBIR
Private Sub BESCRIBIR_Click()
REGISTROLIBRO.Titulo = TBTITULO.Text
REGISTROLIBRO.Autor = TBAUTOR.Text
REGISTROLIBRO.Editorial = TBEDITORIAL.Text
REGISTROLIBRO.Edicin = TBEDICION.Text
REGISTROLIBRO.Precio = TBPRECIO.Text
REGISTROLIBRO.Existencias = TBEXISTENCIAS.Text
Put #1, Val(TBLEERESCR), REGISTROLIBRO
End Sub

Se asignan los valores de cada


uno de los campos de la variable
REGISTROLIBROS

Se escribe el registro

Observe que el N. de registro es el valor que figure en el TextBox TBLEERESCR


Leer datos en un fichero Random. Instruccin Get
Para leer los datos de un fichero Random utilizaremos la instruccin Get. Su sintaxis es la siguiente :
Get # Numerocanal , NumeroRegistro, Variable
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 205

Puede omitirse NumeroRegistro. En este caso, el nmero de registro que se leer ser el siguiente al
ltimo registro ledo.
La Instruccin Get leer un registro completo. Ese registro contendr varios campos, y seguramente nos
interesar conocer el valor de cada campo dentro de ese registro. Variable es una variable que
contendr todos los campos. En nuestra aplicacin de biblioteca, Variable tiene por nombre
REGISTROLIBRO (El mismo que tena para la instruccin Put de escribir. Es pura comodidad del
programador. Puede tener cualquier otro nombre)
Para obtener el contenido de cada campo, realizaremos un proceso similar al empleado para la escritura,
pero al revs. En nuestra aplicacin, pretendemos poner el contenido de cada campo en los mismos
TextBox que se utilizaron para escribirlos. Veamos el contenido del procedimiento click del botn LEER
Private Sub BLEER_Click()
Get #1, Val(TBLEERESCR), REGISTROLIBRO
TBTITULO.Text = REGISTROLIBRO.Titulo
TBAUTOR.Text = REGISTROLIBRO.Autor
TBEDITORIAL.Text = REGISTROLIBRO.Editorial
TBEDICION.Text = REGISTROLIBRO.Edicin
TBPRECIO.Text = REGISTROLIBRO.Precio
TBEXISTENCIAS.Text = REGISTROLIBRO.Existencias
End Sub

Lee el registro completo


Obtiene el valor del campo Titulo
Autor, Editorial, Edicin, Precio
y Existencias y los pone en los
TextBox correspondientes a cada
dato

Funciones e instrucciones aplicables a los ficheros Random.


Funciones Seek y Loc.
En los ficheros Random tienen especial importancia las funciones Seek y Loc.
Mediante la Funcin Loc podemos conocer la el ltimo registro manipulado, bien por lectura, escritura. Si
abrimos el fichero y no se ha hecho ninguna lectura o escritura de registros, el nmero devuelto por la
funcin Loc es 0.
La sintaxis de la funcin Loc es :
Variable = Loc (Numerocanal)
Variable tomar un valor igual al nmero del registro escrito o ledo por ltima vez.
Mediante la Funcin Seek podemos conocer el prximo registro que ser manipulado en una operacin
de lectura o escritura. Si abrimos el fichero y no se ha hecho an ninguna operacin de lectura o
escritura, Seek devuelve el valor 1.

La sintaxis de la funcin Seek es :


Variable = Seek (Numerocanal)
ATENCION
Seek puede ser una funcin (lee un Dato) o una instruccin (fuerza un dato) ! ! !
Instruccin Seek
La instruccin Seek establece el prximo registro a leer o escribir en un fichero Random.
Sintaxis
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 206

Seek (Numerocanal), posicin


posicin es el nmero de registro que se va a leer o escribir en la siguiente operacin. No acepta el 0
como nmero de registro, el mas bajo debe ser el 1. Si se intenta forzar a la posicin 0 dar un error.
Funciones de los ficheros Random:
EOF
Devuelve un valor que indica si se ha llegado al final de un archivo.
Sintaxis

EOF(Numerocanal)

En archivos Random, EOF devuelve False hasta que se haya ejecutado una instruccin Get y no haya
podido leer el registro completo, en cuyo caso devolver True.
La funcin EOF no suele emplearse en ficheros Random, ya que en estos nos movemos a base de
registros, y es muy fcil controlar cuantos registros existen en el fichero y en que registro nos
encontramos o nos vamos a mover, mediante las funciones LOF, LOC y SEEK

LOF

( Lenght Of File )
Devuelve la longitud de un fichero .
Sintaxis

Variable = LOF(Numerocanal)

Mediante la funcin LOF podemos conocer el nmero de registros existentes en un fichero Random,
dividiendo el valor devuelto por LOF por la longitud del registro declarada en la instruccin Open (LEN =
longitud)
N. Registros = LOF / longitud

Recuerde

LSB

Para obtener la longitud de un archivo que no est abierto utilce la funcin


FileLen.

Visual Basic Gua del Estudiante

Captulo 1

Pgina 207

FICHEROS BINARIOS
Un fichero binario es una sucesin de bytes, uno tras otro, que puede almacenar cualquier tipo de
informacin. Cuando se explicaban los ficheros secuenciales, decamos que eran los mas adecuados
para introducir informacin de un texto, con los Random podamos realizar una base de datos de forma
sencilla, a base de controlar los registros y sus campos. Con un fichero binario podemos almacenar
cualquier informacin. (texto y cualquier tipo de datos) .
Para abrir un fichero secuencial se abre utilizando la instruccin :
Open Nombrefichero For Binary As # Numerocanal
Como siempre en VB, Numerocanal puede ser un nmero comprendido entre 1 y 255, que define ea
fichero. No pueden existir al mismo tiempo 2 ficheros abiertos con el mismo Numero de canal.
Nombrefichero es el nombre completo del fichero, con su Path.
Una vez abierto un fichero se binario, podemos leer o escribir datos en l.
Para escribir uno o varios caracteres en un fichero binario, usaremos la instruccin Put.
Put # Numerocanal, Posicin, Variable
Donde Posicin es el Byte donde comenzar la escritura, y Variable es el nombre de la variable que
contiene el dato a escribir. Este dato puede ser un byte o varios bytes.
Para escribir varios bytes podemos hacerlo de dos formas :
- Si se puede conocer de antemano el nmero de bytes a escribir, puede declararse Variable como un
string de ese nmero de caracteres mediante la instruccin Dim, por ejemplo :
Dim Variable As String * numero de bytes
y en este caso siempre escribir el nmero de bytes declarado. Cuidado ! Si los datos a introducir
sobrepasan el nmero de bytes declarados para Variable, los datos sobrantes no se escribirn en el
fichero. Si los datos a escribir en el fichero fuesen menos que los declarados para Variable, la diferencia
se rellenar con el byte nulo ( 0 ).
- Si no se conoce de antemano el nmero de bytes a escribir, podemos declarar la variable sin
especificar el nmero de bytes que tiene, y de esta forma se escribirn todos los bytes que componen la
variable :
Dim Variable As String
Pero en este caso debemos volver a decir Cuidado !, si no conocemos el nmero de bytes que vamos
a escribir, puede que machaquemos parte de la informacin que ya tenemos en el fichero, pues la
instruccin Put va a colocar los bytes que componen Variable en la posicin especificada por Posicin y
siguientes, hasta que quepa toda la cadena de bytes que le queremos introducir. Si la posicin en la que
introducimos esos bytes es una posicin intermedia, y no controlamos bien el nmero de bytes a
introducir y las informaciones que ya existen en el fichero en las posiciones colindantes con las que
vamos a introducir los datos, es muy probable que perdamos esa informacin al introducir la nueva.
Si se omite el dato Posicin, se tomar como byte de inicio de la escritura el siguiente al ltimo usado
por la instruccin Put. Si quiere omitir este dato, debe conservar las comas que lo separan :
Put # Numerocanal, , Variable
Qu pasar si el dato Posicin indica una posicin mayor que la que tiene realmente el fichero ?
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 208

Simplemente que rellenar las posiciones intermedias que se formarn con un byte (puede verlo con el
Block de Notas )
Un fichero binario es, como se deca al principio, una sucesin de bytes, que no tiene ningn tipo de
separacin entre bytes. Cada dato (byte o conjunto de bytes) que introduzcamos en un fichero binario se
escribir en el fichero tal y como se introducen. Machacando informacin ya existente si no se controla
bien donde se mete. Por lo tanto, aunque parece que los ficheros binarios pueden ser mucho mas
verstiles que los secuenciales y los Random, exigen mucho mas control que los anteriores. Limite el
uso de este tipo de ficheros a las aplicaciones en que sea realmente imprescindible.
Para leer datos de un fichero binario, utilizaremos la instruccin Get.
Get # Numerocanal, Posicin, Variable
Donde Posicin es el nmero del primer byte ledo, que como en el caso de Put, si se omite, tomar
como valor el byte siguiente al usado en la ltima instruccin Get. Variable es el nombre de una variable
que contendr los datos ledos.
Pueden leerse uno o varios Bytes, pero ahora surge un pequeo problema. Como le decimos cuantos
bytes debe leer ? Sencillamente los especificados al declarar la variable . Imaginemos que la
declaracin de la variable fue :
Dim Variable As String * 10
Con Variable declarada de esta forma, leer 10 bytes a partir del byte Posicin. (Incluido)
De esta forma, siempre leeremos un nmero determinado de caracteres (10 en el caso del ejemplo).
Esta es una limitacin para el uso de Get. Esta funcin viene muy bien en aquellas aplicaciones en las
que tenemos que extraer un nmero fijo de bytes (En la prctica, en la mayor parte de las aplicaciones
se extrae de uno en uno)
Pero pueden existir aplicaciones en las que sea necesario leer una vez un nmero de caracteres, y otra
vez otro. Ese problema lo tenemos resuelto con la instruccin Input.
Podemos leer caracteres de un fichero secuencial mediante la instruccin Input :
Variable = Input (Numero de bytes, # Numerocanal)
Mediante la instruccin Input podemos leer el nmero de caracteres que queramos, pero no podemos
controlar el byte de comienzo. Por lo tanto deberemos ayudarnos de la instruccin Seek para posicionar
el puntero de lectura encima del primer byte que queramos leer :
Seek (Numerocanal), Nmero del primer Byte a leer
Por ejemplo, si queremos leer 35 bytes de un archivo binario, abierto con el nmero de canal 1,
comenzando por el byte 48 (el 48 ser el primer byte ledo), ejecutaremos las dos siguientes
instrucciones :
Seek (1), 48
Variable = Input (35, #1)
Variable contendr ahora los 35 bytes deseados.
Al igual que se hizo para los ficheros secuenciales y Random, vamos a ver con un ejemplo prctico
como se manejan los ficheros binarios.
El formulario del ejemplo tiene esta forma :

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 209

Con el botn ABRIR se abre el fichero deseado. Si no existe en el disco, lo crea, ya que la instruccin
Open Nombrefichero For Binary As # Numerocanal
intenta abrir un fichero existente llamado Nombrefichero, y si este no existe, lo crea. Si existe el fichero,
presenta todo su contenido en el TextBox inferior, para poder tener una referencia de que lugar ocupan
los distintos caracteres (un fichero binario puede guardar cualquier byte, por lo que si abre un fichero
generado con cualquier programa puede ser que muchos de los bytes no contengan informacin de un
carcter, por lo que le recomendamos haga esta prctica con un fichero creado por la misma prctica)
El botn CERRAR cierra el fichero. SALIR sale de la aplicacin. El TextBox superior (variable) sirve para
introducir la variable a escribir en el fichero, o para presentar la variable leda en caso de lectura . El
TextBox posicin sirve para indicar la posicin del primer byte. Posicin por defecto presenta la posicin
que se extrae mediante la funcin Seek cada vez que se hace una lectura o escritura en el fichero.
Longitud de la variable permite introducir esa longitud, para leer mediante la instruccin Input.
El botn ESCRIBIR escribe el dato Variable en el fichero, LEER (GET) lee un nico byte, y LEER
(INPUT) lee una cadena de caracteres, de longitud la especificada en el TextBox Longitud de la variable.
Se enumera a continuacin el cdigo de cada uno, dejando para las explicaciones del profesor en clase,
o el estudio del alumno, la interpretacin de cada una de susu partes.
FORMULARIO. DECLARACIONES
Option Explicit
Obliga a declarar todas las variables
Dim LONGVAR As Integer
Se declara la variable LONGVAR
Dim COMIENZA As Long
Se declara la variable COMIENZA
Dim TESTO As String
Se declara la variable TESTO
Dim pospordef As Long
Se declara la variable pospordef
BOTON ABRIR
Private Sub BABRIR_Click()
CD1.ShowOpen
CD1 es un CommonDialog para buscar el fichero
Open CD1.filename For Binary As #1
Abre el fichero indicado en CD1
TESTO = Input(LOF(1), #1)
Lee de un golpe el fichero y lo mete en la variable TESTO
TBFICHERO.Text = TESTO
Presenta el fichero en el TextBox TBFICHERO
End Sub
BOTON CERRAR
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 210

Private Sub BCERRAR_Click()


Close
End Sub
BOTON ESCRIBIR
Private Sub BESCRIBIR_Click()
TBVAR2.BackColor = RGB(255, 0, 0)
Dim escribe As String
escribe = TBVAR1.Text
Put #1, Val(TBVAR3), escribe
pospordef = Seek(1)
Lvar5 = Str(pospordef)
End Sub
BOTON LEER (GET)
Private Sub BLEER_Click()
TBVAR2.BackColor = RGB(255, 0, 0)
TBVAR2.Text = "1"
If Seek(1) >= LOF(1) Then
Seek #1, 1
End If
Dim TEXTO As String * 1
If TBVAR3.Text <> "" Then
COMIENZA = Val(TBVAR3.Text)
ElseIf Lvar5.Caption <> "" Then
COMIENZA = Val(Lvar5.Caption)
Else
COMIENZA = Seek(1)
End If
Get #1, COMIENZA, TEXTO
TBVAR1.Text = TEXTO
pospordef = Seek(1)
Lvar5 = Str(pospordef)
End Sub

La instruccin Close cierra todos los ficheros abiertos

Pone el TB long. De la variable en rojo


Declara la variable escribe como string, sin limitacin
Pasa el contenido de TBVAR a la variable escribe
Instruccin Put. Val(TBVAR3) es la posicin del 1er byte
Analiza donde qued el puntero del fichero
y pone este valor en la etiqueta Lvar5

Pone en rojo el TB TBVAR2 (long. de la variable)


e indica que la longitud leda es 1
Si est al final del archivo
pone el puntero en la posicin 1

Declara la variable TEXTO de un byte


Si se le ha indicado donde tiene que comenzar
le dice que comience en la posicin indicada en TBVAR3
si no, si existe posicin por defecto
le indica que comience en la posicin por defecto
si no
pone el puntero en la posicin 1 (byte 1)
lee un byte
y lo presenta en TBVAR1
busca la nueva posicin por defecto
y pone ese valor en Lvar5

BOTON LEER (INPUT)


Private Sub BLLERINPUT_Click()
TBVAR2.BackColor = RGB(255, 255, 255)
Pone TBVAR2 en blanco
LONGVAR = Val(TBVAR2.Text) pasa el valor para long. de variable a LONGVAR
If TBVAR3.Text <> "" Then
si ese valor existe (TBVAR3 es distinto de nada)
COMIENZA = Val(TBVAR3.Text)
la variable COMIENZA toma ese valor
Seek (1), COMIENZA
coloca el puntero en ese valor
End If

Dim TEXTO As String


Declara la variable TEXTO sin limitacin
TEXTO = Input(LONGVAR, #1)
Lee LONGVAR bytes del canal 1 y los pasa a TEXTO
TBVAR1.Text = TEXTO
y lo presenta en el TB TBVAR1
pospordef = Seek(1)
analiza la nueva posicin por defecto
Lvar5 = Str(pospordef)
y la presenta en Lvar5
End Sub

BOTON SALIR
Private Sub BSALIR_Click()
End
End Sub

Sale de la aplicacin.

Private Sub TBVAR2_Change()


TBVAR2.BackColor = RGB(255, 255, 255)
End Sub
LSB

Visual Basic Gua del Estudiante

Captulo 1

Vuelve a color blanco si introducimos un dato en


este Text Box
Pgina 211

FIN DE LA APLICACIN PARA MANEJO DE FICHEROS BINARIOS


Funciones y propiedades aplicables a todos los ficheros
DIR
Devuelve el nombre de un archivo, directorio o carpeta que concuerda con el patrn o atributo de archivo
especificado o la etiqueta de volumen de una unidad de disco.
Sintaxis

Dir[(nombreruta[, atributos])]

nombreruta

Expresin de cadena que especifica un nombre de archivo. Puede incluir el


directorio o carpeta y la unidad de disco. Si no se encuentra nombreruta, devuelve
Null.

atributos

Constante o expresin numrica, cuya suma especifica atributos de archivo. Si se


omite, devuelve todos los archivos normales que satisfacen el nombreruta.

El argumento atributos tiene estas constantes y valores:


Constante

Valor

Descripcin

vbNormal
vbHidden
vbSystem
vbVolume
vbDirectory

0
2
4
8
16

Normal.
Oculto.
Sistema
Etiqueta de volumen; si se especifica se ignoran todos los atributos
Directorio o carpeta.

En Microsoft Windows, Dir permite el empleo de los caracteres comodn '*' (mltiples caracteres) y '?'
(un solo carcter) para especificar varios archivos.
La primera vez que se llama a la funcin Dir se debe especificar el nombreruta, de lo contrario se
produce un error. Si adems se especifican atributos de archivo, se debe incluir el nombreruta.
Dir devuelve el primer nombre de archivo que coincide con el nombreruta. Para obtener ms nombres de
archivo que coincidan con el nombreruta, se debe volver a llamar a Dir sin argumentos.
Cuando no hay ms nombres de archivo coincidentes, Dir devuelve una cadena de caracteres de
longitud cero. Cuando se devuelve una cadena de longitud cero, en las siguientes llamadas se debe
especificar nombreruta o se producir un error. Se puede cambiar el nombreruta sin haber obtenido
todos los nombres de archivo que coinciden con el nombreruta actual. Sin embargo, no se puede llamar
a la funcin Dir.
FILECOPY
Copia un archivo.
Sintaxis

FileCopy fuente, destino

fuente Expresin de cadena que especifica el nombre de un archivo a copiarse puede incluir el
directorio o carpeta y la unidad de disco..
destino Expresin de cadena que especifica el nombre del archivo de destino se puede incluir el
directorio o carpeta y la unidad de disco.
Si intenta utilizar la instruccin FileCopy en un archivo abierto actualmente, se produce un error.
FILEDATATIME
Devuelve una fecha que indica la fecha y hora en que un archivo fue creado o modificado por ltima vez.
Sintaxis
LSB

Variable = FileDateTime(nombreRuta)

Visual Basic Gua del Estudiante

Captulo 1

Pgina 212

El argumento con nombre nombreRuta es una expresin de cadena que especifica un nombre de
archivo. Se puede incluir el directorio o carpeta y la unidad de disco.
FILELEN
Devuelve la longitud de un archivo en bytes.
Sintaxis
Variable = FileLen(nombreRuta)
El argumento con nombre nombreRuta es una expresin de cadena que especifica un nombre de
archivo se puede incluir el directorio o carpeta y la unidad de disco.
Si el archivo especificado est abierto cuando se llama la funcin FileLen, el valor devuelto representa el
ltimo tamao de ese archivo cuando se guard la ultima vez en el disco.
Para obtener la longitud de un archivo abierto, utilice la funcin LOF.
GETATTR
Devuelve un nmero, que representa los atributos de un archivo, directorio o carpeta o una etiqueta de
volumen.
Sintaxis

Variable = GetAttr(nombreRuta)

El argumento con nombre nombreRuta es una expresin de cadena que especifica un nombre de
archivo se puede incluir el directorio o carpeta y la unidad de disco.
Valores devueltos
El valor devuelto por GetAttr es la suma de los siguientes valores de atributos:
Valor

Constante

Descripcin

0
1
2
4
16
32

vbNormal
vbReadOnly
vbHidden
vbSystem
vbDirectory
vbArchive

Normal.
Slo lectura.
Oculto.
Archivo de sistema.
Directorio o carpeta.
El archivo ha sido modificado despus de efectuar la ltima copia de
seguridad.

SETATTR
Establece los atributos de un archivo.
Sintaxis
nombreRuta
atributos

SetAttr nombreRuta;atributos

Expresin de cadena que especifica un nombre de archivo se puede incluir el


directorio o carpeta y la unidad de disco.
Constante o expresin numrica cuya suma especifica los atributos de
archivo.

Las constantes y valores de atributos son los mismos que para la instruccin GetAttr
Si se trata de establecer los atributos de un archivo abierto, se producir un error en tiempo de
ejecucin.

FREEFILE
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 213

Devuelve el siguiente nmero de archivo disponible para ser usado con la instruccin Open.
Sintaxis

FreeFile[(nmerodeintervalo)]

El argumento nmerodeintervalo especifica el intervalo desde el que el siguiente nmero de archivo libre
se va a devolver. Se especifica 0 (predeterminado) para devolver un nmero de archivo en el intervalo 1
a 255, inclusive. Se especifica 1 para devolver un nmero de archivo en el intervalo 256 a 511.
Observaciones Se usa FreeFile cuando se necesita proveer un nmero de archivo y se quiere asegurar
que el nmero de archivo no est ya en uso.

Visual Basic - Gua del Estudiante Cap. 8

LA FUNCION SHELL
LA FUNCION COMMAND PARA PASAR PARAMETROS
LA FUNCION DoEvents
Cajas de mensaje (Mensaje Box)
Cajas de entrada de datos (Input Box)
El Objeto APP (La Aplicacin)

LA FUNCION SHELL
La funcin Shell se utiliza para ejecutar un programa ajeno a la aplicacin que se est ejecutando.
Imaginemos que tenemos una aplicacin Visual Basic que necesita, por ejemplo, establecer una
comunicacin telefnica, y que esa comunicacin telefnica nos la realiza un programa desarrollado en
C++ , llamado MARCADOR.EXE que funciona perfectamente y no queremos desaprovechar.
Imaginemos que ese programa tiene la posibilidad de introducirle el nmero telefnico que debe marcar
como un parmetro. Este parmetro se le introduce, supongamos, aadiendo el nmero al nombre del
programa ejecutable. Por ejemplo:
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 214

MARCADOR.EXE 1234567
En nuestra aplicacin Visual Basic introduciremos una lnea invocando la funcin Shell seguida del
nombre (y Path) del ejecutable y del parmetro que le vamos a introducir al ejecutable:
Shell "C:\VB\MARCADOR.EXE 080"
Mediante esta lnea, lo que hacemos es ejecutar el programa MARCADOR.EXE e introducirle como
parmetro el nmero a marcar. Resultado: el programa MARCADOR.EXE llama al nmero 080
(Bomberos), y una vez establecida la llamada podemos pasarle a ese Organismo datos o lo que nuestra
aplicacin haga.
Veamos que dice la Ayuda de VB respecto a la Funcin Shell:
Ejecuta un programa ejecutable.
Sintaxis

Variable = Shell ( rutaDeAcceso [, estiloDeVentana] )

donde:
Variable es identificador de la tarea (ID)
rutaDeAcceso es el nombre del programa por Ejecutar (con su Path) y cualquier argumentos o
conmutadores (switches) de lnea de comando requeridos; puede incluir directorio o carpeta y unidad de
disco. Tambin puede ser el nombre de un documento que se ha asociado con un programa ejecutable.
estiloDeVentana es el nmero correspondiente al estilo de la ventana en la cual se va a ejecutar el
programa. En Microsoft Windows, si se omite estiloDeVentana, el programa se inicia minimizado con
enfoque.
El argumento con nombre estiloDeVentana tiene estos valores:
Constante

Valor

Descripcin

vbHide
vbNormalFocus

0
1

vbMinimizedFocus
vbMaximizedFocus
vbNormalNoFocus

2
3
4

vbMinimizedNoFocus

Se oculta la ventana y se pasa el foco a la ventana oculta.


La ventana recupera el foco y vuelve a su posicin y tamao
original.
La ventana se muestra como un icono con foco.
La ventana se maximiza con foco.
La ventana vuelve al tamao y posicin ms recientes. La
ventana activa actual permanece activa.
La ventana se muestra como un icono. La ventana activa
actual permanece activa.

Comentarios
Si la funcin Shell ejecuta con xito el archivo nombrado, devuelve la identificacin de la tarea (ID) del
programa iniciado. La ID de la tarea es un nmero exclusivo que identifica el programa en ejecucin.
Este nmero debe ser un Long. Si la funcin Shell no puede iniciar el programa nombrado, ocurrir un
error. Si desea conocer el ID de la tarea, realice una aplicacin con un botn (cmbCalculadora) y un
label (label1). Ponga en ese botn en su procedimiento click, el siguiente cdigo. - Observe que esta
aplicacin inicia la calculadora de Windows Private Sub cmbCalculadora_Click()
Dim variable As Long
variable = Shell("C:\windows\calc.exe", 1)
label1.Caption = Str(variable)
End Sub
Posiblemente lo nico que le importe sea el ejecutar esa aplicacin, sin dar mayor importancia al ID de la
tarea. Utilice una lnea con la siguiente expresin :
Shell ("C:\windows\calc.exe"), 1
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 215

(Observe en las dos formas de ejecutar la funcin Shell, que la colocacin de los parntesis y la coma
separadora es distinto.
El programa a ejecutar puede ser un programa Windows caso anterior de la calculadora) o un programa
DOS.
Nota La funcin Shell ejecuta otros programas de manera asncrona. Esto quiere decir que no se
puede esperar que un programa iniciado con Shell termine su ejecucin antes de que se ejecuten las
instrucciones que siguen a la funcin Shell en la aplicacin. Esto es un gran inconveniente de la funcin
Shell. Excepto en contadas ocasiones, siempre es necesario conocer cuando se ha terminado de
ejecutar el programa iniciado mediante Shell. Y no es ese el nico problema. La mayora de los
programas DOS que se ejecutan con Shell no se cierran automticamente. Esto significa que si
podemos evitar el uso de Shell debe evitarse. Pero si es completamente necesario, tampoco pasa nada.
Pero hay que controlar, tanto la terminacin del proceso DOS como su cierre.
Podemos usar para ello APIs. No las hemos explicado todava. Por eso, y adelantar un poco como se
trabaja con ellas, vamos a presentar, sin grandes explicaciones, lo que hay que hacer para poder
detectar que se ha terminado de ejecutar el programa DOS y para cerrarlo. Ver mas APIs mas
adelante.
El programa DOS elegido para este ejemplo es el popular ARJ.EXE, un compresor de datos que, sin
nimo de publicidad, es uno de los mejores que existen. Pero trabaja solamente en DOS. Se utiliza un
Procedimiento que he llamado ExecCmdNoFocus, para detectar que el proceso abierto para comprimir
o descomprimir ha finalizado, y proceder a cerrarlo.

La declaracin de las Apis y Constantes (En la seccin de Declaraciones de un Mdulo) es la siguiente:


Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As _ String, ByVal
lpWindowName As String) As Long
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, _ ByVal wMsg
As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal _ bInheritHandle
As Long, ByVal dwProcessID As Long) As Long
Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode _ As Long)
As Long
Declaramos las constantes
Public Const WM_CLOSE = &H10
Public Const STILL_ACTIVE = &H103
Public Const PROCESS_QUERY_INFORMATION = &H400
El Procedimiento podemos ponerlo en el Mdulo anterior o en el formulario. Variar el tipo de declaracin
de las APIs:
Public Sub ExecCmdNoFocus(ByVal CmdLine As String)
(CmdLine es el parmetro que le vamos a pasar cuando invoque este procedimiento).
'Este procedimiento inicia un proceso en DOS y espera a que termine
'Una vez terminado este proceso, cierra la ventana, que se mostrar minimizada y sin foco
Declaramos las variables locales en ese procedimiento
Dim hProcess As Long
LSB

'handle del proceso donde se invoca la funcin Shell

Visual Basic Gua del Estudiante

Captulo 1

Pgina 216

Dim RetVal As Long


'Valor donde la funcin GetExitCode coloca el resultado
Dim winHwnd As Long ' manipulador de la ventana que contenga el Caption
Finalizado - ARJ
Dim RetValls As Long 'valor de retorno de PostMessage
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(CmdLine, _
vbMinimizedNoFocus))
Do
GetExitCodeProcess hProcess, RetVal
Sleep 100
'en este apartado comprueba si est abierta la ventana "Finalizado - ARJ"
winHwnd = FindWindow(vbNullString, "Finalizado - ARJ")
If winHwnd <> 0 Then
RetValls = PostMessage(winHwnd, WM_CLOSE, 0&, 0&)
End If
Loop While RetVal = STILL_ACTIVE
End Sub
La ventana DOS del ARJ tiene el Caption Finalizado - ARJ cuando ya ha terminado el proceso. En el
procedimiento ExecCmdNoFocus se analiza si esa ventana est presente (prueba de que ARJ ya ha
terminado, pues antes de terminar tiene otro Caption).
Para llamar a ese procedimiento hay que citarle por su nombre (ExecCmdNoFocus) que como lo
hemos declarado Public en un Mdulo, podemos llamarle desde cualquier parte de la aplicacin.
Debemos pasarle el parmetro CmdLine, que ser el programa que vamos a ejecutar con Shell y los
parmetros adicionales que este programa necesite (En este caso, el programa es ARJ.EXE y a
continuacin debe indicrsele el nombre del archivo ya comprimido, a continuacin a para que aada
mas ficheros a ese archivo, y a continuacin el nombre de ese fichero o ficheros a aadir :
El parmetro CmdLine del procedimiento es todo lo que va entre parntesis.
ExecCmdNoFocus ("C:\DirA\ARJ.EXE a C:\DirB\Fichero1.Ext")
NO se preocupe si no lo entiende ahora. Es difcil.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 217

LA FUNCION COMMAND
En el ejemplo anterior usbamos un ejecutable realizado en C++ para marcar un nmero telefnico que
le introducamos como parmetro. Podemos hacer eso en una aplicacin VB? La respuesta debe ser
SI. Usaremos para ello la funcin Command. Esta funcin nos devuelve el parmetro introducido tras el
nombre del ejecutable realizado en VB, cuando iniciamos la aplicacin VB mediante la lnea de
comandos de Windows (lnea Archivo | Ejecutar del Men de Windows 3.xx o lnea Ejecutar de W95),
o desde otra aplicacin utilizando la funcin Shell.
Veamos tambin en este caso lo que dice la Ayuda de VB:
Command (Funcin)
Devuelve parte del argumento de la lnea de comandos utilizada para lanzar Microsoft Visual Basic o un
programa ejecutable desarrollado con Visual Basic.

Cuando se inicia Visual Basic desde la lnea de comandos, la parte de la lnea de comandos que sigue a
/CMD se pasa al programa como un argumento de la lnea de comandos. En el siguiente ejemplo,
cmdlineargs representa la informacin de argumento devuelta por la funcin Command.
VB /CMD cmdlineargs
En las aplicaciones desarrolladas con Visual Basic y compiladas en un archivo .EXE, Command
devuelve los argumentos que aparezcan en la lnea de comandos tras el nombre de la aplicacin. Por
ejemplo:
MyApp cmdlineargs
En la ventana Cdigo, puede usted cambiar el texto devuelto por Command eligiendo Opciones del
proyecto en el men Herramientas.
Veamos con un par de ejemplos como se pueden usar estas dos funciones:
Marcador Telefnico
Esta aplicacin debe marcar un nmero telefnico. El nmero a marcar se le pasar como parmetro
tras el nombre de la aplicacin. La aplicacin ya compilada se llamar MARCADOR.EXE. Para marcar
un nmero debemos poner, en la lnea de Comando de Windows:
Marcador.exe 1234567
o como ya sabemos, introducirle el parmetro mediante una llamada con la funcin Shell desde otra
aplicacin:
Shell Marcador.exe 1234567
Como no vamos a realizar llamada alguna, sino comprobar que esto puede funcionar, nuestra pequea
aplicacin tendr solamente un Label llamado FRMARCADORL1 donde presentaremos el nmero a
marcar. Todo el cdigo necesario se lo metemos en el procedimiento Activate del formulario:
Private Sub Form_Activate()
FRMARCADORL1.Caption = Command
End Sub
Tambin podemos pasar parmetros a un ejecutable, mediante el Drag & Drop de Windows.
Hemos visto mas atrs como podemos hacer Drag & Drop en una aplicacin VB. Pero como
comentbamos, el D&D no es una funcin de VB, sino de Windows. Y Windows lo utiliza en su
Explorador de Windows para pasar como parmetro a una aplicacin el nombre del fichero que
arrastremos hacia el icono que representa a esa aplicacin. Como estoy seguro que se ha liado, vamos
con un ejemplo.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 218

Si Vd. hace un editor de textos (Editor.EXE) que soporta un formato determinado (por ejemplo el
RichTextFormat RTF), para ejecutar su programa y meterle como parmetro el nombre del fichero
Carta.RTF de forma que al arrancar lea directamente el fichero Carta.RTF, basta con ir al Explorador de
Windows, abrir la carpeta que contenga Carta.RTF, arrastrar el nombre de ese fichero y llevarlo al icono
que representa a Editor.EXE, que imaginemos que le ha preparado un acceso directo. Suelte el botn
del ratn y su editor se ejecutar, y adems, le meter como parmetro el nombre del fichero Carta.RTF
(con su Path correspondiente) Si Ud. haba previsto la captura del Command tal como se explic mas
atrs, y ha preparado su aplicacin para que tome el contenido de Command y entienda que tiene que
abrir y cargar ese fichero, su aplicacin Editor.EXE cargar automticamente ese fichero. Observe que
esta es la forma de trabajar de los procesadores de texto usados normalmente (Word, WordPerfect,
Write, etc.)

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 219

La Funcin DoEvents
Cede el control de la ejecucin al sistema operativo, para que ste pueda procesar otros eventos.
Tambin nos permite conocer el nmero de formularios abiertos en una aplicacin.

Sintaxis

DoEvents
Cede el control al sistema operativo

Sintaxis

variable=DoEvents
variable contendr un nmero indicando el nmero de formularios abiertos en
este momento.

La funcin DoEvents es una instruccin obligada en todos los bucles por condicin para evitar que, en
caso de meterse en un bucle infinito, podamos salir de el aunque sea teniendo que pulsar las teclas CtrlAlt-Sup. Si no lleva esa lnea DoEvents, es posible que tenga que resetaear el ordenador. El siguiente
bucle se pone para esperar a que el programa enve un mensaje a travs del control de comunicaciones.
Este, una vez terminada la comunicacin, pone la variable Transmitido a True. Imagnese que se corta
la comunicacin y Transmitido nunca llega a ser True.
Do Until Transmitido = True
Rem Si Transmitido no llega nunca a ser true, nunca podr salir del bucle
DoEvents
Esta funcin devuelve el control al sistema operativo cada vez que se ejecuta
y puede comprobar si se han pulsado las teclas Ctrl-Alt-Sup
Loop
La funcin DoEvents devuelve tambin el nmero de formularios abiertos por una versin nica de
Visual Basic, como la versin estndar de Visual Basic. DoEvents devuelve 0 en el resto de las
aplicaciones.
El control no se devuelve hasta que el sistema operativo haya terminado de procesar los eventos en cola
y que (slo para Microsoft Windows) se hayan enviado todas las teclas en la cola SendKeys.
Si partes de su cdigo consumen demasiado tiempo de procesamiento, use peridicamente DoEvents
para ceder el control al sistema operativo, de manera que eventos como la entrada por el teclado o los
clics del mouse (ratn) se puedan procesar sin grandes retrasos. Utilice esta funcin sobre todo, cuando
tenga bucles demasiado largos que puedan interrumpir la entrada de datos por teclado o ratn.
Precaucin Asegrese de que el procedimiento que ha cedido el control con DoEvents no se ejecute
de nuevo desde una parte diferente del cdigo antes de que regrese la primera llamada a DoEvents.
Esto podra causar resultados impredecibles. Adems, no use DoEvents si existe la posibilidad de que
otras aplicaciones interacten con el procedimiento, de formas imprevistas, durante el tiempo en ste ha
cedido el control.

EJEMPLO
Para explicar la funcin DoEvents se ha preparado un pequeo ejercicio con un formulario principal
(Form1) y dos formularios auxiliares, estos ltimos solamente a efectos de contar, mediante DoEvents
el nmero de formularios abiertos.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 220

Se declara la variable PARAR como booleana en las declaraciones del Form1


El botn COMENZAR introduce un bucle que no parara nunca. Tambin pone Label1 de color Verde.
Private Sub Command1_Click()
Label1.BackColor = RGB(0, 255, 0)
Do While PARAR = False
N=N+1
If N = 1000 Then
'Cada vez que N=1000 ejecuta la funcin DoEvents.
DoEvents
N=0
End If
Loop
End Sub
En el formulario Form1, al que previamente le hemos puesto la propiedad KeyPreview a True, se le ha
puesto este cdigo en su procedimiento KeyPress:
Private Sub Form_KeyPress(KeyAscii As Integer)
PARAR = True
Label1.BackColor = RGB(255, 255, 0)
End Sub
Si no hubisemos puesto DoEvents en una parte del bucle del contador, nunca se podra acceder al
Procedimiento KeyPress del formulario, pues el programa lo nico que hara ser dar vueltas en el bucle
indefinidamente.
El botn ROJO tiene este cdigo:
Private Sub Command2_Click()
PARAR = True
Label1.Caption = DoEvents
Label1.BackColor = RGB(255, 0, 0)
End Sub

'Aqu comprobamos los Formularios que tenemos


'abiertos en este momento.

Lo mismo ocurrira con el botn ROJO. Al estar el programa haciendo el bucle continuamente, nunca
podramos entrar el Procedimiento Click de este botn.
Los botones FORM2, cierra Form2, FORM3, cierra Form3, lo nico que hacen es mostrar u ocultar
Form2 y Form3 a efectos de poder comprobar cuantos formularios tenemos abiertos.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 221

Private Sub Command4_Click()


Form2.Show
End Sub
Private Sub Command6_Click()
Form2.Hide
End Sub
Private Sub Command5_Click()
Form3.Show
End Sub
Private Sub Command7_Click()
Form3.Hide
End Sub
Por ltimo SALI nos saca del programa. Observe que si no hubisemos puesto DoEvents en el medio
del bucle, tampoco podramos salir del programa, puesto que el sistema operativo no podra comprobar
que hemos hecho Click en este botn.
Private Sub Command3_Click()
End
End Sub
Realice esta pequea prctica con la lnea DoEvents del botn COMENZAR activada y desactivada
(Con una comilla simple). Preprese para, en este ltimo caso, detener la aplicacin pulsando CtrPausa, pues de otra forma no la podr detener.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 222

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 223

Presentacin Modal de formularios. Ventana modal


(Este tema ha sido tomado parcialmente de las pginas de Mundo Visual - Visual Basic.)
Se dice que un Formulario o cualquier tipo de ventana se presenta de forma Modal cuando un elemento
de ese formulario o ventana toma el foco en el momento de mostrarse, y exige que se realice alguna
gestin sobre ella antes de permitir que otra parte de la aplicacin tome de nuevo el foco. La actuacin
que generalmente exige un formulario o ventana es ocultarse.
Para ver esto, cree una aplicacin con dos formularios. El primero (Form1) puede ser el formulario donde
se realizan todas las operaciones de la aplicacin. El segundo (Form2) puede ser el tpico formulario
donde se presenta la informacin del fabricante de la aplicacin, al que se accede normalmente desde el
men, con la palabra Acerca de...
Cree un men en el primer formulario con esa palabra y ponga este formulario como formulario inicial de
la aplicacin. En el procedimiento click de este men ponga el siguiente cdigo :
Form2.Show 1
El 1 detrs de la expresin Show indica que el formulario Form2 debe mostrarse de forma Modal, lo que
significa que no se podr volver a operar con ningn elemento de Form1 hasta que se oculte o
descargue el formulario Form2. Ponga en este Form2 el tpico botn de Aceptar, cuyo cdigo puede ser
simplemente :
Me.Hide
Ejecute la aplicacin y comprobar como se comporta un formulario mostrado como Modal.
Lo dicho para un formulario puede aplicarse para otro tipo de ventanas. El MessageBox y la ventana del
CommonDialog son dos ejemplos de ventanas modales. Veamos la primera :
La caja de Mensajes. MessageBox o MsgBox
Las cajas de mensajes o MessageBox, tienen una funcin clara, que es la de mostrar una determinada
informacin, aviso, o pregunta para que el usuario tenga conocimiento de ella y acte.
Hay 2 formas diferentes de mostrar informacin:
1 - El aviso es s, que tiene por objetivo mostrar una informacin de inters.
2 - El aviso con espera de respuesta, que muestra una informacin esperando que el usuario seleccione
una de las respuestas posibles para que el programa la trate.
Una caja de mensaje, puede ser por ejemplo, la instruccin MsgBox "Hola". Por defecto, la caja de
mensaje ser similar a esta:

Debe darse cuenta de algunas cosas:


En primer lugar el mensaje, "Hola" que se escribe a continuacin de la palabra MsgBox, tambin debe
darse cuenta del botn Aceptar que tiene el Focus de la ventana activa y que slo hay ese botn, y por
ltimo el ttulo de la ventana.
Podemos modificar estos parmetros para alcanzar nuestros objetivos, por eso, vamos a escribir ahora
este cdigo: MsgBox "Hola", ,"Ejemplo" .
El resultado es:
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 224

Como podemos apreciar en el cdigo, la caja de mensaje posee un ttulo Ejemplo y el mensaje, pero es
posible que deseemos escribir un mensaje en varias lneas con salto de prrafo. Nada tan fcil como
este cdigo por ejemplo: MsgBox "Hola" & vbCrLf & "Esto es un ejemplo.", , "Ejemplo".
El resultado es:

Habr observado en la expresin anterior que se ha utilizado vbCrLf (Visual Basic Carriage Return Line
Feed, VB retorno de carro y avance de lnea) Vea mas adelante la aclaracin de esta expresin. Con
ella logramos introducir un salto de lnea.
Supongo que se habr percatado de que entre el mensaje y el ttulo de la ventana, hemos escrito dos
comas, esto es porque entre las comas, debe ir un nmero que representar el icono a mostrar. Existen
cuatro iconos diferentes adems de la posibilidad de no mostrar ninguno. Los iconos son:

Estos iconos corresponden a los siguientes mensajes:


Mensaje crtico.
Mensaje de pregunta.
Mensaje exclamativo.
Mensaje de informacin.
(Slo en W32. En Windows 3.xx dispone de otros diferentes, aunque con el mismo significado)
Para mostrar el icono en cuestin o para que Visual Basic lo entienda, es necesario escribir lo siguiente:
Mensaje crtico.
Mensaje de pregunta.
Mensaje exclamativo.
Mensaje de informacin.

VbCritical
VbQuestion
VbExcalamqtion
VbInformation

16
32
48
64

Note que es lo mismo insertar VbCritical o 16.


Vamos a ver un ejemplo aadiendo un icono al ltimo ejemplo:
MsgBox "Hola" & vbCrLf & "Esto es un ejemplo.", VbQuestion , "Ejemplo"
El resultado es:

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 225

Ahora bien, es posible que queramos mostrar algn otro botn que o bien no sea el de Aceptar o que
adems del botn de Aceptar haya ms botones. Para este propsito, tenemos los siguientes
parmetros:
Aceptar
Aceptar y Cancelar
Anular, Reintentar, Ignorar
S, No y Cancelar
S y No
Reintentar y Cancelar
Aplicacin modal

vbOKOnly
vbOKCancel
vbAbortRetryIgnore
vbYesNoCancel
vbYesNo
vbRetryCancel
vbApplicationModal

0
1
2
4
5
0 (Es la caja de mensaje sin
icono)

La forma de hacer esto es sumar al parmetro del icono que queremos mostrar el valor de los botones
que deseamos que aparezcan.
As por ejemplo:
MsgBox "Hola" & vbCrLf & "Esto es un ejemplo.", VbQuestion + vbYesNo , "Ejemplo"
El resultado es:

An as, es posible que deseemos que el Focus lo adquiera otro un botn determinado. Por ejemplo, en
este caso el Focus lo tiene el botn S, pero es posible que deseemos que lo tenga el botn No por
ejemplo. Esto se consigue con los siguientes parmetros:
Primer botn predeterminado vbDefaultButton1

0
Segundo botn predeterminado vbDefaultButton2

256
Tercer botn predeterminado vbDefaultButton3

512
Por ejemplo: MsgBox "Hola" & vbCrLf & "Esto es un ejemplo.", VbQuestion + vbYesNo +
vbDefaultButton2, "Ejemplo"

El resultado es:

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 226

Si no se seala el botn predeterminado, Visual Basic seleccionar el primer botn. En caso de


seleccionar como predeterminado un botn que no existe, (por ejemplo el tercero), Visual Basic
seleccionar el primero.
Ahora bien, si decidimos mostrar un mensaje esperando una respuesta, o queremos saber que botn ha
pulsado el usuario, esto lo podemos conseguir mediante el siguiente cdigo de respuestas:
Aceptar
vbOK

1
Cancelar
vbCancel

2
Anular
vbAbort

3
Reintentar
vbRetry

4
Ignorar
vbIgnore

5
S
vbYes

6
No
vbNo

7
As por ejemplo, el siguiente cdigo:
Dim Resp As Integer
Resp = MsgBox("Hola" & vbCrLf & "Esto es un ejemplo.", VbQuestion + vbYesNo + vbDefaultButton2,
"Ejemplo")
If Resp = 6 Then
MsgBox "Ha pulsado SI"
Else
MsgBox "Ha pulsado NO"
End If
Tiene el resultado siguiente:

Si pulsamos el botn S obtendremos una accin, y si pulsamos el otro botn otra accin.
Ahora bien, para elegir o seleccionar un evento o accin, el usuario debe saber combinar los cdigos,
sabiendo que un MsgBox posee la siguiente sintaxis principal:
MsgBox Mensaje, Botones, Ttulo de la ventana
InputBox
El InputBox o caja de entrada es otra de las partes ms utilizadas para la interaccin del usuario con la
aplicacin. Es importante que el usuario interacte con la aplicacin para ser el protagonista de esta.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 227

El InputBox nos permite sacar una caja donde el usuario pasar un parmetro, valor o dato para que el
programa lo trate y lo ejecute.
El mensaje que quiere que aparezca se realiza de forma casi idntica al MessageBox. Puede escribirse
varias lneas de texto seguidas por la constante de Visual Basic vbCrLf o salto de lnea o prrafo.
La sentencia es:

Val = InputBox (Mensaje, Titulo, ValorPredeterminado)

Val almacenar el texto escrito por el usuario, que puede ser una cantidad, cadena string, etc.
Por ejemplo:
Dim Val As String
Val = InputBox("Deme su nombre", "Ejemplo")
MsgBox "Su nombre es: " & Val
Tiene como resultado:

(El usuario teclea el nombre - Mundo Visual - y hace click en Aceptar. A continuacin se muestra el
MsgBox - 2 lnea del cdigo anterior )

Ahora bien, podemos determinar un texto predeterminado a la caja de entrada, como por ejemplo:
Dim Val As String
Val = InputBox("Deme su nombre", "Ejemplo", "Mundo Visual")
MsgBox "Su nombre es: " & Val
Obtendremos como resultado:

Es importante determinar que si el usuario elige el botn Cancelar, el programa devolver una cadena de
caracteres igual a 0, es decir, Val ="".

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 228

La caja de entrada puede ser sin embargo ms personalizada mediante dos parmetros como son la
posicin de la ventana de entrada de datos en la pantalla. Estos parmetros se ponen a continuacin del
ValorPredeterminado.
Por ejemplo:
Dim Val As String
Val = InputBox("Deme su nombre", "Ejemplo", "Mundo Visual", 1200, 1400)
Situar la ventana en el eje de las X a 1200 Twips (posicin horizontal) y la Y a 1400 twips (posicin
vertical).

Reitero mi agradecimiento a Mundo Visual


http://www.ciudadfutura.com/visualbasic/

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 229

El Objeto App
El objeto App representa a la aplicacin. Es el objeto Visual Basic que contiene diversas informaciones
acerca de la Aplicacin.
Alguna de estas informaciones se le pueden introducir al proyecto en tiempo de diseo, en el cuadro de
Opciones. Para ello basta con ir, en la Barra de Men de Visual Basic a Herramientas | Proyecto |
Opciones y hacer click en Proyecto. Otra parte donde se introducen es en el cuadro de dilogo
Opciones de EXE. Para ver este cuadro proceda de la misma forma que si fuese a crear un archivo .EXE
de la Aplicacin, Haga click en Archivo | Crear Archivo EXE de la Barra de Men, y una vez que le
aparezca el cuadro de dilogo para introducir el nombre, haga click en OPCIONES.
Estas informaciones son las Propiedades del objeto App. Este objeto no tiene Mtodos ni Eventos.
Comments (Propiedad)
Devuelve o establece una cadena que contiene comentarios sobre la aplicacin en ejecucin. Es de slo
lectura en tiempo de ejecucin.
Sintaxis

MiVariable = App.Comments

Se establece esta propiedad en tiempo de diseo usando el cuadro Opciones de EXE.


CompanyName (Propiedad)
Devuelve o establece un valor de tipo String que contiene el nombre de la empresa o del creador de la
aplicacin en ejecucin. Es de slo lectura en tiempo de ejecucin.
Sintaxis

Mivariable = App.CompanyName

Se establece esta propiedad en tiempo de diseo usando el cuadro de Opciones de EXE. Visual Basic
toma por defecto el nombre de la compaa con que se carg VB.
EXEName

(Propiedad)

Devuelve el nombre raz (sin la extensin) del archivo ejecutable que se est ejecutando actualmente. Si
se utiliza en el entorno de desarrollo, devuelve el nombre del proyecto.
Sintaxis

MiVariable = App.EXEName

Esta propiedad se establece bien en el cuadro de Opciones, bien al guardar el archivo .EXE
FileDescription (Propiedad)
Devuelve o establece un valor de tipo String que contiene informacin de los archivo de la aplicacin en
ejecucin. Es de slo lectura en tiempo de ejecucin.
Sintaxis

Mivariable = App.FileDescription

Se establece esta propiedad en tiempo de diseo usando el cuadro Opciones de EXE.

HelpFile (Propiedad)
Ya comentada mas atrs. Especifica el nombre (con su Path) del fichero de ayuda. Se introduce en
tiempo de diseo en el cuadro de Opciones. Puede cambiarse en tiempo de ejecucin.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 230

hInstance (Propiedad)
Devuelve el controlador de la instancia de la aplicacin. Es un Long
Sintaxis

VariableLong = App.hInstance

Cuando se trabaja en un proyecto dentro del entorno de desarrollo de Visual Basic, la propiedad
hInstance devuelve el controlador de la instancia de Visual Basic.
El valor de esta propiedad lo pone directamente Windows.
LegalCopyright (Propiedad)
Devuelve o establece un valor de tipo String que contiene informacin de derechos de autor sobre la
aplicacin en ejecucin. Es de slo lectura en tiempo de ejecucin.
Sintaxis

Mivariable = App.LegalCopyright

Esta propiedad se establece en el cuadro de dilogo Opciones de EXE.


LegalTrademarks (Propiedad)
Devuelve o establece un valor de tipo String que contiene informacin de marca registrada sobre la
aplicacin en ejecucin. Es de slo lectura en tiempo de ejecucin.
Sintaxis

MiVariable = App.LegalTrademarks

Establezca esta propiedad en tiempo de diseo usando el cuadro de dilogo Opciones de EXE.

Major Minor (Propiedades)


Devuelven o establecen el nmero mayor (menor) de la versin del proyecto. Es de slo lectura en
tiempo de ejecucin.
Sintaxis

MiVariable = App.Major MiVariable = App.Minor

El valor de estas propiedades estn dentro del rango 0 a 9999.


Proporcionan informacin sobre la versin de la aplicacin en ejecucin. Se establecen en tiempo de
diseo usando el cuadro de dilogo Opciones de EXE.
Revision (Propiedad)
Devuelve o establece el nmero de revisin de la versin del proyecto. Es de slo lectura en tiempo de
ejecucin.
Sintaxis

MiVariable = App.Revision

Mediante las propiedades Major, Minor y Revision obtenemos la versin del programa. Es muy util
conocer la version del programa para saber si lo hay que actualizar. Por ejemplo, la instruccin:
MiVariable = App.Major & . & App.Minor & . & App.Revision
Puede devolver un dato parecido a este:
MiVariable = 2.1.4
As conocemos que la versin del programa es la 2.1.4. Estos datos de Major, Minor y Versin hay que
introducirlos en el programa durante el tiempo de diseo. Se usa para ello la caja de Propiedades del
Proyecto
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 231

Path (Propiedad)
Especifica la ruta de acceso del archivo .VBP de proyecto cuando se ejecuta la aplicacin desde el
entorno de desarrollo o la ruta de acceso del archivo .EXE cuando se ejecuta la aplicacin como un
archivo ejecutable.
Esta propiedad es sumamente til. Cuando se realiza una aplicacin, no es prudente obligar al usuario a
meterla dentro de un determinado directorio impuesto por el programador. Si no es as, no sabremos en
qu directorio est el ejecutable, y es muy conveniente saberlo, sobre todo cuando se utilizan ficheros
auxiliares de inicializacin, que deberan estar en el mismo directorio de la aplicacin. Si queremos abrir
el fichero MiAplicacion.Cfg que estar obligatoriamente en el mismo directorio de la aplicacin (aunque
no conocemos su nombre), solamente tenemos que poner la lnea de cdigo :
Open App.Path &
\MiAplicacion.ICfg For Input as # 1, sin importarnos cual es el nombre real de ese directorio.
PrevInstance (Propiedad)
Devuelve un valor booleano que indica si hay ya en ejecucin una instancia anterior de una aplicacin.
Es muy utilo saber que hay una instancia del programa en ejecucin para impedir que se vuelva a abrir
otra.
Sintaxis

VariableBooleana = App.PrevInstance

Puede utilizar esta propiedad en un procedimiento de evento Load para determinar si el usuario ya est
ejecutando una instancia de una aplicacin. Dependiendo de la aplicacin, puede ser conveniente que
slo haya una instancia de la misma en ejecucin al mismo tiempo en el entorno operativo Microsoft
Windows.
ProductName (Propiedad)
Devuelve o establece un valor de tipo String que contiene el nombre de producto de la aplicacin en
ejecucin. Es de slo lectura en tiempo de ejecucin.
Sintaxis

MiVariable = App.ProductName

Establezca esta propiedad en tiempo de diseo usando el cuadro de dilogo Opciones de EXE.

El valor de la propiedad Revision est dentro del rango 0 a 9999.Esta propiedad proporciona informacin
sobre la versin de la aplicacin en ejecucin. Esta propiedad se establece en tiempo de diseo usando
el cuadro de dilogo Opciones de EXE.
StartMode (Propiedad)
Devuelve o establece un valor que determina si una aplicacin se inicia como proyecto independiente o
como servidor de automatizacin OLE. De slo lectura en tiempo de ejecucin.
Sintaxis

VariableLong =App.StartMode

Donde Valor es un nmero o una constante que determina la forma de inicio :


Constante

Valor

Descripcin

vbSModeStandalone

vbSModeAutomation

(Predeterminado) La aplicacin se inicia como proyecto


independiente.
La aplicacin se inicia como servidor de automatizacin OLE.

TaskVisible (Propiedad)
Devuelve o establece un valor que determina si la aplicacin aparece en la lista de tareas de Windows.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 232

Sintaxis

VariableBooleana = App.TaskVisible

Donde booleano puede tomar los valores True o False :


True
False

(Predeterminado) La aplicacin aparece en la lista de tareas de Windows.


La aplicacin no aparece en la lista de tareas de Windows.

La propiedad TaskVisible slo puede establecerse a False en aplicaciones que no presenten interfaz,
como servidores OLE que no contengan o presenten objetos Form. Mientras la aplicacin disponga de
interfaz grfica, la propiedad TaskVisible se establece automticamente a True.

Title (Propiedad)
Devuelve o establece el ttulo de la aplicacin que aparecen en la Lista de tareas de Microsoft Windows.
Si se modifica en tiempo de ejecucin, los cambios no se guardarn con la aplicacin.
Sintaxis

App.Title = Esto es lo que va a figurar en la barra de Titulo

Valor ser una expresin de cadena que especifica el ttulo de la aplicacin. La longitud mxima de valor
es 40 caracteres.
Esta propiedad est disponible en tiempo de diseo en el cuadro de dilogo del comando Crear EXE del
men Archivo.
Todos estos datos figuran en el archivo de proyecto (.VBP). Puede verse editndolo con el Block de
Notas de Windows, e incluso pueden modificarse estas propiedades directamente sobre ese archivo.

Visual Basic - Gua del Estudiante Cap. 9


INTERFACE DE DOCUMENTOS MULTIPLES. (Multiple Document Interface MDI )
EL CONTROL RICH TEXT BOX

INTERFACE DE DOCUMENTOS MULTIPLES.


LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 233

Lo que se va a explicar en este captulo le ser bastante familiar aunque nunca haya reparado en ello.
Posiblemente haya utilizado un procesador de texto en el que est escribiendo una carta, y antes de
terminar de escribir esa carta, comienza a escribir otro documento, y posiblemente otro, y tenga los tres
documentos en la pantalla al mismo tiempo, bien en ventanas escalonadas, (cascada), bien en ventanas
en forma de mosaico, o simplemente tapando unas a otras completamente. Los tres documentos estn
en su procesador de textos, y puede actuar sobre uno u otro simplemente eligiendo el deseado
mediante el mecanismo que le proporciona su procesador de textos. Este sistema no es ni mas ni
menos que una interface de documentos mltiples. En programacin, a este tipo de aplicaciones las
denominamos MDI
Para crear una aplicacin MDI debe hacerse mediante un Formulario Padre al que se le aaden tantos
Formularios Hijo como documentos tengamos. Al formulario padre le denominamos Formulario MDI,
y a los formularios hijo en Visual Basic se les denomina formularios MDIChild. En esta Gua del
Estudiante se usarn indistintamente una u otra denominacin.
La nica diferencia entre un formulario normal y un formulario Hijo es que ste tiene la propiedad
MDIChild a True.
Para realizar una aplicacin MDI, lo primero que hay que hacer es introducir en ella un formulario MDI.
Para introducirlo, basta con hacer click en Insertar | Formulario MDI de la barra de men. Solamente se
puede tener un formulario MDI en una aplicacin. Puede observar que una vez que ha introducido uno, la
palabra Formulario MDI del submen Insertar queda deshabilitada.
Una vez que tiene un formulario MDI puede introducir tantos formularios hijo como desee. Para que un
formulario sea formulario hijo basta con poner a True su propiedad MDIChild.
En una aplicacin MDI pueden coexistir formularios hijo y formularios normales.
Propiedades de los formularios MDI
Aparte de las propiedades de un formulario normal, un formulario MDI tiene las siguiente propiedades :
AutoShowChildren. Muestra los formularios hijo nada mas cargarlos.
Esta propiedad puede verse si se carga un formulario hijo mediante la sentencia :
Load NombreFormularioHijo
Si la propiedad AutoShowChildren est a True, el formulario cargado se ver inmediatamente. Si est a
False, ser necesario ejecutar la sentencia NombreFormularioHijo.Show para presentarlo.

ActiveForm Mediante esta propiedad podemos conocer el formulario activo dentro de una aplicacin
de documentos mltiples. (El formulario activo es aquel que tiene el foco)
MiVariable = ActiveForm.caption
MiVariable contendr el Caption (Barra de Titulo) del formulario activo.
ActiveForm.Backcolor = RGB (255,0,0)
pondr el fondo del formulario activo de color rojo.
ScrollBars
Hace que el Formulario MDI (padre) muestre barras de Scroll para presentar en toda su
extensin a un formulario hijo, cuando las dimensiones de ste superan las de aquel.
Aparte de estas propiedades que diferencian un Formulario MDI de un Formulario normal, los
Formularios MDI presentan otras particularidades.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 234

Insercin de Controles
Solamente podrn introducirse en un formulario MDI aquellos controles
que tengan la propiedad Align. (Picture, Data, DBGrid) y solo permiten que se presenten con alineacin
a uno de los lados del Formulario (Top, Bottom, Left o Right)
El control Picture puede trabajar como contenedor de otros controles. Por lo tanto, para poder introducir
cualquier control (TextBox, Label, CommandButton ...) ser necesario introducir un control Picture, y
sobre el, poner los controles que se necesiten.
Lnea de Men. Cuando existe la lnea de Men en un Formulario MDI y en el Formulario Hijo que
introduzcamos en l, la lnea de men del Formulario MDI se sustituye por la lnea de men del
Formulario Hijo introducido.
Barra de Ttulo. La Barra de Ttulo del Formulario MDI se conserva siempre. Pero si el Formulario Hijo
insertado dentro de l est maximizado (ocupa toda la extensin del Formulario MDI), a la barra de ttulo
se le aadir la barra de Ttulo del Formulario Hijo entre parntesis.
Para hacer que un Formulario sea un formulario hijo basta con ponerle su propiedad MDIChild a True.
Puede preparar los formularios hijo uno a uno e introducirlos dentro del formulario MDI segn las
necesidades de la aplicacin. Este sera el caso de una aplicacin con varias pantallas, todas ellas
colocadas sobre una pantalla fija (Formulario MDI) del que se aprovecha quizs alguna parte como parte
comn de toda la aplicacin (Men, Ttulo, Barra de herramientas montada sobre un Picture, etc.)
Puede tambin darse el caso de introducir un nmero indeterminado de ventanas iguales para realizar
varias veces la misma funcin, pero sobre ventanas diferentes. (Caso del procesador de texto que tiene
varias ventanas de texto, cada una con un documento. Lo que desconocemos a priori es el nmero de
documentos que vamos a editar)
Para el primer caso, ser necesario crear cada una de las ventanas, e introducirlas y quitarlas segn
pida la aplicacin.
En segundo caso, bastar con crear un formulario hijo con todas las partes necesarias para su correcto
funcionamiento, y luego, realizar tantas fotocopias de ese formulario como ventanas necesitemos. Lo
que introducimos en la aplicacin son precisamente esas fotocopias, pero no el original, que lo
seguimos manteniendo intacto para volver a copiarlo si fuese necesario.
A esas fotocopias de un formulario las llamamos Instancias. Al original le llamaremos Clase.
En realidad una Clase es la definicin de un objeto Visual Basic. Un objeto Visual Basic puede ser un
Formulario, un control, un objeto de acceso a datos.
La Instancia es la rplica de una clase. Puede ser la rplica de un Formulario, de un control o de otro
objeto. La Instancia lleva las mismas Propiedades que la clase. Se dice que hereda las propiedades.
(Excepto la propiedad Visible, que siempre, por defecto, aparece a False). Cuando se vara una
propiedad de una Instancia, no se altera el valor de esa propiedad en la Clase ni en ninguna de las
restantes Instancias.
Despus de toda esta teora, podemos saber como se crea una Clase de un formulario ? O dicho de
manera mas coloquial, Cmo se crea un Formulario para poder hacer varias fotocopias de l ?
La respuesta es obligatoriamente mas sencilla que la teora. Con el formulario vaco que tengamos en el
proyecto (Insertemos un Formulario si fuese necesario) pongmosle todos los controles que deseemos.
Le podemos poner un Men y cambiar a nuestro antojo todas sus propiedades. Entre ellas, la propiedad
MDIChild. Si vamos a introducir las Instancias de ese Formulario en un Formulario MDI esa propiedad
debe estar a True, y por lo tanto sus Instancias saldrn igualmente con esa propiedad a True.
Pongmosle un nombre y ya est creada la clase. Supongamos que ese nombre es FormularioHijo
Para crear ahora Instancias de ese Formulario podemos hacerlo de dos formas :
Declarar una variable tipo Objeto. No se asuste. Para declarar que una variable es un Formulario basta
con declararla de la siguiente forma :
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 235

Dim MiVentana As Form


Esta variable debe declararla en sitio adecuado para su aplicacin, y el mbito de esa variable objeto
ser el mismo que para cualquier tipo de variable. (Vea Ambito de las Variables) La sentencia a utilizar
para la declaracin ser Dim, Private, Public o Global tal como se explic para las variables.
Una vez declarada como variable puede hacerla igual a un objeto existente que servir de modelo (Una
Clase) que estar definida por un nombre: (P.e. FormularioHijo)
Set MiVentana = New FormularioHjo
Podemos hacer las dos operaciones a un tiempo : declarar y crear la copia :
Dim MiVentana As New FormularioHijo
Una vez creado la instancia del formulario debemos cargarlo en el Formulario Padre. Para cargarlo
debemos emplear la sentencia Load MiVentana, con lo que quedar cargado en la memoria, pero,
dependiendo de como est la propiedad AutoShowChildren del Formulario Padre se mostrar o no se
mostrar. Para que se muestre, independientemente de como est esa propiedad, basta con ejecutar
MiVentana.Show. En realidad mediante el mtodo Show un formulario no solamente se muestra, sino
que tambin se carga en la memoria si no estuviese previamente cargado. Por lo tanto podamos
habernos ahorrado la instruccin anterior para cargarlo Load MiVentana
Es muy prctico poner un Caption distinto a cada formulario que se introduzca, caso de introducirse
varios formularios hijo iguales. El Caption es una propiedad y por lo tanto todas las instancias heredan el
Caption de la Clase. Sera prudente distinguir un formulario de otro mediante su Caption, es decir
mediante su barra de ttulo.
Para ello podemos crear un contador en el mismo procedimiento en el que creamos una nueva instancia,
y poner el Caption de cada nuevo Formulario siguiendo un orden numeral.
Documento 1, Documento 2, Documento 3, etc.
Ese procedimiento quedar de la siguiente forma :
Static contador As Integer
Dim MiVentana As New FormularioHijo
MiVentana.Caption = Documento & Str (contador)
MiVentana.Show

Referencias a los Formularios. ActiveForm y Me


Si queremos nombrar un Formulario Hijo dentro de una aplicacin MDI el primer problema con el que
nos encontramos es que todos los formularios hijo (Instancias de la misma Clase) tienen el mismo
nombre. Por lo tanto no podemos nombrarlas con ese nombre, ya que la aplicacin no sabra a cual de
ellas nos referimos.
Si el cdigo donde vamos a nombrar ese formulario est fuera de l (P.e. en el Formulario Padre)
deberemos referirnos al formulario hijo mediante ActiveForm. ActiveForm nos va a indicar cual es el
formulario que est actualmente activo. Un formulario est activo cuando estamos trabajando sobre l.
En ese momento tiene el foco. Permanece activo desde que hacemos click con el ratn sobre cualquiera
de sus partes, hasta que activamos otro formulario. Es sencillo reconocer cual es el formulario activo
pues tiene su barra de ttulo con el color vivo.
Cada vez que hacemos una operacin sobre una parte de un formulario ste se pondr activo. Por
ejemplo, si el formulario es un documento de texto, y contiene el texto en un RichTextBox de nombre
RTB1, si queremos hacer una operacin con el texto desde un botn colocado en el formulario padre
(poner en negrita el texto seleccionado), haramos lo siguiente :
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 236

ActiveForm.RTB1.SelBold = True
ya que siempre estaremos seguro de que el Formulario Activo es aquel en el que acabamos de
seleccionar el texto.
Si el botn donde hemos puesto el botn no es el formulario padre, sino el hijo, tenemos un problema
similar. Su nombre ser (con los ejemplos anteriores) MiVentana, y pueden existir varios formularios con
ese nombre, tantos como documentos hayamos introducido. No podemos por tanto nombrarlo con su
nombre, pues hay (o puede haber) varios. Tampoco lo podemos nombrar con ActiveForm, ya que esta
propiedad corresponde al Formulario Padre. La solucin es nombrarle mediante Me. Me siempre se
refiere al formulario que contiene al procedimiento donde est esa palabra. Por lo tanto, si tenemos un
botn en el formulario hijo con la instruccin :
Me.RTB1.SelBold = True
Me se refiere concretamente a ese formulario.
Colocacin de los Formularios Hijo - Mtodo ARRANGE
Mediante el mtodo Arrange podemos distribuir los formularios hijo dentro del formulario padre. Pueden
colocarse en cascada, mosaico horizontal, mosaico vertical o como iconos.
Sintaxis NFMDI.Arrange distribucin
donde
NFMDI = Nombre del Formulario MDI
distribucin puede tomar los siguientes valores o constantes :
Constante

Valor

Descripcin

vbCascade

vbTileHorizontal

vbTileVertical

VbArrangeIcons

Dispone todos los formularios MDI secundarios no minimizados


en cascada.
Dispone todos los formularios MDI secundarios no minimizados
en mosaico horizontal.
Dispone todos los formularios MDI secundarios no minimizados
en mosaico vertical.
Dispone los iconos de los formularios MDI minimizados.

Las ventanas o los iconos se pueden distribuir incluso si el objeto MDIForm est minimizado. Los
resultados son visibles cuando el objeto MDIForm se maximiza.

Posicin de los Formularios en el Eje Z - Mtodo ZOrder


Cuando tenemos varios formularios hijo, unos ocultan a los otros. Mucho mas si los formularios estn
maximizados. Podemos colocar un formulario hijo en la parte frontal del montn de formularios (para que
se vea completamente) o llevarle a la posicin mas atrs mediante el Mtodo ZOrder.

Sintaxis

NFH.ZOrder posicin

Donde NFH = Nombre del Formulario Hijo


posicin puede se 0 1. Si es 0 (o si se omite) el formulario se coloca en primer plano. Si es 1 el
formulario se coloca en el fondo del eje Z.
ZOrder es un mtodo que no solamente se puede emplear con formulario hijo, sino con cualquier
instancia. Puede emplearlo tambin con cualquier control. Pero lea detenidamente la Ayuda de este
mtodo, ya que no todos los controles la admiten.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 237

Mostrar los Formularios existentes mediante el Men -- Propiedad WindowList


Al explicar el Editor de mens casi se pas por alto una propiedad del men : WindowList. Cuando se
activa esta propiedad (Puede activarse para una sola palabra del men. Si se pretende activar para mas
de una dar un error), esa palabra que tiene activada la propiedad WindowList mostrar al hacer click
sobre ella, en un men desplegable, el Caption (Barra de Ttulo) de todos los formularios hijo cargados
en ese instante en la aplicacin. Pueden estar incluso minimizados.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 238

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 239

EL CONTROL RICH TEXT BOX


El control RichTextBox es una caja de texto con mas prestaciones que el TextBox. No est
normalmente en la caja de herramientas, por lo que habr que ir a Proyecto | Componentes y elegir
Microsoft RichTextBox Control. El icono que presenta en la caja de herramientas es el siguiente :

Frente a la rigidez del TextBox, este control nos permite escribir un texto utilizando distintos tipos de
fuentes en el mismo texto, e introducir mas de 65.536 caracteres, lmite mximo del TextBox. Aparte de
estas, tiene otras caractersticas respecto a la forma de guardar y leer el texto en un fichero, que le
convierten en una herramienta muy til para el diseo de aplicaciones en las que haya que introducir
documentos de texto.
El RichTextBox puede utilizar indistintamente formato de texto Ascii (que le llamaremos Texto Plano) o
formato RTF (RichTextFormat, que llamaremos Texto enriquecido) El formato de Texto enriquecido es
un formato de intercambio entre procesadores de texto. Vea al final del captulo una explicacin ms
detallada de este formato de texto. De momento basta con decir que permite poner tipos distintos de
letras, de tamaos, de colores, introducir grficos, y toda una serie de ventajas que le van a permitir
realizar procesadores de texto casi tan perfectos como los editores comerciales mas conocidos. Esto
nos permite por ejemplo, guardar estrictamente las letras que componen el texto (Propiedad Text de
RichTextBox) o guardar el texto, con sus letras y todos los adornos que queramos ponerles (Tipos
distintos de fuente, negrita, cursiva, ). Esto lo logramos con la propiedad TextRTF del RichTextBox.
Cuando hablamos de guardar, nos estamos refiriendo lgicamente a guardarlo en un fichero en el disco,
y tambin a guardarlo en el portapapeles. Si tenemos un RichTextBox de nombre RTB (as le
llamaremos en todos los ejemplos) con un texto tal como
Te creas muy listo Flanahan, pero tus vacas no pasarn por mis tierras
La propiedad Text contendr los siguiente
RTB.Text = Te creas muy listo Flanahan, pero tus vacas no pasarn por mis tierras
La propiedad TextRTF contiene toda la informacin, pero eso s, en formato RTF
RTB.TextRTF={\rtf1\ansi\deff0\deftab720{\fonttbl{\f0\fswissMS
Sans
Serif;}{\f1\froman\fcharset2
Symbol;}{\f2\fswiss\fprq2Arial;}}{\colortbl\red0\green0\blue0;}\deflang1034\pard\li708\plain\f2\fs20
Te
cre\'edas muy listo \plain\f2\fs20\b\i Flanahan\plain\f2\fs20 , pero tus \plain\f2\fs24 vacas\plain\f2\fs20 no
pasar\'e1n por \plain\f2\fs20\ul mis tierras\plain\f2\fs20
\par \pard\plain\f0\fs17
\par }
(Puede que el texto anterior tenga alguna diferencia sobre el real, debido a que hubo que introducirle
algn retorno de carro para poder presentarlo)
Veamos las propiedades de este control

Propiedades del RichTextBox


El RichTextBox tiene todas las propiedades del TextBox, y adems otras que son las que le dan las
caractersticas excepcionales a este control. Las tres siguientes propiedades son idnticas para ambos
controles :
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 240

SelLenght

Devuelve o establece el nmero de caracteres seleccionados. Los caracteres


seleccionados son aquellos que se ponen en vdeo inverso cuando arrastramos con el
ratn.

SelStart

Devuelve o establece el nmero del carcter de comienzo del texto


seleccionado.

SelText Devuelve o establece la cadena de caracteres seleccionados. Si no hay ningn


carcter seleccionado devuelve la cadena (cadena vaca)

En el ejemplo, el texto seleccionado es ejemplo nos permitir, texto que hemos seleccionado con el
ratn. Las propiedades anteriores tomarn estos valores para ese texto seleccionado :
SelLenght = 21

(Recuerde que el espacio tambin es un carcter)

SelStart = 5

(La e de ejemplo es la sexta letra, pero empieza a contar por la 0)

SelText = ejemplo nos permitir


Recuerde que estas propiedades son tanto de lectura como de escritura. Es decir, puede seleccionar un
texto con el ratn y analizar ese texto seleccionado, o seleccionar el texto dndole valores a estas
propiedades.
Las diferencias entre uno y otro control comienzan ahora. En un RichTextBox, con un texto
seleccionado, podemos cambiar el tipo de letra, su tamao, su color, etc.
Tipos y tamao de las fuentes.
El RichTextBox tiene la propiedad Font, propiedad que podemos cambiar e tiempo de diseo o en
tiempo de ejecucin, y que se refiere a la globalidad del RTB. Debemos sealar que en el RTB, la
propiedad Font es en s un objeto ms. Objeto que tiene sus propiedades (Name, Size, Bold, Italic, etc.)
Esto ocurre con los controles modernos, dada la tendencia de VB de ser cada da ms un lenguaje
orientado a objetos. No ocurre lo mismo con otros controles ya conocidos (CommonDialog, por ejemplo)
que deben mantenerse con la nomenclatura anterior por razones de compatibilidad con versiones
anteriores de VB. Veamos esto en el siguiente ejemplo, en el que se modifica la propiedad Font de RTB
con el CommonDialog CD1
RTB.Font.Name = CD1.FontName
RTB.Font.Size = CD1.FontSize
RTB.Font.Bold = False
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 241

RTB.Font.Italic = False
(Observe que en el RTB ponemos Font.Name y en el CD1 ponemos FontName)
Con la propiedad Font podemos escribir en el RTB usando la misma letra para todo el texto. Sin
embargo ver que esta propiedad prcticamente no se va a usar, ya que el RTB tiene la gran ventaja
que puede usar varios tipos de letra y tamaos dentro de un mismo texto. Puede usar tambin varios
colores. Para poder cambiar de letra no usaremos Font.Name, sino SelFontName, (Fjese que esta
propiedad no lleva ningn punto intermedio) que cambia el tipo de letra en el texto que hayamos
seleccionado, y si no hemos seleccionado ningn texto, y el cursor de escritura se encuentra al final del
texto escrito, lo que har ser cambiar el tipo de letra a partir de ese punto.
Propiedades SelBold, SelItalic, SelStrikethru, SelUnderline
Estas propiedades son del tipo Booleano (True/False) y nos permitirn poner el texto seleccionado en
Negrita, Cursiva, Tachada y Subrayada respectivamente.
Por ejemplo,

RTB.SetBold = True pondr el negrita el texto seleccionado.


RTB.SelItalic = True pondr en cursiva el texto seleccionado.
RTB.SelStrikethru = True pondr en tachado el texto seleccionado.
RTB.SelUnderline = True pondr en subrayado el texto seleccionado.
( RTB = Nombre del control RichTextBox )
Si el texto seleccionado est en la parte final del texto, o si el cursor de escritura est al final del escrito y
no se ha seleccionado ningn texto, la propiedad elegida permanecer vigente para la escritura que se
realice a partir de ese punto.
SelFontName

Esta propiedad devuelve o establece el nombre de la fuente en el texto


seleccionado. P.e. RTB1.SelFontName = Arial

SelFontSize

Devuelve o establece el tamao de la fuente en el texto seleccionado.


P.e. RTB1.SelFontSize = 10

SelColor

Devuelve o establece el color del texto seleccionado. Para definir el


color puede usarse cualquiera de los mtodos explicados en un captulo anterior.
Los ejemplos siguientes cambiarn el texto seleccionado a color rojo
RTB.SelColor = RGB (255,0,0)
RTB.SelColor = 255
RTB.SelColor = &HFF

Al igual que las otras propiedades, si el texto seleccionado est al final del texto, o si el cursor de
escritura est al final del escrito, la propiedad elegida permanecer vigente para la escritura que se
realice a partir de ese punto.

Propiedades Text y TextRTF


Las vimos al principio. La propiedad Text contiene TODO el texto del RichTextBox en formato de texto
plano. La propiedad TextRTF contiene TODO el texto del RichTextBox en formato de texto enriquecido.
Estas propiedades son de lectura y escritura, de forma que pueden tener estas dos sintaxis:
Escritura:

RTB.Text = Siempre nos quedar Pars

Esta instruccin sustituye todo el contenido del RTB por el texto Siempre nos quedar Pars
Lectura:

MiVariable = RTB.Text

MiVariable contendr todo el contenido de RTB en formato de texto plano


LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 242

La propiedad TextRTF es similar, pero con texto en formato enriquecido. Si la usamos como lectura:
MiVariable = RTB.TextRTF
MiVariable contendr el texto, ms los caracteres que definen el tipo de letra, tamao, etc, como vimos
al principio.
Si la usamos como escritura:
RTB.TextRTF = TuVariable
Si TuVariable contiene un texto en formato RTF, el contenido de RTB ser justamente ese texto, con
todas sus florituras de tipo de letra, tamao, negrita, etc. Si TuVariable contuviese un texto en formato de
texto plano, lo escribir tal cual, con el tipo y tamao de letra que tenga en su propiedad Font.
Propiedades SelText y SelRTF
Es conveniente no confundirlas con las anteriores. Aquellas contenan TODO el texto del
RichTextBox. Estas, solo el texto que est seleccionado.
SelText
Devuelve o establece el texto seleccionado en formato de texto plano. No est disponible en tiempo de
diseo.
Al ser una propiedad de lectura y escritura, nos permite:
Escritura: aadir texto (que se colocar en la posicin en la que est el curso) o cambiar el texto
seleccionado por otro. La instruccin
RTB.SelText = Siempre nos quedar Pars
Introducir el texto anterior en la posicin donde estuviera el cursor, o si tenamos texto seleccionado,
cambiar el texto anterior por este.
Lectura: Teniendo un trozo de texto seleccionado,
MiVariable = RTB.SelText
MiVariable tomar el valor del texto que estuviese seleccionado en formato de texto plano.
SelRTF
Devuelve o establece el texto seleccionado en formato .RTF. Al igual que SelText es de lectura y
escritura. No est disponible en tiempo de diseo.
Sintaxis (Escritura)

RTB.SelRTF = MiVariable

Si el contenido de MiVariable est en formato RTF, sustituir el texto que tuvisemos seleccionado por el
contenido de MiVariable, y lo escribir con todos los detalles de tipo de letra, tamao, etc., que
contuviese el formato RTF. Si no hubisemos seleccionado previamente ningn texto, escribir ese
texto en el lugar donde estuviese colocado el cursor.
Si el contenido de MiVariable fuese un texto plano, escribir ese texto, usando las mismas propiedades
para la letra que tuviese el texto seleccionado previamente, o las del punto donde se encontrase el
cursor.
Sintaxis de Lectura)

MiVariable = RTB.SelRTF

MiVariable contendr el texto que estuviese seleccionado, en formato RTF.


Esta propiedad es equivalente a la propiedad SelText y funciona de forma idntica, pero en este caso el
texto reemplazado o devuelto mediante la propiedad SelRTF est en formato RTF. Esta propiedad
devuelve una cadena de longitud cero ("") si no hay texto seleccionado en el control.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 243

Alineacin y mrgenes del texto


El RichTextBox permite crear un margen desde el borde izquierdo hasta el comienzo de la escritura,
(Propiedad SelIndent), y otro margen desde el borde derecho hasta el final de la lnea (Propiedad
SelRightIndent), o limitar el ancho de la lnea (Propiedad RightMargin). Tambin se puede poner una
sangra a las lneas segunda y siguientes respecto a la primera lnea del prrafo (Propiedad
SelHangingIndent). Este tipo de sangra es la sangra francesa, sangra que no se suele usar (a lo
mejor se usa en Francia). En realidad lo que se usa mucho es separar la primera lnea del prrafo un
poco ms que el resto de las lneas. Esto puede conseguirse dando un valor negativo a la propiedad
SelHangingIndent. Lo ver mas adelante.
La medida de estos mrgenes y sangras se realiza en las unidades de medida del formulario que
contiene al RichTextBox. Veamos un ejemplo comentado de estas propiedades.
Margen izquierdo. Con la instruccin
RTB.SelIndent = Val(TBSangria)
Separa el prrafo correspondiente a la lnea donde est en ese momento al cursor. (Que a partir de
ahora la llamaremos Lnea en curso) El espacio que separa ese prrafo del borde izquierdo del
RichTextBox es un valor igual al que hayamos introducido en el TextBox TBSangra, medido en las
unidades de medida del formulario que contiene a RTB. Recuerde, slo hace la sangra con el prrafo
que contiene la lnea en curso.
Si queremos separar varios prrafos, debemos seleccionar esos prrafos antes de ejecutar la instruccin
anterior. Para poner una separacin desde el borde izquierdo de todas los prrafos del texto
deberemos primero, seleccionar todo el texto, y luego ejecutar la instruccin anterior. Esto podemos
lograrlo combinando estas tres instrucciones:
RTB.SelStart = 1
RTB.SelLength = Len(RTB.Text)
RTB.SelIndent = Val(TBSangria)
Margen derecho. Usaremos la propiedad SelRightIndent. Con la instruccin:
RTB.SelRightIndent = Val(TBMargenDcho)
Separamos el final del prrafo donde est la lnea en curso una distancia igual al valor de
TBMargenDcho. Esta propiedad es completamente equivalente a la anterior, esta referida al margen
derecho y aquella al margen izquierdo. Es aplicable todo lo que se dijo para SelIndent.
Longitud mxima de la lnea desde el borde izquierdo. Parece un poco largo la definicin de esta
propiedad. Se refiere a la propiedad RightMargin. Esta propiedad marca la distancia desde el borde
izquierdo del RichTextBox hasta el lmite mximo utilizable por el texto. Este valor es el que se toma
como fin de la zona utilizable por el texto, por lo tanto, ese punto ser la referencia que utilice la
propiedad SelRightIndent para determinar el punto a partir del cual crear el margen derecho. Tambin
ser la referencia derecha cuando centremos un texto o lo alineemos a la derecha.
RTB.RightMargin = Val(TBAncho)
La instruccin anterior fija como distancia mxima que puede ocupar una lnea de texto la cantidad
introducida en TBAncho. Por supuesto, expresada como siempre en las unidades de medida del
formulario. La lnea puede ser mas ancha que el ancho del RichTextBox. En este caso la lnea no cabe
en el RTB, pero puede visualizar la lnea completa usando baraas de scroll horizontales (Vea propiedad
ScrollBars ms adelante)
Sangra francesa. La sangra francesa consiste en separar la segunda lnea y siguientes cierta medida
a la derecha respecto a la primera lnea. Algo as
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 244

Esta es la primera lnea de este texto donde se explica lo que es una sangra francesa
en realidad desconozco si en Francia usan este tipo de sangra, pero a m
me gusta ms la sangra espaola, siempre que est bien fresquita.
Esto se logra mediante la propiedad SelHangingIndent y afecta nicamente al prrafo donde se
encuentra la lnea en curso.
Puede hacer lo que parece mas lgico, separar la primera lnea un poco respecto a las dems, dando un
valor negativo a la propiedad SelHangingIndent. Pero para que esto resulte, debe poner un valor al
menos igual a la propiedad SelIndent. En el ejemplo siguiente, hacemos una sangra solamente a la
primera lnea del prrafo donde est la lnea en curso:
RTB.SelIndent = Val(TBSangriaEsp)
RTB.SelHangingIndent = -Val(TBSangriaEsp)
(Observe el signo menos en la segunda lnea) El valor de la sangra de la primera lnea ser el
contenido en TBSangriaEsp

Centrado, Alineacin a la izquierda o a la derecha.


El centrado de una lnea o prrafo se logra mediante la propiedad SelAlignment Puede tomar los
valores 0 (alineado a la izquierda), 1 (a la derecha) 2 (centrado)
Siempre se refiere a la lnea en
curso o al prrafo que contiene la lnea en curso. Si quiere alinear varios prrafos, debe seleccionarlos
antes de ejecutar la instruccin de alineamiento.
RTB.SelAlignment = 0
RTB.SelAlignment = 1
RTB.SelAlignment = 2

alinea a la izquierda
alinea a la derecha
centra el texto

En la alineacin se tiene en cuenta la propiedad RightMargin, es decir, si alinea a la derecha, lo har


tomando como parte mas derecha del escrito el valor de la propiedad RightMargin, no el borde lateral
derecho del RTB. Lo mismo le ocurre con el centrado.
Vietas
El RichTextBox es, como decamos al principio, un control que nos permite realizar editores de textos
muy potentes. Incluso podemos poner vietas
Una vieta es un prrafo marcado con un punto en su comienzo, y que lleva una cierta sangra respecto
al borde izquierdo del RichTextBox. Para poner una vieta es necesario jugar con dos propiedades:
SelBullet, propiedad Booleana que si la hacemos True convertimos el prrafo donde est la lnea en
curso en una vieta. Si est en False, ese prrafo ser un prrafo normal.
BulletIndent, propiedad a la que le pondremos un valor numrico igual a la separacin que queremos
poner en el texto de la vieta.
Para que tenga efecto la propiedad BulletIndent, la propiedad SelBullet debe estar puesta a True. No
tendr efecto alguno si SelBullet = False. Por ejemplo, para poner una vieta podemos poner

RTB.SelBullet = True
RTB.BulletIndent = 500
Una vez puesta una vieta en el RichTextBox, insertar otro cada vez que pulsemos ENTER. Para
quitarlo, basta con ejecutar la sentencia
SelBullet = False
La propiedad BulletIndent es de lectura y escritura. La instruccin siguiente nos devuelve la separacin
de la vieta donde tengamos el cursor. La propiedad BulletIndent devuelve 0 si la seleccin abarca
mltiples prrafos con distintos ajustes de margen o si el prrafo no es una vieta.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 245

Tambin podemos leer el valor de SelBullet. Devolver


Null. La seleccin abarca ms de un prrafo y contiene una mezcla de estilos de vieta y no vieta.
True. Los prrafos de la seleccin tienen estilo de vieta.
False. La prrafos de la seleccin no tienen estilo de vieta.
Tabulacin del RichTextBox
Si queremos crear un editor de texto de la categora de cualquiera de los comerciales, debemos poder
tabular. Tabular significa crear unos hitos o marcas a una determinada distancia del borde izquierdo del
papel, de forma que cada vez que pulsemos la tecla Tabulador el cursor de escritura se coloca al inicio
del siguiente de esas marcas.
El primer problema es que si estamos escribiendo sobre el RichTextBox y pulsamos Tabulador, el foco
se nos escapa hacia el siguiente control, segn el orden de la propiedad TabIndex. Existe una solucin,
que es pulsar la combinacin de las teclas Ctrl + Tab. Sin embargo esa posibilidad no es recomendable,
dado que un usuario normal no est acostumbrado a realizar esa combinacin para forzar una
tabulacin.
La solucin est en poner la propiedad TabStop de todos los controles a False, cada vez que el
RichTextBox toma el foco. Es decir, en su procedimiento GotFocus. De esta forma, al dar el tabulador
ningn control se querr quedar con el foco, y por lo tanto el foco seguir en el RichTextBox. En estas
condiciones el resultado es que el cursor de escritura pasar a la siguiente tabulacin.
Vamos a ver como se puede poner la propiedad TabStop a False en todos los controles del formulario.
Para ello vamos a explicar un nuevo objeto Visual Basic, el objeto Controls. Este objeto es una
coleccin, y est formada por todos los controles del formulario. Como cualquier coleccin tendr una
propiedad, la propiedad Count que toma el valor igual al nmero de controles existentes en el formulario.
Como cualquier cosa de VB formada por varios elementos, cada uno de ellos se distingue por su ndice.
Y este ndice comienza por el 0 y termina por el n-1, siendo n = nmero de elementos de esa coleccin.
Para poner la propiedad TabStop a False en todos los controles de la coleccin Controls del formulario,
basta con poner este cdigo en el procedimiento GotFocus del RTB
Private Sub RTB_GotFocus()
Dim I As Integer
Con la siguiente lnea se evita el error producido en aquellos controles que no tienen la propiedad
TabStop
On Error Resume Next
For I = 0 To Me.Controls.Count - 1
Controls(I).TabStop = False
Next I
End Sub
Podemos hacerlo de otra forma. Declaremos una variable tipo Objeto Control
Private Sub RTB_GotFocus()
Dim Pepe As Control
On Error Resume Next 'De esta forma se evita el error producido en aquellos controles que no tienen
la propiedad TabStop
For Each Pepe In Controls
Pepe.TabStop = False
Next
End Sub
Nota. Si va a la informacin del RichTextBox podr ver un ejemplo de esto, con el siguiente cdigo:
For Each Control In Controls
Control.TabStop = False
Next Control
Milagros del Visual Basic: As no funciona
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 246

Ya funciona perfectamente el tabulador en el RichTextBox. Pero cuando salgamos del RichTextBox,


debemos volver a poner la propiedad TabStop de todos los controles a True. Para ello, en el
procedimiento LostFocus del RTB pondremos el cdigo anterior, poniendo True en vez de False en la
propiedad TabStop.
Programar las medidas de las tabulaciones.
Propiedad SelTabCount
Establece el nmero de tabulaciones en un RTB. P.e., si queremos crear 5 tabulaciones
RTB.SelTabCount = 5
Propiedad SelTabs
Establece el valor numrico (separacin desde el borde izquierdo) de las tabulaciones. Dado que pueden
existir varias tabulaciones, deberemos distinguirlas entre ellas mediante un ndice. El ndice para la
primera tabulacin es el 0
RTB.SelTabs(0) = 1000
RTB.SelTabs(1) = 2000
RTB.SelTabs(2) = 3000
RTB.SelTabs(3) = 4000
RTB.SelTabs(4) = 5000

Con estas lneas determinaramos la posicin de tabulacin de


los 5 tabuladores.

Antes de darle valor a la propiedad SelTabs deberemos haber creado los tabuladores mediante
SelTabCount. Si pretende darle valor a un tabulador mayor que el nmero de tabuladores real (por
ejemplo, si pone en el caso anterior RTB.SelTabs(5) = 5000) le dar un error.
Recuerde que los valores de los tabuladores debe darlos en las unidades de medida del formulario.

OTRAS PROPIEDADES
Propiedad SelCharOffset
Nos permite crear subndices y superndices. La sintaxis es:
RTB.SelCharOffset = Nmero
Donde Nmero indica la separacin del superndice o subndice en Twips. Si Nmero es positivo,
obtendremos un superndice, si es negativo, un subndice.
Esta forma de escribir subndices y superndices se debe aplicar cada vez que queramos escribir uno de
ellos, e inmediatamente, poner esa propiedad a 0, ya que si no lo hacemos as, escribira como
subndice o superndice el resto del texto. P.e. para poner un superndice:
TamIni = RTB.SelFontSize
RTB.SelFontSize = TamIni - 4
RTB.SelCharOffset = 40
RTB.SetFocus
Para restaurar los valores anteriores
RTB.SelFontSize = TamIni
RTB.SelCharOffset = 0
RTB.SetFocus

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 247

Propiedad SelProtected
Es una propiedad Booleana, que nos permite proteger contra cualquier cambio a una parte del texto (o
todo el texto) que contiene el RTB. Para proteger una parte del texto basta con seleccionarla y a
continuacin ejecutar la instruccin
RTB.SelProtected = True
Una vez protegida una parte del texto, esa parte no se puede variar. Puede desprotegerse, volviendo a
seleccionarla y ejecutando la instruccin:
RTB.SelProtected = False
Propiedad ScrollBars
Pone barras de desplazamiento al RichTextBox.
Esta propiedad puede establecerse a 0 (None, ninguna), a 1 (Horizontal), 2 (Vertical) o 3 (Both, ambas).
Cuando las barras de desplazamiento no son necesarias, bien porque hay pocas lneas, bien porque hay
pocos caracteres por lnea, las barras de desplazamiento estn desactivadas.
Es frecuente pensar que las barras de desplazamiento horizontal no funcionan. Y eso ocurre porque
siempre se ven desactivadas. En realidad lo que pasa es que solamente se activan cuando la lnea de
texto es mas ancha que el ancho del RichTextBox. Puede ocurrir eso cuando la propiedad RightMargin
tiene un valor superior a la anchura del control, circunstancia que nos permite escribir salindonos del
control, y es en solamente en ese caso en el que se activa la barra de scroll horizontal.
Las barras de desplazamiento pueden desactivarse mediante la propiedad DisableNoScroll.
Propiedad DisableNoScroll
Devuelve o establece un valor que determina si estn desactivadas las barras de desplazamiento en el
control RichTextBox.
Sintaxis

NombredelRichTextBox.DisableNoScroll = True / False

Si es False, las barras de desplazamiento aparecen normalmente. Si es True, las barras de


desplazamiento aparecen atenuadas.

Propiedad Appearance
Plano o tridimensional, como en el resto de los controles.
Propiedad AutoVerbMenu
Propiedad Booleana que indica si se presenta un men emergente cuando el usuario hace click con el
botn derecho del ratn. El men emergente muestra los comandos de Deshacer (Ctrl-Z) cortar (Ctrl-X),
copiar (Ctrl-C), pegar (Ctrl-V) y Eliminar (Supr) Pero no es necesario escribir cdigo en ninguna parte
para que se realicen estas operaciones (Por una vez, VB nos regala unas operaciones. No es VB, es
Windows directamente)
Sintaxis

NombredelRichTextBox.AutoVerbMenu = True / False

Si esta propiedad est a True muestra el men. False no lo muestra.


Propiedad BorderStyle
Sin borde o con borde (None o Fixed Single)
Propiedad Enabled
Propiedad Booleana. Activa o desactiva el RichTextBox
FileName
Esta propiedad devuelve o establece el nombre del fichero .RTF cargado en el RichTextBox. Si
ejecutamos la lnea de cdigo :
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 248

RTB1.Filename =C :\CursoVB\Mitexto.rtf
lo que ocurrir es que nuestra aplicacin cargar el fichero C :\CursoVB\Mitexto.rtf en el RichTextBox
RTB1. Es decir, hace lo mismo que el Mtodo LoadFile (Vea mas abajo).
Slo puede especificar los nombres de archivos de texto o archivos .RTF vlidos para esta propiedad.
Le recomendamos que para cargar un texto en un RTB use siempre el mtodo LoadFile en vez de la
propiedad Filename.
Si lo que hacemos con esta propiedad es consultar el fichero cargado en el RTB :
Variable = RTB1.Filename
obtendremos en Variable el nombre (y Path) del fichero que tenemos cargado en el RTB
HideSelection
Devuelve o establece un valor que determina si el texto seleccionado aparece resaltado cuando el
RichTextBox pierde el enfoque. Esto es justamente lo que ocurre cuando seleccionamos un trozo de
texto (Por ejemplo para pasar ese texto a negrita) y hacemos click sobre otro control (Por ejemplo, sobre
un botn de comando para cambiar a Negrita) Si tenemos esta propiedad a False el texto seleccionado
sigue seleccionado. Si est a True, el texto se deselecciona.
NOTA Le recomiendo que cuando tenga un control para cambiar el tipo de letra, hgalo sobre un control
que no acepte el foco (Label, p.e.)
Sintaxis

NombreRTB.HideSelection = True / False

para establecer la propiedad

Variable = NombreRTB.HideSelection

para leerla

Propiedad Locked
Igual que le ocurre al TextBox, si ponemos esta propiedad a True impedimos que se pueda cambiar el
texto existente en el RichTextBox mediante el teclado.
MaxLength
Esta propiedad marca el nmero mximo de caracteres que puede contener. Si se pone a 0
(Predeterminado) admite cualquier nmero de caracteres.
MousePointer
Igual que para el resto de los controles.
Multiline
Igual que para el TextBox. Si est a True (predeterminado) el RichTextBox puede contener varias lneas.
Si est a False, una solo.
OLEDragMode
OLEDropMode
Estas dos propiedades son similares a la DragMode de otros controles. Se vern con mas detalle al
estudiar el Drag & Drop.

METODOS DEL CONTROL RichTextBox


El control RichTextBox cuenta con unos mtodos especiales para abrir un fichero y guardar el texto que
contiene un poco especiales. Estos mtodos (SaveFile y LoadFile) se pueden usar solamente cuando
queremos guardar o leer el texto en formato .RTF. Con ellos no es necesario abrir el fichero (con Open
Nombrefichero .....) ni cerrarlo, pero siempre para guardar o leer texto en formato RTF. Podemos leer o
guardar el texto de un RichTextBox como texto plano (Como los ficheros ASCII .TXT). Para ello
debemos utilizar los mtodos Open Nombrefichero For Input / Output vistos en el captulo de ficheros.
METODO SaveFile
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 249

Guarda el contenido de un control RichTextBox en un archivo.


Sintaxis NombredelRTB.SaveFile(nombre_ruta, tipo_archivo)
Donde nombre_ruta (Parmetro requerido) es una expresin de cadena que define la ruta de acceso y el
nombre del archivo que va a recibir el contenido del control, y tipo_archivo es un entero o una constante
que especifica el tipo de archivo cargado, como se describe a continuacin :
0
1

rtfRTF
rtfText

El control RichTextBox guarda su contenido como un archivo .RTF.


El control RichTextBox guarda su contenido como un archivo de texto.

El valor predeterminado es 0. Si no se pone este parmetro, toma el valor 0 por defecto.


Ejemplo
RTB1.SaveFile C :\CursoVB\mitexto.rtf, 0
Guarda el contenido del RichTextBox RTB1 en un fichero llamado mitexto.rtf que est en el directorio
CursoVB, con formato RTF
Aparte del mtodo SaveFile, puede utilizar la funcin Print de Visual Basic y las propiedades TextRTF y
SelRTF del control RichTextBox para escribir archivos .RTF. Por ejemplo, puede guardar el contenido de
un control RichTextBox en un archivo .RTF de este modo:
Open "mitexto.rtf" For Output As 1
Print #1, RichTextBox1.TextRTF
Close #1

METODO LoadFile
Carga un archivo .RTF o un archivo de texto en un control RichTextBox.
Sintaxis NombreRTB.LoadFile nombre_ruta, tipo_archivo
Donde nombre_ruta (Parmetro requerido) es una expresin de cadena que define la ruta de acceso y el
nombre del archivo que se va a cargar en el control, y tipo_archivo
es un entero o una constante
que especifica el tipo de archivo cargado, como se describe a continuacin
0
1

rtfRTF
rtfText

El archivo cargado debe ser un archivo .RTF vlido.


El control RichTextBox carga cualquier archivo de texto.

Al cargar un archivo con el mtodo LoadFile, el contenido del archivo cargado reemplaza a todo el
contenido del control RichTextBox. Esto hace que cambien los valores de las propiedades Text y rtfText.
Tambin puede usar la funcin Input de Visual Basic y las propiedades TextRTF y SelRTF del control
RichTextBox para leer archivos .RTF. Por ejemplo, puede cargar el contenido de un archivo .RTF en el
control RichTextBox de este modo:
Open "C :\CursoVB\mitexto.rtf" For Input As 1
RichTextBox1.TextRTF = Input$(LOF(1), 1)
Close #1

METODO Find
Busca una cadena especfica en el texto de un control RichTextBox.
Sintaxis Variable = NombreRTB.Find (cadena, inicio, fin, opciones)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 250

Donde :
cadena (Necesario)
inicio (Opcional)

fin

(Opcional)

Opciones (Opcional)

Valor

Constante

rtfWholeWord

Una expresin de cadena que desea buscar en el control.


Un ndice de caracteres de tipo Integer que determina dnde comienza
la bsqueda. Cada carcter del control tiene un ndice entero que lo
identifica de forma nica. El primer carcter de texto del control tiene
un ndice 0.
Un ndice de carcter de entero que determina dnde termina la
bsqueda.
Una o ms valores o constantes utilizadas para especificar
caractersticas opcionales, como se describe a continuacin.
Descripcin

Determina si una coincidencia se basa en una palabra completa o en


parte de una palabra.
4
rtfMatchCase Determina si una coincidencia se basa el uso de maysculas y
minsculas de la cadena especificada adems del texto de la cadena.
8
rtfNoHighlight Determina si una coincidencia aparece resaltada en el control
RichTextBox.
Puede combinar mltiples opciones si utiliza el operador Or.
Si se encuentra el texto buscado, el mtodo Find resalta el texto especificado y devuelve un nmero con
la posicin del primer carcter resaltado. Si no se encuentra el texto especificado, el mtodo Find
devuelve 1.
Si utiliza el mtodo Find sin la opcin rtfNoHighlight aunque la propiedad HideSelection sea True y el
control RichTextBox no tenga el enfoque, el control seguir resaltando el texto encontrado. Los usos
posteriores del mtodo Find slo buscarn el texto resaltado hasta que se mueva el punto de insercin.
El comportamiento de bsqueda del mtodo Find vara segn la combinacin de valores especificados
para los argumentos inicio y fin. Esta tabla describe los comportamientos posibles:
Inicio

Fin

Comportamiento de bsqueda

Especificado

Especificado

Especificado

Omitido

Omitido

Especificado

Omitido

Omitido

Busca desde la ubicacin inicial especificada hasta la


ubicacin final especificada.
Busca desde la ubicacin inicial especificada hasta el final del
texto del control.
Busca desde el punto de insercin actual hasta la ubicacin
final especificada.
Busca en la seleccin actual si el texto est seleccionado o en
todo el contenido del control si no hay texto seleccionado.

METODO GetLineFromChar
Devuelve el nmero de la lnea que contiene una posicin de carcter especificado en un control
RichTextBox.
Sintaxis

Variable = NombreRTB.GetLineFromChar (pos_carcter)

Donde pos_carcter (Requerido) es un entero largo que especifica la posicin del carcter cuya lnea
desea identificar. El ndice del primer carcter del control RichTextBox es 0.
Utilice el mtodo GetLineFromChar para averiguar qu lnea del texto de un control RichTextBox
contiene una determinada posicin de carcter. Es posible que necesite hacerlo porque puede variar el
nmero de caracteres de cada lnea, lo que hace muy difcil averiguar qu lnea del texto contiene un
determinado carcter, identificado por su posicin en el texto.
METODO SelPrint
Enva texto con formato de un control RichTextBox a un dispositivo de impresin.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 251

Sintaxis

NombreRTB.SelPrint(hdc)

Donde hdc es el contexto de dispositivo del dispositivo que va a utilizar para imprimir el contenido del
control.
Si hay texto seleccionado en el control RichTextBox, el mtodo SelPrint slo enviar el texto
seleccionado al dispositivo de destino. Si no hay texto seleccionado, se enviar el contenido completo del
control RichTextBox al dispositivo.
El mtodo SelPrint no imprime texto desde el control RichTextBox. En su lugar, enva una copia del
texto con formato a un dispositivo que pueda imprimirlo. Por ejemplo, puede enviar el texto al objeto
Printer utilizando cdigo como ste:
RichTextBox1.SelPrint(Printer.hDC)
Observe que la propiedad hDC del objeto Printer se utiliza para especificar el argumento de contexto de
dispositivo del mtodo SelPrint.
Nota Si utiliza el objeto Printer como destino del texto desde el control RichTextBox, deber inicializar
en primer lugar el contexto de dispositivo del objeto Printer. Esto es necesario, ya que Visual Basic no
conoce el hDC del Printer hasta que se imprime algo. La informacin de Microsoft recomienda imprimir
una cadena de longitud cero.
(Ejecutar la instruccin Printer.Print ) Sin embargo esa no es buena solucin ya que da un error de
impresora. Vale mas forzar la posicin del papel, aunque no hiciese falta
Printer.Orientation = 1
Mediante SelPrint nos podemos ahorrar la tediosa programacin del Printer, pero tiene tambin
inconvenientes: No controlamos el cambio de pgina, si tenemos papel preimpreso es muy difcil
ajustarlo, etc.
METODO Span
Selecciona texto en un control RichTextBox basndose en un conjunto de caracteres especificado.
Sintaxis NombreRTB.Span juego_caracteres, hacia_adelante, negado
donde :
juego_caracteres (Requerido) Una expresin de cadena que especifica el juego de caracteres que se
va a buscar al ampliar la seleccin, basndose en el valor de negado.
hacia_adelante (Opcional) Una expresin booleana que determina en qu sentido se mueve el punto de
insercin, como se describe mas adelante.
Negado (Opcional) Una expresin booleana que determina si los caracteres de juego_caracteres
definen el conjunto de caracteres de destino o se excluyen del conjunto de caracteres de destino, como
se describe mas adelante.
Los valores para hacia_adelante son:
True (Predeterminado) Selecciona texto desde el punto de insercin actual o desde el principio de la
seleccin actual hacia delante, hacia el final del texto.
False Selecciona texto desde el punto de insercin actual o el principio de la seleccin actual hacia
atrs, hacia el principio del texto.
Los valores para negado son:
True Los caracteres incluidos en la seleccin son los que no aparecen en el argumento
juego_caracteres. La seleccin se detiene en el primer carcter encontrado que aparece en el
argumento juego_caracteres.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 252

False (Predeterminado) Los caracteres incluidos en la seleccin son los que aparecen en el argumento
juego_caracteres. La seleccin se detiene en el primer carcter encontrado que no aparece en el
argumento juego_caracteres.
El mtodo Span se utiliza principalmente para seleccionar fcilmente una palabra o una frase en el
control RichTextBox.
Si el mtodo Span no encuentra los caracteres especificados basndose en los valores de los
argumentos, el punto de insercin o la seleccin actual permanece sin cambios.
El mtodo Span no devuelve datos.
METODO Upto
Mueve el punto de insercin hasta el primer carcter (sin incluirlo) que sea miembro del conjunto de
caracteres especificado en un control RichTextBox.
Sintaxis NombredelRTB.Upto (juego_caracteres, hacia_adelante, negado)
Donde :
juego_caracteres (Requerido) Una expresin de cadena que especifica el conjunto de caracteres que
se va a buscar al mover el punto de insercin, basndose en el valor de negado.
hacia_adelante (Opcional) Una expresin booleana que determina en qu sentido se mueve el punto de
insercin, como se describe en Valores.
negado (Opcional) Una expresin booleana que determina si los caracteres de juego_caracteres definen
el conjunto de caracteres de destino o se excluyen del conjunto de caracteres de destino, como se
describe en Valores.
Valores
Los valores de hacia_adelante son:
True
False

(Predeterminado) Mueve el punto de insercin hacia delante, hacia el final del texto.
Mueve el punto de insercin hacia atrs, hacia el principio del texto.

Los valores para negado son:


True Los caracteres no especificados en el argumento juego_caracteres se utilizan para mover el
punto de insercin.
False (Predeterminado) Los caracteres especificados en el argumento juego_caracteres se utilizan
para mover el punto de insercin.

El Portapapeles y el RichTextBox
Imagnese que seleccionamos un texto en un RichTextBox y ese texto lo metemos al portapapeles.
Dado que el texto est escrito en RTF, Como nos lo guarda el Portapapeles ?
La solucin es que puede guardarlo en las dos versiones. En formato de texto plano (Guarda
estrictamente los caracteres ASCII del texto seleccionado) o como texto enriquecido (RTF), guardando
en este caso, adems del texto limpio y puro, la informacin del tipo de letra, tamao, color, etc. tpicas
del formato RTF.
Para ello debemos indicarle al portapapeles en qu formato queremos guardarlo. La lnea de cdigo :
Clipboard.SetText RTB1.SelRTF, vbCFRTF
guarda en el portapapeles el texto seleccionado en ese momento, en formato RTF. La lnea
Clipboard.SetText RTB1.TextRTF, vbCFRTF
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 253

guarda en el portapapeles todo el contenido del RichTextBox (llamado RTB1 en los ejemplos) en
formato RTF
Las lneas :
Clipboard.SetText RTB1.SelRTF, vbCFText
Clipboard.SetText RTB1.TextRTF, vbCFText
guardarn, respectivamente, el texto seleccionado y todo el texto de RTB1, en formato de texto plano

Pero esta no es la nica forma de introducir texto procedente del RichTextBox en el portapapeles.
Podemos introducir el texto seleccionado con formato RTF de la forma :
ClipBoard.SetText RTB1.SelRTF
Y el texto plano con

Clipboard.SetText RTB1.SelText

Para introducir TODO el texto del RTB en formato RTF


Clipboard.SetText RTB1.TextRTF
Para meter TODO el texto del RTB en texto plano
Clipboard.SetText RTB1.Text

APENDICE
Constantes del control RichTextBox
Constante

Valor

Descripcin

Propiedad Appearance
rtfFlat
0
Uniforme. Pinta sin efectos visuales.
rtfThreeD
1
(Predeterminado). 3D. Pinta con efectos tridimensionales.
Mtodo Find
rtfWholeWord

rtfMatchCase

rtfNoHighlight

Determina si una coincidencia se basa en una palabra completa o en


parte de una palabra.
Determina si una coincidencia se basa en el uso de maysculas y
minsculas de la cadena especificada adems del texto de la cadena.
Determina si una coincidencia aparece resaltada en el control
RichTextBox.

Mtodos LoadFile y SaveFile


rtfRTF
0
(Predeterminado) RTF. El archivo cargado debe ser un archivo .RTF
vlido (mtodo LoadFile) o el contenido del control se guarda en un archivo .RTF
(mtodo SaveFile).
rtfText
1
Texto. El control RichTextBox carga cualquier archivo de texto
(mtodo LoadFile) o el contenido del control se guarda en un archivo de texto
(mtodo SaveFile).
Propiedad MousePointer
rtfDefault
0
(Predeterminado) La forma est determinada por el objeto.
rtfArrow 1
Flecha.
rtfCross
2
Cruz (cursor en forma de cruz).
rtfIbeam
3
Cursor en forma de I.
rtfIcon
4
Icono (cuadrado pequeo dentro de un cuadrado).
rtfSize
5
Tamao (flecha de cuatro puntas que seala al norte, sur, este y oeste)
rtfSizeNESW 6
Tamao NE-SO (flecha de dos puntas que seala al nordeste y al
sudoeste).
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 254

rtfSizeNS
7
rtfSizeNWSE 8
rtfSizeEW
9
rtfUpArrow
10
rtfHourglass
11
rtfNoDrop
12
rtfArrowHourglass
rtfArrowQuestion
rtfSizeAll
15
rtfCustom
99

Tamao N S (flecha de dos puntas que seala al norte y al sur).


Tamao NO, SE.
Tamao EO (flecha de dos puntas que seala al este y al oeste).
Flecha hacia arriba.
Reloj de arena (espere).
No colocar.
13
Flecha y reloj de arena.
14
Flecha y signo de interrogacin.
Ajustar todo.
Icono personalizado especificado por la propiedad MouseIcon.

Propiedad Selalignment
rtfLeft
0
(Predeterminado) Izquierda. El prrafo se alinea a lo largo del margen
izquierdo.
rtfRight
1
Derecha. El prrafo se alinea a lo largo del margen derecho.
rtfCenter
2
Centro. El prrafo se centra entre los mrgenes izquierdo y derecho.

Propiedad Scrollbars
rtfNone
0
rtfHorizontal
1
rtfVertical
2
rtfBoth
3

(Predeterminado) Ninguna.
Slo barra de desplazamiento horizontal.
Slo barra de desplazamiento vertical.
Barras de desplazamiento horizontal y vertical.

El FORMATO RTF
Cuando se edita un texto mediante un procesador de textos, el fichero resultante se guarda don un
formato distinto para cada procesador. De esta forma, un texto editado en WP no es compatible con el
P.T. AmiPro, con Word o con cualquier otro. Los fabricantes de estos procesadores de textos han tenido
que incluir una herramienta capaz de convertir un formato a otro para poder alcanzar la compatibilidad
entre ellos que el mercado exiga.
El Formato de Texto Enriquecido pretende ser un nexo de unin entre todos los procesadores de texto,
para poder intercambiar ficheros editados en uno u otro. De hecho, las ltimas versiones de los mas
importantes procesadores de textos incluyen la posibilidad de guardar y buscar el texto en este formato.
(WP, Word)
Este formato consiste en guardar mediante caracteres ASCII plenamente legibles tanto el texto escrito
como los tipos de letra, tamao, saltos de carro, etc. Veamos un ejemplo comparativo del mismo texto
escrito en Word, guardado en RTF y en ASCII :
Texto1
Este texto est escrito en Word. Observe que podemos poner letra negrita, letra cursiva, letra
subrayada. Podemos cambiar el color de las letras, rojo, verde, azul. Podemos cambiar el tamao de las
letras a tamao mas grande, mas pequeo, etc.

Fin Texto 1
El mismo texto en ASCII puro :
Texto1
Este texto est escrito en Word. Observe que podemos poner letra negrita, letra cursiva, letra
subrayada. Podemos cambiar el color de las letras, rojo, verde, azul. Podemos cambiar el tamao de las
letras a tamao mas grande, mas pequeo, etc.

Fin Texto 1
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 255

Y ahora el mismo texto en formato RTF. En este formato hubo que seccionar las lneas para poder
mostrarlas en una hoja, ya que RTF utiliza lneas sin retornos de carro. Se han seccionado las lneas
terminndolas con un guin bajo y comenzando en la lnea siguiente tambin con un guin bajo.
{\rtf1\ansi \deff5\deflang1033{\fonttbl{\f5\fswiss\fcharset0\fprq2 Arial;}}_
_{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;_
_\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;
\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\_
_green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\_
blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue_
_192;}{\stylesheet{\widctlpar
\f5\fs20\lang1034 \snext0 Normal;}{\*\cs10 \additive Default Paragraph Font;}_
_}{\info{\author LUIS SUAREZ BERNALDO}{\operator LUIS SUAREZ BERNALDO}_
_{\creatim\yr1997\mo3\dy9\hr11\min8}{\revtim\yr1997\mo3\dy9\hr11\min9}_
_{\version1}{\edmins1}{\nofpages1}
{\nofwords38}{\nofchars220}{\*\company }{\vern57431}}\margl1701\margr1701\_
_margt1417\margb1417 \deftab708\widowctrl\ftnbj\aenddoc\hyphhotz425\formshade_
_ \fet0\sectd \linex0\headery709\footery709\colsx709\endnhere {\*\pnseclvl1
\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstar_
_t1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\_
_pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5
\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcl_
_tr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\_
_pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pn_
_start1\pnindent720\pnhang
{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{_
_\pntxtb (}{\pntxta )}}\pard\plain \qj\widctlpar \f5\fs20\lang1034 Texto1
\par
\par Este texto est\'e1 escrito en Word. Observe que podemos poner letra _
_{\b negrita}, letra {\i cursiva}, letra {\ul subrayada}. Podemos cambiar_
_ el color de las letras, {\cf6 rojo}, {\cf4 verde}, {\cf2 azul}. Podemos _
_cambiar el tama\'f1o de las letras a {
\fs24 tama\'f1o mas grande}, {\fs16 mas peque\'f1o}, etc.
\par
\par
\par Fin Texto 1
\par \pard \widctlpar
\par }
Como puede observar, el RTF incluye el texto escrito casi en ASCII, pero aadiendo una serie de datos
respecto al tipo de letra, codifica los acentos, las ees, y hasta incluye, tomndolo del ordenador, el
nombre del operador que lo ha escrito. Estas informaciones tambin se guardan cuando se archiva un
texto en el formato propio del procesador de textos, pero lo hace en binario, por lo que no lo podemos
visualizar. El formato RTF, dentro de que mete toda esa informacin adicional, lo archiva con caracteres
ASCII.

MUY IMPORTANTE
Observe que el fichero .RTF comienza por {\rtf Cuando tenga que importar un texto hacia un
RichTextBox, puede que ese texto est en formato RTF o como Texto Plano (Fichero ASCII puro) Para
saber si el texto est en RTF analice los Cinco primeros caracteres del texto a importar. Si son {\rtf es
que est en presencia de un texto RTF.
Para saber si un fichero contiene texto enriquecido, basta con abrirlo como un fichero secuencial,
(recuerde que un fichero .RTF tiene solamente caracteres ASCII) y leer los cinco primeros caracteres.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 256

Ejercicio Propuesto. Conlos conocimientos de los Documentos de Interfaces Multiples, y los del
RichTextBox que ha adquirido en este captulo, y los conocimientos del men y los ficheros que ya tiene
de los captulos anteriores, ya est en condiciones de realizar un editor de textos, casi tan bueno como el
Word. Debe ponerle las funciones tpicas de cortar, copiar y pegar, documento nuevo, cerrar, guardar,
guardar como, y cada vez que cierra un documento debe saber si ha habido cambios para proponer que
se guarden.

Visual Basic - Gua del Estudiante Cap. 10


Procedimientos y funciones en VB
CORRECCION DE ERRORES Y DEPURACION DE PROGRAMAS - EL OBJETO ERROR
LA AYUDA DE WINDOWS
Procedimientos
Un Procedimiento en Visual Basic es un trozo de cdigo que realiza una determinada tarea. Un
procedimiento es el cdigo que asociamos a un evento de un control (CommandButton_Click,
Form_Load, ...). Un control puede tener por lo tanto, muchos procedimientos asociados. Uno a cada uno
de sus eventos.
Si queremos realizar una determinada tarea en un programa, y esta tarea se repite muchas veces en ese
programa, podemos, por ejemplo, repetir el cdigo tantas veces como sea necesario en los puntos del
programa que as lo pidan. Esto nos llevara a escribir lneas y lneas repetidas en nuestras aplicaciones,
con el consiguiente incremento de trabajo y del volumen de la aplicacin.
Podemos hacer otra cosa mas prctica y elegante. Escribir ese cdigo una sola vez, creando con l un
Procedimiento. Este Procedimiento tendr un nombre, y cada vez que queramos que se ejecute ese
cdigo bastar con nombrar por ese nombre al Procedimiento.
Un procedimiento puede insertarse en un Mdulo o en Formulario. Para crear un Procedimiento basta
con hacer click en la Barra de Men de VB en Insertar | Procedimiento. Observar que la palabra
Procedimiento del Men desplegable est deshabilitada si no est abierta ninguna ventana de cdigo.
Para habilitarla, abra la ventana de cdigo del Formulario o Mdulo donde quiere insertar el nuevo
Procedimiento.
Una vez hecho Click en Insertar | Procedimiento le aparecer esta ventana :

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 257

En esta ventana debe teclear el nombre que quiere dar al Procedimiento. En tipo debe elegir la opcin
Procedimiento (Veremos mas adelante la Funcin y en otro captulo las opciones Propiedad y Evento) y
en el Ambito debe elegir Public o Private dependiendo del mbito que quiera darle :
Public. Se podr acceder a l desde cualquier Formulario o Mdulo del programa.
Dependiendo de donde se haya insertado el Procedimiento (Formulario o Mdulo), debe citarse de la
siguiente forma :
Si se ha insertado en un Mdulo, puede citarse solamente por su nombre. Puede citarse tambin por el
nombre del mdulo seguido por el nombre del procedimiento, separando ambos por un punto. Si el
procedimiento tiene por nombre NombreProcedimiento y se ha insertado en el Mdulo1 puede citarse de
las dos formas siguientes en cualquier parte del programa:

NombreProcedimiento
Modulo1.NombreProcedimiento
Si se ha insertado en un Formulario, desde ese Formulario basta con citarle por su nombre. Desde otro
Formulario o Mdulo, hay que citarlo mediante el nombre del Formulario donde est insertado, seguido
del nombre del procedimiento, separados por un punto.
Private. Si elige este mbito, slo se podr acceder a ese Procedimiento desde el Formulario o Mdulo
donde se haya insertado.
La caja de opcin (Check) que pone Todas las variables locales como estticas nos va a poner todas
las variables declaradas dentro del procedimiento como estticas (No ponen a cero o nulo su valor
cuando salimos y volvemos a entrar en ese procedimiento). Puede ahorrarnos un poco de cdigo.
El cdigo de los Procedimientos se guarda en el General del Formulario o Mdulo donde se han
insertado :

Para llamar a un procedimiento desde cualquier parte del cdigo basta con escribir en una lnea el
nombre del procedimiento.
fpublico
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 258

Muchos programadores anteponen la palabra Call


Call fpublico
No hace falta poner Call, aunque Visual Basic lo admite. Algunos programadores me dicen que al poner
Call, siempre se enteran mejor de que estn llamando a un procedimiento. Me parece muy bien, y creo
que es una buena razn. Pero no existe otra razn para ello.
Los datos que se puedan generar en un procedimiento debe extraerlos de ese procedimiento mediante
variables. Ver que con las funciones es distinto.
Cuando se llama a un procedimiento, se lleva a ese procedimiento la condicin de tratamiento de errores
que existe en el procedimiento desde el que se llam. Por ejemplo:
Private Sub Boton1_Click()
On Error GoTo RutErr
Lineas de cdigo de este procedimiento
Llamada al Procedimiento Calcula_Dietas
Calcula_Dietas
Mas lneas de cdigo de este procedimiento
RutErr:
End Sub
Si al ejecutarse el procedimiento Calcula_Dietas ocurre un error, al detectarse ese error interceptable, el
programa salta a ejecutar la lnea RutErr del procedimiento Boton1_Click.
Esto puede producirse serios problemas a la hora de depurar su programa. Para evitar que suceda eso,
y que se pare la ejecucin del programa en la lnea del procedimiento Calcula_Dietas en la que se
produjo el error, inicie este procedimiento con una instruccin que anule la condicin de tratamiento de
errores:
Public Sub Calcula_Dietas()
On Error Goto 0
.
Ens Sub
Funciones
Una funcin es una forma especial de realizar un procedimiento. En realidad es un procedimiento al que
le pasamos una o varios parmetros con los que realizar una operacin (cualquier operacin, no tiene
porqu ser matemtica) y obtendr un resultado de esos parmetros. Este resultado puede leerse desde
otra parte de la aplicacin en una variable que tienen el mismo nombre que la funcin. La forma de
obtener los datos de la funcin es llamar directamente a esa funcin, como ver un poco ms adelante.
Para insertar una Funcin se procede de igual forma que para un Procedimiento, pero marcando el
botn de opcin Tipo Funcin en la caja de dilogo de la figura anterior.
El mbito de una Funcin es el mismo que el un Procedimiento. Si se declara Pblica puede usarse en
toda la aplicacin. Si se declara Privada, solamente en el Formulario o Mdulo donde se haya insertado.
Para llamar a una Funcin son vlidos igualmente los criterios expuestos para los Procedimientos en
cuanto a la sentencia Call.

Parmetros de una Funcin

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 259

Se dijo anteriormente que a una Funcin se le pasan uno o varios parmetros con los que va a realizar
alguna operacin. Al declarar la Funcin, hay que decirle el nombre de los parmetros que se le van a
pasar, de que tipo son (String, Integer, Boolean, ...) y cmo se le van a pasar (ByVal, ByRef,
ParamArray). Esto hay que introducrselo en la propia declaracin
Public Function MiFuncion(ByVal Variable1 as String, ByVal Variable2 as Integer)
End Function
La funcin MiFuncion sabe que debe recibir dos parmetros, y que el primero ser una cadena de
caracteres y el segundo un integer. Los nombres Variable1 y Variable2 son los nombres que usa la
Funcin internamente. No tienen porqu coincidir con los nombres que tengan las variables que
contienen esos valores en otras partes del programa.
Una funcin siempre da un resultado. Este resultado se le introduce en una variable que tiene el mismo
nombre que la funcin. Esta variable no hace falta declararla, ya que la declaracin de la funcin lleva
implcito que exista una variable con ese nombre.
Imaginemos que lo que va a hacer la funcin de este ejemplo es tomar una cadena de caracteres
(Variable1) y obtener de ella otra cadena con los caracteres iniciales de la primera, tantos caracteres
como nos indique la segunda variable (Variable2)
Si, por ejemplo, le passemos los valores :
Variable1 = Gua del Estudiante
Variable2 = 14
Obtendramos como resultado la cadena

Gua del Estud

Ya se habr dado cuenta de que debemos emplear Left para obtener los caracteres iniciales de una
cadena. Nuestra funcin quedar de la forma :
Public Function MiFuncion(ByVal Variable1 as String, ByVal Variable2 as Integer) As String
MiFuncion =Left (Variable1, Variable2)
End Function
(Observe que hemos aadido la expresin As String al final de la declaracin. Esto quiere significa que le
estamos diciendo a la funcin que su resultado es un String,)
Donde MiFuncion es una variable que se ve en todo el mbito de la funcin. Para llamar a la funcin,
basta con citarla por su nombre y ponerle los parmetros necesarios. Cuando est tecleando el cdigo,
Visual Basic le invitar a introducir los parmetros citndole su nombre. (En nuestro ejemplo, ByVal
Variable1 as String, ByVal Variable2 as Integer
En cualquier parte del programa podemos poner :
Label1.Caption = MiFuncion (Gua del Estudiante, 14)
y Label1 tomar como Caption la cadena Gua del Estud
Pruebe esto con una pequea aplicacin. En un formulario, ponga un TextBox (Text1) donde va a
introducir la cadena original, otro TextBox donde va a introducir el nmero de caracteres a tomar, y un
Label (Label1) donde va a ver el resultado. Ponga un Botn de comando (Command1) donde llamar a
la funcin. Inserte una funcin (MiFuncion) en ese formulario :

Private Sub Command1_Click()


Label1.Caption = MiFuncion(Text1.Text, Val(Text2.Text))
End Sub
Public Function MiFuncion(ByVal Variable1 As String, ByVal Variable2 As Integer) As String
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 260

MiFuncion = Left(Variable1, Variable2)


End Function
Puede pensar que para hacer esta cosa tan elemental no merece la pena hacer una funcin.
Efectivamente. Bastara con poner en el botn Command1_Click el siguiente cdigo :
Label1.Caption = Left(Text1.Text, Val(Text2.Text))
y funcionara igual. Lgicamente, una funcin debe introducirse cuando vaya a realizar un cdigo un
poco mas complejo, y sobre todo, cuando se va a repetir en muchos procedimientos.
Hemos visto que los parmetros de la funcin pueden pasarse Por Valor (ByVal), caso del ejemplo
anterior, y Por Referencia (ByRef). Cul es la diferencia ? La diferencia es que si le pasa un valor por
valor (ByVal) ese valor, aunque lo cambie la funcin internamente, ese cambio no se manifiesta fuera de
ella. Si se pasa por referencia (ByRef), y la funcin cambia el valor de esa variable, ese cambio se
mantiene fuera de la funcin.
Veamos esto de una forma muy sencilla : Vamos a hacer una funcin que multiplica dos nmeros. Pero
dentro de la funcin vamos a cambiar uno de esos nmeros, sumndole 2. Una vez realizada la
operacin presentamos el valor de los dos factores en dos Label a ver si ha cambiado. Insertemos dos
funciones, MultiplicaA y MultiplicaB. En MultiplicaA le introducimos los datos Por Valor y en MultiplicaB
por Referencia.
Public Function MultiplicaA(ByVal X1 As Integer, ByVal X2 As Integer) As Integer
x1 = x1 + 2
MultiplicaA = x1 * x2
End Function
Public Function MultiplicaB(ByRef X1 As Integer, ByRef X2 As Integer) As Integer
x1 = x1 + 2
MultiplicaB = x1 * x2
End Function
Las dos funciones son idnticas, excepto en la forma de pasarle los parmetros. Pongamos un Botn de
Comando para multiplicarlo con MultiplicaA y otro con MultiplicaB. Al final del procedimiento click de cada
uno de ellos presentamos las dos variables que se pasan a la funcin en sendos Label. Cuando se usa
MultiplicaA el valor de X1 (pepe en el CommandButton) se mantiene. En MultiplicaB cambia al valor
pepe+2
Private Sub Command1_Click()
Dim pepe As Integer
Dim juan As Integer
pepe = Val(Text1)
juan = Val(Text2)
Label1 = MultiplicaA(pepe, juan)
Label2 = pepe
Label3 = juan
End Sub
Tras esto, se pone en Lable2 el valor pepe
Private Sub Command2_Click()
Dim pepe As Integer
Dim juan As Integer
pepe = Val(Text1)
juan = Val(Text2)
Label1 = MultiplicaB(pepe, juan)
Label2 = pepe
Label3 = juan
End Sub

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 261

Tras esto, se pone en Label2 el valor pepe + 2


MultiplicaB
x1 = x1 + 2

(se mantienen el cambio realizado en la funcin

No queda ah la cosa. Un valor puede pasarse tambin por ParamArray. En principio parece que esto ya
es para nota. No es para tanto.
Vamos a ver que sucede cuando queremos realizar una suma. La suma de los importes de varios
productos de un ticket de compra. En principio no sabemos cuantos productos va a comprar un cliente,
por lo tanto no sabemos a priori cuantos parmetros le tenemos que pasar. Para pode pasar un nmero
indeterminado de parmetros se los pasamos como PamArray :
Public Sub sumacifras(ParamArray cifra())
Dim I As Integer
Dim suma As Integer
For I = LBound(cifra) To UBound(cifra)
suma = suma + CInt(cifra(I))
Next I
Label1.Caption = suma
End Sub
Private Sub Command2_Click()
sumacifras 1, 2, 3, 4, 5, 6, 7, 8
End Sub
Este cdigo nos suma las cifras 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8
La variable que se pasa con ParamArray debe ser Variant
Existe otra forma de pasar parmetros : Optional
Cuando se declara una funcin con un determinado nmero de parmetros, es necesario pasrselos
todos. Si no se hace as, VB nos dar un error. Pero puede que algn parmetro no exista siempre.
Cuando uno o varios de los parmetros que se pasan a una funcin son opcionales, se le pueden pasar
como Optional.
Se pueden pasar uno o mas parmetros como Optional. Las condiciones para
opcionales es que ocupen los ltimos lugares y que sean del tipo Variant

los parmetros

Hagamos un ejemplo en el que vamos a poner en un TextBox (TB4) el nombre y apellidos de una
persona. El segundo apellido se lo pasamos como Opcional. La declaracin de la funcin ser :

Public Function SUMANOMBRES(NOMBRE As String, APE1 As String, Optional APE2 _


As Variant)
Debemos detectar si se le ha pasado el parmetro opcional. Usamos para ello IsMissing
If IsMissing (APE2) Then
TB4.Text = NOMBRE & " " & APE1
Else
TB4.Text = NOMBRE & " " & APE1 & " " & APE2
End If
End Function
Los parmetros los tomamos de tres TextBox (TB1, TB2 y TB3, siendo este ltimo el que es opcional. En
un botn de comando ponemos este cdigo :
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 262

Private Sub Command1_Click()


If TB3 <> "" Then
SUMANOMBRES TB1, TB2, TB3
Else
SUMANOMBRES TB1, TB2
End If
End Sub
Salir de una funcin
La forma natural de salir de una funcin es cuando se ejecuta todo su cdigo. Al final siempre tiene la
sentencia End Function
Se puede salir de una funcin antes de que termine. Por ejemplo, si se cumple una determinada
condicin, se puede salir de la funcin mediante la sentencia Exit Function

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 263

CORRECCION DE ERRORES Y DEPURACION DE PROGRAMAS


EL OBJETO ERROR
Una vez que conocemos gran parte del Visual Basic, y que seguramente habremos hecho alguna
aplicacin, es momento de pararnos en una de las cosas que un programador nunca debe olvidar: Un
programa no solo debe funcionar, sino que debe funcionar bien.
Parece que esta afirmacin carece de sentido o que al menos es una afirmacin gratuita. Sin embargo
es un defecto muy comn entre programadores noveles, quizs por la alegra que da el trabajo
terminado, olvidarse de algo tan fundamental como la calidad del programa, y perder por ello la alegra
que da el trabajo bien hecho.
Cuando terminamos un programa, lo normal es que no funcione bien. Mucho antes de terminarlo ya
habremos tenido la sorpresa de que Visual Basic ha detectado un error y detiene la ejecucin del
programa. Iremos corrigiendo los errores elementales que van apareciendo, errores de sintaxis, ficheros
que ya estaban abiertos, End If que nos faltaban, etc. Y el programa parece que ya puede funcionar
hasta el final. El programa debe entrar entonces en la fase de correccin de errores y optimizacin.
Correccin de Errores.
Denominamos Correccin de errores al proceso de la programacin en la que se analizan y corrigen los
errores existentes en el cdigo o en el funcionamiento del programa.
Podemos por tanto dividir los errores en errores de cdigo y errores de funcionamiento.
Es un error de cdigo, por ejemplo, la siguiente lnea de programa:
Open A:\MiFicher.Txt For Input as #1
Habr notado el error de bulto consistente en que A:\MiFicher.Txt debe ir entre comillas dobles. Este tipo
de error se detecta generalmente al ejecutar el cdigo. En este caso, Visual Basic nos dar el mensaje
de error Error de Sintaxis nada mas terminar de escribir la lnea. Errores como este, o el tpico If sin
End If seguro que se los ha encontrado repetidas veces y no vamos a ahondar mas en ellos. Se corrige
el error sintctico en el momento y el problema queda resuelto. Pero volvamos a la lnea de cdigo
anterior, esta vez ya bien escrita:
Open A:\MiFicher.Txt For Input as #1
Al estar escrita correctamente, esta lnea no nos puede dar error de sintaxis. Pero, Que ocurre cuando
estamos ejecutando el programa que contiene esa lnea, y en el momento de ejecutarla no tenemos
metido un disquete en la unidad A:? O piense lo que ocurrira si tenemos un disquete en A:, pero no
existe en l el fichero MiFicher.Txt. No existe ningn error de sintaxis. El programa puede funcionar
correctamente si, en el momento de la ejecucin de esa lnea, tenemos un disco en la unidad A: y ste
contiene un fichero llamado MiFicher.Txt. Sin embargo no puede funcionar si no tenemos metido el
disquete, o si este no tiene el mencionado fichero.
En cualquiera de estos dos ltimos casos se produce un Error de Ejecucin.
Existen dos tipos de errores de ejecucin: Errores Interceptables y Errores que no se pueden
interceptar.
Los errores interceptables son aquellos que Visual Basic conoce. Los dos errores anteriores son de este
tipo. Son errores no interceptables, aquellos que Visual Basic no puede detectar. No porque no los
conozca, sino porque el propio error deja sin trabajar a Visual Basic o incluso al sistema operativo.
Afortunadamente el sistema operativo est muy protegido, pero no por ello dejan de ocurrir estos
errores. Recuerda la frase El programa xxx ha causado un error de proteccin general en el Mdulo.....
Bueno, acaba de producir un error No Interceptable.
No solamente existen estos errores, tambin hay errores no catalogados y aplicables solamente al
programador. Piense en un bucle infinito. Un bucle infinito es una secuencia de instrucciones tal como:
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 264

Do While n < 2000


n=n+1
If n = 1000 then n = 0
Loop
Podr advertir que este bucle no se termina nunca, ya que n no podr alcanzar nunca el valor 2000 ya
que cada vez que llega a 1000 le cambiamos su valor a 0. Este tipo de error, ms normal de lo que
parece, ni lo detecta VB ni produce una cada del sistema operativo. Sin embargo es un error, pero en
este caso ser el propio programador quien se tenga que dar cuenta de l, ya que VB no puede
ayudarnos debido a que el cdigo, lnea a lnea, est perfectamente escrito.
Vemos por tanto que VB solamente nos ayudar en los errores de sintaxis, durante el tiempo de diseo,
y los errores interceptables en tiempo de ejecucin.

Errores Interceptables.
Veamos lo que dice la ayuda de VB para este tema:
Los errores interceptables pueden producirse cuando est ejecutando una aplicacin, tanto en el
entorno de Visual Basic como en modo autnomo. Algunos de estos errores pueden ocurrir tambin en
tiempo de diseo o en durante la compilacin.
Un error interceptable es, como decamos anteriormente, un error que Visual Basic conoce. Para
conocerlos, VB dispone de un objeto que vamos a ver a continuacin. El Objeto Error
Objeto Error
Contiene informacin sobre errores en tiempo de ejecucin.
El Objeto Error tiene Propiedades y Mtodos. Las propiedades del objeto Error las establece quien
genera el error. Por ejemplo, si el error se genera durante la ejecucin, ser VB quien genera las
propiedades del objeto Error. Pero puede ser tambin el programador quien genere el error. Lo veremos
mas adelante
Al objeto Error se le designa por Err
Las propiedades del Objeto Error son:
Description, HelpContext, HelpFile, LastDLLError, Number, Source

Propiedad Description
Devuelve o establece una cadena descriptiva asociada a un error.
Sintaxis

Variable = Err.Description
Err.Description = Cadena descriptiva del error

Veremos un ejemplo mas adelante.

Propiedad HelpContext

Devuelve o establece el identificador de contexto de un tema para un archivo de Ayuda de Microsoft


Windows.
Sintaxis
LSB

Err.HelpContext [= id_contexto]

Visual Basic Gua del Estudiante

Captulo 1

Pgina 265

Variable = Err.HelpContext
Esta propiedad y la siguiente le permiten presentar automticamente la ayuda cuando se produce un
error.
Propiedad HelpFile
Devuelve o establece la ruta completa del archivo de Ayuda de Microsoft Windows que debe mostrarse
al producirse el error.
Sintaxis

Err.HelpFile = C:\MiCarpeta\MiFicherodeAyuda.Hlp

Tambin puede leer el valor de esta propiedad:


Variable = Err.HelpFile
Cuando se especifica un archivo de Ayuda de Microsoft Windows en HelpFile, se le llama
automticamente cuando el usuario presiona el botn Ayuda (o la tecla F1) del cuadro de dilogo del
mensaje de error. Si la propiedad HelpContext contiene un identificador de contexto vlido para el
archivo especificado, se mostrar automticamente el tema correspondiente. Si no se especifica nada en
HelpFile, aparecer el archivo de Ayuda completo.
Propiedad LastDLLError
Devuelve un cdigo de error de sistema producido por una llamada a una biblioteca de vnculos
dinmicos (DLL). Esto ocurre cuando falla la ejecucin de una funcin API.
Propiedad Number
Esta es la propiedad mas importante del Objeto Error. Por ello es la propiedad predeterminada. Permite
conocer el nmero del error producido. Tambin nos permite establecer el nmero de error, cuando nos
interesa provocar un error mediante cdigo, con el mtodo Raise
Number es una variable tipo Long !!!
Sintaxis

Variable = Err.Number

Al ser la propiedad predeterminada, no es necesario poner Number. La siguiente lnea es


operativamente igual a la anterior:
Variable = Err
Source
Devuelve o establece el nombre del objeto o aplicacin que ha generado el error originariamente.
Sintaxis

Variable = Err.Source
Err.Source = expresin_cadena

Vea en la ayuda de VB la explicacin (muy ilustrativa) de esta propiedad.

El Objeto Error tiene solamente dos mtodos:

Mtodo Clear
Borra los valores de todas las propiedades del objeto Err.
Sintaxis
LSB

Err.Clear

Visual Basic Gua del Estudiante

Captulo 1

Pgina 266

Puede utilizar Clear para borrar explcitamente el objeto Err una vez que se ha tratado un error. Visual
Basic llama al mtodo Clear automticamente siempre que se ejecuta alguna de las instrucciones
siguientes:
Cualquier tipo de instruccin Resume
Exit Sub, Exit Function, Exit Property
Cualquier instruccin On Error
De aqu se desprende que un error no sale del procedimiento en el que se gener. Para salir de un
procedimiento el programa debe pasar necesariamente por una instruccin Exit Sub. En ese momento,
desaparecen todas las propiedades del Objeto Error.
Mtodo Raise
Genera un error en tiempo de ejecucin.
Sintaxis

Err.Raise(Nmero, Origen, Descripcin, ArchivoAyuda, ContextAyuda)

Los argumentos de Raise se describen a continuacin.


Nmero Requerido. Entero de tipo Long que identifica la naturaleza del error.
Origen
Opcional. Expresin de cadena que indica el objeto o aplicacin que ha generado
originariamente el error.
Descripcin Opcional. Expresin de cadena que describe el error.
ArchivoAyuda Opcional. Ruta del archivo de Ayuda de Microsoft Windows en el que se encuentra la
informacin sobre el error.
ContextoAyuda Opcional. Identificador de contexto que especifica el tema del archivo indicado en
ArchivoAyuda que contiene la informacin de ayuda del error.
Todos los argumentos son opcionales, excepto Nmero. Sin embargo, si utiliza Raise sin especificar
algunos argumentos, y si los valores de las propiedades del objeto Err no se han borrado, tales valores
se conservarn para el error actual.
Decamos al principio del Objeto Error que sus propiedades las establece quien las gener. Con el
Mtodo Raise se genera un error. Y vea que se pueden establecer sus propiedades.
Control de los errores
Ya sabemos que herramienta usa Visual Basic para detectar errores. Vamos a ver ahora como usarla.
Pero veamos previamente lo que es en Visual Basic una Rutina. No se extrae si alguien le llama Label
o Etiqueta. En otros lenguajes se llama as, incluso en Q-Basic, donde no existan los controles Visual
Basic llamados etiquetas, se usaba esta denominacin. En Visual Basic no podemos usarla, para no
confundirla con el control.
Una Rutina es un trozo de cdigo escrito en un procedimiento, que tiene un nombre. El nombre de la
Rutina puede ser cualquiera, y debe terminar con el carcter dos puntos (:) Por ejemplo:
RutinaErrores:
El nombre de la rutina debe ocupar l solo una lnea. Se accede directamente a la rutina cuando citamos
su nombre en el cdigo del procedimiento donde est la Rutina.
Para citarla, debemos usar ese nombre, quitando el carcter dos puntos final. Podemos llamarla
mediante la sentencia GoTo. Veamos un pequeo ejemplo. Es un botn de comando, y un TextBox. Si
el TextBox (Text1) mantiene su texto original (Text1) hacemos que el programa pase por la rutina. Si lo
hemos variado, hacemos que no pase:
Private Sub Command1_Click()
If Text1 = "Text1" Then
GoTo Rutina
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 267

Else
MsgBox "No pasa por la Rutina"
End If
Exit Sub
Rutina:
MsgBox "S pas por la Rutina"
End Sub
La rutina es en realidad un trozo de cdigo del procedimiento que se ejecutar, bien porque hayamos
dirigido all la ejecucin del programa (mediante GoTo) o bien porque el programa pase por la rutina al
ejecutarse. Observe el Exit Sub que tiene en la lnea inmediatamente anterior a la Rutina. Si no lo
ponemos, el programa pasar por la rutina una vez ejecutada la sentencia condicional If - Else - End
If, igual que si se tratase de cualquier otra parte del programa. Para evitar que pase por ella, ponemos
ese Exit Sub que har que el programa salga del procedimiento sin llegar al final.
En el ejemplo anterior, la condicin para que pasase por la rutina era que se cumpliese una determinada
condicin en Text1. Para que pase por una rutina, al darse la condicin de que ha ocurrido un error,
usaremos la instruccin On Error GoTo
Importante. Cuidado con GoTo
Hay un dicho entre los programadores de Visual Basic. Los programadores se dividen en tres grupos.
Los que nunca usan GoTo. Los que usan GoTo sin saber usarla y los que usan GoTo sabiendo usarla,
pero dicen que de estos ltimos hay muy pocos.

Instruccin On Error GoTo


Activa una rutina de tratamiento de errores y especifica la ubicacin de la misma en un procedimiento.
Tambin puede utilizarse para desactivar una rutina de tratamiento de errores.
Sintaxis

On Error GoTo Rutina


On Error Resume Next
On Error GoTo 0

Va a la Rutina especificada
Pasa del error y contina en la lnea siguiente a
la que provoc el error
Desactiva todo el tratamiento de errores que
haya activado en el procedimiento actual.

Veamos el ejemplo anterior, con la instruccin On error GoTo.


Private Sub Command1_Click()
On Error Resume Next
Con la lnea anterior le decimos que se olvide del error y siga en la lnea siguiente
a la que provoc el error
If Text1 = "Text1" Then
GoTo Rutina
Else
On Error GoTo 0
La lnea anterior desactiva el tratamiento de errores generado en la lnea segunda (On
Error Resume Next). Pruebe a quitar y poner esta lnea (On error GoTo 0)
Err.Raise 53
En la lnea anterior generamos artificialmente el error 53
MsgBox "No pasa por la Rutina"
Exit Sub
End If
Rutina:
MsgBox "S pas por la Rutina"
End Sub
Cuando insertamos la lnea On Error GoTo Rutina, el programa sabe que nada mas producirse un
error, debe ir a la rutina sealada. En esa rutina tomaremos las medidas adecuadas para que se
subsane el error producido. As por ejemplo, si en una lnea le decimos al programa que vaya a leer un
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 268

fichero de la unidad A:, puede ocurrir que la unidad no tenga metido el disco. O que lo tenga metido pero
que no exista el fichero en ese disco.
La rutina de correccin de errores debe contemplar cada uno de esos dos casos, y actuar de forma
distinta en uno y en otro.
Hagamos un ejemplo donde al pulsar un botn (Command2) se busca el fichero Mificher.Txt en el disco
A: y el contenido de ese fichero se coloca en Label1
Private Sub Command2_Click()
Dim Variable As String
Open "A:\Mificher.Txt" For Input As #1
Line Input #1, Variable
label1.Caption = Variable
Close #1
End Sub
Si no est metido el disco en la unidad A nos dar el siguiente error:
Se ha producido el Error 71 de tiempo de ejecucin. El disco no est listo
Si estuviese metido el disco, pero no tuviera un fichero llamado Mificher.Txt, dara este error:
Se ha producido el Error 53 de tiempo de ejecucin. No se ha encontrado el archivo
En realidad estos errores no son de programa, sino de una utilizacin incorrecta del programa, ya que
debera estar metido el disco, y que contuviese un fichero llamado Mificher.Txt. Pero en programacin
hay que prever estas eventualidades. Y lo lgico sera poner un aviso dicindole al usuario que la unidad
A: no est preparada (caso 1) o que el disco no contiene el fichero buscado (caso 2)

Instruccin Resume
Hemos visto en el apartado anterior la sentencia On Error Resume Next, de la que decamos que
pasaba del error y contina en la lnea siguiente a la que provoc el error. Es as ya que la Instruccin
Resume hace desaparecer el error mediante cdigo (Pone Err.Numbber = 0). Si le aadimos Next el
programa sigue ejecutndose en la lnea siguiente a la que gener el error.
La Instruccin Resume puede tener las siguientes sintaxis:
Sintaxis

Resume [0]
Resume Next
Resume Rutina

Resume [0] Si el error se ha producido en el procedimiento que contiene el controlador de errores, la


ejecucin contina con la instruccin que lo caus.
Puede ocurrir que el error no se haya producido en el mismo procedimiento que contiene la rutina de
tratamiento de errores, sino en otro al que se le ha llamado desde este. En este caso, la ejecucin
contina en la instruccin del procedimiento que contiene la rutina de tratamiento de errores desde la
que se llam a otro procedimiento.
Resume Next Si el error se ha producido en el procedimiento que contiene el controlador de errores, la
ejecucin contina con la instruccin inmediatamente posterior a la que lo caus. Si el error se ha
producido en un procedimiento llamado, la ejecucin contina en la instruccin del procedimiento que
contiene la rutina de tratamiento de errores (o la instruccin On Error Resume Next) inmediatamente
posterior a aqulla desde la que se llam a otro procedimiento.
Resume Rutina La ejecucin contina en la rutina citada en la instruccin. La rutina debe encontrarse
en el mismo procedimiento que el controlador de errores.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 269

Ya que conocemos las instrucciones On Error GoTo y Resume, veamos en el ejemplo anterior como
resolvemos el problema de que no exista disco en la unidad A: o que en el disco no exista el fichero
buscado:
EJEMPLO
Activemos la deteccin de errores e introduzcamos una rutina que detecte el error ocurrido y que haga
lo que tenga que hacer en cada caso:
Private Sub Command2_Click()
On Error GoTo RutinaErrores
Dim Variable As String
Open "A:\Mificher.Txt" For Input As #1
Line Input #1, Variable
Label1.Caption = Variable
Close #1
RutinaErrores:
If Err.Number = 71 Then
No hace falta poner Err.Number. Basta con Err
MsgBox "La Unidad A no tiene ningn disco. Introduzca uno"
Resume
Al poner Resume (sin mas) el programa seguir ejecutndose
en la misma lnea que provoc el error. Como hemos
intercalado un MsgBox, que lleva implcita una espera a que se
le haga click en su botn, durante esa espera el usuario puede
cambiar el disco y al reiniciarse el programa en esa lnea, ya
puede tener un disco para que no se repita el error.
End If
If Err = 53 Then
Aqu hemos puesto solamente Err
MsgBox "El disco A no tiene ningn fichero llamado Mificher.Txt. Ponga el disco correcto"
Resume
End If
End Sub
Ventana de Depuracin. El Objeto Debug
Es momento ahora de hablar de la ventana de depuracin. Esta ventana permite que Visual Basic se
comunique con nosotros en tiempo de ejecucin. Es la ventana de Debug. No est presente
normalmente en la pantalla, pero se presenta haciendo click en Ver | Ventana de Depuracin de la barra
de men de Visual Basic. En esta ventana se presenta lo que escribamos en un objeto preparado para
ayudarnos en la correccin de errores, que se llama precisamente Objeto Debug:
Este objeto no tiene propiedades y tiene solamente un mtodo: el Mtodo Print
En esta ventana podemos presentar otro tipo de datos, por ejemplo el valor de una variable en un
determinado momento:
Debug.Print MiVariable
Veremos en el ejemplo de este captulo una aplicacin de la ventana de depuracin que le dejar claras
las ideas.
Si queremos que cuando se produzca un error se nos presente en esa ventana, basta con insertar esta
lnea de cdigo en la Rutina de Error:
Debug.Print Err.Number
Debug.Print Err

o simplemente

Hemos visto la forma de detectar un error y tomar las medidas oportunas para que el programa siga
funcionando. Aqu lo hemos hecho solicitndole una operacin al usuario. En otros casos nos interesar
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 270

que el programa pase del error, en otras que repita un procedimiento... El programador deber ver en
cada caso la respuesta que debe dar el programa a un determinado error.
Un programa perfecto es aquel que contempla todas las posibilidades de error y les da solucin a todas.
Esto quiere decir, que un programa debera tener en cada procedimiento una llamada a la deteccin de
errores (On error GoTo ... ) y una rutina de correccin. El trabajo es grande. La recompensa tambin.
Pero un error muy comn entre programadores es autocomprobar sus errores. Realiza un programa y
comienza a ejecutarlo intentando descubrir los errores en los que puede caer. Le recomiendo que esa
labor la realice un compaero. La persona que realiz el programa sabe perfectamente lo que debe
hacer. Y an queriendo, le cuesta mucho trabajo cometer errores. Una persona que nunca haya
trabajado con el programa, lo que le cuesta trabajo es no cometerlos.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 271

LA AYUDA DE WINDOWS
NOTA sobre las ayudas de los programas Windows
Hasta ahora era normal presentar las ayudas en el formato csico de fichero .Hlp. Sin embargo, dado el
auge que ha tomado el formato Html (sobre todo desde que Microsoft lo incluy como una parte ms de
Windows), actualmente se est usando ms el formato .Html que el .Hlp. Las razones son bastante
obvias. La edicin de un fichero Html es mucho mas sencilla que la de un Hlp (Y si no se lo cree, lase
este captulo) Pese a todo, se sigue incluyendo este tema, ya que el formato Hlp sigue siendo actual.
Eso s, este captulo no se ha actualizado, y cuando se habla del HC.Exe deberamos estar hablando del
HelpWorkShop (HWC.Exe), un programa que funciona en Windows, y para el que es aplicable todo lo
descrito aque de los fichero .Hpj.
Toda aplicacin bien terminada debe tener una ayuda. Cualquier aplicacin realizada en Visual Basic
puede tenerla, usando para ello los recursos que brida Windows.
La presentacin de la ayuda podra hacerse mediante un formulario, donde se presentan distintos
ficheros segn las necesidades del usuario. Sin embargo esta forma de presentar la ayuda nunca llegar
a ser tan completa como la que brinda Windows, y el trabajo a desarrollar para igualar la presentacin de
Windows sera laborioso. Solucin : utilizar los recursos de Windows.
El recurso de Windows es un programa capaz de presentar ficheros de ayuda. Estos ficheros son un
poco especiales y solamente se pueden presentar mediante ese presentador de ficheros de ayuda. Ese
es el programa WinHelp.Exe para las versiones de 16 bits y las primeras versiones de Windows 95, y el
WinHlp32.Exe para Windows 98 y Windows NT4. Como en todas las aplicaciones de Microsoft (MS)
tienen compatibilidad hacia arriba. Por lo tanto no se extrae que una ayuda que le abre perfectamente
el WinHlp32.Exe, si la pretende abrir con el WinHelp.exe (que es ms antiguo) le diga que no se trata de
un fichero de ayuda.
Windows dispone de otra utilidad, el programa HC.EXE (Help Compiler) que puede adaptar el fichero
.RTF donde escribir la ayuda, a un formato capaz de ser interpretado por el WINHELP.EXE Lo vamos
viendo todo paso a paso.
Antes de comenzar a explicar como se realiza una ayuda Windows vamos a comentar el formato de
archivos RTF. Este formato posiblemente le sea familiar debido a que el control RichTextBox puede
guardar y leer ficheros en ese formato. Las siglas RTF vienen precisamente de Rich Text Format, en
castellano, Formato de Texto Enriquecido.
Cuando se edita un texto mediante un procesador de textos, el fichero resultante se guarda don un
formato distinto para cada procesador. De esta forma, un texto editado en WP no es compatible con el
P.T. AmiPro, con Word o con cualquier otro. Los fabricantes de estos procesadores de textos han tenido
que incluir una herramienta capaz de convertir un formato a otro para poder alcanzar la compatibilidad
entre ellos que el mercado exiga.
El Formato de Texto Enriquecido pretende ser un nexo de unin entre todos los procesadores de texto,
para poder intercambiar ficheros editados en uno u otro. De hecho, las ltimas versiones de los mas
importantes procesadores de textos incluyen la posibilidad de guardar y buscar el texto en este formato.
(WP, Word)
Este formato consiste en guardar mediante caracteres ASCII plenamente legibles tanto el texto escrito
como los tipos de letra, tamao, saltos de carro, etc. Veamos un ejemplo comparativo del mismo texto
escrito en Word, guardado en RTF y en ASCII :
Texto1
Este texto est escrito en Word. Observe que podemos poner letra negrita, letra cursiva, letra
subrayada. Podemos cambiar el color de las letras, rojo, verde, azul. Podemos cambiar el tamao de las
letras a tamao mas grande, mas pequeo, etc.

Fin Texto 1
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 272

El mismo texto en ASCII puro :


Texto1
Este texto est escrito en Word. Observe que podemos poner letra negrita, letra cursiva, letra
subrayada. Podemos cambiar el color de las letras, rojo, verde, azul. Podemos cambiar el tamao de las
letras a tamao mas grande, mas pequeo, etc.

Fin Texto 1
Y ahora el mismo texto en formato RTF. En este formato hubo que seccionar las lneas para poder
mostrarlas en una hoja, ya que RTF utiliza lneas sin retornos de carro. Se han seccionado las lneas
terminndolas con un guin bajo y comenzando en la lnea siguiente tambin con un guin bajo.
{\rtf1\ansi \deff5\deflang1033{\fonttbl{\f5\fswiss\fcharset0\fprq2 Arial;}}_
_{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;_
_\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;
\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\_
_green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\_
blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue_
_192;}{\stylesheet{\widctlpar
\f5\fs20\lang1034 \snext0 Normal;}{\*\cs10 \additive Default Paragraph Font;}_
_}{\info{\author LUIS SUAREZ BERNALDO}{\operator LUIS SUAREZ BERNALDO}_
_{\creatim\yr1997\mo3\dy9\hr11\min8}{\revtim\yr1997\mo3\dy9\hr11\min9}_
_{\version1}{\edmins1}{\nofpages1}
{\nofwords38}{\nofchars220}{\*\company }{\vern57431}}\margl1701\margr1701\_
_margt1417\margb1417 \deftab708\widowctrl\ftnbj\aenddoc\hyphhotz425\formshade_
_ \fet0\sectd \linex0\headery709\footery709\colsx709\endnhere {\*\pnseclvl1
\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstar_
_t1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\_
_pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5
\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcl_
_tr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\_
_pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pn_
_start1\pnindent720\pnhang
{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{_
_\pntxtb (}{\pntxta )}}\pard\plain \qj\widctlpar \f5\fs20\lang1034 Texto1
\par
\par Este texto est\'e1 escrito en Word. Observe que podemos poner letra _
_{\b negrita}, letra {\i cursiva}, letra {\ul subrayada}. Podemos cambiar_
_ el color de las letras, {\cf6 rojo}, {\cf4 verde}, {\cf2 azul}. Podemos _
_cambiar el tama\'f1o de las letras a {
\fs24 tama\'f1o mas grande}, {\fs16 mas peque\'f1o}, etc.
\par
\par
\par Fin Texto 1
\par \pard \widctlpar
\par }
Como puede observar, el RTF incluye el texto escrito casi en ASCII, pero aadiendo una serie de datos
respecto al tipo de letra, codifica los acentos, las ees, y hasta incluye, tomndolo del ordenador, el
nombre del operador que lo ha escrito. Estas informaciones tambin se guardan cuando se archiva un
texto en el formato propio del procesador de textos, pero lo hace en binario, por lo que no lo podemos
visualizar. El formato RTF, dentro de que mete toda esa informacin adicional, lo archiva con caracteres
ASCII.
La utilidad que tiene Windows para presentar las ayudas utiliza precisamente este formato RTF. Por ello,
debemos disponer de un procesador de textos que pueda guardar el texto escrito en este formato.
(Word, WP5, WP6 y otros) Los ejemplos de estos apuntes se han realizado en Word.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 273

Antes de decidirnos a escribir el fichero de ayuda debemos pensar muy bien lo que vamos a poner en l.
Pensemos ante todo a que personas va dirigida la aplicacin, sus posibles conocimientos de informtica
y de otros temas que estarn relacionados con la aplicacin. Es decir, planifiquemos la ayuda antes de
comenzar a hacerla.
Para acceder a la ayuda, Windows ofrece la posibilidad de pulsar F1 . Nuestras aplicaciones deben
sacar la ayuda pulsando F1. Lo podrn hacer mediante otros procedimientos. Comencemos por lo mas
sencillo, una ayuda de una nica pgina.
Escriba el texto de ayuda con Word y gurdelo en formato RTF, en cualquier directorio, pero
preferentemente en uno que no se mezcle con otros ficheros para poder localizarlo mejor. Cree si es
necesario un directorio exclusivo para la ayuda. Imaginemos que lo creamos y es el C :\DIRAYUDA,
donde guardamos el fichero de ayuda con el nombre AYUDA1.RTF
Este archivo no lo puede utilizar directamente el programa WINHELP.EXE. Hay que compilarlo. Para
ello utilizamos el compilador HC.EXE. Este compilador no es una herramienta Windows, por lo que
tendr que ir al DOS y ejecutarlo. El programa HC.EXE se encuentra en el directorio C :\ ..... \VB\HC
Pero al compilador HC.EXE hay que suministrarle la informacin para que pueda trabajar. Esa
informacin se la damos en un fichero que le pasaremos como parmetro, que debe tener extensin
.HPJ y que meteremos en el mismo directorio donde tengamos el fichero de ayuda AYUDA1.RTF
Este fichero estar editado en ASCII puro. Puede editarlo con el EDIT de MS-DOS o con el Block de
Notas de Windows. Imaginemos que lo vamos a llamar FICHAYUD.HPJ y como se dijo, se meter en el
mismo directorio donde est el fichero de ayuda. (C :\DIRAYUDA) El nombre que decida para este
fichero con extensin .HPJ ser el que tenga el fichero de ayuda (Que se obtendr de la compilacin y
tendr por extensin .HLP) Tendr, de momento, dos lneas.
[FILES]
AYUDA1.RTF
Vayamos al directorio C :\ ...... \VB\HC (en MS-DOS) y tecleemos
HC C:\DIRAYUDA\ FICHAYUD.HPJ
La compilacin no suele dar problemas sobre todo en un fichero de ayuda tan simple de una nica
pgina. Al compilar, obtenemos un fichero con el mismo nombre que el fichero .HPJ y extensin .HLP,
(FICHAYUD.HLP en nuestro caso) que lo dejar en el directorio donde estuviera el programa HC.EXE.
(Posiblemente el C :\VB\HC) Debe moverlo a otro directorio donde no estorbe y lo podamos localizar sin
problemas. Movmoslo al C :\DIRAYUDA Vayamos a nuestra aplicacin VB y abramos el men de
Herramientas | Opciones para sacar el cuadro de Opciones. Vaya a la pestaa de Proyecto y busque el
directorio y nombre del fichero .HLP haciendo click sobre el cuadrado con tres puntos (...) que est a la
derecha del TextBox de Archivo de Ayuda. Se le abrir un CommonDialog para buscarlo.
NOTA : Para evitar liarse con los directorios, es medida siempre prudente llevarse el compilador
de ayudas HC.EXE al directorio donde tengamos el fichero .RTF y el .HPJ.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 274

Haga click en Aceptar y ejecute la aplicacin. Pulse F1. SORPRESA ! Tenemos en pantalla la ventana
de ayuda de Windows con el fichero que habamos escrito. F1 ha invocado a WINHELP.EXE y este
programa present el fichero de ayuda asociado con el proyecto.
Observe que el texto se adapta a las dimensiones de la ventana. Y si supera en vertical las dimensiones
de la ventana, aparecen barras de scroll verticales. Puede de esta forma recorrer todo el fichero de
ayuda.
Sin embargo este procedimiento no sera el mas indicado para una informacin de ayuda extensa.
Deberemos poner varias pginas. Si lo hacemos as, al pulsar F1 siempre aparecer la pgina 1. Si
aparece siempre la pgina 1, pongamos en esta primera pgina el ndice de temas, y en las pginas
sucesivas cada uno de los temas. Ya veremos como acceder a cada una de las pginas haciendo click
sobre la lnea del ndice que contiene el ttulo del tema deseado. Tal y como lo hace con cualquier
aplicacin Windows.
Volvamos al editor Word y abramos el fichero que habamos creado de una pgina, y adale mas
pginas introduciendo avances de pgina manuales (Se introducen con Control + Intro)
Imaginemos que tenemos esta configuracin del fichero :

INDICE
1 - Introduccin a la aplicacin
2 - Acceso a la Base de Datos
3 - Introduccin de datos
4 - Lectura de datos
---------------

salto de pgina manual - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Introduccin a la Aplicacin
Esta aplicacin est realizada para . . . . . . . . . .
--------------

salto de pgina manual - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Acceso a la Base de Datos


LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 275

Para abrir la Base de datos . . . . . . . . .


--------------

salto de pgina manual - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Introduccin de datos
Para introducir datos . . . . . . . . . . . .
--------------

salto de pgina manual - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Lectura de datos
Para leer los datos . . . . . . . . . . . . . . . .

Ya tenemos hecho un fichero de ayuda con varias pginas. No es suficiente esto, ya que WINHELP.EXE
, pulsando F1, solamente nos mostrar la pgina 1. Debemos hacer algo para, una vez en la pgina 1,
que nos estar mostrando el ndice, poder acceder a cada una de las pginas haciendo click sobre la
lnea del ndice que contiene el tema de inters.
Para ello debemos poner un identificador a cada una de las pginas. Este identificador debe ser nico,
es decir, no pueden existir dos pginas con el mismo identificador.
Para introducir un identificador en una pgina, una vez que tenga el fichero de ayuda terminado, sitese
con el cursor al comienzo del ttulo de la primera pgina (despus del ndice), justamente al lado de
Introduccin a la Aplicacin . Inserte en ese punto una Nota al pi (Abra el Men Insertar | Nota al
Pi del Word) Le aparecer esta ventana :

Introduzca una almohadilla (#) en el TextBox Marca personal. Haga click sobre Aceptar.
Le aparecer en la parte inferior de la pantalla un cuadro para introducir el identificador de esa pgina.
Repita el proceso para todas las pginas insertndoles una Nota al pi a cada una. Al final obtendr este
resultado :
INDICE
1 - Introduccin a la aplicacin
2 - Acceso a la Base de Datos
3 - Introduccin de datos
4 - Lectura de datos
- - - - - - - - - - - - - - - - - - - - - salto de pgina manual - - - - - - - - - - - - - - - - - - - - - - - # Introduccin a la Aplicacin
Esta aplicacin est realizada para . . . . . . . . . .
--------------------#

salto de pgina manual

-----------------------

Introduccin

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 276

Acceso a la Base de Datos

Para abrir la Base de datos . . . . . . . . .


- - - - - - - - - - - - - - - - - - - - - salto de pgina manual - - - - - - - - - - - - - - - - - - - - - - - # Introduccin de datos
Para introducir datos . . . . . . . . . . . .
-------------------# Lectura de datos

salto de pgina manual

-----------------------

Para leer los datos . . . . . . . . . . . . . . . .


EN ESTA PARTE DE LA PAGINA VERA UNA SEPARACION QUE PONE, A LA IZQUIERDA
Todas las notas al pie
#

Introduccin
Acceso
# Meterdatos
# Leerdatos
#

(Observe que estamos simulando la ventana de Word. Donde ve - - salto de pgina manual - entienda que estamos simulando lo que Vd. ve en la ventana real)
En la parte inferior puede ver los identificadores que se han asociado a cada pgina. Qu podemos
hacer para asociar estos identificadores a las lneas correspondientes del ndice ? Muy sencillo, y es el
siguiente paso que debe hacer :
Volvamos a la primera pgina del documento Word, donde tenemos el ndice.
INDICE
1 - Introduccin a la aplicacin
2 - Acceso a la Base de Datos
3 - Introduccin de datos
4 - Lectura de datos
Habr observado en las aplicaciones Windows que para seleccionar un tema hay que poner el puntero
del ratn sobre la lnea deseada, que est en color verde, y en ese momento el puntero se convierte en
una mano. En nuestra aplicacin ocurrir lo mismo. Seleccione todas las lneas que quiere asociar a
cada uno de los identificadores (Una a una o todas a la vez, dependiendo de como las tenga dispuestas),
y vaya al men Formato | Fuentes . Le aparecer el cuadro de dilogo. Vaya al TextBox Subrayado de
ese cuadro de dilogo y elija Doble.

Acceso
Meterdatos
#
Leerdatos
#

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 277

Al ponerles doble subrayado, le aparecern en la ayuda de color verde, y el puntero se le transformar


en una mano cuando lo ponga encima de una de esas lneas. Pero todava queda asociarlas a cada uno
de los identificadores. Para ello tiene que llevar el puntero del ratn justamente al final de cada una de
las lneas. Al hacer click el puntero de escritura se coloca en ese punto. Tiene que escribir a continuacin
de cada lnea el nombre del identificador que corresponda. Pero lgicamente no querr que se vea en la
pantalla de ayuda. Por lo tanto debe hacerlo invisible. Para escribir un texto invisible en Word hay que
pulsar las teclas Control + Maysculas + O. Pulse las tres al mismo tiempo y a continuacin escriba el
nombre del identificador que corresponda. No ver lo que escribe pues para eso est escribiendo con
texto invisible. Puede visualizarlo mediante el botn

del editor Word. Ver tambin todos los caracteres de control del documento. Si lo prefiere, vaya al
men Herramientas | Opciones y sobre la pestaa Ver seleccione Texto oculto.
Proceda de igual forma con todas las lneas del ndice. Cuando termine, guarde el documento en
formato RTF y complelo de la forma explicada mas atrs. Posiblemente ahora le salgan errores de
compilacin, pues el compilador comprueba que todos los identificadores se corresponden en el ndice y
en las pginas. Si le falta algn pie de pgina o un salto de carro manual le dar error. Tambin le dar
un error, mejor dicho una observacin, indicndole que hay prrafos ocultos. Es lgico, ha detectado los
textos ocultos que contiene el fichero. Ni caso. Le habr creado el archivo .HLP y le sugiero que lo
pruebe, movindolo al directorio C :\DIRAYUDA y ejecutando la aplicacin. Pulse F1 y le saldr la pgina
con el ndice y las lneas del ndice en verde. Si lo ha hecho todo perfectamente, al seleccionar una y otra
lnea le aparecer la pgina correspondiente.
Ya tenemos una ayuda de varias pginas !
Ventanas Emergentes
Es posible que dentro de la informacin presentada en cualquiera de las pginas anteriores, exista una
palabra o frase que quisiera explicar con mas detalles. Habr observado en las ayudas de Windows que
algunas frases dentro de las pginas de ayuda estn en verde, y al acercar el puntero del ratn a ellas se
convierte en una mano. Para poder hacer lo mismo en nuestra ayuda, volvamos al documento Word.
INDICE
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 278

1 - Introduccin a la aplicacin
2 - Acceso a la Base de Datos
3 - Introduccin de datos
4 - Lectura de datos
- - - - - - - - - - - - - - - - - - - - - salto de pgina manual - - - - - - - - - - - - - - - - - - - - - - - # Introduccin a la Aplicacin
Esta aplicacin est realizada para . . . . . . . . . .
- - - - - - - - - - - - - - - - - - - - - salto de pgina manual
# Acceso a la Base de Datos

-----------------------

Para abrir la Base de datos . . . . . . . . .


- - - - - - - - - - - - - - - - - - - - - salto de pgina manual - - - - - - - - - - - - - - - - - - - - - - - # Introduccin de datos
Para introducir datos . . . . . . . . . . . .
-------------------# Lectura de datos

salto de pgina manual

-----------------------

Para leer los datos . . . . . . . . . . . . . . . .

Observe unas palabras que estn subrayadas. Imagnese que esas palabras tienen un significado que
queremos explicar con mayor detalle. Puestos en nuestro caso, queremos explicar con mas detalle lo
que es una aplicacin, una Base de Datos, introducir y leer.
Pretendemos que, al hacer click sobre una de estas palabras se abra, dentro de la ventana de ayuda,
otra ventana con la explicacin de lo que es esa palabra concreta. Por lo tanto, debemos introducir esas
informaciones a base de introducir nuevas pginas en el documento Word donde editamos el fichero de
ayuda. Adalas de la misma forma insertndoles un pie de pgina y el identificador deseado, de la
misma forma que se explic mas atrs. Recuerde que el identificador debe ser nico.
Una vez terminado de introducir todas las nuevas pginas, vaya a las palabras o frases que quiere
explicar con el texto de esas pginas, seleccinelas y deles el atributo de subrayado simple (Hgalo de
forma similar a cuando hizo lo del subrayado doble, pero esta vez SIMPLE) Introduzca inmediatamente
despus de la palabra o frase un texto oculto con el nombre del identificador seleccionado para la pgina
deseada en esa palabra. Guarde el documento Word y vuelva a compilar como anteriormente. Ejecute la
aplicacin y compruebe como vamos avanzando en el tema de las ayudas de Windows.
Si repasamos las propiedades de los controles, seguro que se acuerda de la propiedad HelpContextID
que tenan la mayora de los controles VB. En aquel momento decamos que esa propiedad que
establece un nmero de contexto asociado para este control. Este nmero se aplica para determinar la
ayuda interactiva asociada a este control. Ha llegado el momento de sacarle partido a esa propiedad.
Podemos usar la tecla F1 para acceder al ndice de la ayuda de una aplicacin y movernos a lo largo de
la ayuda seleccionando una u otra informacin. A veces resulta prctico seleccionar directamente la
ayuda correspondiente a la funcin de un control. Para poder hacer esto, asociaremos una de las
pginas del documento Word anterior al nmero que figura en la propiedad HelpContextID. Cuando ese
control tenga el foco, al pulsar F1 saldr como pgina por defecto la pgina asociada mediante la
propiedad HelpContextID.

Introduccin
Acceso
#
Meterdatos
#
Leerdatos
#

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 279

Para establecer esta relacin vayamos al fichero con extensin .HPJ que serva para introducir los datos
al Help Compiler. En nuestro caso se llamaba FICHAYUD.HPJ y tena por el momento, solamente dos
lneas.
[FILES]
AYUDA1.RTF
En estas dos lneas le introducamos el nombre del fichero de ayuda [FILE]. Aadamos ahora en otro
apartado [MAP] la relacin entre los identificadores de pgina y los nmeros de contexto de la propiedad
HelpContextID de cada uno de los controles que la tengan activada (valor distinto a 0). Se escribir el
nombre del identificador de pgina, y separado por un espacio o un tabulador, el nmero de contexto :
[MAP]
Identificador1
Identificador2
Identificador3
Identificador4

1
2
3
4

En este caso, cuando un control que tiene en su propiedad HelpContextID el nmero 3 tiene el foco, al
pulsar F1 aparecer como pgina por defecto la correspondiente a la explicacin con identificador
nombre Identificador3. Lo mismo ocurrir con el resto de los identificadores.
Aada a su aplicacin 4 TextBox y asgneles los valores 1, 2, 3 y 4 a sus propiedades HelpContextID.
Vuelva a compilar la ayuda y ejecute la aplicacin. Vaya pasando el foco de uno a otro TextBox y
comprobndolo.
Puede que las ayudas que quiera aportar a cada uno de los controles sea muy breve, caso por ejemplo
de la que puede introducir en los TextBox para indicar al usuario lo que se va a hacer con el dato
concreto que se va a meter en ese TextBox. Y que esas ayudas breves sean muy numerosas y tal vez
cambiantes de un usuario a otro. Esto complicara su fichero de ayuda original, al que debera introducir
muchas pginas nuevas. Puede editar estas pequeas ayudas en otro documento Word, de la misma
forma que se ha descrito, y darle un determinado nombre (AYUDA2.RTF para nuestro ejemplo) y
aadirlo como otro fichero en la lista [FILES]. Colquelo tras el fichero anterior, pues el que lleva el
ndice debe ser el primero que figure en la lista. Debe aadir la relacin entre los nombres de
identificador que haya puesto en ese nuevo fichero y los nmeros de contexto de cada control.
El fichero FICHAYUD.HPJ queda de momento con la siguiente forma :
[FILES]
AYUDA1.RTF
AYUDA2.RTF
[MAP]
Identificador1
Identificador2
Identificador3
Identificador4

1
2
3
4

Este procedimiento de acudir rpidamente a la ayuda de un determinado control puede que no sea el
ideal, ya que en una aplicacin, siempre tiene el foco algn control. Si ese control que ahora mismo tiene
el foco tiene activado el HelpContextID, y el usuario pulsa F1, con la intencin de ir a ver cualquier cosa
no relacionada con el control que tiene actualmente el foco, se ver sorprendido con que aparece una
informacin que nada tiene que ver con la esperada (ndice). En cualquier caso, siempre podr ir al
ndice haciendo click en el botn CONTENIDO de la ventana de ayuda, pero en principio no est bien
que le aparezca en pantalla una informacin no esperada. Tiene solucin, incluya en el men (palabra
Ayuda) o en un control Image con el smbolo ? una llamada al programa WINHELP.EXE, pasndole
como parmetro el nombre del fichero de ayuda. Esto lo podemos hacer mediante la funcin SHELL
SHELL WINHELP.EXE C:\DIRAYUDA\FICHAYUD.HLP , 1

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 280

(Vea funcin Shell. No se olvide del 1 final, pues si no lo pone la ayuda le saldr minimizada. Puede
poner tambin un 4)
Tambin puede utilizar para este fin el CommonDialog. Introduzca un CommonDialog en su aplicacin y
ponga en su propiedad HelpFile el nombre del fichero de ayuda. La propiedad HelpCommand de este
CommonDialog debe estar puesta a 3 para que comience mostrando el ndice de la ayuda. En estas
condiciones, en vez de acudir a la funcin Shell para ejecutar el WINHELP.EXE,
ejecute
CommonDialog.ShowHelp. Vea con mas detalles las propiedades del CommonDialog, pues le permite
presentar otras funciones de la ayuda de Windows (Ayuda de la Ayuda, etc.)
Titulo de la ventana de Ayuda
Habr observado que la ventana de ayuda tiene, en la barra de ttulo el siguiente texto : Ayuda de
Windows. Si deseamos personalizarlo y poner el nombre de nuestra aplicacin, basta con aadir un par
de lneas al fichero FICHAYUD.HPJ. Las correspondientes al apartado [OPTIONS]. Este apartado debe
ir en primer lugar del fichero, y puede llevar la informacin de la barra de ttulo y el CopyRight. Estos dos
parmetros se introducen de la siguiente forma :
[OPTIONS]
TITLE= Nuestra Aplicacin VB - Fichero de Ayuda
COPYRIGHT= Nombre del Autor(a)
[FILES]
AYUDA1.RTF
AYUDA2.RTF
[MAP]
Identificador1
Identificador2
Identificador3
Identificador4

1
2
3
4

El dato introducido en la lnea COPYRIGHT sale en el men de la pantalla de ayuda, en Ayuda |


Versin.

Grficos en la ventana de Ayuda.


Si necesita introducir un grfico en la ventana de ayudas puede hacerlo de dos formas :
- Introducirlo en el fichero Word. Esta opcin es recomendable si el grfico es muy pequeo.
- Introducirlo directamente desde un fichero .BMP .WMF (Metarchivo). Recomendable
grfico es grande. Este mtodo se denomina de referencia a un grfico.

cuando el

Para introducirlo por el primer procedimiento, inserte el grfico en el texto Word y proceda como
siempre.
Para introducirlo por el segundo mtodo, tiene tres posibilidades : Introducir el grfico en el centro de la
ventana de ayuda, introducirlo a la izquierda con texto a su derecha o a la derecha con texto a su
izquierda.
Se supone que el grfico est en un fichero llamado GRAFICO1.BMP en el directorio C:\DIRAYUDA.
Vayamos al documento Word, y en el sitio donde desee introducir el grfico inserte la(s) lnea(s) :
{bmc c:\dirayuda\grafico1.bmp}Le colocar este grfico en medio de la ventana de ayuda, y este texto
inmediatamente debajo del grfico.
o

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 281

{bml c:\dirayuda\grafico1.bmp}Le colocar este grfico a la izquierda de la ventana de ayuda, y este


texto a la derecha del grfico.
o
{bmr c:\dirayuda\grafico1.bmp}Le colocar este grfico a la derecha de la ventana de ayuda, y este
texto a la izquierda del grfico.
Se han resaltado en negrita las tres opciones. Recuerde la llaves donde se encierra la posicin y el
nombre (y path) del grfico.
Debe tener cuidado al introducir grficos, ya que el compilador (HC.EXE) trabaja en DOS, y me da la
impresin de que no utiliza mas que los primeros 640 Ks. de memoria. Con un grfico de 470 Ks. usado
en la preparacin de estos apuntes fue incapaz de compilarlo, dando error de memoria insuficiente. (Y
no es que el Ordenador no tenga RAM suficiente)
Historial
La Ayuda de Windows nos permite recordar todas las pginas sobre las que se hizo una consulta. Esto
puede ser muy til, pues tenemos muy accesible los temas que hemos consultado, para poder realizar
una nueva lectura de los mismos si fuese necesario.
Para obtener la ventana de historial, basta con hacer click en la barra de men de la ventana de Ayuda
en Opciones | Mostrar Ventana de Historial.
Pero para que se pueda mostrar el historial, es necesario darle un nombre a las pginas, y ser ese
nombre el que figure en la ventana de historial. Ese nombre es distinto del identificador de pgina,
aunque no hay ningn problema porque sea el mismo. Ponga como nombre de la pgina una palabra
que identifique esa pgina de una forma nica.
Para poner el nombre a la pgina, vaya al comienzo de cada pgina e introduzca una nota al pi de la
misma forma que cuando pona el identificador. En este caso el smbolo a introducir en la Marca
personal es el $. Proceda a introducir el nombre en la parte de abajo de la pantalla de Word
Palabras Clave
La Ayuda de Windows nos permite accede a una pgina usando como criterio de bsqueda ciertas
palabras que ponemos como clave. Por ejemplo, si queremos que aparezca nuestra pgina de ejemplo
que habla de Acceso a la Base de Datos, cuando el usuario busca una de las siguientes palabras :
Tablas, Base, Registro, y a la de Lectura de Datos cuando busque Obtener, Leer y Visualizar
Volvamos al editor Word, a las dos pginas nombradas y al lado de las notas al pi anteriores,
introduzca otra, esta con la Marca personal K. En la parte inferior de la pantalla, donde pone el nombre
de la nota al pie, ponga introduzca las palabras clave para cada una de ellas, separadas con una coma.
Salve el fichero RTF y vuelva a compilar. Ejecute la aplicacin y saque la Ayuda. Observar que el botn
Bsqueda de la ventana de ayuda est habilitado. Haga click en este botn y ver que esas palabras ya
figuran en la lista.
Usar los Grficos de la Ayuda como enlaces a pginas
Lo mismo que hacamos con las palabras, bien las del ndice, a las que con un subrayado doble les
introducamos un enlace a una pgina, o con cualquier palabra o frase de una pgina, que mediante un
subrayado simple les introducamos un enlace a una ventana emergente, lo mismo podemos hacer con
la referencia a un grfico. (Vea un poco mas arriba, las referencias a los grficos del tipo {bmc
c:\dirayuda\grafico1.bmp} ) Si seleccionamos esa referencia y le ponemos el atributo de doble
subrayado, al acercar el puntero del ratn a ese grfico (en la ayuda) nos mostrar una mano, y
haciendo click sobre el grfico sacar la pgina correspondiente. Si le ponemos el atributo de subrayado
simple, nos sacar una ventana emergente. Eso s, en cualquiera de los dos casos, deberemos poner, a
continuacin de la referencia al grfico, con texto invisible, el indicador de pgina que especifique la
pgina o ventana emergente que queremos mostrar.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 282

Pginas en secuencia
Si tenemos una ayuda muy larga y la queremos leer toda, con lo que sabemos deberamos ir al ndice y
desde all acceder a la pgina 1, leerla, volver al ndice, acceder a la pgina 2, leerla, volver al ndice ....
Para evitar este proceso, y acceder secuencialmente a cada una de las pginas, podemos asignar a
cada una de las pginas un cdigo de secuencia, que podr estar formado por caracteres alfanumricos.
Este cdigo de secuencia ser el que marque el orden de aparicin de las pginas. Pero el orden de
aparicin ser segn el cdigo ASCII de los caracteres que formen ese cdigo, comenzando por la
izquierda. Por lo tanto puede ocurrirle la paradoja de que aparezca primero la pgina 100 que la 65. Es
decir, si los cdigos estn formados por nmeros aparecern primero todas las pginas que comiencen
por 1, aunque el valor numrico de una de ellas sea superior a otra que comience por 2, 3, 4, ...
Para asignar este cdigo de secuencia deberemos introducir otra nota al pi para cada pgina, en este
caso con la marca personal + (signo mas). Tambin deberemos indicarle al WinHelp que deseamos
sacar los botones (<<) y (>>) para desplazarnos por las pginas. Esto se consigue aadiendo una
nueva seccin al archivo .HPJ que se denomina [CONFIG] y le introduciremos en esta seccin la
expresin BrowseButtons()
El fichero FICHAYUD.HPJ quedar de la siguiente forma :

[OPTIONS]
TITLE= Nuestra Aplicacin VB - Fichero de Ayuda
COPYRIGHT= Nombre del Autor(a)
[FILES]
AYUDA1.RTF
AYUDA2.RTF
[MAP]
Identificador1
Identificador2
Identificador3
Identificador4

1
2
3
4

[CONFIG]
BrowseButtons()
Encabezado de pginas
Habr observado en la ayuda de Visual basic que una o dos lneas en la parte superior de la ventana de
ayuda se conservan all continuamente aunque nos desplacemos hacia abajo mediante los cursores de
desplazamiento. Esas lneas son el Encabezado de pgina. Para conseguir esto en nuestra ayuda
deberemos escribir las lneas que queramos que se conserven como encabezado de pgina al principio
de cada pgina, seleccionarlas con el cursor del ratn y abrir el men Formato | Prrafo (Se supone
que est utilizando el procesador de texto Microsoft Word) donde le aparecer un cuadro de dilogo con
dos solapas, Sangra y Espacio y Presentacin. Elija Presentacin y dentro de esta solapa, active la
casilla Conservar con el Siguiente. Las lneas que hubiera seleccionado se le conservarn como
Encabezado de pgina.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 283

VENTANAS MULTIPLES
Con frecuencia es til emplear varias ventanas para mostrar la informacin de una aplicacin. El ejemplo
que tenemos mas a mano es el de la Ayuda de Visual Basic. Cuando tenemos seleccionada la ayuda de
un control, se pueden observar al menos dos palabras que nos llevan a una segunda ventana :
Propiedades y Eventos. Cuando elegimos una de estas informaciones aparece una segunda ventana
que nos muestra la informacin pedida, sin perder la informacin que tenemos en la primera ventana.
Esta segunda ventana se comporta de manera idntica a la primera, en cuanto a llamadas a otras
pginas o a mens emergentes.
Para poder presentar esta segunda ventana es necesario primero definirla. Para ello volvamos a nuestro
fichero .HPJ y le aadiremos un nuevo apartado : WINDOWS, donde introduciremos el nombre de la
nueva ventana, el ttulo de la misma (El ttulo que aparecer en su parte superior), y, entre parntesis, su
posicin y dimensiones.
El fichero .HPJ quedar de la siguiente forma, tras introducirle dos nuevas ventanas :
[OPTIONS]
TITLE= Nuestra Aplicacin VB - Fichero de Ayuda
COPYRIGHT= Nombre del Autor(a)
[FILES]
AYUDA1.RTF
AYUDA2.RTF
[MAP]
Identificador1
Identificador2
Identificador3
Identificador4

1
2
3
4

[CONFIG]
BrowseButtons()
[WINDOWS]
Ventana2 = Titulo de esta Ventana, (PosicinX, PosicinY, DimensinX, DimensinY)
Ventana3 = Titulo de esta Ventana, (PosicinX, PosicinY, DimensinX, DimensinY)

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 284

Para llevar la informacin a una de estas ventanas, en vez de a la ventana principal, se aadir tras el
identificador de la pgina que queremos enviar a la nueva ventana el smbolo > y a continuacin el
nombre de la ventana.
El Objeto App
Introducimos aqu un nuevo objeto Visual Basic. El objeto App es un objeto global al que se accede con
la palabra clave App. (No se le. El objeto App no es ni mas ni menos que un conjunto de datos acerca
de la aplicacin) Determina o especifica informacin sobre el ttulo de la aplicacin, la ruta de acceso de
su archivo ejecutable y los archivos de Ayuda, y si est ejecutndose una instancia anterior de la
aplicacin. Este objeto tiene solamente propiedades. No tiene ni Eventos ni Mtodos. Una de sus
propiedades es HelpFile, propiedad que es de lectura y escritura. Es decir, podemos obtener el nombre
del fichero de ayuda de una aplicacin consultando el valor de esa propiedad del Objeto App. En el
ejemplo siguiente introducimos el nombre del fichero de ayuda en el Label1
Label1.caption= App.HelpFile
Como la propiedad HelpFile tambin es de escritura, se puede cambiar en tiempo de ejecucin el
fichero de ayuda. Piense lo til que puede resultar esto para cambiar el idioma de la ayuda de una
aplicacin. Para ello basta con imponer el nombre (con su Path) del nuevo fichero de ayuda :
App.HelpFile = "C:\ ..... \ ..... \ nuevaayuda.hlp"
(Vea un poco mas adelante mas informacin sobre el Objeto App)

Otros Compiladores de Ayuda (HCP.EXE, HCW.EXE, ...)


En este captulo hemos citado como compilador del fichero de ayuda al programa HC.EXE que
habitualmente se encuentra en el directorio C :\ . . . . \ VB\HC. Este compilador trabaja perfectamente
con ficheros .RTF creados con las versiones primeras del Word.
Si Ud. realiza los ficheros .RTF con el Word para Windows95 (Word 6.0), no habr tenido ningn
problema con lo descrito anteriormente. Si tiene Word de office97 (W97) habr observado que al
compilar la ayuda con el HC.EXE le sale un error. No se preocupe. Es que el fichero RTF creado por
W97 es distinto del creado por W95, lo cual, aparte de dar una idea de como se trabajan los temas de
compatibilidad entre procesadores que deberan ser compatibles, nos obliga a buscar otro compilador de
ayudas.
No lo intente con el HCP.EXE. Tampoco vale. Busque por Internet un fichero llamado HCW.EXE,
compilador que tiene adems la ventaja de que trabaja en Windows. Usa el mismo fichero .HPJ y acepta
los ficheros .RTF creados con W95 y W97
El aspecto de este compilador de ayudas es el siguiente :

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 285

Aparte de este compilador, existen otros que funcionan de forma similar. No vamos a explicar cada uno
de los compiladores que podamos encontrar, que como se dijo hay bastantes y (creo que) shareware.
Lo importante es que todo lo dicho respecto a la edicin de los ficheros :RTF y .HPJ sigue siendo vlida
para estos compiladores. Existen algunos compiladores que tambin crean el fichero .HPJ. Es
comprensible no intentar examinar uno a uno en esta Gua del Estudiante.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 286

Visual Basic - Gua del Estudiante Cap. 11


BASES DE DATOS EN VISUAL BASIC (1)
A modo de introduccin
Todo lo visto hasta ahora en este libro es el Visual Basic elemental que debe conocer necesariamente
para realizar una aplicacin. Sin embargo hay algo que falta. El 90 % de las aplicaciones que va a
realizar van a llevar una base de datos. Es lgico. Una aplicacin se hace normalmente para presentar
datos, datos que habr que introducir y mostrar de forma conveniente. Lo de introducir y mostrar
datos son las materias que va a ver en los captulos siguientes, pero no olvide lo de mostrarlos de
forma conveniente, y es en eso donde tendr que aplicar todo lo que lleva aprendido hasta ahora. Se
observa con mucha frecuencia que el alumno tiene una prisa desmesurada por llegar a los temas que
tratan las bases de datos, dejando un poco de lado la interface necesaria para su introduccin y
presentacin, que es lo que da ergonoma y elegancia a una aplicacin. El conocimiento de bases de
datos es necesario. Lo explicado hasta ahora, imprescindible.
Visual Basic nos permite trabajar directamente con distintas bases de datos (ACCESS, dBaseIII,
dBaseIV , dBase 5, Excel3, Excel4, Excel5, Excel7, FoxPro2.x, Foxpro3.0, LotusWK1, LotusWK3,
LotusWk4, Paradox3.x, Paradox4.x y Paradox5.x Esto lo logra mediante el Motor de Bases de Datos
Jet, herramienta de Microsoft para administrar los datos en bases de datos Access. Tiene un nombre
que mas parece de una materia de ingeniera aeronutica, pero en realidad no es mas que un conjunto
de programas que se cargan en el disco duro cuando instala Access o Visual Basic. E esta forma de
acceder a las bases de datos se le llama Acceso mediante objetos DAO. Lo de DAO viene de Data
Access Objet. Y es la forma ms sencilla y rpida de acceder a una base de datos Access instalada en
el propio disco duro o en un disco de red de rea local rpida. (Lo de facilidad de acceso a una base de
datos Access viene implcito en la poltica de Microsoft de facilitar la compatibilidad entre sus
aplicaciones)
Pero esto se quedara muy corto si solamente se pudiese conectar con las bases de datos citadas. No
se puede concebir un sistema de desarrollo que no pueda acceder a bases como Oracle, Informix, SQL
Server, etc. Estas bases de datos, aparte de tener su propia interface para acceso a datos, disponen de
una forma de acceso comn a todas : ODBC
Lo de ODBC (Open Data Base Conectivity) es un mecanismo de conexin entre bases de datos
abiertas. Lo de abiertas significa que tienen esa interface de acceso comn, interface a travs de la cual
puede acceder a sus datos cualquier aplicacin. Esta interface utiliza el lenguaje SQL, y es necesario
establecer una conexin ODBC en Windows. Lo veremos mas adelante.
Los objetos DAO pueden acceder tambin a bases de datos a travs de ODBC. Esto podemos decirlo
con la versin DAO 3.5, no podemos decir lo mismo con la 2.5, procedimiento previsto pero que no
funcionaba.
Este pobre funcionamiento de DAO con ODBC llev a Microsoft a crear otro tipo de acceso a datos: el
RDO (Remote Data Objet), y los objetos de acceso a datos RDO. Esto consiste en objetos parecidos a
los DAO, pero que en vez de atacar directamente a la base de datos como lo hace DAO, lo hacen a
travs de una conexin ODBC previamente establecida en Windows. As por ejemplo, en un objeto DAO
hablamos del nombre de la base de datos, refirindonos al nombre del fichero que contiene los datos
(C:\Mis Documentos\MiBase.Mdb), y en RDO nos referimos al nombre de la conexin ODBC
(Connection) refirindonos al nombre de una conexin ODBC ya establecida, que apunta a una base de
datos que es donde vamos a leer o escribir. Este mtodo tiene la gran ventaja de que podemos
establecer hoy una conexin con una base determinada, y si queremos cambiar maana la base de
datos sobre la que vamos a trabajar, basta con cambiar esa conexin apuntando hacia otra base de
datos. As no es necesario realizar ningn cambio a nuestro cdigo
Un error bastante general con los objetos RDO es pensar (seguramente por aquello de Remote Data
Objet) que solamente pueden trabajar con una base de datos que est en otro ordenador, al cual
estaremos unidos por cualquier forma de conexin. No tiene nada que ver. RDO significa solamente que
accedemos a los datos a travs de ODBC, y podemos hacerlo (al igual que con DAO) a una base que
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 287

est en el mismo disco duro que la aplicacin, o una que est en un servidor unido a travs de una Red
de Area Local.
Pero RDO no tiene las prestaciones que tiene DAO para trabajar con bases de datos Access. De hecho,
RDO pierde grandes facilidades que aporta DAO para este tipo de bases de datos. RDO trabaja sobre
una conexin ya instalada, que apunta a una base de datos ya creada. Con RDO no podemos crear esa
base de datos. Esto es obvio, con RDO podemos entrar en una base de datos Oracle, por ejemplo.
Nadie puede pretender que Visual Basic cree una base de datos de esa marca. Sin embargo, con ADO
s podemos crear una base de datos Access. Piense en la facilidad para distribuir una aplicacin que
tenga una base de datos Access cuyos campos puedan tener un tamao definido por el propio usuario.
Bastara poner una herramienta en la propia aplicacin donde el usuario introdujese los tamaos de los
campos tipo texto, para adaptar la base de datos a sus necesidades. Esto puede hacerlo con DAO
puesto que nos permite crear bases de datos Access, pero no lo podemos hacer mediante RDO.
RDO utiliza una terminologa ligeramente distinta de DAO. Por ejemplo, sonde en DAO ponemos
OpenRecordset, en RDO debemos poner OpenResultset. Es una pena que no se pueda trabajar con la
misma terminologa y con todas las prestaciones que tiene DAO a travs de ODBC. Esto mismo pens
Microsoft, y esa fue la razn de implementar en los objetos DAO 3.5 la conexin ODBCDirect.
ODBCDirect nos permite trabajar con los mismos objetos DAO pero a travs de una conexin ODBC,
que en este caso, funciona. Puede ser un poco ms lenta que DAO, pero en esto hay opiniones para
todos. De esta forma es posible seguir utilizando los viejos mtodos aprendidos para DAO (Y lo que es
mejor, reutilizar el cdigo ya escrito en anteriores aplicaciones) a travs de una conexin ODBC. Lo
veremos mas adelante.
Pero no debemos pensar que aqu se acaban los mtodos de acceso a datos. Existe otro mas, muy
reciente denominado ADO. ADO quiere sustituir a DAO y RDO.
En este punto pona hace dos aos que eso lo va a determinar el mercado. Hoy (Nov.2002) se puede
decir que ADO ha sustituido en todas las aplicaciones nuevas a RDO, y ha dejado a DAO solamente el
mercado de las pequeas aplicaciones domsticas. ADO es una maravilla. Por eso, la Gua del
Estudiante dedica un nuevo captulo y un amplio ejemplo a ADO. Pero eso no implica que no haya que ir
paso a paso. Y primero hay que aprender DAO. Pero ahora todo lo que aprenda de DAO le va a servir
para ADO, pues en ADO s coincide el cdigo. Aprendamos pues DAO, y luego aplicaremos nuestros
conocimientos a ADO. La gran ventaja de ADO es que en aquellas aplicaciones que leen una base
situada en un servidor, ocupa menos la red de rea local, ya que trabaja una aplicacin Cliente
Servidor.
Adelanto de trminos. Aplicaciones Cliente servidor Piense en una base de datos instalada en una
red no muy rpida. Si creamos un acceso a datos (recordset) con DAO, el trfico de datos por la red es
muy grande, dado que puede darse el caso de tener que ver toda la base de datos para extraer de ella
solamente un dato. Una aplicacin Cliente Servidor lo que hace es montar un programa en el
servidor, al cual le pedimos desde nuestra aplicacin el dato deseado. Ese programa posiblemente tenga
que ver toda la base de datos para encontrar el dato que nos interesa, pero lo hace localmente en el
servidor, sin verter todos los datos a la red de rea local. Una vez que lo ha encontrado, nos pasa a
travs de la red el dato solicitado, con lo que bajamos el trfico por la red de forma muy importante. Lo
veremos mas adelante pero no con una gran profundidad. Es un tema que se sale necesariamente de
este curso debido a su extensin. Existen multitud de libros que tratan el tema.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 288

No se preocupe de los que acaba de leer. Con las explicaciones anteriores parece que esto de las bases
de datos debe ser cosa de gurs informticos, vedado al resto de los mortales. Nada mas lejos de la
realidad. Y para demostrarlo, en lo que queda de captulo vamos a trabajar con bases de datos SIN
escribir una sola lnea de cdigo. No digo que sea lo mejor, pero puede hacerse. Esto se logra mediante
controles OCX creados por Microsoft, que controlan directamente a ese conjunto de programas que
habamos dado en llamar Motor de bases de Datos Jet o a los programas similares de RDO o ADO.
Comenzaremos el estudio de bases de datos con los objetos DAO. Y para DAO el control que organiza
el trabajo al Motor Jet es el Control Data. Existen controles similares para RDO y para ADO. Pero no
corramos y centrmonos sobre DAO y nuestro motor Jet

DAO - Acceso a bases de datos mediante el Control Data


Para acceder a estas Bases de Datos basta con introducir un control Data en el formulario, y fijarle las
propiedades apropiadas para que trabaje sobre uno u otro tipo de base de datos. El control Data nos
permite acceder de una forma sencilla a cualquier base de datos de estos tipos, y sirve de enlace entre
la base de datos y los controles que son habilitados para presentar los datos de esa base. Utiliza el
motor de bases de datos Jet para el acceso a los datos.
El Control Data
El control Data puede tomarse directamente de la caja de herramientas. Al contrario que los controles
similares RDO y ADO, este est siempre en la caja de herramientas. En el formulario tiene el aspecto de
una barra deslizante :

Decamos que el control Data sirve de enlace entre la base de datos y los controles que pueden
presentar datos. Estos controles a los que nos referimos son los llamados Controles Enlazados a
Datos, y que son viejos conocidos nuestros, al menos algunos de ellos.
Los dos ms sencillos son el control Label y el control TextBox
Un control Label puede presentar un dato. Si queremos que ese dato sea un campo de una tabla de una
base de datos, basta que enlacemos la base de datos al control data, y que enlacemos luego el control
Label con el control Data. Si hacemos lo mismo con el TextBox, no solamente podremos presentar
datos de la BD, sino que los podemos introducir, al ser el TextBox un control bidireccional.
Veamos como se enlaza un control data a una base de datos. Se supone que el alumno conoce la
estructura de una base Access, BD con la que vamos a iniciar este estudio. De cualquier forma, y para
los que han suspendido la asignatura de base de datos Access, citar solamente que una base de datos
Access contiene dentro de un fichero (P.e. C:\MiCarpeta\MiBase.Mdb) varias Tablas (P.e. Tabla1,
Tabla2 y Tabla3) Cada tabla es en s una base de datos en el sentido estricto. Tiene un nmero
indeterminado de registros, (filas) que guardan la informacin en varios Campos.
El fichero, que tiene por extensin Mdb es la base de datos, y ese nombre (Direccin completa de la
carpeta y nombre del fichero) es lo que debemos poner al control Data en su propiedad DataBaseName.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 289

Con esto, el control data ya sabe donde tiene que ir a leer los datos. Pero le falta todava por saber en
que tabla dentro de esa BD los tiene que leer. El nombre de la tabla se lo indicamos al control Data en la
propiedad RecordSource. Para elegir esta propiedad basta con desplegar la lista de las tablas haciendo
click en la flecha de la lnea de la propiedad RecordSource. Dado que el control Data ya sabe en que
base de datos debe leer los datos (Ya tiene puesta la propiedad DataBaseName), ya puede saber
cuantas tablas tiene y los nombres de estas tablas. Elija la tabla deseada. En nuestro ejemplo, Authors
Con esto ya podra trabajar, pero le faltan an ciertos detalles. Por ejemplo, el tipo de recordset que debe
crear. (Dynaset, Snapshot, Table) Esto se lo indicamos en la propiedad RecordsetType, que por defecto
le va a poner Dynaset. (Ya veremos que es cada uno de ellos) Y ya tenemos casi todas las propiedades
del control Data cubiertas. Las dems son las tpicas de todos los controles. Casi todas las
propiedades, porque hay una que se ha introducido en la versin 6 de VB para permitir las dos formas de
atacar a la base de datos, con el motor Jet o a travs del citado ODBCDirect.. Esa propiedad es
DefaultType y nos permite elegir entre usar el motor de base de datos Jet (Poniendo a esta propiedad
el valor 2 o dbUseJet) o usar ODBCDirect (Ponindole el valor 1 dbUseODBC) El valor por defecto es
usar el motor Jet y as trabajaremos en principio.
Ya tenemos enlazado el control Data a la base de datos. Falta ahora enlazar una etiqueta y un TextBox
al control Data para tener el enlace completo. Eso es an ms sencillo. Si desplegamos las propiedades
del TextBox por ejemplo, veremos que tiene unas propiedades que cuando lo estudiamos, las habamos
pasado un poco por alto: DataSource y DataField.
En la figura puede ver que la propiedad DataSource puede desplegarse, mostrando en este caso el
nombre del nico control Data que tenemos en el formulario: Data1 Si tuvisemos mas controles Data,
apareceran los nombres de todos ellos. Se elige uno.

A continuacin debemos sealarle qu campo queremos que nos presente. Podemos desplegar la lista,
donde podemos ver los campos de la tabla elegida para la propiedad RecordSource del control Data.
Elegimos uno y ejecutamos la aplicacin.

Podemos observar que ya funciona. Si ponemos tantos TextBox como campos tiene la tabla elegida,
podemos ver todo el contenido de la Base de datos movindonos a lo largo de ella mediante las flechas
de cursor del control Data. Todo ello sin escribir una lnea de cdigo tal y como habamos prometido.
Entremos ahora en un estudio un poco ms avanzado del control Data.
El control Data proporciona acceso a datos almacenados en bases de datos usando uno de los tres tipos
de objetos Recordset. El control Data le permite ir de registro en registro y presentar y manipular los
datos de los en controles enlazados. Sin un control Data, los controles enlazados con datos de un
formulario no pueden tener acceso automticamente a los datos.
Los controles enlazados solamente pueden tener acceso a un control Data si este est en el mismo
Formulario.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 290

En el tema de Bases de Datos se emplean trminos no conocidos an. Se irn viendo a lo largo del
curso, pero no queda otro remedio mas que comenzar a utilizarlos. Se irn haciendo avances de estos
trminos, que sern explicados en profundidad en su momento.
Avance de trminos.
Objeto Recordset (conjunto de registros)
Es un conjunto lgico de registros. Los tres tipos de objetos Recordset son Dynaset, (Permite la lectura
y escritura de un registro) Snapshot (Realiza una lectura instantnea de los registros, no permitiendo
modificarlos) y Table. (Representacin en el cdigo de una tabla base que puede utilizarse para
agregar, modificar o eliminar registros de una sola tabla).
Controles enlazados
Son los controles que pueden presentar directamente datos de uno o varios campos de una Base de
Datos. Los controles DBList, DBCombo y DBGrid tienen la posibilidad de presentar un conjunto de
registros cuando se asocian con un control Data. Los controles CheckBox, TextBox, Label, Picture,
Image, ListBox y ComboBox tambin son controles enlazados con datos y pueden asociarse a un nico
campo de un Recordset administrado por un control Data.
La mayora de las operaciones de acceso a datos se pueden realizar usando el control Data sin escribir
ningn cdigo. Los controles enlazados con un control Data presentan de forma automtica los datos de
uno o ms campos del registro actual o, en algunos casos, de un conjunto de registros a ambos lados
del registro actual. El control Data realiza todas las operaciones sobre el registro actual.
Avance de trminos
Registro Actual. Un registro es un conjunto completo de campos. Una base puede tener muchos
registros, pero el puntero de la base de datos apunta a un nico registro en cada momento. Ese
registro al que apunta el puntero se llama registro actual.
Si el control Data recibe instrucciones de moverse a un registro diferente, todos los controles enlazados
pasan automticamente los cambios al control Data para ser guardados en la base de datos. El control
Data se sita despus en el registro requerido y pasa los datos del registro actual a los controles
enlazados donde son presentados. Esto significa que se pueden modificar los datos de una base de
datos simplemente cambiando los datos en los controles enlazados que lo permitan, y moviendo el
puntero de la base de datos, es decir, cambiando el registro actual.
Una vez iniciada la aplicacin, Visual Basic usa las propiedades del control Data para abrir la base de
datos seleccionada, abrir un objeto Database y crear un objeto Recordset. Las propiedades Database y
Recordset del control Data hacen referencia a los objetos Database y Recordset recin creados que
pueden ser manipulados por el control Data. Siempre podremos conocer el Recordset usado por el
control Data leyendo esa propiedad
VariableTipoRecordset =Data1.Recordset
Y si tenemos otro control Data en la aplicacin (Puede estar en otro formulario) siempre podemos hacer
que el recordset de este segundo control Data sea igual al del primero
Set Data2.Recordset = VariableTipoRecordset
(Obviamente el mbito de VariableTipoRecordset debe permitir que se vea en los formularios donde est
Data1 y Data2
Cuando se usa un control Data para crear un objeto Recordset o cuando se crea un objeto Recordset en
el cdigo y se asigna al control Data, el motor de base de datos Jet de Microsoft puebla
automticamente el objeto Recordset. Como resultado, los marcadores (y en los objetos Recordset de
tipo snapshot, los datos del conjunto de registros) se guardan en la memoria local; el usuario no necesita
manipular el control Data y no es necesario invocar el mtodo MoveLast en el cdigo para conocer el
nmero total de registros. Los bloqueos de pgina usados para crear el Recordset se liberan ms
rpidamente, haciendo posible que otros objetos Recordset accedan a los mismos datos. Los objetos
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 291

Recordset creados en el cdigo pero que no se asignan a un control Data no son poblados
automticamente por el motor Jet. Se deben poblar desde el cdigo.
El prrafo anterior, tomado casi literalmente de la informacin de Microsoft, exige al menos una
explicacin.
Cuando se crea un Recordset mediante un control Data, se leen inmediatamente todos los registros que
forman parte de ese Recordset (Recuerde que un Recordset es un conjunto de registros). De esta forma,
en una base que estuviera compartida por varios usuarios a travs de una Red de Area Local (RAL) un
usuario leera todos los datos en el mismo momento de la creacin del Recordset por el control Data,
llevara esos datos a su memoria RAM y no volvera a estorbar en la base de datos (cuando un usuario
de una RAL lee un dato en una BD, bloquea esta BD mientras dura su lectura y no pueden acceder a ella
otros usuarios) Si el Recordset se crea por cdigo, se lee solamente un registro (la base se bloquea en
el momento de la lectura e inmediatamente se libera), y cuando se le pide otra operacin (p.e. que
avance un registro) vuelve a bloquear la BD, lee ese registro y la desbloquea. En principio el leer el
Recordset de una vez parece que tiene ventajas en aquellas instalaciones que tienen una base de datos
compartida. Todo ello a un precio. Ocupar mas memoria RAM en cada uno de los PCs de los usuarios.
Esta limitacin hace en algn caso que no sea posible utilizar un control Data por falta de memoria RAM
en los puestos de usuario.
El control Data puede manipularse con el mouse, movindose de registro en registro o al principio o al
final del Recordset. El control Data no permite que el usuario se pase de los lmites del Recordset
usando el mouse. No se puede mover el enfoque al control Data.

Observacin muy importante


El control Data crea un objeto Database y un objeto Recordset automticamente. Estos objetos de
acceso a datos son idnticos a los creados mediante cdigo, y tienen las mismas propiedades y
mtodos. Podemos referirnos a ellos usando el nombre del control Data seguido del nombre del objeto
(Database o Recordset). Por ejemplo :
Data1.Database

Data1.Recordset

El objeto Database creado por un control Data no se cierra aunque se cambie la propiedad
DatabaseName del control Data. Lo mismo ocurre con el objeto Recordset. Solamente podemos
cerrarlos utilizando el mtodo Close :
Data1.Database.Close

Data1.Recordset.Close

Esta observacin debe ser tenida muy en cuenta sobre todo cuando el control Data abre la Base de
Datos de forma exclusiva, o cuando tenemos que hacer una operacin con la Base de Datos que exija
que est cerrada. Por ejemplo, el mtodo CompactDatabase y otros mtodos que veremos mas
adelante.
Objetos para acceso a datos
Los objetos para acceso a datos Database y Recordset creados por el control Data tienen cada uno sus
propiedades y mtodos propios y se pueden escribir procedimientos que usen estas propiedades y
mtodos para manipular los datos.
Por ejemplo, el mtodo MoveNext de un objeto Recordset mueve el registro actual al siguiente registro
del Recordset. Para invocar este mtodo, se podra usar el siguiente cdigo:
Data1.Recordset.MoveNext
El control Data puede crear cualquiera de los tres tipos de objetos Recordset (Dynaset, Snapshot, Table)
Si no se indica el tipo a crear, se crea un Recordset de tipo Dynaset.

Nota. Las constantes usadas para requerir un tipo especfico de Recordset cuando se usa un control
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 292

Data son diferentes de las constantes usadas para determinar el tipo de Recordset creado o que se va
crear usando el mtodo OpenRecordset.
Para seleccionar un tipo especfico de Recordset, establezca la propiedad RecordsetType del control
Data a:
Tipo de Recordset

Valor

Constante control Data

Constante OpenRecordset

Table
Dynaset
Snapshot

0
1
2

vbRSTypeTable
vbRSTypeDynaset
vbRSTypeSnapshot

dbOpenTable
dbOpenDynaset
dbOpenSnapshot

Diferencias entre la Edicin Standard y la Edicin Profesional de Visual Basic


En cuanto al acceso a datos, la diferencia principal entre las ediciones Estndar y la Profesional de
Visual Basic es la capacidad de crear nuevos objetos para acceso a datos. En la edicin Estndar NO
se pueden declarar en el cdigo (con la palabra clave Dim) variables como objetos para acceso a datos.
Esto quiere decir que slo el control Data puede crear objetos Database y Recordset.
En la edicin Profesional y Empresarial de Visual Basic, SI se puede crear un nuevo objeto Recordset
y asignarlo a la propiedad Recordset del control Data.
Esta diferencia ha llevado a la locura a muchos alumnos y programadores usando la versin de su casa
y la de su empresa o centro escolar !
En la pequea aplicacin realizada al comienzo de este tema ha visto que los controles enlazados a
datos permiten visualizar e introducir datos en la base de datos a travs del control Data. Efectivamente,
no tendra sentido poner un control data sin enlazarlo a otros controles para que estos nos sirvan de
elementos de presentacin y captura de datos. Veremos mas adelante en este captulo los controles
enlazados a datos.
Consultas almacenadas
Otra opcin importante cuando se usa el control Data es la posibilidad de presentar una consulta
realizada previamente en Access. Si se ha creado previamente una consulta, el control Data nos
mostrar esa consulta como si se tratase de una tabla ms de la base de datos, al desplegar la lista de
tablas para cubrir la propiedad RecordSource. Puede por lo tanto presentar solamente los campos que
necesite en su aplicacin, tomados de una tabla (o de varias tablas si ha establecido las relaciones
oportunas) y de esta forma su aplicacin va a trabajar ms rpido que si tuviese que seleccionar esos
campos mediante una instruccin SQL Para presentar una consulta, establezca la propiedad
RecordSource del control Data al nombre de esa consulta (En vez de poner el nombre de una tabla,
ponga el nombre de la consulta). Esto no puede hacerse si la consulta contiene parmetros. Esto le
ocurre cuando la consulta se ha creado partiendo de los datos de otra consulta.
Es mucho ms rpida una consulta utilizando una consulta ya creada en Access que introduciendo la
consulta en SQL. La razn es muy sencilla. Al crear una consulta es Access quien crea una especie de
tabla nueva en la propia base de datos. Esta tabla nueva no contiene datos, sino referencias a registros
de una tabla. Por lo tanto, el motor de bases de datos se limita a recorrer esa tabla nueva, tomar el
nmero del registro que debe presentar, ir a ese registro y tomar el dato que contiene. Si lo que hace es
una consulta SQL, se debe obtener la informacin registro a registro segn las condiciones establecidas
en la clusula SQL. Esta segunda opcin tarda logicamente ms. Y si est leyendo la base de datos a
travs de una red de rea local, la ocupacin de esta red es mucho menor si el recordset se crea con la
consulta de Access.
Estamos hablando de una consulta SQL establecida en el control Data. Dnde? Justamente en la
propiedad RecordSource del control data. Hasta ahora habamos puesto en esa propiedad el nombre de
una tabla o de una consulta ya hecha en Access. Si en vez del nombre de la tabla ponemos una consulta
SQL, la cosa tambin funciona:
Con una Tabla
Data1.RecordSource = Autores
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 293

Con una consulta SQL


Data1.RecordSource = Select * From Autores Where Apellidos = Cervantes Saavedra
Esta consulta obtiene de la tabla Autores, solamente los registros en los que el campo Apellidos sea
igual a Cervantes Saavedra Funciona, pero para averiguar el nmero de registros que tienen esos
apellidos deber recorrerlos todos, comprobar si son iguales a los expresados en la sentencia SQL y en
caso afirmativo pasarlos al recordset creado. Si se hubiera creado una consulta previamente en Access,
y pusisemos el nombre de la consulta en la propiedad RecordSource del control Data, ste ira
directamente a los registros que gozan de tan ilustres apellidos, ya que Access habra hecho una tabla
con los nmeros de los registros que cumplen esa condicin (esa tabla no contiene los datos, sino el
nmero de los registros que los contienen), el control data leera esos nmeros e ira a los registros
indicados en esos nmeros, evitando de esta forma tener que leer el contenido del campo Apellidos del
resto de los registros. De cualquier forma, si la base de datos est en el mismo ordenador que la
aplicacin, esto empieza a ser importante cuando trate tablas con muchos registros. Si est en una red
de rea local no hace falta tener muchos registros para comprobar que se ralentiza la aplicacin.
Propiedades del control Data
Align El control Data puede programarse para que se ajuste automticamente a la parte superior o
inferior de su formulario primario usando la propiedad Align. En cualquier caso, el control Data ajusta su
tamao horizontal al de su formulario primario cuando el tamao de ste cambia. Esta propiedad permite
situar un control Data en un formulario MDI sin requerir un control Picture que lo contenga.
Appearance Flat y 3-D
Backcolor

Color de fondo de la parte intermedia del control

Administracin de BOF/EOF
Las propiedades BOFAction y EOFAction establecen el comportamiento del control Data cuando llega
al principio o final de los registros. En esos casos se produce el BOF y EOF respectivamente.
BOF (Begin Of File). Se produce el BOF cuando el control Data se posiciona sobre el registro
inmediatamente anterior al primero (No es un juego de palabras). Este registro ser el -1.
EOF (End Of File) Se produce la condicin EOF cuando el control Data se posiciona en el registro
inmediatamente posterior al ltimo. Este registro ser tambin el -1.
La propiedad BOFAction permite seleccionar el comportamiento del Data cuando nos hemos pasado de
registros por abajo. Tiene las opciones MoveFirst (se mueve al primer registro) o BOF (se queda donde
est)
La propiedad EOFAction establece el comportamiento del control Data cuando se sobrepasa el ltimo
registro. Podemos indicarle que se mueva al ltimo registro (MoveLast), que se quede donde est
(EOF), o que introduzca un nuevo registro (AddNew)
Caption

El nombre que figurar en la parte intermedia del control.

Connect Muy Importante. En esta propiedad debemos indicarle al control Data el tipo de base de datos
a la que va a conectarse. Admite todas las bases enumeradas al principio de este captulo.
DatabaseName En esta propiedad se le indica el nombre (Con su Path) de la base de datos a la que
debe conectarse. Para facilitar la bsqueda de la base de datos, haciendo click en esta propiedad en la
caja de propiedades, podemos sacar un cuadro de dilogo haciendo click de nuevo en los tres puntos
que aparecen a la derecha de la propiedad. El cuadro de dilogo seleccionar directamente las
extensiones de los ficheros de bases de datos acordes con el tipo de base de datos seleccionada en la
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 294

propiedad Connect.
Database

(Solo en ejecucin)

Esta propiedad es slo de lectura. Devuelve una referencia a un objeto Database subyacente de un
control Data.
Sintaxis

Variable = nombredelcontroldata.Database

El objeto Database creado por el control Data se basa en las propiedades DatabaseName, Exclusive,
ReadOnly y Connect del control.
Los objetos Database tienen propiedades y mtodos que puede utilizar para administrar los datos. Puede
utilizar cualquier mtodo de un objeto Database con la propiedad Database de un control Data, como
Close y Execute. Tambin puede examinar la estructura interna de la Database empleando su coleccin
TableDefs y, a su vez, las colecciones Fields e Indexes de objetos TableDef individuales.
NOTA. Aunque puede crear un objeto Recordset y pasarlo a la propiedad Recordset de un control
Data, no puede abrir una base de datos y pasar el objeto Database recin creado a la propiedad
Database del control Data.
DragIcon, DragMode , Enabled Igual que todos los controles.
DefaultType
Devuelve o establece un valor que indica el tipo del origen de datos (Motor Jet u ODBCDirect) que se
usan en el control Data.
Sintaxis

NombreDelControlData.DefaultType = 1

Puede tomar los valores 1 (Usa ODBCDirect) y 2 (Usa el Motor Jet) Pueden usarse tambin las
constantes dbUseODBC o dbUseJet respectivamente
EditMode
Solo lectura en tiempo de ejecucin. Devuelve un valor que indica el estado de modificacin del registro
actual.
Sintaxis

Variable = NombreDelControlData.EditMode

Variable tomar uno de los siguientes valores :


dbEditNone
dbEditInProgress

No se est realizando ninguna operacin de modificacin.


Se ha invocado el mtodo Edit y el registro actual se encuentra en el
bfer de copia.
dbEditAdd
Se ha invocado el mtodo AddNew y el registro actual del bfer de
copia es un registro nuevo que an no se ha guardado en la base de datos.
La propiedad EditMode es especialmente til cuando se desea partir de la funcionalidad predeterminada
de un control Data, o cuando no se utiliza un control Data en Visual Basic Edicin profesional. Puede
comprobar el valor de la propiedad EditMode y el del parmetro accin del procedimiento del evento
Validate para determinar si se debe invocar el mtodo Update.
Tambin puede comprobar si el valor de la propiedad LockEdits es True y el de EditMode es
dbEditInProgress para determinar si la pgina de datos actual se encuentra bloqueada.
Exclusive Devuelve o establece un valor (True / False) que indica si la base de datos est abierta para
acceso de un nico usuario o de mltiples usuarios.
Font, ForeColor, Height, Index, Left, MouseIcon, MousePointer, Name, igual que el resto de los
controles.
Negotiate Propiedad caracterstica de los controles que tienen la propiedad Align. Establece un valor
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 295

que determina si se muestra un control que puede alinearse cuando un objeto activo del formulario
muestra una o ms barras de herramientas. No est disponible en tiempo de ejecucin.
Options
Devuelve o establece un valor que especifica una o ms caractersticas del objeto Recordset
de la propiedad Recordset del control Data. Puede ponerse en el cuadro de propiedades o en tiempo de
ejecucin. Puede tomar los siguientes valores o nombres de constantes (estos nombres solo si los
introduce en tiempo de ejecucin)
1
2
4
8
16
32

dbDenyWrite

En un entorno multiusuario, otros usuarios no pueden realizar


cambios en registros del Recordset.
dbDenyRead
En un entorno multiusuario, otros usuarios no pueden leer
registros (slo Recordset de tipo tabla).
dbReadOnly
No se pueden realizar cambios en registros del Recordset.
dbAppendOnly
Puede agregar nuevos registros al Recordset, pero no puede
leer los registros existentes.
dbInconsistent Las actualizaciones pueden aplicarse a todos los campos del
Recordset, aunque infrinjan la condicin de unin.
dbConsistent
(Predeterminado) Las actualizaciones slo se aplican a los
campos que no infringen la condicin de unin.

64

dbSQLPassThrough

256

dbForwardOnly

512

dbSeeChanges

Cuando se utilizan controles Data con una instruccin SQL en


la propiedad RecordSource, enva la instruccin SQL a una base de
datos ODBC, como SQL Server o Oracle, para su procesamiento.
El Recordset es un desplazamiento slo hacia adelante. El
nico mtodo de movimiento permitido es MoveNext. Esta opcin no
puede utilizarse en objetos Recordset manipulados con el control Data.
Genera un error interceptable si otro usuario est cambiando
datos que usted edita.

Para establecer mas de un valor de los descritos, basta con sumar sus valores. Tambin puede
establecer ms de un valor para esta propiedad, combinando opciones sumando valores entre s. Por
ejemplo, para establecer dbReadOnly y dbInconsistent puede utilizar este cdigo:
Data1.Options = dbAppendOnly + dbInconsistent
Para determinar si la propiedad contiene un valor especfico, puede utilizar el operador And. Por ejemplo,
para averiguar si el Recordset est abierto para acceso de slo lectura, podra usar este cdigo:
If Data1.Options And dbReadOnly Then...
Si cambia la propiedad Options en tiempo de ejecucin, deber utilizar el mtodo Refresh para que el
cambio sea efectivo.
ReadOnly Devuelve o establece un valor que determina si la Database del control est abierta para
acceso de slo lectura.
RecordsetType
Devuelve o establece un valor que indica el tipo de objeto Recordset que desea que cree el control Data.
Los valores o nombre de la constante que puede adoptar son los siguientes:
0
1

vbRSTypeTable
vbRSTypeDynaset

vbRSTypeSnapshot

Un Recordset de tipo tabla.


(Predeterminado) Un Recordset de tipo hoja de respuestas
dinmica.
Un Recordset de tipo instantnea.

Si no especifica un RecordsetType antes de que el control Data cree el Recordset, se crear un


Recordset de tipo hoja de respuestas dinmica. (Dynaset)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 296

Recordset
Devuelve o establece un objeto Recordset definido por las propiedades de un control Data o por un
objeto Recordset existente.
Veremos mas adelante las propiedades de un objeto Recordset, propiedades que son en todo aplicables
al Recordset del control Data.
El Recordset es como se adelant, un conjunto de registros. Si las propiedades Connect,
DatabaseName, Options, RecordSource, Exclusive, ReadOnly y RecordsetType establecidas para el
control Data son vlidas, se crea un Recordset automticamente basndose en dichas propiedades. Ese
ser el Recordset del control Data. Pero tambin puede crearse previamente un Recordset mediante la
instruccin OpenRecordset y forzar que el Recordset del control Data sea justamente ese mediante la
instruccin Set Data1.Recordset = MiRecordset
Sea cual fuera la forma de crearlo, a partir del momento en que el Data tenga su Recordset podemos
referirnos a l, por ejemplo para ir al primer registro (Data1.Recordset.MoveFirst), avanzar un registro
(Data1.Recordset.MoveNext), al anterior (Data1.Recordset.MovePrevious)
ir al ltimo (Data1.Recordset.MoveLast), aadir un registro (Data1.Recordset.AddNew), guardar los
cambios en la Base de Datos (Data1.Recordset.Update), o borrar el registro actual
(Data1.Recordset.Delete)
Si se cambia alguna de las propiedades citadas al principio que cambien el Recordset, es necesario
volver a crearlo. Para ello basta con utilizar el Mtodo Refresh. (Data1.Refresh)
RecordSource
Devuelve o establece la tabla, el objeto QueryDef (Consulta) o la instruccin SQL subyacente para un
control Data. Esta propiedad puede fijarse en el cuadro de propiedades del control data, (el caso mas
usado) o introducirse como cdigo. En los dos primeros casos, lo normal es introducir el nombre de una
tabla o una consulta de las existentes en la base de datos especificada en la propiedad DatabaseName,
nombres que se pueden elegir desplegando la lista que se obtiene haciendo click sobre la flecha que
aparece al lado de la casilla de esta propiedad. Observe que en la lista desplegada figuran los nombres
de las tablas y de las consultas que tiene la Base de Datos elegida en la propiedad DatabaseName. Ni
que decir tiene que para poder introducirla de esta forma es necesario fijar previamente la propiedad
DatabaseName.
Puede introducirse en tiempo de ejecucin mediante cdigo con la siguiente expresin :
NombreDelControlData.RecordSource = NombredelaTabla
Donde NombredelaTabla es una expresin de cadena que especifica el nombre de una Tabla o una
Consulta, de las que componen la base de datos especificada en la propiedad DatabaseName, o una
consulta SQL vlida que utiliza sintaxis apropiada para la base de datos especificada en la propiedad
DataBaseName. La propiedad RecordSource especifica el origen de los recursos accesibles a travs
de controles enlazados del formulario. Si establece la propiedad RecordSource como el nombre de una
tabla existente en la base de datos, todos los campos de esa tabla sern visibles a los controles
enlazados adjuntos a este control Data. El orden de los registros recuperados lo establece el objeto
Index que selecciona mediante la propiedad Index del Recordset. Si no establece la propiedad Index, los
datos se devolvern sin ningn orden concreto.
Si establece la propiedad RecordSource como el nombre de una consulta existente en la base de datos,
todos los campos devueltos por la consulta sern visibles a los controles enlazados adjuntos al control
Data. El orden de los registros recuperados lo establece la consulta Si en la consulta no se ha
especificado un orden, los datos se devolvern sin ningn orden concreto.
Si establece la propiedad RecordSource como una instruccin SQL que devuelve registros, todos los
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 297

campos devueltos por la consulta a SQL sern visibles a los controles enlazados adjuntos al control
Data. Esta instruccin puede incluir una clusula ORDER BY para cambiar el orden de los registros
devueltos por el Recordset creado por el control Data o una clusula WHERE para filtrar los registros.
Despus de cambiar el valor de la propiedad RecordSource en tiempo de ejecucin, deber utilizar el
mtodo Refresh para activar el cambio.
Nota. Asegrese de que cada control enlazado tiene un valor vlido para su propiedad DataField. Si
cambia el valor de la propiedad RecordSource de un control Data y, a continuacin, utiliza Refresh, el
Recordset identificar el nuevo objeto. Esto puede invalidar los valores de DataField de controles
enlazados y producir un error interceptable.

Las Propiedades Tag, Top, Visible, WhatThisHelpID, Width, igual que el resto de los controles.
METODOS DEL CONTROL DATA
(Se explican aqu los mtodos que inciden directamente en el tratamiento de bases de datos. No se
comentan los mtodos Drag, Move y ZOrder que son idnticos a los del resto de controles)
Mtodo Refresh
De momento es aplicable al control Data. Veremos que tambin es aplicable a otros objetos de acceso a
datos (QueryDef). El mtodo Refresh no puede utilizarse con colecciones que no sean
persistentes, como Databases, Recordsets o Workspaces.
Actualiza los datos del recordset del control data. Imagnese que el control data accede a una base de
datos compartida. Mediante este mtodo actualizamos el contenido del recordset del Data y por lo tanto
los datos presentados a travs de los controles enlazados. El mtodo Refresh tambin se utiliza para
cerrar y volver a generar el objeto Recordset o las estructuras de datos creadas por un control Data.
Sintaxis

NombredelcontrolData.Refresh

Puede utilizar el mtodo Refresh sobre un control Data para abrir o reabrir la base de datos (si han
variado las propiedades DatabaseName, ReadOnly, Exclusive o Connect) y volver a generar el objeto
Recordset indicado por la propiedad Recordset del control.
Mtodo UpdateControls
Actualiza los datos presentes en los controles enlazados a datos vinculados al control Data.
Sintaxis

Nombredelcontroldata.UpdateControls

Utilice este mtodo para restablecer en los controles enlazados sus valores originales, por ejemplo
cuando un usuario modifica los datos y luego decide cancelar los cambios.
Este mtodo produce el mismo efecto que hacer actual de nuevo al registro actual, excepto en que no se
produce ningn evento ni introduce en la Base de Datos los posibles valores que se hubiesen cambiado
en los controles enlazados.
Mtodo UpdateRecord
Guarda en la base de datos los valores actuales de los controles enlazados.
Sintaxis

NombredelcontrolData.UpdateRecord

Puede utilizar este mtodo para guardar el contenido actual de los controles enlazados en la base de
datos. Los cambios introducidos en los controles enlazados a datos se pasan a la base de datos al
cambiar el registro actual, bien mediante cdigo (Data1.Recordset.MoveNext, p.e.) o usando las flechas
del control data, o cambiando el registro actual en un DBGrid. Sin embargo hay circunstancias en las
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 298

que no es apropiado hacer esto. Mediante el mtodo UpdateRecord introducimos los cambios en la BD.
Este mtodo no desencadena el evento Validate.
En algunos casos, la actualizacin puede no tener lugar, debido a que la operacin vulnere las
restricciones de integridad referencial, o que la pgina que contiene el registro est bloqueada, o que la
base de datos u objeto Recordset no sean actualizables, o a que el usuario no cuente con el permiso
adecuado para la operacin. En cualquiera de estas circunstancias, se producir un error interceptable.
Estos son los mtodos del Control Data. Este control tiene su Recordset, y el Recordset del
control Data tiene sus mtodos, idnticos a los de un Recordset creado por cdigo.
EVENTOS DEL CONTROL DATA
Error
Se produce solamente como resultado de un error de acceso a datos que tiene lugar cuando no est
ejecutando cdigo Visual Basic. Lo explicamos.
El control data carga los datos durante la carga del formulario que lo contiene, abriendo la base indicada
en su propiedad DataBaseName. Imagnese que no existe esa base de datos en el disco. En ese caso
no se producir ningn interceptable ya que no se ejecuta ningn cdigo escrito. Tampoco se ejecuta
ningn cdigo escrito cuando el usuario hace click en uno de los botones del control data.
El procedimiento Error del control Data se ejecuta cada vez que ocurre un error por una maniobra de
este tipo, y pasa el cdigo de error como parmetro. Analizando el cdigo de error podemos escribir
cdigo en este procedimiento para paliar el error. La ayuda de VB tiene un buen ejemplo del uso de este
procedimiento.
Este ejemplo presenta un cuadro de dilogo Abrir si no se ha podido encontrar la base de datos
especificada en la propiedad DataBaseName del control Data despus de haber terminado el evento
Form_Load.
Private Sub Data1_Error (DataError As Integer, Response As Integer)
Select Case DataError
'Si no se ha encontrado el archivo de base de datos se produce el error 3024
Case 3024
'Presentar un cuadro de dilogo Abrir.
CommonDialog1.ShowOpen
End Select
End Sub
Reposition
Se produce despus de que un registro se convierte en el registro actual.
Private Sub Objeto_Reposition()
Donde objeto = Nombre del control Data
Cuando se carga un control Data, El primer registro de su objeto Recordset se convierte en el registro
actual, provocando el evento Reposition. Cuando un usuario haga clic en uno de los botones del control
Data, movindose de registro en registro o si se usa uno de los mtodos Move del objeto Recordset
asociado al control data, como MoveNext, MoveFirst, MovePrevious, los mtodos Find, como FindFirst,
FindNext, o cualquier otra propiedad o mtodo que cambie el registro el actual, se produce el evento
Reposition despus de que cada registro se convierta en el actual.
Este evento se puede usar para realizar clculos basndose en los datos del registro actual o para
cambiar el formulario en respuesta a los datos del registro actual.
Validate
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 299

Se produce antes de que un registro diferente se convierta en el registro actual; antes del mtodo
Update (excepto cuando los datos se guardan con el mtodo UpdateRecord); y de los mtodos Delete,
Unload o la operacin Close.
Private Sub objeto_Validate ([ ndice As Integer,] accin As Integer, guardar As Integer)
objeto = Nombre del control Data
ndice = Indice del control Data dentro de una matriz de controles (Si ha lugar)
accin = Un entero que indica la operacin que ha producido el evento, como se describe mas
adelante
guardar = una expresin booleana que especifica si los datos asociados han cambiado, como
se describe mas adelante.
Accin puede tomar estos valores :
0

vbDataActionCancel

1
2
3
4
5
6
7
8
9
10
11

vbDataActionMoveFirst
vbDataActionMovePrevious
vbDataActionMoveNext
vbDataActionMoveLast
vbDataActionAddNew
vbDataActionUpdate
vbDataActionDelete
vbDataActionFind
vbDataActionBookmark
vbDataActionClose
vbDataActionUnload

Cancela la operacin cuando se sale del


procedimiento Sub.
Mtodo MoveFirst.
Mtodo MovePrevious.
Mtodo MoveNext.
Mtodo MoveLast.
Mtodo AddNew.
Operacin Update (no UpdateRecord).
Mtodo Delete.
Mtodo Find.
La propiedad Bookmark no ha sido definida.
Mtodo Close.
El formulario se va a descargar.

Los valores de guardar son:


True
False

Los datos asociados han cambiado.


Los datos asociados no han cambiado.

El evento Validate se usa para realizar las ltimas comprobaciones sobre los registros que se van a
escribir en la base de datos.
Vea la ayuda de Visual Basic para mayor detalle de este evento.

CONTROLES ENLAZADOS A DATOS


Los controles enlazados a datos son aquellos que pueden presentar datos de una base de datos, a
travs de un control Data. Los controles enlazados a datos permiten crear aplicaciones con acceso a
datos con muy poco cdigo, o incluso ninguno. Para utilizar cualquiera de estos controles enlazados
conectables a datos debe incluir uno o ms controles Data en un formulario. El control Data establece un
enlace entre la base de datos y los controles enlazados para la manipulacin de los datos. El control
Data que sirve de enlace entre la Base de Datos y los controles enlazados debe estar obligatoriamente
en el mismo formulario que los controles.
Los controles asociados a datos tienen todos la propiedad DataSource, que es la propiedad donde se
debe poner el nombre del control Data asociado a ellos. Existen en Visual Basic trece controles
enlazados a datos, adems del control Data :
Data Ya comentado, se utiliza para tener acceso a los datos de las bases a travs de controles
enlazados de un formulario. Crea y administra los objetos Database y Recordset para su uso por parte
de los controles enlazados. Requerido para su uso con todos los dems controles enlazados.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 300

DBCombo Se utiliza para obtener una combinacin enlazada formada por un cuadro de lista y un
cuadro de texto. La lista puede llenarse automticamente a partir de un control Data. El usuario puede
elegir un elemento de la lista o introducir un valor en el cuadro de texto. Puede utilizarse para
proporcionar acceso de lectura / escritura a un campo de texto especfico seleccionado en la lista.
DBList Se usa para mostrar una lista generada a partir de un control Data en la que el usuario puede
elegir un elemento. La lista puede rellenarse automticamente desde un control Data, y puede
proporcionar acceso de lectura / escritura a un campo de texto especfico seleccionado en ella.
DBGrid Se utiliza para mostrar a la vez todos los registros del recordset del control Data. El DBGrid se
rellena automticamente con todos los registros, y muestra todos los campos del recordset de control
Data, formando una cuadrcula con filas y columnas. El usuario puede elegir un elemento de la
cuadrcula para variar el valor en ese campo y registro o introducir un nuevo registro. El hecho de
colocarse sobre un determinado registro de la cuadrcula, fuerza a ese registro a convertirse en el
registro actual del control Data al que est asociado.
Label Se usa para el texto que el usuario no debe modificar. Puede utilizarse para ofrecer acceso de
slo lectura a un campo de texto especfico.
TextBox Se utiliza para almacenar texto que el usuario puede introducir o modificar. Puede utilizarse
para proporcionar acceso de lectura / escritura a un campo de texto especfico.
CheckBox Se utiliza para crear un cuadro que el usuario puede elegir de forma sencilla para indicar si
algo es verdadero o falso, o para mostrar varias opciones entre las que el usuario pueda elegir ms de
una. Puede utilizarse para proporcionar acceso de lectura / escritura a un campo booleano o de bit
especfico.
ComboBox Se utiliza para obtener una combinacin de un cuadro de lista y un cuadro de texto. La lista
se rellena con el mtodo AddItem. El usuario puede elegir un elemento de la lista o introducir un valor en
el cuadro de texto. Puede utilizarse para proporcionar acceso de lectura / escritura a un campo de texto
seleccionado en la lista. Consulte el control DBCombo
ListBox Se utiliza para mostrar una lista en la cual el usuario puede elegir un elemento. La lista se
rellena con el mtodo AddItem. Puede usarse para proporcionar acceso de lectura / escritura a un
campo de texto especfico seleccionado en la lista. Consulte el control DBList
PictureBox Se usa para mostrar una imagen grfica de un mapa de bits, un icono o un meta-archivo en
un formulario. Puede utilizarse para proporcionar acceso de lectura / escritura a un campo de imagen o
binario especfico.
Image Se utiliza para mostrar una imagen grfica de un mapa de bits, un icono o un meta-archivo en un
formulario. Las imgenes mostradas en un control Image utilizan menos recursos que las de los
controles PictureBox. Puede usarse para proporcionar acceso de lectura / escritura a un campo de
imagen o binario especfico.
MSFlexGrid
Es un control enlazado a datos de reciente incorporacin. Apareci con la versin 5 de
VB y es un control parecido al DBGrid, pero con algunas ventajas y otros inconveniente. En este caso,
estando asociado a un control Data, el MSFlexGrid solamente permite leer datos, no podemos variar el
contenido de ningn registro. Tampoco se mueve el registro actual del control Data cuando
seleccionamos otra fila del MSFlexGrid.

PROPIEDADES RELACIONADAS CON DATOS COMUNES A ESTOS CONTROLES


Los controles enlazados a datos tienen unas propiedades para el acceso a datos basadas en el enlace
con la base de datos a travs del control Data. Las propiedades comunes a todos ellos son :
DataSource Fuente de datos. Es el nombre del control Data que lo enlaza con la B.D. Este control Data
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 301

es el que determina la Tabla donde estn los campos con los datos. Esta Tabla se determina mediante
la propiedad RecordSource del control Data.
DataField
Es el nombre del campo, dentro de la Tabla de la base de datos, que se va a presentar en
el control enlazado a datos. Esta propiedad no la tiene el DBGrid ni el MSFlexGrid debido a que
presentan todos los campos de la Tabla de la base de datos seleccionada en el control Data.
Si se le ha forzado al control Data la propiedad Recordset, los campos que se pueden mostrar en los
controles enlazados a datos son justamente, los del ese Recordset al que se le ha forzado.
Vamos a estudiar cada uno de los controles enlazados a datos con un poco mas de detalle.
Control Label
Posiblemente el control Label es el control ms sencillo para mostrar el contenido de un campo de una
base de datos. Como todos los controles enlazados a datos, el Label permite presentar los datos e
introducirlos en la base a travs del control Data. Lo que ocurre con el Label es que su propiedad
Caption no se puede introducir directamente por teclado, y deber cambiarse por cdigo. Esto puede ser
una ventaja (no hay posibilidad de introducirlo accidentalmente) y un inconveniente, al tener que escribir
cdigo para hacerlo.
El control Label, al poder ser origen (a travs del formulario que lo contiene) y destino de un enlace DDE,
esto nos puede resolver muchos problemas de introducin de distintos datos de otras aplicaciones que
no tengan acceso directo a una base de datos.
El control Label, en lo referente al enlace a datos, solamente tiene las propiedades mencionadas de
DataSource y DataField.
Control TextBox
Todo lo dicho del control Label es aplicable al TextBox, que adems presenta la particularidad de que en
este control s se puede escribir directamente desde el teclado. De esta forma podemos introducir datos
o cambiar los existentes en la base de datos.
Control CheckBox
El control CheckBox permite presentar e introducir datos de tipo Booleano. Tiene las propiedades
DataSource y DataField en lo relativo a acceso a datos.
Controles ListBox y ComboBox
Estos controles tienen una caracterstica especial respecto a su comportamiento con el enlace a la base
de datos. La lista no se puede cargar directamente desde la base de datos, sino a travs de un control
intermedio, por ejemplo un Label, donde presentaremos un campo de la base de datos. El texto de la
propiedad Caption de este Label se introduce en el ListBox o ComboBox mediante el mtodo AddItem.
Una vez introducidos todos los elementos de ese campo que nos interesen, cada vez que la base de
datos se sita sobre el registro correspondiente a uno de los elementos que est en el ListBox o
ComboBox, ste cambia su ListIndex para seleccionar el elemento correspondiente al registro actual del
control Data.
El ListBox puede contener elementos correspondientes a la base de datos y otros ajenos. Puede
emplearse esta caracterstica del ListBox para seleccionar un elemento entre varios elementos tomados
de la BD y otros introducidos por otro procedimiento, con la particularidad de que el ListIndex de este
ListBox ir a posicionarse sobre el elemento de la BD correspondiente al registro actual del Control Data.
Tienen las propiedades DataSource y DataField en lo relativo a acceso a datos.
Controles DBList y DBCombo
Para agregar estos controles debe insertar el OCX Microsoft Data Bound List Controls 6.0
Estos controles tienen dos enlaces a controles data. Uno para rellenar la lista, que se lo debemos indicar
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 302

en la propiedad RowSource, acompaado del nombre del campo con el que la va a rellenar, que
introduciremos en la propiedad ListField, y otro enlace a otro control Data, que se lo debemos indicar en
la propiedad DataSource. El campo de este segundo control Data se lo indicaremos en la propiedad
DataField. El comportamiento de estos dos controles es el siguiente: Mediante el enlace a travs de la
propiedad RowSource se rellena la lista, utilizando los datos del campo elegido en la propiedad
ListField. Imaginemos que la tabla a la que nos conectamos con estas propiedades es la Tabla A. La
tabla a la que enlazamos el DBList mediante la propiedad DataSource, le llamamos Tabla B. Con este
invento vamos a pasar un dato desde la tabla A a la tabla B. El dato que vamos a pasar est en la tabla
A en el campo sealado en la propiedad BoundColumn del DBList. El registro de la tabla A de donde
cogemos el dato ser el seleccionado en el DBList. El registro de la tabla B donde vamos a meter el dato
ser el registro actual de ese control data, control actual que habremos seleccionado mediante cualquier
mtodo. El campo de esa tabla B que vamos a variar ser el campo indicado en la propiedad DataField.
(Esto se vuelve a explicar mas abajo, pero para entenderlo no hay mas remedio que realizar una
prctica)
Control PictureBox y Control Image
Pueden mostrar una imagen almacenada en una Base de Datos. Mediante el control Data, se puede
introducir la imagen presente en uno de estos controles en la Base de Datos.
El campo que contenga una imagen en una BD debe ser tipo Objeto OLE (Binario Largo en versiones
anteriores de Access), y el tipo de imgenes que se pueden introducir son los mapas de bits (Archivos
con extensin .BMP), los archivos de icono, (Extensin .ICO) y los metaarchivos. (Metafiles, extensin
.WMF)
Para introducir un grfico en una BD es mas prctico introducirlo mediante un control Data y un control
Picture o Image que creando por cdigo un Recordset. En realidad deberamos decir que es el nico
mtodo prctico de introducir / sacar imgenes de una Base de Datos
Control DBGrid
Es posiblemente el control que ms se use para presentar y modificar datos de una B.D. El control
DBGrid presenta todos los registros y todos los campos de la Base de Datos. Por eso, necesita
obligatoriamente un control Data para poder presentar datos. Otros controles (Label, TextBox, Picture,
etc.) que solamente presentan un dato (un campo de un registro) pueden trabajar sin necesidad de un
control data, creando un Recordset mediante cdigo. (Lo veremos un poco mas adelante). Sin embargo
el control DBGrid, al presentar todos los datos de la base de datos necesita un control Data. Veamos
porqu.
Cuando creamos un objeto Recordset mediante la instruccin : (se ver mas adelante)
Set Mirecordset = MiDataBase.Openrecordset (Select campo1, campo2 from Mitabla)
lo que estamos haciendo es seleccionar, de todos los campos que pueda tener la tabla llamada Mitabla,
los denominados campo1 y campo2. Cada vez que seleccionemos un registro, es ese registro solamente
el que se mantiene en la memoria del ordenador, (el registro actual) y de ese registro, solamente
metemos los datos del campo1 y campo2.
Cuando creamos un Recordset mediante un control Data, se meten en la memoria TODOS los registros
de la tabla especificada en el control data. Por lo tanto, al permanecer todos los registros de esa tabla en
memoria, podremos presentar sus valores en el control DBGrid. No lo podremos hacer con un
Recordset creado mediante cdigo, que solamente mantiene un registro en memoria.
Deberemos explicar qu ocurre cuando se crea un Recordset mediante cdigo, y posteriormente se
fuerza a que el Recordset del control data sea igual a ese Recordset creado.
Con el Recordset creado con la instruccin anterior, podemos forzar a un control Data que su Recordset
sea igual al ya creado mediante la instruccin :
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 303

Set Data1.Recordset = MiRecordset


En este caso, el control Data1 tomar todos los registros con los campos campo1 y campo2 de la base
de datos y los meter en la memoria RAM. As ya podemos rellenar las cuadrculas del control DBGrid.
Observe que una aplicacin de acceso a datos ocupar mucha mas memoria RAM si establecemos el
enlace con la base de datos mediante un control Data que si lo hacemos creando Recordsets a medida.
Pero si necesitamos presentar los datos en un DBGrid, no quedar mas remedio que usar un control
Data. Si nuestra aplicacin no tiene que presentar en el DBGrid todos los campos de la tabla de la B.D.
podemos crear previamente un Recordset mediante cdigo y a continuacin forzar que el Recordset del
control Data sea igual al Recordset creado, utilizando la expresin anterior.
El control DBGrid tendr tantas columnas como campos tenga el Recordset. El nmero de filas ser
igual al nmero de registros que tiene la tabla. Si se sobrepasa el espacio fsico del DBGrid para poder
presentarlos, aparecern automticamente flechas de deslizamiento vertical. El ancho de las columnas
puede cambiarse mediante la propiedad Width del objeto Columns del DBGrid.
DBGrid1.Columns(n).Width = Valor
Donde n es el nmero de la columna (la primera es la 0) y el valor debe expresarse segn las unidades
de medida (ScaleWidth) del Formulario que lo contiene.
Del control DBGrid podemos destacar estas propiedades :
AllowAddNew
Devuelve o establece un valor que indica si el usuario puede agregar nuevos registros al objeto
Recordset subyacente a un control DBGrid.
La ltima fila que se muestra en el control DBGrid se deja en blanco para permitir a los usuarios
introducir nuevos registros. Si la propiedad AllowAddNew es False, los usuarios no pueden establecer
el foco en dicha fila.
El Recordset subyacente puede, por otras razones, no permitir inserciones incluso en el caso de que la
propiedad AllowAddNew sea True. En este caso, se producir un error si el usuario intenta agregar un
registro.
AllowDelete
Devuelve o establece un valor que indica si el usuario puede eliminar registros del objeto Recordset
subyacente a un control DBGrid.
Utilice la propiedad AllowDelete para impedir que los usuarios eliminen registros del conjunto de
registros a travs de la interaccin con el control DBGrid.
El objeto Recordset subyacente puede, por otras razones, no permitir eliminaciones incluso en el caso de
que la propiedad AllowDelete sea True. En este caso, se producir un error si el usuario intenta eliminar
un registro.
AllowRowSizing
Devuelve o establece un valor que indica si un usuario puede modificar el tamao de las filas del control
DBGrid.
Sintaxis

nombre.AllowRowSizing = [True / False]

Si la propiedad AllowSizing es True, el puntero del mouse se convierte en una flecha de doble cabeza
(Size N S) cuando se sita sobre el divisor de filas entre selectores de registro, y el usuario puede
modificar el tamao de las filas mediante arrastre. Cualquier cambio de tamao de columna provoca un
evento RowResize.
AllowUpdate
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 304

Devuelve o establece un valor que indica si un usuario puede modificar datos del control DBGrid.
Sintaxis

nombre.AllowUpdate = [True / False]

Cuando la propiedad AllowUpdate es False, el usuario puede an desplazarse a travs del control
DBGrid y seleccionar datos, pero no puede modificar ninguno de los valores; cualquier intento de hacerlo
se ignora.
Puede tambin hacer uso de las propiedades del objeto Columns para hacer que columnas individuales
del control DBGrid sean de slo lectura, pero los valores de la propiedad AllowUpdate tienen prioridad
sobre los valores establecidos para las columnas (sin modificar stos).
Nota El objeto Recordset puede no permitir actualizaciones incluso si AllowUpdate es True para el
control DBGrid; en este caso se produce un error interceptable cuando el usuario intenta cambiar el
registro.
ColumnHeaders
Devuelve o establece un valor que indica si los encabezados de columna se muestran en el control
DBGrid.
Sintaxis

objeto.ColumnHeaders = [True / False]

Si es True se muestran los encabezados de columna del control DBGrid, y si es False no se muestran.
DataMode
Establece un valor que especifica si el control DBGrid funciona en modo enlazado o no enlazado. Esta
propiedad no est disponible en tiempo de ejecucin.
Los valores que puede tomar la propiedad DataMode son:
0-Bound.
El control DBGrid est enlazado con el control Data.
1-Unbound. El control DBGrid no est enlazado directamente al control Data.
Un DBGrid est enlazado cuando se le asigna un control Data en su propiedad DataSource. En este
caso, presenta sin mas los datos del Recordset de ese control Data. Si le especificamos en la propiedad
DataMode que no est enlazado, utilizaremos cdigo en los procedimientos del control Data para pasarle
los datos cuando nos interese.

DefColWidth
Devuelve o establece un valor que indica el ancho de columna predeterminado para todas las columnas
del control DBGrid.
Sintaxis

objeto.DefColWidth [= valor]

donde valor es un entero basado en el modo de escala del control.


Si se da a la propiedad DefColWidth el valor 0, el control establece automticamente el tamao de todas
las columnas en base al ancho del encabezado de columna o al valor de la propiedad Size del campo
subyacente, seleccionando el ms largo de los dos.
RecordSelectors
Los selectores de registros aparecen a la izquierda de las filas en el control DBGrid. Cuando el usuario
elige el selector, el registro completo (fila del control DBGrid) se selecciona.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 305

La propiedad RecordSelectors devuelve o establece un valor que indica si se muestran los selectores
de registro en el control DBGrid.
Sintaxis

objeto.RecordSelectors = [True / False]

El Objeto Columns aplicado al control DBGrid.


El objeto Columns es un objeto no privativo del control DBGrid, que contiene todas las columnas y las
propiedades de las columnas de un control. Podemos cambiar las propiedades de cada una de las
columnas de un DBGrid mediante las propiedades del objetos Columns asociado a l. Por ejemplo, el
encabezamiento de una columna en un DBGrid es, por defecto, el nombre del campo que se va a
presentar en esa columna. Si queremos poner otro encabezamiento a una columna, ejecutaremos la
expresin :
DBGrid1.Columns(0).Caption = "Cabecera"
donde el 0 entre parntesis significa que estamos afectando a la columna nmero 0 (la primera por la
izquierda).
Si queremos cambiar su anchura :
DBGrid1.Columns(3).Width = 1000
En este caso estamos fijando la anchura de la columna cuarta por la izquierda a 1000 unidades de
medida de las del Formulario que contiene al DBGrid.

CONTROLES DBList y DBCombo


Los dos controles DBList y DBCombo se implementan de la misma manera. Las dos nicas diferencias
estriban en la forma en que se presenta la informacin al usuario y la presencia de la porcin del control
DBCombo en el cuadro de texto, que se emplea para introducir valores.
Los controles DBList y DBCombo tienen dos modos que pueden utilizarse individualmente o al mismo
tiempo:
Autollenado: Llena automticamente la lista con un campo seleccionado de entre todos los registros
administrados por el control Data especificado por la propiedad RowSource del control DBList o
DBCombo.
Actualizacin automtica: Enlaza el registro seleccionado en el control a un campo especfico del
objeto Recordset administrado por el control Data especificado por la propiedad DataSource.
Esto explicado en otras palabras significa lo siguiente :
En control DBList o DBCombo puede trabajar sobre dos controles Data. Uno para rellenar la lista. El
control Data y el campo que rellena la lista son los especificados en las propiedades RowSource y
ListField del control DBList o DBCombo. Respecto a este control Data estos controles funcionan
solamente como receptores de datos : No pueden cambiar el contenido de los registros con los que
rellenan su lista. (Llamemos a esta base de datos Base A en esta explicacin)
El otro control Data es el que estos controles usan para introducir datos en su BD asociada. El control
Data y el campo de la BD asociados a estos controles DBList y DBCombo, son los especificados en las
propiedades DataSource y DataField. Es sobre esta base de datos y el campo correspondiente sobre
los que estos controles DBList y DBCombo actan cambiando o introduciendo datos. (Llamemos a esta
otra base de datos Base B)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 306

Basta con seleccionar un elemento de la lista (que pertenece a la base A) y un campo (X) del registro de
la base A al que pertenece ese elemento se colocar en el campo correspondiente (el indicado en la
propiedad DataField del control DBList o DBCombo) de la base B. En el caso del DBCombo, podemos
escribir directamente el dato en su caja de texto en vez de seleccionarlo de la lista.
Ese campo (X) cuyo dato pasamos de la base A a la base B no tiene porqu ser el elemento que vemos
en la lista. Puede ser otro campo de la base A. Ser el que introduzcamos en la propiedad
BoundColumn del DBList o DBCombo. Es la propiedad que viene a continuacin. Lasela con la
atencin que se merece.
Propiedad BoundColumn
Devuelve o establece el nombre del campo de origen de un objeto Recordset que se utiliza para
suministrar un valor de datos a otro Recordset.
Resumamos. En un DBList o DBCombo presentamos en su lista un determinado campo de una BD. Esa
BD tendr mas campos. Un poco mas arriba decamos que ese elemento de la lista podamos pasarlo a
otra BD (La especificada en la propiedad DataSource, y en su campo DataField). Podramos pasar a
esa BD, en vez del elemento de la lista, otro campo de esa BD origen ?. Podramos, por ejemplo,
presentar en la lista el nombre de una persona, nombre que hemos tomado de un listn telefnico, y en
vez de pasar el nombre que es el que figura en la lista, pasar su nmero de telfono, que es otro campo
de la misma BD. La respuesta es SI. Para ello, pongamos en la propiedad BoundColumn del DBList o
DBCombo que estamos usando, el nombre del campo que contiene el nmero de telfono. Observe que
por defecto, esa propiedad se rellena con el mismo campo que el especificado en la propiedad ListField.
Eso no quiere decir que no se pueda cambiar. Para cambiarlo, haga click en la flecha vertical que
aparece en la casilla de propiedades, y donde ver que aparecen todos los campos de la base de datos
seleccionada en el control Data asociado a este control. Tambin puede cambiarlo en tiempo de
ejecucin con la siguiente sintaxis :
nombredelDBList.BoundColumn = nombredelcampo
Con estas ideas expresadas aqu, puede comenzar a leer el texto de ayuda de esta propiedad. No se
desespere si no entiende algo de lo all expresado.

BoundText
Devuelve o establece el valor de la propiedad BoundColumn de un control DBCombo o DBList pasado
desde o hacia la propiedad DataField despus de realizar una seleccin. Es decir, es el contenido del
campo especificado en la propiedad BoundColumn comentada anteriormente.
Esta propiedad est disponible solamente en tiempo de ejecucin.
Esta propiedad es de lectura y escritura. Es sencilla de usar para conocer el contenido del campo
especificado en BoundColumn. (lectura del valor)
Cuando la queramos utilizar para forzar el valor de esta propiedad a un valor determinado, debemos
utilizar la siguiente sintaxis :
objeto.BoundText [= valor]
En este caso, el DBList o DBCombo intenta buscar un elemento coincidente en el campo especificado en
la propiedad BoundColumn de todos los registros de la BD asociada. Si encuentra uno igual , se
establece el valor de la propiedad BoundText basndose en el campo especificado por la propiedad
BoundColumn. Si no se encuentra dicha coincidencia, la propiedad BoundText se establece en el valor
Null.
Es decir, si hay coincidencia con algn valor de ese campo, BoundText seguir con el valor especificado.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 307

Si no la hay, BoundText se pone a Nulo.

MatchWithList
Propiedad solo de lectura. Devuelve True si el contenido actual de la propiedad BoundText coincide con
uno de los registros de la parte de lista del control.
Sintaxis

Variable = objeto.MatchWithList

Si Variable = True el contenido de la propiedad BoundText coincide con uno de los registros de la lista. Si
es False, el contenido de la propiedad BoundText no coincide con ninguno de los registros de la lista.
Cuando introduce un valor en la parte de texto del control DBCombo, la propiedad MatchWithList se
establece como True si el valor introducido es uno de los elementos que aparecen en la lista. Usando
esta propiedad, el cdigo puede interceptar entradas que no estn la lista, o proporcionar cdigo para
agregar la nueva entrada a la tabla de origen.
DataChanged
Devuelve o establece un valor que indica que han cambiado los datos del control enlazado por algn
proceso distinto de la recuperacin de datos del registro actual. No est disponible en tiempo de diseo.
Sintaxis

objeto.DataChanged [=Variable]
Variable = objeto.DataChanged

establece la propiedad
lee el valor actual de esta propiedad

Variable puede ser True, indicando que los datos que hay actualmente en el control no son iguales que
los del registro actual, y False (Predeterminado) que indica que los datos que hay actualmente en el
control (si los hay) son iguales que los del registro actual.
Comentarios
Cuando un control Data se mueve de un registro a otro, pasa datos desde los campos del registro actual
a controles enlazados al campo especfico o el registro completo. Cuando se muestran datos en los
controles enlazados, la propiedad DataChanged se establece como False. Si el usuario o alguna
operacin cambia el valor del control enlazado, la propiedad DataChanged se establece como True. Si
pasa a otro registro la propiedad DataChanged no se ve afectada.
Cuando el control Data comienza a mover a otro registro, se produce el evento Validate. Si DataChanged
es True para algn control enlazado, el control Data invoca automticamente los mtodos Edit y Update
para enviar los cambios a la base de datos.
Si no desea guardar los cambios de un control enlazado en la base de datos, puede establecer la
propiedad DataChanged como False en el evento Validate.
MatchEntry
Devuelve o establece un valor que indica cmo el control DBCombo o DBList realiza bsquedas
basndose en la entrada del usuario.
Sintaxis

objeto.MatchEntry = valor

Donde valor es una constante o un valor que define el comportamiento de un control cuando tiene el
enfoque y el usuario introduce uno o ms caracteres.
0
vbMatchEntrySimple Coincidencia bsica: (Predeterminado) El control busca la siguiente
coincidencia del carcter introducido usando la primera letra de entradas de la lista. Al escribir
repetidamente la misma letra se recorren todas las entradas de la lista que comienzan por esa letra.
1
vbMatchEntryExtended Coincidencia ampliada: El control busca una entrada que coincida con
todos los caracteres introducidos. La bsqueda se realiza a medida que se escriben los caracteres,
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 308

refinando progresivamente la bsqueda.


Cuando la propiedad MatchEntry se establece como vbMatchEntryExtended y el usuario presiona la tecla
de retroceso o espera varios segundos, la cadena de coincidencias de restablece.
SelectedItem (Solo DBCombo)
Devuelve un valor que contiene un marcador para el registro seleccionado en un control DBCombo.
Sintaxis

DBCombo1.SelectedItem

Cuando selecciona un elemento de la parte de lista del control DBCombo, la propiedad SelectedItem
contiene un marcador que puede utilizar para reposicionar el registro seleccionado en el Recordset como
especifica la propiedad RowSource.
SelText
SelText devuelve o establece una cadena con el texto actualmente seleccionado, o es una cadena de
longitud cero () si no hay caracteres seleccionados.
VisibleCount
Devuelve un valor que indica el nmero de elementos visibles del control DBCombo o DBList.
Sintaxis

objeto.VisibleCount

La propiedad VisibleCount devuelve un entero desde 0 al nmero de elementos visibles del control. Un
elemento se considera visible nicamente si una parte del texto es visible.
VisibleItems
Devuelve una matriz marcadores, uno para cada elemento visible de la lista del control DBCombo o
DBList.
Sintaxis

objeto.VisibleItems

Estos marcadores pueden emplearse para obtener registros individuales del conjunto de registros
empleado para rellenar la lista.
Y aqu se terminan las propiedades de DBList y DBCombo. La lata que dan y lo poco que se
usan!

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 309

Controles Picture e Image para acceso a datos a travs del control Data.
Merece la pena hablar del almacenamiento de imgenes en una base de datos. Es posible introducir
imgenes en una base de datos Access. El campo debe ser del tipo Objeto OLE y puede manejarse de
dos formas, una de forma sencilla, mediante un control Data, y otra de forma un poco complicada,
mediante los mtodos AppendChunk y GetChunk. Estos dos mtodos los veremos un prximo
captulo. Pero adelanto que es complicado usarlos.
Es muy sencillo sin embargo introducir y presentar imgenes residentes en una base de datos mediante
los controles Picture e Image. Estos controles son enlazados a datos y pueden guardar una imagen o
presentarla. Basta para ello poner los valores adecuados en las propiedades DataSource y DataField
para elegir un campo tipo Objeto OLE de la base de datos y est el problema resuelto. Sobre todo para
presentar la imagen, que lo hace automticamente. No es lo mismo para introducir los datos, pero
tambin es muy sencillo.
Basta para ello disponer de un CommonDialog, por ejemplo, para buscar una imagen dentro del disco. El
fichero puede ser un BMP, JPG o WMF. Abrimos el CommonDialog (CD1) y buscamos la imagen
deseada. A continuacin la cargamos en el Control Picture o Image que est enlazado a datos mediante
el mtodo LoadPicture. Para introducir la imagen en la base de datos basta con cambiar de registro, o
utilizar el mtodo UpdateRecord del control Data.
Para presentar una imagen es preferible usar el control Image con la propiedad Stretch = False a usar el
control Picture. Con el Image y esa propiedad puesta a False, siempre veremos la imagen con el tamao
diseado en el formulario. Hacerlo con el control Picture se puede, pero es algo mas complicado.
Pese a que, como se ha visto, se pueden meter imgenes en la base de datos Access, no es
aconsejable hacerlo debido al volumen tan grande de datos que genera. Es preferible guardar la imagen
en el fichero con la imagen, y meter en la base de datos la direccin completa del fichero. Para abrirlo no
hay mas que leer la direccin del fichero, y presentarlo en el Picture o Image mediante el mtodo
LoadPicture.

Control MSFlexGrid
El control MSFlexGrid es un control similar al DBGrid, pero pensado fundamentalmente para enlazarlo a
datos a travs del control Adodc1 (El control similar al Data en ADO). Sin embargo tambin funciona con
el control Data, aunque con prestaciones reducidas. Estando enlazado al control Data, muestra los datos
solo para lectura. Tampoco permite cambiar el registro actual del control Data haciendo click sobre una
de las lneas del MSFlexGrid. Estas dos condiciones le hacen el control ideal para presentar todos los
datos del control Data para aquellos casos en los que no se permite cambiarlos al usuario.

Nota final al control Data


Puede ver en la informacin de Microsoft palabras como los antiguos controles Data y Control de datos
remotos (RDC). No se desanime. El control Data y DAO tienen mucho que decir todava en la
programacin en Visual Basic. Efectivamente hay controles ms modernos creados mediante la
tecnologa ActiveX que aportan unas prestaciones mayores que estos dos controles. Y formas de acceso
a datos mucho ms modernas y abiertas que el motor Jet. Pero tienen tambin su contrapartidas.
Estudie bien el control Data y el acceso a travs de DAO. Llevar mucho camino recorrido para estudiar
posteriormente ADO.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 310

Visual Basic Gua del estudiante Cap. 12


Objetos DAO
ACCESO A BASES DE DATOS SIN UTILIZAR EL CONTROL DATA
En el captulo anterior hemos visto los controles capaces de acceder a un Base de Datos, enlazados
mediante un control Data. Se comenz a exponer que no es necesario usar un control Data para acceder
a leer datos, aadir registros o cambiar su contenido. Y es ms. Comenzaremos ahora a ver que el
control Data pese a que puede evitarnos gran cantidad de lneas de cdigo, nos hace perder el control
respecto al programa. Es normal. El control Data se ha desarrollado para realizar un trabajo muy
estndar. Si nuestra aplicacin se separa un poco de lo normal, lo mas probable es que necesitemos
realizar las operaciones mediante cdigo. Esto no quiere decir que el Data haya que dejarlo en desuso.
Ser necesario en aquellas aplicaciones en las que se va a usar un control DBGrid, pues como se
recordar, mediante el uso de un control Data metemos en memoria RAM todo el contenido de la base
de datos relativo al Recordset que hemos creado. El control Data ser necesario en aquellas
aplicaciones donde utilicemos un DBGrid, un DBList o un DBCombo. Veremos mas adelante que
tambin ser necesario cuando queramos guardar imgenes en una Base de Datos.
El control Data tambin permite consultas ms rpidas a la BD. El hecho de guardar el contenido
completo del Recordset en la memoria hace que cualquier consulta sea ms rpida. Eso s, estamos
empleando mucha ms memoria RAM.
Pero en este captulo vamos a ver como se pueden manejar bases de datos utilizando otros objetos de
acceso a datos. Concretamente los objetos DAO.- (Data Access Objet).
Los objetos DAO utilizan el Motor de Bases de Datos Jet de Microsoft y trabajan directamente sobre
el fichero que contiene la base de datos. Existen otros objetos de acceso a datos, como ha podido ver en
el captulo anterior, que no trabajan directamente sobre el fichero, sino sobre una conexin ODBC que
enlaza con la base de datos. Son los objetos RDO y ADO, cuyo estudio se realizar en captulos
posteriores. Estos ltimos tipos son mas modernos, pero no tienen algunas prestaciones que tienen los
DAO, debido precisamente a que no trabajan directamente sobre el fichero. Centrmonos sobre los
objetos DAO
Estos objetos, pese a que no tienen representacin en la interface grfica, son objetos Visual Basic
como los dems, y nos podremos referir a ellos por su nombre como hacamos con todos los controles.
Eso s, debemos declararlos como se declaran las variables, y siguen siendo vlidos los criterios de
declaracin de variables en cuanto al mbito de aplicacin. Si declaramos un DAO en un procedimiento,
no nos podremos referir a l fuera de ese procedimiento. Si queremos que sea vlido en toda la
aplicacin deberemos declararlo en la seccin de declaraciones de un mdulo, o en la seccin de
declaraciones de un formulario si fuese suficiente ese mbito para nuestra aplicacin.
La primera sorpresa suele ocurrir a la hora de declarar un objeto. Por ejemplo, para declarar un objeto
tipo DataBase debemos hacerlo con la siguiente declaracin:
Dim MiBaseDatos As DataBase
Y al ejecutar el programa puede ocurrirle el siguiente error: Error de compilacin. No se ha definido el
tipo definido por el usuario.
Lo que le est ocurriendo es que su programa no conoce el tipo de variable DataBase. Para que la
conozca, debe agregarle una referencia. Vaya a Proyecto | Referencias de la barra de men y
seleccione Microsoft DAO 3.51 Objet Library
Haga click en Aceptar y ya tiene agregada esa
referencia a su programa. Agregar una referencia significa que le ha dicho a su programa que puede
hacer uso de una coleccin de DLLs donde podr encontrar la definicin del objeto o la variable que no
encuentra. Ahora ya no le dar el error anterior, pues en esa DLL que acaba de agregarle a su programa
est la explicacin al secreto de lo que es un objeto DataBase.
Ver que hay mas referencias parecidas a Microsoft DAO 3.51. (Las versiones 2.0, 2.1, 2.5/3.5, y si ha
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 311

instalado Access2000 tendr la 3.6) Existen tantas versiones distintas como versiones de Access. En
realidad esta DLL no es mas que un componente de Access que podemos usar, al igual que lo hace
Access, para gestionar una base de datos. Debe elegir la versin mas alta, pero con cuidado. La versin
3.5 corresponde a la versin de Access 97. Cuando cree con su programa una base de datos con esta
versin, no podr abrirla con Access 2.0 No se olvide de la teora de la compatibilidad de Microsoft, que
dice que cualquier versin que Microsoft considere obsoleta no debe reconocer los datos guardados por
versiones ms modernas del mismo programa. Piense si es posible que alguien que vaya a abrir una
base de datos guardada con su aplicacin dispone de una versin anterior de Access. Por ejemplo,
cuando se est escribiendo este libro, est recin aparecido Access 2000. Cree que es oportuno en
estos momentos, en los que todava se est introduciendo en muchos usuarios Access 97 usar una DLL
que nos cree bases de datos que solamente puedan ser abiertas por Access 2000?.
La versin Microsoft DAO 3.6 corresponde a Access 2000. Si ha instalado este programa le aparecer
esa referencia en la lista de referencias. No se sorprenda si antes de instalar Access 2000 no tena esa
referencia y despus de la instalacin s. Si crea una BD con la versin 3.6 no podr abrirla con Access
97 Esta es la compatibilidad hacia delante de Microsoft!

Objetos DAO de acceso a datos


Son muchos y tienen estructura jerrquica. Es importante resaltar lo de su estructura jerrquica, ya que
como ver, un objeto DAO crea los objetos DAO inmediatamente inferiores en jerarqua.
Hay que sealar que las colecciones de estos objetos DAO son a su vez objetos de acceso a datos. Esto
hay que explicarlo un poco mejor. Por ejemplo, un objeto Database es un objeto DAO que representa
una base de datos abierta. Al objeto que agrupa a todas las bases de datos abiertas en ese momento le
llamamos Objeto Databases. Si tenemos dos bases de datos abiertas en un determinado momento, el
objeto Databases contendr dos elementos.
Todos los objetos DAO excepto el dbEngine tienen colecciones. Es lgico. El dbEngine, como ver mas
adelante, es precisamente el Motor de Bases de Datos Jet y solamente existe uno. Comenzaremos
precisamente por l la explicacin de los objetos DAO.
El dbEngine es el motor Jet. Y como vimos en el captulo anterior, la versin 3.5 puede trabajar
directamente sobre el fichero de la base de datos o a travs de una conexin ODBC. En el primer caso
decimos que est trabajando en el espacio de trabajo Microsoft Jet Si le hacemos trabajar a travs de
ODBC decimos que estamos trabajando en el espacio de trabajo ODBCDirect
Los objetos que emplea en cada uno de los espacios de trabajo pueden verse en las figuras 20.1 y 20.2.
Puede observarse que tiene muchos mas objetos en el espacio de trabajo Microsoft Jet que en el de
ODBCDirect. Es lgico. Con el primero nos permite CREAR bases de datos, y por lo tanto necesita
tener objetos tales como el Tabledef, Index o Relation. Lo ver un poco mas adelante.
El objeto dbEngine tiene los siguientes mtodos, propiedades y colecciones
Mtodos CreateWorkspace, CompactDatabase, RepairDatabase, Idle, RegisterDatabase
Propiedades DefaultPassword, DefaultUser, IniPath, LoginTimeout, Version
Colecciones Errors, Properties, Workspaces
Veremos estos mtodos y propiedades segn vayamos avanzando en el captulo

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 312

Fig. 20.1 Objetos DAO para el espacio de trabajo Microsoft Jet

En esta figura pueden verse los objetos y sus colecciones. Las colecciones llevan el nombre en plural.
Parece un poco complicado, y posiblemente lo ser. Lo cierto es que para el trabajo que se hace
normalmente con bases de datos este diagrama queda bastante reducido. No se extrae tampoco de ver
que objetos como el Fields y el Field existen en varios niveles. Lo ver mucho mejor mas adelante.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 313

Fig. 20.2 Objetos DAO para el espacio de trabajo ODBCDirect

Este modelo parece un poco mas asequible. La razn es que no hace todo lo que hace el espacio de
trabajo Microsoft Jet.

Objeto Workspace
Un objeto Workspace define una sesin de trabajo para un usuario especfico. Una sesin de trabajo es
precisamente eso, una sesin de trabajo en el ms puro estilo informtico. Pueden existir varias
sesiones de trabajo, pero en la mayora de los casos eso no es lo normal. Ser necesario crear varias
sesiones cuando necesitemos imponer restricciones de acceso a una base de datos, cuando tengamos
que usar Transacciones (*) en un sistema multiusuario, y en algn caso ms. Las sesiones de trabajo
tienen dueo (Usuario) y una palabra clave para acceder a ellas.
Pero lo normal es tener solamente una sesin abierta. Y visual Basic nos facilita este caso abriendo una
sesin de trabajo automticamente. Cuando se inicia Visual Basic, se crea un Workspace con palabra
clave y nombre de usuario Admin. Este Workspace es precisamente el que ocupa el nmero cero de la
coleccin de Workspaces. Es decir, es el Workspaces(0).
No se preocupe de que ahora mismo no lo entienda. Ya lo entender. Pero hay que exponerlo ahora. El
objeto Workspace contiene:
Para el espacio de trabajo Microsoft Jet:
Grupos de trabajo, que es un grupo de usuarios de un entorno multiusuario que comparten
datos y el mismo sistema de base de datos.
Grupos de usuarios, que es una coleccin de cuentas de usuario. Estos objetos, que no son
objetos de acceso a datos, sino de explotacin de los recursos del sistema, estn enfocados a la
seguridad respecto al acceso a las bases de datos que se trabajan conjuntamente. No tendra
sentido hablar aqu de ellos si no fuese porque encontrar referencias a estos objetos
continuamente en la ayuda de Visual Basic.
Bases de Datos (Databases). Este el objeto que ahora nos interesa del objeto Workspace. Un
objeto Database es una base de datos abierta.

Para el espacio de trabajo ODBCDirect:


Conexin, que representa una conexin con una base de datos a travs de ODBC
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 314

Bases de Datos (Databases).


Ya podemos comenzar a comprender una diferencia entre ambos espacios de trabajo. En el Microsoft
Jet tenemos Usuarios y Grupos de Usuarios. En el espacio ODBCDirect no los tenemos, ya que el
permiso o denegacin de acceso de uno u otro usuario a una base de datos se establece cuando se
crea (en Windows) la conexin ODBC. En el espacio ODBCDirect tenemos un objeto llamado
Connection, objeto que no tenemos en el Microsoft Jet ya que con este sistema accedemos
directamente al fichero de la base de datos. No necesitamos ninguna conexin establecida previamente.
Al objeto Workspace se le puede dar un nombre definido por el usuario. Ese nombre habr que
declararlo como nombre de una variable objeto Workspace :
Dim Misesion as Workspace
La declaracin de la variable Objeto tiene las mismas caractersticas que cualquier variable en cuanto al
mbito en el que se puede usar. Para que pueda usarse en toda la aplicacin deberemos declararla en
un Mdulo con la sentencia Public
Public Misesion as Workspace
Esta advertencia es vlida para la declaracin de todos los objetos DAO.
Una vez declarado el nombre del objeto Workspace, hay que crearlo. En realidad, y tal como citbamos
mas atrs, cada vez que se inicia una sesin de Visual Basic, se crea automticamente un Workspace.
El nmero 0 A este Workspace no podemos ponerle ningn tipo de palabra de acceso, ya que se la ha
puesto VB : Admin. Utilicemos este Workspace, el nmero 0 de la coleccin Workspaces, para
comenzar a trabajar. Tiempo tendremos mas adelante de ver como se crea un Workspace. Para hacer
que Misesion sea ese Workspace que crea automticamente VB basta con ejecutar la siguiente lnea de
cdigo
Set Misesion = Workspaces(0)
Pero si no queremos aprovechar este Workspace creado automticamente por Visual Basic, y queremos
usar otro, usemos el mtodo CreateWorkspace. Se ver al final del captulo.

Creacin de Objetos DAO


Para crear un objeto DAO (Cualquiera que sea) debemos usar una forma que se va a repetir a lo largo
de toda su vida profesional, mientras trabaje con Visual Basic y Bases de Datos:
Set ObjetoDAOInferior = ObjetoDAOSuperior.Mtodo ( Aqu .... alguna cosa )
Logicamente el trmino Aqu .... alguna cosa va a depender de cada mtodo y de lo que Vd. quiera
hacer, pero la estructura Set DAOInferior = DAOSuperior.Mtodo ( - - - - - - - - - - ) se mantendr en
todas las operaciones de creacin y manipulacin de objetos DAO. Esta sintaxis es tan simple que un
profesor de Visual Basic deca que es como un juego de nios No lo olvide y se le quitar el miedo al
manejo de bases de datos mediante cdigo. Posiblemente hasta ahora le haya parecido muy difcil y
haya optado por usar el control Data para todas sus aplicaciones. Si recuerda este Juego de nios ver
que es ms sencillo crear objetos DAO que poner un control Data en un formulario.
Comenzaremos a explicar la operacin de bases de datos mediante DAO explicando como se crean
bases de datos Access mediante Visual Basic. Para que se van a crear bases de datos mediante un
programa si puedo hacerlo directamente con Access? . Esta pregunta me la han hecho los alumnos
durante todos mis aos de docencia. La nica respuesta para ello es que deseo que Vd. sea
programador, no usuario de ofimtica.

Objeto Database
Un objeto Database representa una base de datos abierta. Una coleccin Databases contiene todos
los objetos Database abiertos en un objeto Workspace del motor de bases de datos Microsoft Jet.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 315

Un objeto Database puede crearse, bien porque hemos creado una base de datos mediante el
procedimiento CreateDataBase, o porque hemos abierto una base de datos existente mediante el
procedimiento OpenDatabase. En cualquiera de los dos casos, el objeto Database existe hasta que lo
cerremos (mediante el mtodo Close) o hasta que cerremos la aplicacin.
Al objeto Database se le debe dar un nombre definido por el usuario. Eso s, hay que declararlo como
una variable objeto Database
Dim MiDataBase As Database
El nombre que le demos al objeto DataBase no tiene nada que ver con el nombre del fichero que alberga
esa base de datos. El objeto DataBase es la base de datos que creamos en la memoria RAM del
ordenador.
Coleccin Databases Es el conjunto de Objetos Database existentes. La coleccin Databases
pertenece al Workspace.

Crear una Base de Datos ACCESS. Mtodo CreateDatabase


Para crear una base de datos deberemos utilizar el mtodo CreateDatabase. Previamente debemos
declarar el nombre que queremos dar al objeto DataBase que se va a crear como un objeto Database :
Dim MiBaseDatos as Database
Si tenemos declarado un Workspace llamado Misesion mediante la declaracin :
Dim Misesion as Workspace
Y hacemos que Misesion sea el Workspace creado automticamente por VB
Set Misesion = Workspaces (0)
podremos usar el mtodo del Workspace CreateDatabase para crear ese objeto Database. Recuerde
que el objeto Database NO es el fichero que va a contener la base de datos sino que es una estructura
de base de datos que est de momento en la memoria RAM del ordenador. El fichero se crear
posteriormente cuando cerremos el objeto Database. El nombre del objeto Database tampoco tiene
porque coincidir con el nombre del fichero que se va a crear. En el ejemplo que veremos mas adelante,
el nombre del objeto Database es MiBaseDatos y el nombre del fichero es MiBase.Mdb.
La sintaxis del mtodo CreateDataBase es el juego de nios citado antes:
Set ObjetoDAOInferior = ObjetoDAOSuperior.Mtodo ( Parmetros )
En nuestro caso el Objeto DAO superior es el Workspace Misesion, y los parmetros que hay que pasar
en este caso son:

Nombre (y Path) del fichero de la base de datos


Idioma, para permitir la ordenacin alfabtica de los datos. Para los idiomas espaol, ingls y francs
debe usar dbLangGeneral.
Opciones, que le permite elegir la versin de la base de datos a crear (Equivalente a la versin de
Access) y si deseamos crear una base de datos cifrada. Si no pone nada en este parmetro le crea una
base de datos sin cifrar, y de la ltima versin que le permite la referencia elegida para el motor de bases
de datos (Microsoft DAO 3,51, por ejemplo)
Vayamos al ejemplo:
Set MiBaseDatos = Misesion.CreateDatabase (C:\MiCarpeta\MiBase.MDB, dbLangGeneral)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 316

Si ahora cierra el programa le crear la Base en el disco. Ejecute Access


C:\MiCarpeta\MiBase.MDB. Ya Existe! Pero observar que est completamente vaca.
Base de Datos ACCESS tiene tablas. Y de momento no hemos escrito ningn cdigo
tablas. Vamos a seguir creando esta base de datos, al tiempo que explicamos
procedimientos que hay que usar para ello.

y abra la BD
Es normal. Una
para crear esas
el resto de los

El Mtodo CreateDataBase Crea un nuevo objeto Database, guarda la base de datos en disco y
devuelve un objeto Database abierto.
Vaya a la ayuda de VB. Ver que la sintaxis de este mtodo es:
Set MiBaseDatos = Misesion.CreateDatabase (nombre_base, escenario, opciones)

MiBaseDatos es el nombre del objeto Database por el cual nos referiremos a esa base de datos, NO el
nombre del archivo con el que quedar guardada en el disco.
Misesion es el nombre del objeto Workspace existente que contendr la base de datos. Si se omite este
argumento, se utilizar el objeto Workspace predeterminado - Workspaces(0) e incluso, si no se pone
nada, usar ese Workspace predeterminado.
nombre_base es el nombre del archivo de base de datos que se va a crear. Es decir, el nombre del
archivo en el disco. Puede ser una ruta completa y un nombre de archivo, como por ejemplo
"C:\MiCarpeta\MiBase.MDB". Si no se indica una extensin, se agregar .MDB. Si la red lo admite,
tambin puede especificar una ruta de red, como por ejemplo "\\MISERVID\MICOMP\MIDIR\MIBD". Con
este mtodo slo pueden crearse archivos de base de datos .MDB. (ACCESS)
escenario es una expresin de cadena utilizada para especificar dos cosas: el orden alfabtico que se
va a usar en esta base de datos, (Obligatorio) que denominaremos inf_local y el Password o palabra
clave que quiere usar para restringir su uso. Este Password es opcional. Debe especificar el
argumento inf_local o se producir un error. Consulte la tabla de constantes para inf_local incluida
ms adelante en este tema.
En el argumento Opciones puede combinar varias opciones, segn se especifica a mas adelante.
Puede combinar varias opciones sumando las constantes correspondientes.

Valores de los parmetros


En el argumento inf_local se suministra informacin de la lengua empleada para especificar la
propiedad CollatingOrder del texto para las comparaciones entre cadenas. Es un argumento
obligatorio. Para los idiomas Ingls, alemn, francs, portugus, italiano y espaol moderno se usa la
siguiente constante :
dbLangGeneral
No use dbLangSpanish. pues no hace nada especial respecto a dbLangGeneral
Este parmetro es obligatorio. Piense que una vez creada la Base de Datos, alguna vez le pedir que le
obtenga un Recordset con los datos ordenados alfabticamente ( acurdese de la sentencia SQL
ORDER BY Nombredelcampo )
Si desea introducir una palabra clave para restringir el acceso a la base de datos, debe indicarlo a
continuacin. Deber concatenarlo con la inf_local mediante el signo & y separarlo mediante
punto y coma. Hay que poner pwd antes de la contrasea
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 317

dbLangGeneral & ";pwd=NuevaContrasea"


Para el ltimo parmetro, Opciones se pueden usar las siguientes constantes :
Constante

Descripcin

dbEncrypt
dbVersion10

Crea una base de datos codificada.


Crea una base de datos que utiliza la versin 1.0 del motor de base de datos
Microsoft Jet.
Crea una base de datos que utiliza la versin 1.1 del motor de base de datos
Microsoft Jet.
Crea una base de datos que utiliza la versin 2.5 del motor de base de datos
Microsoft Jet.
Crea una base de datos que utiliza la versin 3.0 del motor de base de datos
Microsoft Jet. Esta Versin es compatible con la 3.5

dbVersion11
dbVersion25
dbVersion30

Si se omite la constante de codificacin, se crear una base de datos no codificada.


El mtodo CreateDataBase abre esta nueva base de datos y devuelve un objeto Database, cuya
estructura y contenido deber completar utilizando objetos de acceso a datos adicionales. Es decir, crea
una Base de Datos sin nada que deber rellenarla posteriormente con tablas.
(Advertencia sobre las bases de datos codificadas. No piense que al codificar la base de datos va a
mantener sus datos confidenciales en secreto. Access se los guardar codificados, pero se los va a
presentar de forma clara. Utilice para ello el Password, ya que no podr abrir la base si no se conoce ese
Password. Pero tampoco se fe mucho. Existen infinidad de craqueadores de contraseas de Access. El
Password vale para proteger la BD de usuarios no piratas. No emplee este procedimiento en
aplicaciones en las que necesite verdadera confidencialidad.

Objetos DAO para introducir en una base de datos


Estos objetos que se pueden aadir son : Objetos TableDef, TableDefs, Field, Fields, QueryDef,
QueryDefs. Para hacer las cosas poco a poco nos fijaremos solamente en las tablas y los campos.
(Objetos Tabledef y Field)
El Objeto TableDef es una tabla de una base de datos ACCESS. El Objeto TableDefs es la coleccin
que contiene todas las tablas de la base de datos
Un objeto Field representa un campo dentro de una tabla Access. La coleccin Fields contiene todos los
campos de una tabla. Ver mas adelante que tambin hay objetos Field en otros objetos DAO (Index,
QueryDef, Recordset, Relation), pero de momento vamos a fijarnos solamente en las tablas.

Crear una Tabla. Mtodo CreateTableDef.


Crea un objeto Tabledef, que no es ni ms ni menos que la estructura de una tabla Access, pero que de
momento est en la memoria RAM del ordenador. Cuando esa estructura se pase al fichero de la base
de datos en el disco, ser una Tabla que podemos ver cuando abramos la BD con Access.
El objeto Tabledef debe crearlo un objeto DataBase. Puede ser perfectamente el objeto Database
creado anteriormente. Pero seguramente lo ha cerrado (cerrando el programa, simplemente) para poder
ver con Access la base de datos que acaba de crear. Puede volver a crear el objeto DataBase abriendo
la base de datos. Aunque se le explicar mas tarde, le adelanto el mtodo para abrir una base de datos
existente en el disco:
Set MiBaseDatos = Misesion.OpenDatabase (C:\MiCarpeta\MiBase.MDB)
Declaremos ahora el nombre que quiere ponerle al objeto Tabledef que va a crear: (MiTabla1)
Dim Mitabla1 As Tabledef

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 318

Si queremos introducir varias tablas en la BD deberemos declarar tantos objetos Tabledef como tablas
necesitemos:
Dim MiTabla2 as Tabledef, MiTabla3 as Tabledef,
y crearemos las tablas necesarias mediante el mtodo CreateTableDef
Si acude a la informacin de VB para ver los parmetros que hay que pasar en el mtodo
CreateTableDef ver que son muchos: ([nombre[, atributos[, origen[, conexin]]]]) Se explicar para que
sirven todos ellos, pero de momento nos quedamos nicamente con el primero: Nombre, que es el
nombre que podr ver en Access como nombre de la tabla que va a crear.
Set Mitabla1 = MiBaseDatos.CreateTableDef (Nombre)
Ejemplo:

Set Mitabla1 = MiBaseDatos.CreateTableDef (Alumnos)

Si queremos crear ms Tabladefs:


Set Mitabla2 = MiBaseDatos.CreateTableDef (Profesores)
Set Mitabla3 = MiBaseDatos.CreateTableDef (Asignaturas)
De momento solamente hemos creado uno o varios objetos Tabledef. Pero como siempre, vacos. Una
tabla tiene campos. Un objeto Tabledef tiene Fields. Debemos crear objetos Field (Campos) para poder
meterlos en los objetos Tabledef que acabamos de crear.

Crear campos. Mtodo CreateField


Crea un objeto Field, que es la estructura de lo que mas tarde ser un Campo de una tabla de la BD. El
objeto Field solamente est en la memoria RAM del ordenador. Cuando pase a formar parte de una tabla
ser un campo de esa tabla.
El objeto Field debe crearlo el objeto DAO superior a l: el Tabledef. Previamente declararemos los
nombres de los Objetos Field a introducir.
Dim MiCampo11 as Field, MiCampo121 as Field, MiCampo21 as Field
(El Campo11 es el primer campo que meteremos en el Tabledef Tabla1. El Campo12 el segundo, el
Campo21 ser el primer campo del Tabledef Tabla2, etc.
Los parmetros que vamos a pasar en este mtodo son:
Nombre
Tipo
Tamao

Ser el nombre de ese campo. P.e. NombreAlumno, Apellidos, etc


Tipo de dato, String, numrico, Date, etc
Slo para los campos String. Indicar el nmero de caracteres de ese campo.

Creamos el objeto Field con la siguiente sintaxis


Set MiCampo11 = Mitabla1.CreateField ([nombre[, tipo [, tamao]]])
(Vea el Anexo 1 Propiedades de los campos al final de este captulo)
Ejemplos
Set MiCampo11 = Mitabla1.CreateField (ID_Alumno, dbText, 8)
Set MiCampo12 = Mitabla1.CreateField (NombreAlumno, dbText, 20)
Set MiCampo13 = Mitabla1.CreateField (Apellidos, dbText, 25)
Set MiCampo14 = Mitabla1.CreateField (Edad, dbInteger)
Set MiCampo15 = Mitabla1.CreateField (Fecha_Ingreso, dbDate)
Set MiCampo21 = Mitabla2.CreateField (NombreProfesor, dbText, 20)

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 319

Se crean todos los campos que se quieren introducir en las tablas. Observe que cada objeto Field debe
ser creado por el objeto Tabledef que lo va a contener. (MiTabla1 crea todos sus campos, MiTabla2 los
suyos, etc)
Ya estn todos los campos creados, pero todava no estn metidos en las tablas. Tenemos que
aadirlos a la coleccin de campos de la tabla que los cre. Esa coleccin de campos es el Objeto Fields
de la tabla. Se aade mediante el mtodo Append.
MiTabla1.Fields.Append Micampo11
MiTabla1.Fields.Append Micampo12
MiTabla1.Fields.Append Micampo13
MiTabla1.Fields.Append Micampo14
MiTabla1.Fields.Append Micampo15
MiTabla2.Fields.Append Micampo21
Ya tenemos campos formando parte de la coleccin Fields de las tablas. Ahora debemos aadir las
tablas a la coleccin de tablas de la base de datos. Esa coleccin de tablas es el objeto Tabledefs de la
base de datos, es decir, del objeto DataBase. Lo haremos tambin mediante el mtodo Append
MiBaseDatos.TableDefs.Append Mitabla1
MiBaseDatos.Tabledefs.Append Mitabla2
Si ahora cerramos la base de datos mediante el mtodo Close:
MiBaseDatos.Close
Ya tenemos la base de datos creada en el disco de la misma forma que lo hubiera hecho Access.
Pero puede que le falte algo respecto a una base creada directamente con Access: los Indices y
las Relaciones.
Un ndice es una marca que le podemos poner a cada uno de los registros en un campo. Esa marca
puede servir por ejemplo, para ordenar los registros de la BD por ese campo. Puede servir tambin para
evitar que dos registros tengan el mismo valor para un determinado campo. En el ejemplo que estamos
preparando, el Campo11 (ID_Alumno) queremos que sea un ndice, y adems que no se pueda repetir el
mismo valor para dos registros distintos, de forma que no puedan existir dos registros con el mismo valor
en ese campo.
Una Relacin es una correspondencia entre un campo de una tabla y otro campo de caractersticas
similares en otra tabla. Esto nos lleva al concepto de Base de Datos Relacional que seguramente ya
sabe de que se trata. En Access se puede establecer una relacin de una forma muy sencilla. En Visual
Basic tambin. Pero antes de seguir reflexionemos y recordemos lo que hemos hecho hasta ahora.
Observe que, cada vez que creamos un objetos (DataBase, Tabledef, Field) usamos el mencionado
juego de nios. El mtodo correspondiente para crear un objeto DAO pertenece al objeto DAO
inmediatamente superior en jerarqua, es decir, CreateDatabase es un mtodo del objeto Workspace,
CreateTableDef es un mtodo del objeto Database, CreateField es un mtodo del objetos TableDef.
Las colecciones pertenecen tambin al objeto inmediatamente superior en jerarqua al tipo de objetos
que forman la coleccin. La coleccin Fields (Objeto Fields) pertenece a un objeto TableDef, la
coleccin TableDefs (objeto TableDefs) pertenece a un objeto Database, y la coleccin Databases
(Objeto Databases) pertenece a un objeto Workspace. La coleccin Workspaces pertenece al
DBEngine, y el DBEngine ya no podemos asignarlo a ningn objeto DAO. Tendremos que decir que
pertenece al sistema.
Recordemos ese juego de nios :
Set DAOInferior = DAOSuperior.Mtodo ( - - - - - -)
Hemos visto que despus de crear un objeto, debemos aadirlo a la coleccin a la que debe pertenecer
con el mtodo Append. El procedimiento es siempre el mismo :
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 320

Objeto superior.Coleccin.Append Objeto a aadir


Sigamos ahora perfeccionando la base de datos. Vamos a ver como se crea un Indice.

Crear Indices para los campos. Mtodo CreateIndex


Para crear un ndice debe estar creado el campo al que se le va a aplicar el ndice. Puede que le parezca
un poco extrao alguno de los mtodos que vamos a usar para crear un ndice, como por ejemplo volver
a usar el procedimiento CreateField para crear un campo que ya existe. Son las incongruencias que
tiene a veces Visual Basic. Le recomiendo que si no se acuerda bien de cmo se hace, recurra a la
ayuda de VB, que en este caso es exacta y concisa. O si lo prefiere, al ejemplo que ilustra esta Gua del
Estudiante como colofn a este captulo.
Primer debemos crear el Objeto Index. Se hace mediante el mtodo del objeto Tabledef, CreateIndex.
El ndice debe crearlo el Tabledef al que pertenece el campo que queremos que sea ndice. La sintaxis
de CreateIndex es:
Set NombreIndice = NombreTabledef.CreateIndex([Nombre])
Donde NombreIndice es el nombre de una variable declarada como tipo de dato objeto Index.
NombreTabledef es el nombre de variable del objeto TableDef que se desea usar para crear el nuevo
objeto Index.
Nombre es una variable de tipo String que da un nombre nico al nuevo objeto Index. Este nombre lo
puede ver si abre la base de datos con Access y en la vista de Diseo de la tabla, abre la funcin Ver |
Indices de la barra de men.
En nuestro ejemplo:
Declaramos el objeto Index
Dim MiIndice as Index
Creamos el ndice
Set MiIndice = MiTabla1.CreateIndex (Indice1)
Ya tenemos creado el Objeto Index. Ahora, (y aqu empieza la incongruencia citada) este objeto Index
debe crear el campo que queremos que sea ndice. Pero ese campo ya debe existir en el objeto
Tabledef con el que hemos creado el ndice (en este caso, en MiTabla1)
Set MiCampo11 = MiIndice.CreateField (ID_Alumno, dbText, 8)
El nombre del campo, tipo y tamao deben coincidir con los datos que sirvieron para crear el
campo en el objeto Tabledef.
Pero un ndice puede tener varios campos. Por ejemplo, piense en el cdigo de un objeto en un
inventario. El cdigo es el nmero que identifica de forma unvoca a un objeto. Un objeto inventariable
(por ejemplo una mesa) tiene un cdigo de grupo (por ejemplo, el 123) Hay muchas mesas dentro de un
inventario, pero todas ellas tienen un nmero distinto (una tiene el 001, otra el 002, etc) La combinacin
de cdigo de grupo ms el nmero del objeto dentro de ese grupo queremos que sea un ndice. Ese
ndice estar formado entonces por dos campos. En este caso deberemos crear los dos campos:
Set MiCampo11 = MiIndice.CreateField (C_Grupo, dbText, 3)
Set MiCampo12 = MiIndice.CreateField (Numero, dbText, 3)
Ya tenemos el campo o los campos creados por el ndice. Ahora debemos aadirlo (o aadirlos) a la
coleccin Fields del objeto Index recin creado. Lo hacemos mediante el mtodo Append
MiIndice.Fields.Append MiCampo11
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 321

Si fuesen dos los campos


MiIndice.Fields.Append MiCampo11
MiIndice.Fields.Append MiCampo12
No crea que ya hemos terminado. Un objeto Index tiene propiedades. Una de ellas ya la hemos visto sin
querer, la propiedad Name (nombre del ndice, en nuestro ejemplo, Indice1). Otras propiedades son:
Primary - El objeto Index representa la clave primaria de la tabla.
Unique - No permite repeticin de valores en ese campo
Required - Indica que todos los campos del objeto Index deben rellenarse.
IgnoreNulls - Indica si permite valores Nulos en los campos del ndice.
(Existen adems las propiedades Clustered, Foreign, DistinctCount que no se explican para no
complicar mas el tema. Cuando los necesite no tendr inconveniente en estudiarlos partiendo de la
ayuda de VB)
Para introducir el valor de una de estas propiedades se procede con la siguiente sintaxis:
MiIndice.Uniuqe = True
MiIndice.Primary = True
Ya est creado el ndice y tiene ya metido uno o mas campos y todas sus propiedades. Ahora debemos
aadir ese ndice a la coleccin Indexes del Objeto Tabledef.
MiTabla1.Indexes.Append MiIndice

Lo confieso. Cada vez que hago esto en la vida real tengo que volver a leer este procedimiento en la
Gua del Estudiante. Es complicado, pero alguna vez se terminar aprendiendo.

Ya tenemos la base de datos completamente creada. Sin embargo alguien dir que le falta algo:
Relacionar dos tablas

Relaciones entre tablas Mtodo CreateRelation


Una Relacin es una asociacin establecida entre dos campos del mismo tipo ubicados en dos tablas
distintas. Se pueden establecer relaciones uno a uno uno a varios. Para relacionar un campo con
otros, ese campo debe ser clave primaria. A la tabla que contiene a este campo se le llama Tabla
Principal. A la tabla que contiene el campo (o los campos) relacionados se le llama Tabla Relacionada.
Para crear una relacin, usaremos un nuevo objeto DAO : El objeto Relation. Este objeto forma parte de
una coleccin, que es a su ves otro objeto DAO : el objeto Relations.
Para crear una relacin usaremos el Mtodo CreateRelation, que es un mtodo del objeto Database.
(Lgico, una relacin se establece entre dos tablas. Por lo tanto, la relacin debe pertenecer al objeto
DAO superior jerrquicamente a las tablas: el Objeto Database. Como para cualquier otro objeto DAO,
es necesario declararlo :
Dim MiRelacion as Relation
Para crear la relacin deberemos usar el mtodo CreateRelation
Set MiRelacion = MiBaseDatos.CreateRelation ("RelacionUno")

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 322

Una relacin se hace entre dos campos. Una relacin debe tener campos. Por lo tanto, deberemos hacer
una cosa similar a la que hacamos para el mtodo CreateIndex, crear los campos mediante el Objeto
Relation que acabamos de crear. Pero esos campos ya deben estar creados en las tablas que se van a
relacionar.
Supongamos que queremos crear una relacin en la base de datos creada en el ejemplo anterior, y
queremos relacionar el campo Campo11 que est en MiTabla1 y que lo habamos hecho clave primaria,
con el campo Campo21 de MiTabla2. MiTabla1 y MiTabla2 son los nombres reales de las tablas, NO
los nombres de los objetos Tabledef.
El ejemplo que trae la ayuda de VB puede ser muy aclaratorio, pero le advertimos lo mismo que para los
ndices, paciencia. Una vez creada la relacin, podr comprobarlo visualizndola con el visor de
relaciones del Access
Suponemos que la base de datos est abierta. Si no lo est, la abrimos.
Set MiBaseDatos = Workspaces(0).OpenDatabase("MIBD.MDB")
Creamos el objeto Relation, que tendr por nombre RelacionUno, pero este nombre NO debe
confundirse con el nombre del objeto DAO Relation, que es MiRelacion
Set MiRelacion = MiBaseDatos.CreateRelation ("RelacionUno")
Una vez creada, le decimos a MiRelacion cual es la Tabla principal
MiRelacin.Table = "MiTabla1"

'Nombre de la tabla principal.

Le decimos cual es el nombre de la tabla relacionada


MiRelacin.ForeignTable = "MiTabla2"

Nombre de la tabla relacionada

Le ponemos los atributos a la relacin. En este caso dbRelationUpdateCascade, para que, si hacemos
un cambio en el valor del campo de la tabla principal, ese cambio se refleje en el campo o los campos
relacionados con el.
MiRelacin.Attributes = dbRelationUpdateCascade
Le decimos cual es el nombre del campo de la tabla principal que vamos a relacionar, mediante el
mtodo CreateField. Deberemos declarar el nombre del objeto Field que vamos a crear para la relacin
Dim MiCampo as Field
Set MiCampo = MiRelacin.CreateField("Campo11")
Le recordamos lo de antes. Campo11 debe estar ya creado en la tabla Tabla1. Parece un poco ilgico
usar el mtodo CreateField para un campo que ya est creado.
Le decimos ahora cual es el nombre del campo en la tabla relacionada
MiCampo.ForeignName = "Campo21"
Aadimos el campo creado a la coleccin Fields del objeto Relation
MiRelacin.Fields.Append MiCampo
Y ahora aadimos el objeto Relation recin creado a la coleccin Relations del objeto Database
MiBaseDatos.Relations.Append MiRelacin
Solamente nos falta ver que valores puede tener la propiedad Attributes del objeto Relation
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 323

dbRelationUnique
dbRelationDontEnforce
dbRelationInherited
dbRelationUpdateCascade
dbRelationDeleteCascade

La relacin es uno a uno.


La relacin no es impuesta (no hay integridad referencial).
La relacin existe en una base de datos no activa que contiene
las dos tablas vinculadas.
Las actualizaciones se realizarn en cascada.
Las eliminaciones se realizarn en cascada.

Ahora ya casi podemos decir que tenemos la base de datos creada. Puede que sea as o que le falte
alguna cosa. Puede faltarle una o varias consultas. Las consultas tambin se pueden crear mediante
objetos DAO. Precisamente con un objeto QueryDef

Consultas. El Objeto QueryDef


Pero habr observado que una base de datos ACCESS puede contener, adems de tablas,
CONSULTAS. Las consultas no contienen datos. Contienen una referencia a los registros de las tablas
que los contienen. Una consulta podramos decir que son conjuntos de registros tomados de una o
varias tablas (en este ltimo caso, esas tablas deben estar relacionadas) que cumplen unas
determinadas condiciones. Pero aunque podemos ver esos registros como tales, con sus datos
exactamente igual que si se tratase de los registros de una tabla, las consultas no contienen el dato, sino
el nmero del registro dentro de la tabla que lo contiene. A la hora de presentar los datos de una
consulta, lo que estamos presentando son los datos almacenados en la tabla o las tablas que componen
esa consulta.

Crear una consulta. Mtodo CreateQueryDef


Un objeto QueryDef representa una consulta de la base de datos. El objeto QueryDefs es la coleccin
de objetos QueryDef. La diferencia entre una consulta (Un QueryDef) y una tabla (Un TableDef) es que
la Tabla tiene dentro de s los datos. La consulta tiene dentro una referencia al lugar de las tablas donde
se encuentran los datos.
Antes de utilizar el mtodo CreateQueryDef debe declarar el nombre de los objetos a crear,
declarndolos como Variables Objeto tipo QueryDef . El mbito es igual que para cualquier variable:
Public MiConsulta1 as QueryDef
Public MiConsulta2 as QueryDef
Ahora podemos utilizar el mtodo CreateQueryDef para crear el nuevo objeto QueryDef en la base de
datos.
Sintaxis Con la frmula de siempre :
Set MiConsulta1 = MiBaseDatos.CreateQueryDef ([Nombre][, Texto_sql])
Donde
MiConsulta1 es una variable del tipo QueryDef que previamente se ha declarado como tal. Ser el
nombre por el que llamemos al Objeto QueryDef en el cdigo de nuestra aplicacin.
MiBaseDatos es el nombre del objeto Database abierto en el que vamos a introducir el nuevo objeto
QueryDef.
Nombre es una expresin de cadena que representa el nombre de la nueva consulta que vamos a crear.
Este nombre ser el que veamos al abrir la base de datos con Access en la pestaa Consultas. Puede
omitirlo a la hora de crear la consulta, pero deber aadirselo posteriormente.
Texto_sql es una expresin de cadena (instruccin SQL vlida) que define el objeto QueryDef.
Lgicamente una consulta nos debe suministrar una serie de datos de una o mas tablas. Esos datos no
tienen porqu ser todos los datos de las tablas. Texto_sql es precisamente el filtro de esos datos
(expresado mediante una clusula SQL).
Una vez creado el objeto QueryDef, no es necesario aadirlo a la coleccin QueryDefs de la Base de
Datos, excepto que hayamos creado el objeto QueryDef sin nombre. (Sin haber puesto el parmetro
Nombre, segn se coment mas atrs). Para aadirlo a la coleccin QueryDefs :
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 324

MiBaseDatos.QueryDefs.Append MiConsulta1
Como caso prctico de creacin de una consulta, podemos tener
Set MiConsulta1 = MiBaseDatos.CreateQueryDef (Fernandez, Select Nombre, Apellido1,
Apellido2 From Alumnos Where Apellido1 = Fernandez )
Ahora ya tenemos la base de datos creada con todas las posibilidades. Ha llegado el momento de crear
una base real para comprobar todo lo expuesto.

Ejemplo prctico de creacin de una base de datos. El famoso ejercicio del Videoclub
Vayamos a un ejemplo tpico en cualquier curso de Visual Basic: el famoso Videoclub. Un videoclub tiene
una base de datos en la que tenemos una tabla, de nombre Clientes donde figuran los nombres y
direccin de los clientes, as como el nmero de su cuenta bancaria. Tiene un campo (ID_Cliente) que
es el que define al cliente. Ser un campo tipo texto, que albergar un nmero que se incrementar en 1
cada vez que se hace un nuevo cliente. Cada cliente tiene un ID_Cliente y ese ID_Cliente es nico para
l. (Este campo podra ser un autonumrico, pero personalmente no me gusta usar autonumricos. Un
autonumrico es un Long numrico- y quiero ser coherente con lo expuesto en el captulo 1 donde se
deca que solamente se usaran campos numricos en aquellos datos con los que se hagan operaciones
matemticas) El campo ID_Cliente ser clave primaria, ya que no pueden existir dos clientes con el
mismo ID_Cliente.
Otra tabla necesaria ser la tabla Peliculas, donde introduciremos todos los datos relativos a las
pelculas (existentes o no en el videoclub), tal como ttulo, director, artistas, resumen, calificacin, precio,
etc. Tendr un campo, ID_Pelicula que identificar a esa pelcula. Pero puede haber versiones en varios
idiomas, por lo tanto, existir otro campo Idioma de tipo texto, para introducir ese dato. Por lo tanto, una
pelcula deberemos definirla por el conjunto formado por su ID_Pelicula y por su Idioma. El conjunto de
esos dos campos ser la clave primaria. (Si cree que hay campos que no tienen sentido en esta tabla
(Idioma), piense que esto es un ejemplo para poder explicar de la forma ms didctica todas las posibles
variaciones de una instruccin)
Existe otra tabla denominada Cintas, donde figurarn todas las cintas existentes en el videoclub.
Para poder relacionarla con la tabla Peliculas, le ponemos un campo llamado ID_Pelicula que en
esta tabla no ser clave primaria. Tambin le pondremos el campo Idioma, sobre el que no
haremos ningn tipo de relacin. Tendr un campo ID_Cinta que ser la combinacin de varios
datos, uno que nos indique la pelcula que tiene grabada esa cinta (Ser la combinacin de los
campos ID_Pelicula e Idioma) y de un nmero secuencial que indicar el nmero de la copia. Si le
pone imaginacin y este conjunto de datos puede meterse en un cdigo de barras, le facilitar la
operacin de alquiler y devolucin. En este ejercicio haremos que sea as, dndole a este campo
un tamao de 13 dgitos para poder meterlo en un cdigo EAN-13. Podemos aadirle mas
campos a nivel administrativo, como fecha de alta, fecha de baja, precio de esta copia, etc.

Existir una tercera tabla, Alquileres, que relacionar al cliente con la cinta que ha alquilado.
Tendr un campo llamado ID_Cliente y otro ID_Cinta. Aparte tendr otros dos campos, fecha de
alquiler y fecha de devolucin.
La base de datos deber tener dos relaciones, una, entre el campo ID_Cliente de la tabla Clientes
y el campo ID_Clientes de la tabla alquileres (Ser uno a infinito) y otra relacin, entre el campo
ID_Cinta de la tabla Cintas y el campo ID_Cinta de la tabla Alquileres (Relacin 1 a 1 ya que
solamente existe una cinta con esa ID_Cinta). Para darle ms alegra al ejercicio le pondremos
una relacin entre los campos ID_Pelicula e Idioma de las tablas Peliculas y Cintas.
(Se ha puesto el nombre de Pelicula al campo relacionado con ID_Pelicula para que se vea que
dos campos relacionados no tienen porqu tener el mismo nombre. Eso s, deben tener las
mismas caractersticas)
Como colofn a todo esto, crearemos una consulta en la que utilizaremos todas las relaciones.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 325

Para llevar a cabo este ejercicio se ha partido de una interface grfica en la que pueden verse tres
botones (Borrar la base de datos, crearla y salir) y un TextBox donde se ha puesto el nombre del
fichero de la base de datos en su propiedad Text. Veamos el cdigo de cada uno de los botones
(por orden inverso de complejidad del cdigo)

Fig. 20.3 Interface grfica de la parte de crear bases de datos para la aplicacin del Videoclub
CODIGO
Private Sub BSalir_Click()
Unload Me
End Sub
Private Sub BBorrar_Click()
On Error GoTo RutErr
Dim HayDir As String
HayDir = Dir(TBNombreBase)
If HayDir <> "" Then
Kill TBNombreBase
End If
RutErr:
If Err = 75 Then
MsgBox "Tiene la Base de Datos abierta por otro programa"
End If
End Sub
Creacin de la base de datos
Private Sub BCrear_Click()
On Error GoTo RutErr
Dim HayDir As String Se comprueba que existe la BD y se invita a borrarla
HayDir = Dir(TBNombreBase)
If HayDir <> "" Then
MsgBox "Ya existe el fichero con la base de datos. Debe borrarlo previamente"
Exit Sub
End If
Se declaran todas las variables tipo objeto
Dim MiBaseDatos As Database
Dim MiTabla1 As TableDef, MiTabla2 As TableDef, MiTabla3 As TableDef
Dim MiTabla4 As TableDef
Dim MiCampo11 As Field, MiCampo12 As Field, MiCampo13 As Field
Dim MiCampo14 As Field, MiCampo15 As Field, MiCampo21 As Field
Dim MiCampo22 As Field, MiCampo23 As Field, MiCampo24 As Field
Dim MiCampo25 As Field, MiCampo31 As Field, MiCampo32 As Field
Dim MiCampo33 As Field, MiCampo34 As Field, MiCampo35 As Field
Dim MiCampo36 As Field, MiCampo41 As Field, MiCampo42 As Field
Dim MiCampo43 As Field, MiCampo44 As Field
Se crea el Objeto DataBase (Se toma el nombre del fichero del TextBox TBNombreBase
Set MiBaseDatos = Workspaces(0).CreateDatabase(TBNombreBase, dbLangGeneral)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 326

Se crean los Objetos Tabledef


Set MiTabla1 = MiBaseDatos.CreateTableDef("Clientes")
Set MiTabla2 = MiBaseDatos.CreateTableDef("Peliculas")
Set MiTabla3 = MiBaseDatos.CreateTableDef("Cintas")
Set MiTabla4 = MiBaseDatos.CreateTableDef("Alquileres")
Cada Tabledef crea sus propios Objetos Field
Set MiCampo11 = MiTabla1.CreateField("ID_Cliente", dbText, 8)
Set MiCampo12 = MiTabla1.CreateField("Nombre", dbText, 20)
Set MiCampo13 = MiTabla1.CreateField("Apellidos", dbText, 50)
Set MiCampo14 = MiTabla1.CreateField("Direccion", dbText, 50)
Set MiCampo15 = MiTabla1.CreateField("Telefono", dbText, 15)
Set MiCampo21 = MiTabla2.CreateField("ID_Pelicula", dbText, 8)
Set MiCampo22 = MiTabla2.CreateField("Titulo", dbText, 20)
Set MiCampo23 = MiTabla2.CreateField("Idioma", dbText, 1)
Set MiCampo24 = MiTabla2.CreateField("Director", dbText, 25)
Set MiCampo25 = MiTabla2.CreateField("Resumen", dbText, 255)
Set MiCampo31 = MiTabla3.CreateField("ID_Cinta", dbText, 13)
Set MiCampo32 = MiTabla3.CreateField("Pelicula", dbText, 20)
Set MiCampo33 = MiTabla3.CreateField("Idioma", dbText, 1)
Set MiCampo34 = MiTabla3.CreateField("Precio", dbSingle)
Set MiCampo35 = MiTabla3.CreateField("Fecha_Alta", dbDate)
Set MiCampo36 = MiTabla3.CreateField("Fecha_Baja", dbDate)
Set MiCampo41 = MiTabla4.CreateField("ID_Cliente", dbText, 8)
Set MiCampo42 = MiTabla4.CreateField("ID_Cinta", dbText, 13)
Set MiCampo43 = MiTabla4.CreateField("Fecha_Alq", dbDate)
Set MiCampo44 = MiTabla4.CreateField("Fecha_Dev", dbDate)
Una vez creados los campos se les ponen las peopiedades que se estime oportuno
En este caso, se ha puesto la propiedad AllowZeroLength (Permitir valores nulos en ese campo)
a lo que interesa en cada uno de los campos. Nota Tenga presente que por defecto le va a dejar
el campo que NO permite valores nulos, circunstancia que le va a crear problemas.
MiCampo12.AllowZeroLength = True
MiCampo13.AllowZeroLength = False
MiCampo14.AllowZeroLength = True
MiCampo15.AllowZeroLength = True
Se aaden los campos a la coleccin Fields de las tablas
MiTabla1.Fields.Append MiCampo11
MiTabla1.Fields.Append MiCampo12
MiTabla1.Fields.Append MiCampo13
MiTabla1.Fields.Append MiCampo14
MiTabla1.Fields.Append MiCampo15
MiTabla2.Fields.Append MiCampo21
MiTabla2.Fields.Append MiCampo22
MiTabla2.Fields.Append MiCampo23
MiTabla2.Fields.Append MiCampo24
MiTabla2.Fields.Append MiCampo25
MiTabla3.Fields.Append MiCampo31
MiTabla3.Fields.Append MiCampo32
MiTabla3.Fields.Append MiCampo33
MiTabla3.Fields.Append MiCampo34
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 327

MiTabla3.Fields.Append MiCampo35
MiTabla3.Fields.Append MiCampo36
MiTabla4.Fields.Append MiCampo41
MiTabla4.Fields.Append MiCampo42
MiTabla4.Fields.Append MiCampo43
MiTabla4.Fields.Append MiCampo44
Se aaden las tablas a la coleccin Tabledefs del objeto Database
MiBaseDatos.TableDefs.Append MiTabla1
MiBaseDatos.TableDefs.Append MiTabla2
MiBaseDatos.TableDefs.Append MiTabla3
MiBaseDatos.TableDefs.Append MiTabla4
Se declaran las variables tipo objeto Index y tipo objeto Field para crear los ndices
Dim MiIndice1 As Index, MiIndice2 As Index, MiIndice3 As Index
Dim CampoIndiceA As Field
Dim CampoIndiceB As Field
Se crea el primer objeto Index
Set MiIndice1 = MiTabla1.CreateIndex("IndiceCliente")
Este objeto Index crea el campo que va a ser ndice, con los mismos datos que el
campo MiCampo11
Set CampoIndiceA = MiIndice1.CreateField("ID_Cliente", dbText, 8)
Se aade el campo a la coleccin Fields del Index
MiIndice1.Fields.Append CampoIndiceA
Se le dice que es un ndice primario (Clave primaria)
MiIndice1.Primary = True
Se aade el objeto Index recin creado a la coleccin Index del objeto tabledef
MiTabla1.Indexes.Append MiIndice1
Se procede de igual forma con el segundo objeto Index
Set MiIndice2 = MiTabla2.CreateIndex("IndicePeliculas")
Aqu se meten dos campos en el mismo ndice
Set CampoIndiceA = MiIndice2.CreateField("ID_Pelicula", dbText, 10)
Set CampoIndiceB = MiIndice2.CreateField("Idioma", dbText, 1)
MiIndice2.Fields.Append CampoIndiceA
MiIndice2.Fields.Append CampoIndiceB
MiIndice2.Primary = True
MiTabla2.Indexes.Append MiIndice2
Set MiIndice3 = MiTabla3.CreateIndex("IndiceCintas")
Set CampoIndiceA = MiIndice3.CreateField("ID_Cinta", dbText, 13)
MiIndice3.Fields.Append CampoIndiceA
MiIndice3.Primary = True
MiTabla3.Indexes.Append MiIndice3

Se declaran los objetos Relation y un par de objetos Field para crear las relaciones. Por
claridad se han declarado objetos Field distintos para la creacin de los ndices y de las relaciones, pero
podran haber sido los mismos
Dim MiRelacion1 As Relation, MiRelacion2 As Relation, MiRelacion3 As Relation
Dim CampoRelacionA As Field
Dim CampoRelacionB As Field
Se crea la primera relacin entre el campo ID_Clientes de la tabla Clientes (Tabla primaria) y el campo
ID_Cliente de la tabla Alquileres (Tabla relacionada)
Set MiRelacion1 = MiBaseDatos.CreateRelation("RelClientes", "Clientes", "Alquileres")
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 328

Set CampoRelacionA = MiRelacion1.CreateField("ID_Cliente", dbText, 8)


CampoRelacionA.ForeignName = "ID_Cliente"
MiRelacion1.Fields.Append CampoRelacionA
MiBaseDatos.Relations.Append MiRelacion1
Se crea la segunda relacin
Set MiRelacion2 = MiBaseDatos.CreateRelation("RelCintas", "Cintas", "Alquileres")
MiRelacion2.Attributes = dbRelationUnique
Set CampoRelacionA = MiRelacion1.CreateField("ID_Cinta", dbText, 13)
CampoRelacionA.ForeignName = "ID_Cinta"
MiRelacion2.Fields.Append CampoRelacionA
MiBaseDatos.Relations.Append MiRelacion2
La tercera relacin relaciona dos campos, Pelcula e Idioma
Set MiRelacion3 = MiBaseDatos.CreateRelation("RelCintasPelis", "Peliculas", "Cintas")
Set CampoRelacionA = MiRelacion1.CreateField("ID_Pelicula", dbText, 8)
Set CampoRelacionB = MiRelacion1.CreateField("Idioma", dbText, 8)
CampoRelacionA.ForeignName = "Pelicula"
CampoRelacionB.ForeignName = "Idioma"
MiRelacion3.Fields.Append CampoRelacionA
MiRelacion3.Fields.Append CampoRelacionB
MiBaseDatos.Relations.Append MiRelacion3
Se comienza a crear una consulta (La sentencia SQL est cortada dado que no cabe en una lnea. El
signo indica que esa lnea contina en la siguiente
Dim MiConsulta1 As QueryDef
Set MiConsulta1 = MiBaseDatos.CreateQueryDef("Pelis", "SELECT Clientes.Nombre,
Clientes.Apellidos, Clientes.Telefono, Peliculas.Titulo, Alquileres.ID_Cinta " & _
" FROM Peliculas INNER JOIN (Clientes INNER JOIN (Cintas INNER JOIN Alquileres ON
Cintas.ID_Cinta = Alquileres.ID_Cinta) " & _
" ON Clientes.ID_Cliente = Alquileres.ID_Cliente) ON (Peliculas.Idioma = Cintas.Idioma) AND
(Peliculas.ID_Pelicula = Cintas.Pelicula)" & _
" WHERE (((Alquileres.ID_Cinta)='0000000000001'));")
Se cierra la el objeto database. En este momento es cuando se crea el fichero.
MiBaseDatos.Close
se comunica al usuario la buena nueva de que la base ha sido creada.
MsgBox "La base de datos se ha creado con xito"
Aqu comienza la rutina de error
Exit Sub
RutErr:
MsgBox "Ha ocurrido el error " & Err & ". " & Err.Description
End Sub
Nota acerca de la sentencia SQL para crear la consulta.
Se puede ser muy experto en SQL y tener miedo a crear una consulta SQL debido a la
complejidad que puede tener. No crea que el autor ha escrito la sentencia SQL que ha visto. Ha
utilizado el truco de crear primero la consulta con Access, de la forma grfica que seguro que Vd.
conoce, ha comprobado que era eso lo que quera, pas a Vista SQL y la copi. Es muy bueno
hacer prcticas con SQL, para que no se olvide. Pero en algunos casos es preferible acudir a los
trucos que nos proporcionan nuestras herramientas.

El resultado de todo esto podemos verlo si abrimos la base de datos con Access

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 329

Fig. 20.4 Tablas de la BD de Videoclub creada con el cdigo descrito

Fig. 20.5 Y la consulta

Fig. 20.6 Clave Primaria formada con los dos campos de la tabla Pelculas

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 330

Fig. 20.7 Propiedades de esa clave primaria

Fig. 20.8 Las relaciones creadas

Crear bases de datos con contrasea


Imagnese que quiere que su base de datos no se pueda abrir mediante Access. Lo que debe
hacer es crearla con una contrasea (Password) de forma que cuando la quiera abrir, le pida el
Password. Si no lo sabe, no se puede abrir. Si crea una base de datos con estas caractersticas, y
no comunica el Password a nadie, solamente la podr abrir mediante el programa. (Eso s, el
programa para abrirla, deber introducir en su instruccin de apertura el Password con el que se
cre.)
Si volvemos a la lnea donde creabamos la base de datos del videoclub:
Set MiBaseDatos = Workspaces(0).CreateDatabase(TBNombreBase, dbLangGeneral)
Basta con aadirle ";pwd=PaswordElegido" concatenndolo tras el parmetro que especifica la
lengua. En el ejemplo siguiente hemos usado como Password las iniciales LSB
Set MiBaseDatos =
= Workspaces(0).CreateDatabase(TBNombreBase, dbLangGeneral & ";pwd=LSB")
Cuando lleguemos a la parte de abrir bases de datos, explicaremos cmo se abre una base de
datos con contrasea. Y no crea que ha conseguido la confidencialidad total de sus datos.
Existen programas que puede bajarse de Internet que le leen la contrasea con la que ha
protegido su base. No es una proteccin total, pero s suficiente para que un usuario normal no
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 331

se la pueda abrir.

Crear bases de datos encriptada


Puede encriptar el fichero de su base de datos. Solamente le ser til para que no puedan ver el
contenido del fichero .MDB, ya que si se abre con Access, le presentar los datos de forma
correcta. Para encriptar una base de datos basta con aadir la palabra dbEncrypt en la instruccin
donde ha creado la BD
Set MiBaseDatos = Workspaces(0).CreateDatabase(TBNombreBase,dbLangGeneral & ";pwd=LSB", dbEncrypt)

Ha merecido la pena el trabajo. Hemos creado la base de datos haciendo click en un botn de la
aplicacin. No ha sido necesario venderle al cliente Access, ni enviar una base de datos vaca
con los discos de distribucin. Adems hemos controlado todos los parmetros de los campos
de nuestra BD. Merece la pena crearse las bases de datos por programa.

Anexo1
Propiedades de los campos
Ha visto mas atrs que puede ser necesario cambiar las propiedades de los campos una vez
creados (Por ejemplo, MiCampo13.AllowZeroLength = False) Alargaramos demasiado este ya
largo captulo si se explican todos los las propiedades que puede tener un campo. Aada un
poco de esfuerzo a su estudio y vea las propiedades de los objetos Field en la ayuda. Le reseo
aqu las que he considerado mas importantes

AllowZeroLength Si/NO Si es Si permite que ese campo tenga valores nulos


DataUpdatable Si/No Si es Si permite modificar el dato de ese campo. No tiene aplicacin a la hora de
crear un campo. S puede cambiar el valor de esta propiedad por ejemplo, cuando crea un recordset.
DefaultValue Es el valor que le pone a ese campo si no introduce ninguno. Puede indicar un valor a la
hora de crear el campo:
Campo14.DefaultValue = Madrid

Required Si/No Indica si el dato es requerido. En caso de que tome el valor SI (True) es
necesario introducir un dato en ese campo
Value Es justamente el dato que almacena en ese campo. Es la propiedad por defecto del objeto Field.

Propiedades Type, Attributes y Size referidas a los campos


En el mtodo CreateField debe introducir el tipo del campo que desea crear. (Como puede ver
mas atrs, con esta sintaxis p.e.: CreateField("Fecha_Alq", dbDate) Ese tipo coincide con la
propiedad Type aplicada a los campos. La propiedad Size solamente tendr que aplicarla cuando
vaya a crear un campo tipo Texto.
Puede ver la ayuda de VB para mas detalles. Le enumero los mas usuales

Propiedad Type
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 332

Constante

Descripcin

Constante

dbBoolean
dbCurrency
dbDouble
dbLong
dbLongBinary
dbSingle

Campo SI/NO
dbByte
Tipo moneda
dbDate
Numrico Doble
dbInteger
Entero Long
dbMemo
Binario largo (Objeto OLE)
Numrico Single
dbText

Descripcin
Campo tipo Byte
Tipo Date/Time
Numrico Integer
Campo Memo
CampoTexto

Propiedad Attributes
Constante

Descripcin

dbFixedField
dbVariableField
dbAutoIncrField

El tamao del campo es fijo (predeterminado en campos numricos).


El tamao del campo es variable (Slo campos de texto).
El valor del campo en los registros nuevos es incrementado
automticamente a un valor Long integer nico que no puede ser modificado.
Slo aceptado en tablas bases de datos Jet.
El valor del campo no puede ser modificado.
El campo est ordenado de forma descendente (Z-A o 100-0) (slo se
aplica a objetos Field de una coleccin Fields de un objeto Index). Si se omite
esta constante, el campo se ordena ascendentemente (A-Z o 0-100)
(predeterminado).

dbUpdatableField
dbDescending

dbAutoIncrField es la constante a utilizar cuando queremos crear un campo que se vaya


incrementando cada vez que se introduce un nuevo registro (Campo Contador). Por ejemplo, si hemos
creado un campo denominado ID que ser el contador de una serie de registros, y queremos que se
incremente en 1 cada vez que aadamos un registro, debemos usar la propiedad Attributes ANTES de
aadir ese campo al objeto TableDef correspondiente, de la siguiente forma :
Set micampo1N = mitabla01.CreateField("ID", 4) Creamos el campo ID
micampo1N.Required = True
La propiedad Required la veremos
micampo1N.Attributes = dbAutoIncrField
Le damos atributo de contador
mitabla01.Fields.Append micampo11
Aadimos el campo a la tabla
Propiedad Size
Devuelve o establece un valor que indica el tamao mximo, en bytes, de un objeto Field que contiene
texto o el tamao fijo de un objeto Field que contiene texto o valores numricos
Esta propiedad se le debe suministrar en la sintaxis de CreateField solamente cuando creamos
un campo tipo texto - CreateField("ID_Cinta", dbText, 13). El tamao de un campo texto puede
ser desde 1 a 255 caracteres. Para el resto de los tipos de datos, el tamao va implcito en el tipo
de dato. Puede consultar el tamao ocupado por cualquier campo, leyendo la propiedad Size de
un campo:
Variable = Micampo11.Size

Abrir una Base de Datos ya existente mediante DAO.


Mtodo OpenDatabase
Hasta ahora hemos visto como crear una base de datos. No es lo ms usual. Lo normal es tener la base
de datos creada y abrirla cuando queremos extraer datos o introducir datos. Vamos a ver como se abre
una base de datos mediante DAO, usando el espacio de trabajo Microsoft JET. Veremos luego como se
puede crear un Recordset, que es en realidad sobre el que se leen y escriben datos, como se pueden
aadir registros, borrarlos etc.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 333

Para abrir una base de datos existente deberemos usar el mtodo OpenDatabase. Pero previamente
deberemos declarar el nombre que se le va a dar a ese objeto Database mediante la instruccin Dim si
queremos que el mbito de ese Database sea un formulario, o Global o Public, (en la seccin de
declaraciones de un Mdulo o Formulario) si queremos que el mbito sea toda la aplicacin.
Por ejemplo, si queremos abrir una base de datos y poder referirnos a ella en toda la aplicacin,
debemos declararla de esta forma en la seccin de declaraciones de un mdulo :
Public MiBaseDatos as Database

Mtodo OpenDatabase
Abre la base de datos existente. La base de datos abierta se agrega automticamente a la coleccin
Databases.
Sintaxis Recuerde la expresin general: Set DAOInferior = DAOSuperior.Mtodo ( - - - - - -)
Set MiBaseDatos = Misesion.OpenDatabase(nombre_bd[, exclusivo[, slo-lectura[, origen]]])
La sintaxis del mtodo OpenDatabase consta de las siguientes partes:
MiBaseDatos Variable de tipo de dato objeto Database que representa el objeto DAO
Database que se va a abrir.
Misesion
Variable de tipo de dato objeto Workspace que representa el objeto
Workspace existente que va a contener a la base de datos.
nombre_bd
Expresin de cadena con el nombre de un archivo (y su Path) de una base de
datos existente. Si el nombre de archivo tiene extensin, es necesario especificarla. Si la
red lo admite, tambin puede especificar una ruta de red, como por ejemplo
"\\MISERVID\MICOMP\MIDIR\MIBD.MDB". nombre_bd tambin puede ser un origen de
datos OBDC. Lo veremos en otro captulo.
Al especificar nombre_bd hay que tener en cuenta algunas consideraciones:
Si se refiere a una base de datos ya abierta por otro usuario con acceso
exclusivo, se producir un error.
Si no se refiere a una base de datos existente o a un origen de datos ODBC
vlido, se producir un error.
Si es una cadena de longitud cero ("") y origen es "ODBC;", aparecer un cuadro de
dilogo con todos los nombres de orgenes de datos ODBC registrados, en el que el
usuario podr elegir una base de datos.
exclusivo

slo_lectura

origen

p.e.

Valor de tipo Boolean que es True si la base de datos se va a abrir con acceso
exclusivo (no compartido) o False si se va a abrir con acceso compartido. Si se omite
este argumento, la base se abrir con acceso compartido.
Valor de tipo Boolean que es True si la base de datos se va a abrir con acceso
de slo lectura o False si se va a abrir con acceso de lectura/escritura. Si se omite este
argumento, la base se abrir para lectura/escritura.
Expresin de cadena utilizada para abrir la base de datos. Esta cadena
constituye los argumentos de conexin ODBC. Para especificar una cadena de origen
deber especificar tambin los argumentos exclusivo y slo_lectura. Consulte la sintaxis
en la propiedad Connect.

Set MiBaseDatos = Misesion.OpenDatabase (C:\Guia_Est\Videoclub.MDB)

abre la base de datos cuyo fichero est en C :\Guia_Est y se llama Videoclub.MDB. Al no expresarle mas
parmetros la abre de modo no exclusivo, y de lectura y escritura. Al no especificar nada en el parmetro
origen entiende que la base es ACCESS
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 334

Nota para todo este captulo. No es necesario cambiar el nombre del Workspace. Si Misesion =
Workspaces (0), la sentencia anterior podemos ponerla tambin :
Set MiBaseDatos = Workspaces(0).OpenDatabase (C:\Guia_Est\Videoclub.MDB)
El hecho de poner siempre un nombre al Workspace es solamente a efectos didcticos
Ya tenemos la base de datos abierta. Pero no crea que nuestro programa ha hecho trabajo. Se ha
limitado a ver si exista el fichero indicado y a apuntar el nombre y path de ese fichero que contiene la
base de datos. El trabajo comienza cuando cree el recordset.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 335

EL OBJETO RECORDSET
(O la mitad de lo que Vd. necesita saber de Bases de Datos)
Un objeto Recordset contiene los registros de una tabla o de una consulta. Puede ser que no los
contenga todos, si al crear ese recordset le hemos impuesto que los registros cumplan una determinada
condicin. En resumen, un recordset es un objeto de acceso a datos que contiene una coleccin de
registros tomados, bien de una tabla, bien de un conjunto de tablas (a travs de una consulta)
Tambin hay una coleccin Recordsets. La coleccin Recordsets contiene todos los objetos Recordset
abiertos de un objeto Database.
Al utilizar objetos de acceso a datos, casi toda la interaccin con los datos se produce a travs de
objetos Recordset. Todos los objetos Recordset estn formados por registros (filas) y campos
(columnas). Existen tres tipos de objetos Recordset:
Recordset de tipo tabla: Representacin en cdigo de una tabla base de datos que puede utilizarse
para agregar, modificar o eliminar registros de una sola tabla de base de datos. Un Recordset tipo Tabla
contiene todos los campos de una tabla y no puede contener campos que no pertenezcan a esa tabla.
Recordset de tipo hoja de respuestas dinmica: Resultado de una consulta que puede tener registros
actualizables. Un Recordset de tipo hoja de respuestas dinmica es un conjunto dinmico de registros
que puede utilizarse para agregar, modificar o eliminar registros de una o ms tablas de una base de
datos subyacente. Este tipo de objeto Recordset puede contener campos de una o ms tablas de una
base de datos.
Recordset de tipo instantnea: Copia esttica de un conjunto de registros que puede utilizarse para
buscar datos o generar informes. Los objetos Recordset de tipo instantnea pueden contener campos de
una o ms tablas de una base de datos, pero no pueden actualizarse. Un recordset de tipo instantnea
(Snapshot) es una fotografa que se hace a la tabla o tablas que lo componen. Los datos que tiene el
recordset son los que existan cuando se realiz la fotografa. Cualquier actualizacin posterior no se
puede ver.
Resumiendo, un Recordset es un conjunto de registros. Recuerde cuando explicbamos en control Data
se deca que este control creaba un Recordset a partir de sus propiedades DatabaseName y
RecordSource. De esta forma, el conjunto de registros que tiene ese control Data es la totalidad de los
registros de la tabla (o consulta) que ponamos en la propiedad RecordSource. Pero siempre podemos
asignar a la propiedad Recordset de ese control Data un Recordset ya creado mediante cdigo. Y en ese
caso, solamente contendr los campos que a nosotros nos interese, incluso campos de distintas tablas,
cosa que viene muy bien algunas veces.
Un Recordset lo crearemos con el mtodo OpenRecordset que estamos estudiando. El objeto
Recordset se abre desde un objeto DataBase (que es lo normal). Pero si acude a la informacin de VB
ver que tambin se puede abrir desde un TableDef, un QueryDef y desde otro Recordset. No se
complique la vida. Abra directamente los Recordsets desde la base de datos. A lo mejor, tenemos
oportunidad de ver que tambin se puede abrir desde otro recordset, pero que en este caso solamente
podemos abrirlo para cambiar alguna de sus propiedades.
Como cualquier objeto DAO, debemos declararlo como variable tipo objeto.
Public Mirecordset As Recordset
Una vez declarado, para abrirlo basta con ejecutar la sentencia :
Set Mirecordset = base_datos.OpenRecordset (origen[, tipo[, opciones]])
Al crear un nuevo objeto Recordset se agrega automticamente a la coleccin Recordsets.
base_datos es el nombre del objeto Database que va a crear el recordset. (La base de datos que acaba
de abrir)

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 336

Origen en la primera expresin es una variable de tipo String que especifica el origen de los registros del
nuevo objeto Recordset. El origen puede ser un nombre de tabla, un nombre de consulta o una
instruccin SQL que devuelva registros. En el caso de los objetos Recordset de tipo tabla, el origen slo
puede ser un nombre de tabla.
Tipo es el tipo de Recordset que se quiere crear. Si no se especifica un tipo, OpenRecordset crear un
objeto Recordset de tipo tabla cuando sea posible. (Cuando especifica como Origen el nombre de una
Tabla) Si se especifica una consulta o una tabla adjunta, OpenRecordset crear un objeto Recordset de
tipo hoja de respuestas dinmica. El tipo del nuevo objeto Recordset se define mediante una de las
siguientes constantes :
dbOpenTable para abrir un objeto Recordset de tipo tabla.
dbOpenDynaset para abrir un objeto Recordset de tipo hoja de respuestas dinmica.
dbOpenSnapshot para abrir un objeto Recordset de tipo instantnea.
El parmetro opciones permite especificar las caractersticas del nuevo objeto Recordset tales como las
restricciones de edicin y consulta para otros usuarios. Vea la Ayuda de VB para mayor detalle.
Los objetos Recordset se eliminan automticamente de la coleccin Recordsets al cerrarlos con el
mtodo Close. Tambin se eliminan automticamente cuando creamos otro recordset con el mismo
nombre.
Ejemplo de creacin de un Objeto Recordset
Decamos que se puede crear un Recordset con la sentencia :
Recuerde la Frmula general Set DAOinf = DAOsup.Mtodo ( - - - - - - - )
Set Mirecordset = base_datos.OpenRecordset (origen[, tipo[, opciones]])
Si tenemos abierta una base de datos llamada MiBaseDatos, podemos crear el objeto MiRecordset
eligiendo de la tabla MiTabla de esa base de datos los campos Campo1, Campo2 y Campo3, y que sea
del tipo de hoja de respuestas dinmica, de la siguiente forma :
Set Mirecordset = MiBaseDatos.OpenRecordset (SELECT Campo1, Campo2, Campo3 _ FROM
MiTabla, dbOpenDynaset)
Si deseamos que el Recordset contenga todos los campos de esa misma tabla :
Set Mirecordset=MiBaseDatos.OpenRecordset (SELECT * FROM MiTabla, dbOpenDynaset)
o simplemente sin utilizar la sentencia SQL :
Set Mirecordset = MiBaseDatos.OpenRecordset (MiTabla, dbOpenDynaset)
En los ejemplos anteriores no se ha establecido ningn parmetro en Opciones.
Veamos lo que decamos antes. Crear un Recordset desde otro recordset. Se puede usar solamente
para variar sus propiedades. Si desde el Recordset anterior, queremos crear un nuevo Recordset
denominado MiRecordset1, que tenga la condicin de que sea solo lectura, usaremos la sentencia :
Set Mirecordset1 = Mirecordset.OpenRecordset (dbReadOnly)
Este nuevo Recordset contendr los mismos campos que el Recordset origen, pero no podremos
cambiar datos en l.
Pueden crearse tantos Recordsets como se necesiten. Estos Recordsets pueden tener campos
comunes. Es ms, podramos crear dos Recordsets exactamente iguales.
Pero en la mayora de los casos, necesitaremos crear un Recordset donde se elijan varios campos de
una o varias tablas, seleccionando de esos campos unos determinados valores. Por ejemplo, en una
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 337

base con las direcciones de los clientes, a lo mejor queremos seleccionar todas aquellas direcciones en
las cuales el cdigo postal sea el 28700 (San Sebastin de los Reyes). Imaginemos que hemos abierto
la base de datos con el nombre CLIENTES (Recuerde que este es el nombre del objeto DAO usado para
abrir la B.D., no el nombre que pueda tener esa B.D. en el disco), y esta base de datos tiene una tabla
llamada DIRECCIONES (Este s es el nombre real de la tabla dentro de la B.D.) Vamos a abrir un
Recordset con todos los clientes de San Sebastin de los Reyes :
Set Mirecordset2 = CLIENTES.OpenRecordset (SELECT * FROM DIRECCIONES WHERE
COD_POSTAL = 28700, dbOpenDynaset)
El Recordset Mirecordset2 contiene todos los campos de todos los registros de la tabla DIRECCIONES
que cumplan la condicin de que el cdigo postal (campo COD_POSTAL en el ejemplo) sea igual a
28700.
Observe en esta y anteriores expresiones, que la sentencia SQL est entre doble comilla.
Podemos introducir cualquier sentencia SQL para determinar qu registros introducimos en el
Recordset. Por ejemplo, si queremos seleccionar todos los clientes de Madrid (su cdigo postal
comenzar necesariamente por 28 y le seguirn tres cifras) :
Set Mirecordset2 = CLIENTES.OpenRecordset (SELECT * FROM DIRECCIONES WHERE
COD_POSTAL LIKE 28???, dbOpenDynaset)

Tipo de recordset ms prctico Dynaset, Table?


A la hora de crear un recordset podemos pensar que tipo es el ms adecuado. Todo depender de lo
que necesitemos de nuestro recordset y de cmo nos queramos mover por l. Cuando decimos
movernos por l queremos decir cambiar de un registro a otro, buscar registros, etc.
Vamos a prescindir del recordset tipo Snapshot si lo que queremos es leer y escribir datos. Un recordset
Snapshot solamente sirve para realizar informes (leer) de los datos en un instante determinado. Veamos
la eleccin entre Dynaset y Table
Si queremos seleccionar parte de los registros de una tabla, o ver registros de varias tablas al mismo
tiempo (lo que podemos ver en Access en una consulta), debemos elegir directamente el tipo Dynaset,
ya que el tipo Table debe contener TODOS los registros de una UNICA TABLA.
Si estamos en ese caso es el nico en el que tendremos dudas respecto al tipo elegido.
Si creamos un recordset tipo Table se nos puede complicar un poco el cdigo a la hora de movernos a lo
largo del recordset, ya que no podemos usar ciertos mtodos como los Find (FindFirst, FindLast, etc.)
debiendo utilizar para realizar la misma funcin los mtodos Move (MoveFirst, MoveLast, MovePrevious,
MoveNext), o el mtodo Seek, un poco ms complicado y que exige un ndice. (Lo que ganamos con la
complicacin del Seek es velocidad). Los desplazamientos a lo largo de un recordset tipo tabla son
mucho ms rpidos que sobre un recordset tipo Dynaset. Esa rapidez se nota fundamentalmente cuando
va a manejar miles de registros, en cuyo caso es indispensable usar recordsets tipo tabla y moverse
sobre un ndice. Si no va a manejar miles de registros, no apreciar mucha diferencia entre uno y otro. Y
si usa Dynaset dispone de ms recursos, sobre todo de bsqueda. Veremos casos de uno y otro tipo.

Mtodos y Propiedades del recordset que va a necesitar inmediatamente


Propiedad RecordCount
Devuelve el nmero de registros accedidos en un objeto Recordset. El valor de esta propiedad es de
slo lectura
Sintaxis

NombredeMiRecordset.RecordCount

Donde NombredeMiRecordset es un objeto Recordset. El valor devuelto por la propiedad RecordCount


es un dato numrico Long
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 338

(NombredeMiRecordset puede ser del tipo Dynaset, Snapshot Table. Pero en el caso de que sea
Dynaset se va a encontrar con una sorpresa. Si le pide ese dato a un recordset tipo Dynaset recin
creado, le devolver el valor 1. Parece que solamente tiene un registro! No es as. Un recordset tipo
Dynaset tiene la ventaja (y el inconveniente) de que solamente guarda en memoria un registro. Por lo
tanto no sabe cuantos registros tiene realmente hasta que no los recorre todos. Para que el mtodo
RecordCount le devuelva el nmero de registros existentes, tiene que acceder previamente al primero
y al ltimo. Para ello basta con ejecutar estas dos lneas de cdigo:
NombredeMiRecordset.MoveLast
NombredeMiRecordset.MoveFirst
A partir de ese momento, ya le indicar el nmero correcto de registros existentes.

Mtodo AddNew
Crea un nuevo registro en un objeto Recordset de tipo Table o Dynaset.
Sintaxis

MiRecordset.AddNew

El mtodo AddNew crea un nuevo registro donde puede introducir nuevos datos, y posteriormente
agregarlo al conjunto de registros del objeto Recordset. Este mtodo establece en los campos el valor
Null (predeterminado para los objetos Recordset de tipo tabla) o los valores predeterminados, si existen.
El registro creado queda en la memoria, y ah se puede modificar simplemente asignando a cada campo
el valor deseado. Para asignar un valor a un campo simplemente tenemos que poner la expresin :
MiRecordset ! MiCampo1 = Dato tipo string
MiRecordset ! MiCampo2 = Dato tipo numrico
Una vez que se hayan introducido los datos en el nuevo registro, debe utilizar el mtodo Update para
guardar los cambios y agregarlo al conjunto de registros. No se modificar la base de datos hasta que se
utilice el mtodo Update.
La posicin del nuevo registro depende del tipo de objeto Recordset:
En un objeto Recordset de tipo hoja de respuestas dinmica, (Dynaset) los registros se insertan al final
del conjunto, independientemente de las reglas de ordenacin que pueda haber en vigor al abrir el
conjunto de registros. En un objeto Recordset de tipo tabla cuya propiedad Index est definida, los
registros se agregan en el lugar correspondiente al orden. Si no se ha establecido la propiedad Index, los
nuevos registros se agregan al final del conjunto.
El registro que era actual antes de utilizar el mtodo AddNew contina sindolo despus. Esto puede
comprobarlo asignando a un Label el contenido de un campo, aadir un registro con un valor para ese
campo distinto al que est presente en el Label y comprobar que el contenido del Label no se ve
afectado por haber introducido un registro nuevo. Si desea hacer que el nuevo registro sea el actual,
puede establecer en la propiedad Bookmark el marcador identificado por el valor de la propiedad
LastModified. En la prctica anterior observar tras este proceso que se cambia el contenido del Label
al nuevo valor.
Vea la propiedad LastModified un poco mas adelante.

Mtodo Edit
Copia el registro actual de un objeto Recordset de tipo hoja de respuestas dinmica o tabla en el bfer
de copia para su edicin.
Sintaxis

LSB

MiRecordset.Edit

Visual Basic Gua del Estudiante

Captulo 1

Pgina 339

Donde MiRecordset representa el nombre de un objeto Recordset abierto y actualizable que contiene el
registro a editar.
Una vez invocado el mtodo Edit, los cambios efectuados en los campos del registro actual se copian en
el bfer de copia. Al terminar de realizar los cambios deseados, utilice el mtodo Update para
guardarlos. Como en el caso del mtodo AddNew este registro modificado est en la memoria y es
necesario introducirlo en la BD.
El registro actual despus de utilizar Edit es precisamente el registro que acabamos de editar. Para
poder usar Edit debe existir un registro actual. Si no es as o si MiRecordset no se refiere a un objeto
Recordset de tipo tabla u hoja de respuestas dinmica, a un objeto Table o a un objeto Dynaset abierto,
se producir un error.
El uso de Edit producir un error en las condiciones siguientes:
No hay registro actual.
La base de datos o el conjunto de registros es de slo lectura.
Ningn campo del registro es actualizable.
Otro usuario ha abierto la base de datos o el conjunto de registros para uso exclusivo.
Otro usuario ha bloqueado la pgina que contiene el registro.
Una vez aadido el registro, o cambiados los datos de un registro, debemos utilizar el Mtodo Update
para guardar los datos en la BD.

Mtodo Update
Guarda el contenido del bfer de copia en un objeto Recordset de tipo hoja de respuestas dinmica o
tabla especificado.
Es decir, mete en la Base de Datos el contenido del registro que estaba en la memoria, bien por haber
utilizado el mtodo Update, bien por haber utilizado el mtodo Edit.
Sintaxis

MiRecordset.Update

Donde MiRecordset representa el nombre de un objeto Recordset de tipo hoja de respuestas dinmica o
tabla, abierto y actualizable.
Los cambios en el registro actual se perdern en las siguientes situaciones:
Uso del mtodo Edit o AddNew y desplazamiento a otro registro sin utilizar antes Update.
Uso de Edit o AddNew y utilizacin de nuevo de Edit o AddNew sin especificar antes Update.
Establecimiento de otro registro en la propiedad Bookmark.
Cierre del conjunto de registros indicado en MiRecordset sin utilizar antes Update.
Cada vez que se crea o edita un registro se cambia el valor de la propiedad LastModified, que tomar el
marcador de ese registro creado o editado.
Mtodo CancelUpdate
Cancela todas las actualizaciones pendientes del objeto Recordset.
Sintaxis

recordset.CancelUpdateTipo

Tipo puede tomar los siguientes valores


dbUpdateRegular
dbUpdateBatch
Comentarios
LSB

Cancela los cambios pendientes que no estn en la memoria cach.


Cancela los cambios pendientes en la memoria cache actualizada.

Visual Basic Gua del Estudiante

Captulo 1

Pgina 340

El mtodo CancelUpdate cancela todas las actualizaciones pendientes a causa de una operacin Edit o
AddNew. La utilizacin del mtodo CancelUpdate tiene el mismo efecto que moverse a otro registro sin
utilizar el mtodo Update, salvo que el registro activo no cambia y algunas propiedades, como BOF y
EOF, no se actualizan.

Mtodo Delete
Este mtodo elimina el registro actual de un objeto Recordset de tipo hoja de respuestas dinmica o
tabla. Para eliminar un registro, debe haber un registro actual en el Recordset antes de utilizar Delete,
pues de lo contrario se producir un error interceptable. Una vez eliminado, este registro sigue siendo el
registro actual. Puede observar, que si a continuacin de Delete utiliza AbsolutePosition para conocer en
que registro est, la respuesta ser -1, prueba de que est sobre un registro inexistente.
Propiedad Bookmark
Devuelve o establece un marcador que identifica de forma nica el registro actual de un objeto
Recordset o define el registro actual de un Recordset como marcador vlido.
Esto merece una pequea aclaracin. Bookmark en ingls significa ese papel que introducimos en un
libro para saber en qu pgina hemos dejado la lectura. En Visual Basic, significa el registro en el que
estamos actualmente (registro actual) Podemos conocer en que registro estamos mediante la siguiente
expresin:
Variable = MiRecordset.Bookmark
Pero tenemos que tener en cuenta que Variable es una variable tipo String (S, string, aunque parezca
que para conocer la posicin de un registro debera ser un numrico, pero es as). Por lo tanto
deberamos haber declarado la variable previamente como una variable tipo String
Dim Variable As String
Pero esta propiedad sirve para colocarnos en el registro que deseemos. Eso s, previamente deberamos
haber obtenido el Bookmark de ese registro. Imagnese que se est moviendo a lo largo del recordset y
hemos visto un registro donde tenemos un dato importante (por ejemplo, un mximo del valor de un
campo) No sabemos si habr otro registro que tenga un valor mayor que este. Deberemos seguir
buscando, pero antes anotamos el Bookmark de ese registro
Variable = MiRecordset.Bookmark
Seguimos buscando movindonos por todo el recordset, y comprobamos que no hay otro registro con un
valor mayor. Queremos volver a aquel registro. Para ello forzamos a que el registro cuyo Bookmark sea
igual a Variable se convierta en registro actual:
MiRecordset.BookMark = Variable
Y se colocar en el registro deseado.
Solamente se puede ver la propiedad Bookmark en aquellos recordsets que tengan la propiedad
Bookmarkable a True. En un Recordset basado completamente en tablas del motor de base de datos
Microsoft Jet, el valor de la propiedad Bookmarkable es True y pueden usarse marcadores. Sin
embargo, otros productos de bases de datos pueden no aceptar los marcadores. Por ejemplo, no se
pueden usar marcadores en un Recordset basado en una tabla anexa Paradox que no tiene clave
principal.
La propiedad Bookmark se almacena internamente como matriz de Byte. Por esta razn, si se intenta
usar la propiedad Bookmark en una operacin de comparacin, se producir un error interceptable.
Antes de tener acceso a la propiedad Bookmark, copie los valores de los marcadores a variables cadena
y efecte las comparaciones usando dichas variables cadena. Por ejemplo, el siguiente cdigo compara
marcadores en dos objetos Recordset:
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 341

Dim Marca1 as String, Marca2 as String


Dim Rs1 as Recordset, Rs2 as Recordset
Set Rs1 = Db.OpenRecordset("Ttulos")
Set Rs2 = Rs1.Clone()
Marca1 = Rs1.Bookmark
Marca2 = Rs2.Bookmark
If Marca1 = Marca2 Then Print "Esta comparacin es vlida "
No intente realizar la siguiente comparacin, aunque a primera vista parezca igual :
If Rs1.Bookmark = Rs2.Bookmark Then ..... Porque dar error.
No hay lmite en el nmero de marcadores que pueden establecerse. Para crear un marcador para otro
registro distinto del registro actual, muvase al registro deseado y asigne el valor de la propiedad
Bookmark a una variable String que identificar el registro.
Para asegurarse de que el Recordset acepta marcadores, inspeccione el valor de su propiedad
Bookmarkable antes de usar la propiedad Bookmark. Si Bookmarkable es False, el Recordset no acepta
marcadores, y el uso de la propiedad Bookmark produce un error interceptable.
Si la propiedad Bookmark se establece a un valor que corresponda a un registro eliminado, se produce
un error interceptable.

Propiedad LastModified
Devuelve un marcador que indica el registro ms recientemente agregado o modificado.
Sintaxis

NombreRecordset.LastModified

El valor devuelto por esta propiedad es un tipo de datos Variant o String. (Similar al devuelto por
Bookmark) LastModified se puede usar para colocarse en el registro ms recientemente agregado o
actualizado.
Esta propiedad puede usarse para volver al ltimo registro que ha sido modificado. Basta para ello
igualar la propiedad Bookmark a la propiedad LastModified :
NombreRecordset.Bookmark = NombreRecordset.LastModified

Mtodos MoveFirst, MoveLast, MoveNext, MovePrevious


Estos mtodos son aplicables a todos los tipos de recordset.
Se sitan en el primer, el ltimo, el siguiente o el anterior registro del objeto Recordset especificado y lo
convierten en el registro actual.
Sintaxis

MiRecordset.{MoveFirst | MoveLast | MoveNext | MovePrevious}

Puede utilizar los mtodos Move para desplazarse de un registro a otro sin aplicar una condicin.
Al abrir el conjunto de registros indicado en Recordset, el primer registro pasa a ser el registro actual y
en la propiedad BOF se establece False. Si el conjunto no contiene ningn registro, se establecer en
BOF el valor True y no habr registro actual.
Si el primer o el ltimo registro ya es el actual al utilizar MoveFirst o MoveLast, el registro actual no
vara.
Si utiliza MovePrevious cuando el registro actual sea el primero, en la propiedad BOF se establecer
True y no habr registro actual. Si utiliza de nuevo MovePrevious, se producir un error y BOF continuar
con el valor True.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 342

Si utiliza MoveNext cuando el registro actual sea el ltimo, en la propiedad EOF se establecer True y
no habr registro actual. Si utiliza de nuevo MoveNext, se producir un error y EOF continuar con el
valor True.
Si Recordset hace referencia a un objeto Recordset de tipo tabla o a un objeto Table, el movimiento se
har segn el ndice actual de la tabla. Para establecer el ndice actual puede usar la propiedad Index. Si
no establece un ndice actual, el orden de los registros devueltos no estar definido.
Si utiliza MoveLast en un objeto Recordset basado en una consulta SQL o QueryDef, se forzar la
terminacin de la consulta, poblando completamente el objeto Recordset.
No es posible utilizar los mtodos MoveFirst ni MovePrevious en los Recordset tipo snapshot de
desplazamiento hacia delante.
Para desplazar la posicin del registro actual en un objeto Recordset un nmero de registros
determinado hacia adelante o hacia atrs, utilice el mtodo Move.

Mtodo Move
Desplaza la posicin del registro actual en un objeto Recordset.
Sintaxis

MiRecordset.Move filas[, inicio]

Donde :
filas es un valor de tipo Long con signo que especifica el nmero de filas (de registros) que se desplaza
la posicin. Si filas es mayor que 0, la posicin se desplaza hacia adelante (hacia el final del archivo). Si
es menor que 0, la posicin se desplaza hacia atrs (hacia el principio del archivo).
Inicio (opcional) es un valor de tipo String que identifica un marcador. Si se especifica inicio, el
desplazamiento ser relativo al marcador indicado. Si se omite, Move comenzar por el registro actual.
El marcador que debe utilizarse para definir el registro Inicio debe ser un Bookmark o similar
(LastModified, por ejemplo)
Si se especifica una posicin anterior al primer registro, la posicin del registro actual se situar al
principio del archivo (BOF). Si se especifica una posicin posterior al ltimo registro, la posicin del
registro actual se situar al final del archivo (EOF).
Si el objeto Recordset no contiene registros y el valor de su propiedad BOF es True, el uso de este
mtodo para desplazarse hacia atrs producir un error interceptable en tiempo de ejecucin. Lo mismo
ocurrir si el valor de la propiedad EOF es True y pretende desplazarse hacia adelante. Si las
propiedades BOF o EOF tienen el valor True y se intenta usar el mtodo Move sin un marcador vlido,
se generar un error interceptable.
Si el objeto Recordset est basado en una consulta, la operacin forzar la ejecucin de la consulta en el
nmero de filas especificado..

Mtodos FindFirst, FindLast, FindNext, FindPrevious


Estos mtodos no se pueden aplicar a un recordset tipo Tabla

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 343

Buscan el primer, el ltimo, el siguiente o el anterior registro de un objeto Recordset de tipo instantnea u
hoja de respuestas dinmica, que satisfaga el criterio especificado y lo convierte en el registro actual.
Sintaxis

MiRecordset.{FindFirst | FindLast | FindNext | FindPrevious} criterio

MiRecordset es el nombre de un objeto Recordset.


Criterio es una expresin de cadena (como la clusula WHERE de una instruccin SQL, sin la palabra
WHERE) que se utiliza para buscar un registro.
Si no se encuentra ningn registro que satisfaga el criterio, el puntero de registro actual se situar en el
primer registro del objeto Recordset y se establecer en la propiedad NoMatch el valor True. Si
Recordset contiene ms de un registro que satisfaga el criterio, FindFirst hallar el primero de ellos,
FindNext el siguiente y as sucesivamente. La propiedad NoMatch tomar en este caso el valor False.
Compruebe siempre el valor de la propiedad NoMatch para determinar si la operacin de bsqueda ha
tenido xito. Si la bsqueda ha tenido xito, NoMatch se establece a False. Si ha fracasado, NoMatch
se establece a True y el registro actual pasa a ser el primero del objeto Recordset. Por ejemplo:

Dim Estabaaqui as String


Estabaaqui = Recordset.Bookmark
Recordset.FindFirst "Nombre = 'Luis' "

If Recordset.NoMatch = True Then


Recordset.Bookmark = Estabaaqui

Else
.
.

' Busca un nombre. Recuerde siempre las


comillas dobles para la expresin de bsqueda y las
comillas simples si se trata de un dato string.
'Si no se ha encontrado
' Si no se ha encontrado, vuelve al que era el
registro actual.
' S se ha encontrado.

Aqu las instrucciones adecuadas


End If

No es posible utilizar estos mtodos en un objeto Recordset de tipo snapshot de desplazamiento hacia
delante.
Al buscar campos que contengan fechas, deber utilizar el formato de fecha de los Estados Unidos
(mes-da-ao), incluso cuando no utilice la versin para este pas del motor de base de datos Jet, pues
de lo contrario es posible que no se encuentren los datos buscados. Puede utilizar la funcin Format
para convertir la fecha. Por ejemplo:
Mirecordset.FindFirst "fecha > #" & Format(mifecha, "mm/dd/yyyy" ) & "#"
Observe que las fechas, aparte de ponerlas en americano, hay que presentarlas entre almohadillas (#).
Observe lo dicho mas atrs para las comillas dobles en la expresin de bsqueda.

Mtodo Seek
Este mtodo solo se puede usar con recordsets tipo Tabla
Si no podemos usar los mtodos Find en un recordset tipo Tabla, Qu podemos hacer para buscar un
dato en un recordset de este tipo? Usar el mtodo Seek
El mtodo Seek busca el primer registro de un objeto Recordset indexado de tipo Table que cumple el
criterio especificado para el ndice activo y lo convierte en el registro activo. Slo funciona en espacios de
trabajo Microsoft Jet.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 344

Sintaxis

MiRecordset.Seek comparacin, clave1, clave2...clave13

Donde MiRecordset es un recordset de tipo Table que tiene definido un ndice en el campo por el que
se va a realizar la bsqueda. Como podemos tener varios ndices en una tabla, deberemos indicarle cual
es el ndice de bsqueda. Una vez que se lo indiquemos, ese ndice ser el Indice activo.
comparacin

Es una de esta expresiones de cadena: <, <=, =, >=, >.

clave1, clave2...clave13 Son uno o ms valores que corresponden a los campos en el ndice activo del
objeto Recordset. Puede utilizar un argumento de hasta 13 claves.
Antes de usar Seek se debe establecer el ndice activo. Todo ndice tiene un nombre. Habamos visto
cuando crebamos un ndice que deba tener un nombre. Recuerde el ejemplo:
Set MiIndice2 = MiTabla2.CreateIndex("IndicePeliculas")
Puede ver el nombre de ese ndice en la Fig. 20.7 En este caso habamos creado el ndice mediante
cdigo y hemos podido controlar su nombre. Si lo hubisemos creado directamente en Access, el
nombre que le pone por defecto es el mismo que el nombre del campo.
Ese nombre del ndice es el que debemos usar para crear el ndice activo. Por ejemplo, si quisiramos
que el ndice activo fuese el IndicePeliculas lo haramos ndice activo mediante la siguiente instruccin:
MiRecordset.Index = "IndicePelculas"
A partir de ahora, el campo (o campos) de ese ndice ser sobre el que realizaremos la bsqueda
mediante Seek. Para encontrar el registro que tenga por valor 00000012 usaremos la expresin
MiRecordset.Seek "=", "00000012"
Ese registro ser ahora el registro actual. Si hubiese mas de un registro con ese valor, el registro actual
ser el primero que cumpla esa condicin
En el ejemplo hemos utilizado el comparador = para buscar un registro cuyo valor en el campo indicado
por el ndice activo sea igual al indicado en el siguiente parmetro (00000012). Si quisisemos encontrar
un registro cuyo valor sea superior a 00000012 usaramos la expresin
MiRecordset.Seek ">", "00000012"
Pero observe ahora que el 0000012 no es un nmero, es una cadena de caracteres. No se preocupe.
Seek puede comparar el contenido de un campo numrico, de un campo texto, de un campo
Fecha/Hora, etc. Eso s, debe compararlo con un valor del mismo tipo, es decir, si el contenido del
campo es numrico, en el parmetro Clave1 deberemos pasarle un campo numrico, si el campo es
texto, deberemos pasarle un dato tipo texto, etc.
El mtodo Seek busca en los campos clave especificados y localiza el primer registro que cumpla el
criterio especificado por comparacin y clave1. Cuando lo encuentra, convierte ese registro en activo y la
propiedad NoMatch se establece en False. Si el mtodo Seek no consigue localizar ninguna
coincidencia, la propiedad NoMatch se establece en True y el registro activo es indefinido.
Si comparacin es igual (=),mayor o igual (>=) o mayor que (>), Seek empezar al principio del ndice y
buscar hacia adelante.
Si comparacin es menor que (<) o mayor o igual que (<=), Seek empezar al final del ndice y buscar
hacia atrs, a menos que haya entradas de ndice duplicadas al final. En tal caso, Seek empezar en
una entrada cualquiera entre las entradas duplicadas existentes al final del ndice.
Debe especificar valores para todos los campos definidos en el ndice. Si utiliza Seek con un ndice de
mltiples columnas y no especifica un valor de comparacin para cada campo del ndice, no podr usar
el operador de igual (=) en la comparacin. Esto se debe a que algunos de los campos de criterio(clave2,
clave3, etc) estarn predeterminados en Null, lo que posiblemente no concordar. Por tanto, el operador
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 345

de igual slo funcionar correctamente si tiene un registro que sea Null en su totalidad, excepto la clave
que est buscando. Es aconsejable usar el operador mayor que o igual en su lugar.
En el ejemplo siguiente se toman los nombres de las calles y otros datos de una tabla llamada
Calles_Nombre, cuyo campo NombreVia esta indexado. El ndice tiene el mismo nombre que el campo
porque se cre directamente con Access. El procedimiento BBuscaCalle_Click busca la primera calle
cuyo nombre coincida con las letras tecleadas en el TextBox TBBuscaCalle
Set BaseDatos = OpenDatabase("C:\Callejero\Calles.mdb")
Set RsCalles = BaseDatos.OpenRecordset("Calles_Nombre", dbOpenTable)
Private Sub BBuscaCalle_Click()
RsCalles.Index = "NombreVia"
RsCalles.Seek ">=", TBBuscaCalle
If RsCalles.NoMatch = False Then
TBNombreCalle = RsCalles!nombrevia
Else
TBNombreCalle = "No se encontr la calle"
End If
End Sub

Mtodo Clone
En muchas ocasiones es necesario crear un Recordset que sea copia exacta de otro. Las ocasiones en
las que es necesario hacer esto pueden ser variadas, pero vamos a destacar una : crear un Recordset
idntico al Recordset de un control Data, para trabajarlo con cdigo durante una parte de la ejecucin del
programa. Otras aplicaciones pueden ser copiar el Recordset de otra mquina a travs de la Red de
Area Local, ... y donde podamos llegar con nuestra imaginacin.
La sintaxis de Clone es la siguiente :
Sintaxis

Set Duplicado = Original.Clone

Donde Duplicado es una variable tipo Recordset, y Original es el Recordset que se va a duplicar.
Con el mtodo Clone puede crear mltiples Recordsets. Cada uno de ellos puede tener su propio
registro actual. El uso de Clone no modifica los datos de los registros. Puede modificar un registro desde
cualquier Recordset, bien desde el que sirvi de original, bien desde cualquiera de sus copias, pero debe
hacerlo invocando los mtodos Edit - Update. Puede compartir marcadores entre dos o ms Recordsets
creados de esta forma.
Puede utilizar el mtodo Clone cuando desee realizar en un conjunto de registros una operacin que
requiera varios registros actuales. Este mtodo es ms rpido y eficiente que crear un nuevo Recordset.
Inicialmente, un Recordset creado con Clone carece de registro actual. Para hacer que un registro sea el
actual antes de utilizar el Recordset copia, puede utilizar cualquiera de los mtodos Move, Find o Seek
(solo para Recordsets tipo Tabla), o establecer su propiedad Bookmark
El hecho de cerrar el Recordset original no afecta al duplicado y viceversa.
Nota No es posible utilizar este mtodo con snapshots de desplazamiento hacia delante (objetos
Recordset de tipo instantnea con la opcin dbForwardOnly activada).

Mtodo Requery
El mtodo Requery actualiza los datos de un objeto Recordset, volviendo a ejecutar la consulta con la
que se ha creado ese Recordset. Este mtodo debe usarse cada vez que se sospeche que los datos de
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 346

la Base de datos han cambiado, y se quieran presentar los datos actualizados. Es un mtodo tpico de
una BD que se est usando desde varios puestos a travs de una Red de Area Local.
Sintaxis

NombreRecordset.Requery [NuevoQueryDef]

Donde NombreRecordset es el nombre del Recordset, y NuevoQueryDef (opcional) es una consulta


almacenada
No es posible utilizar el mtodo Requery en objetos Recordset tipo Snapshot o en los Dynaset que
tengan la propiedad Restartable a False, ni tampoco en los objetos Recordset de tipo Tabla.
Si los valores de las propiedades BOF y EOF del objeto Recordset son ambos True despus de utilizar
el mtodo Requery, la consulta no habr devuelto ningn registro y el objeto Recordset no contendr
datos.

Transacciones
Mtodos BeginTrans, CommitTrans y Rollback
Estos mtodos son mtodos del Objeto Workspace
Veamos estos tres mtodos que, dadas sus funciones, deben estudiarse conjuntamente.
Supongamos un Banco. Debe hacer una transferencia entre dos cuentas corrientes que estn en la
misma base de datos. La operacin es sencilla : Busca la cuenta origen y crea un nuevo registro. Apunta
en el campo OPERACIN una T de Transferencia, en el campo IMPORTE apunta el valor del dinero a
transferir, y en el campo SALDO pone la diferencia entre lo que haba en ese campo en la ltima
operacin, menos el importe del dinero transferido.
A continuacin hace un proceso similar con la cuenta destino, pero en este caso, sumndole el importe
de la transferencia. No hay problemas. Pero que pasa si, una vez sacado el dinero de la cuenta origen,
no se puede ingresar en la cuenta destino, por la razn que sea (cuenta bloqueada, no existe esa
cuenta, fallo de la red de rea local) Obviamente la operacin no se ha completado, y hay que devolver
el dinero a la cuenta origen. Podra hacerse un apunte, metiendo la misma cantidad de dinero que se ha
extrado anteriormente, y su saldo no se ver afectado. Pero no s lo que pensara el cliente cuando vea
un estadillo de su cuenta, en la que le han sacado una cantidad de dinero, aunque en el siguiente apunte
se lo hayan vuelto a introducir.
Para evitar estas situaciones usamos lo que se denomina una Transaccin, que es una combinacin de
estos tres mtodos. Con el mtodo BeginTrans iniciamos la Transaccin. Con CommitTrans
terminamos la transaccin y se guardan los cambios realizados (En ambas cuentas a la vez, en el caso
del ejemplo). Con Rollback se termina la transaccin sin llegar a guardar los cambios, quedando el
Objeto Workspace afectado por las operaciones internas a esa transaccin tal y como estaba antes de
comenzar dicha operacin.
Dado que una transaccin pertenece a un Workspace, deberemos aplicar estos mtodos al Workspace
que ese usuario tenga abierto. Es decir, en un sistema con varios usuarios que estn trabajando
simultneamente sobre una Base de Datos, un determinado usuario deber entrar con un Workspace
propio (una sesin de trabajo solo para l). En estas condiciones podemos crear una transaccin. Y aqu
comenzamos a ver la necesidad de crear Workspaces distintos para distintos usuarios. Veremos un
poco ms adelante como se crean los Workspaces.
Sintaxis

MiSesin.BeginTrans
MiSesin.CommitTrans
MiSesin.Rollback

Dentro de un objeto Workspace, las transacciones son siempre globales y no se limitan slo a la base de
datos o al conjunto de registros. Si realiza operaciones en ms de una base de datos o conjunto de
registros durante una transaccin en un objeto Workspace, el mtodo Rollback deshar todas las
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 347

operaciones en todos ellos. Quiere esto decir que una transaccin debe iniciarse al comenzar una
determinada operacin, realizar esa operacin sin realizar ninguna otra durante ese tiempo, terminar la
operacin y finalizar la transaccin, bien con CommitTrans o con Rollback.
Si desea tener transacciones simultneas, lo mas indicado es crear varios objetos Workspace para usar
uno con cada transaccin.
Puede anidar transacciones. Es posible tener hasta cinco niveles de transacciones abiertos a un tiempo
en un mismo objeto Workspace utilizando mltiples combinaciones anidadas de BeginTrans y
CommitTrans o Rollback. En este caso, el orden de finalizacin de una transaccin debe ser siempre de
menor a mayor nivel jerrquico, es decir, se deber cerrar primero la transaccin que est mas interior
dentro del anidamiento, y as sucesivamente. Si cierra una transaccin anidada mediante CommitTrans,
y posteriormente cierra una transaccin que abarque a esta ltima con Rollback, los cambios de la
primera transaccin NO quedarn guardados.
(Cuando se utilizan bases de datos SQL ODBC externas no es posible anidar las transacciones).
Si cierra un objeto Workspace sin guardar o deshacer las transacciones pendientes, stas se desharn
automticamente.
Algunas bases de datos pueden no admitir las transacciones. En este caso la propiedad Transactions
del objeto Database o Recordset tendr el valor False. Lea detenidamente la Ayuda de estos mtodos
antes de trabajar con ellos.
El hecho de usar transacciones, aparte de lo que significa para asegurar la integridad de los datos,
ahorra accesos al disco (Importantsimo en algunas redes LAN y WAN), ya que los cambios a introducir
se van almacenando en un bfer en la memoria, y se vuelcan al disco solamente en el momento de
terminar la transaccin de modo afirmativo con CommitTrans.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 348

La proteccin de accesos a una base de datos Access. Usuarios, Workspaces, Grupos de Trabajo,
Grupos de Usuarios. La base de datos de sistema.
Acabamos de ver que es necesario poder crear Workspaces para cada usuario. Hasta ahora, y para no
complicar el estudio de las bases de datos, habamos usado solamente el Workspaces(0) que VB crea
automticamente. Vamos a entrar ahora en la creacin de Usuarios (Users) y Workspaces. El mtodo
para crear Workspaces es el CreateWorkspace, mtodo del dbEngine. Comencemos con una mirada a
este objeto desde el punto de vista de DAO. No olvide que el dbEngine es el motor de bases de datos
Jet.

El dbEngine. Visin desde DAO


El objeto dbEngine es el objeto de nivel ms alto en el modelo de objeto DAO. Es el encargado de
contener y controlar todos los objetos DAO. Hay un solo objeto dbEngine, inherente a la aplicacin, y no
se pueden crear ms.
Tiene como cualquier objeto DAO sus propiedades y mtodos. Vamos a ver alguna propiedad, en orden
ascendente de importancia prctica.
Propiedad Version
Devuelve la versin actual de DAO en uso. El tipo de datos es String (p.e., "3.5" )
Propiedad DefaultType
Establece o devuelve un valor que indica qu tipo de espacio de trabajo (Microsoft Jet u ODBCDirect)
utilizar el prximo objeto Workspace que se cree. Puede tomar los valores:
dbUseJet
dbUseODBC

Crea objetos Workspace conectados al motor de base de datos Microsoft Jet.


Crea objetos Workspace conectados a un origen de datos ODBC.

Propiedad
DefaultUser. Establece el nombre de usuario utilizado para crear el Workspace
predeterminado cuando se inicializa.
Propiedad DefaultPassword. Establece
predeterminado cuando se inicializa.

la

contrasea

utilizada

para

crear

el

Workspace

El DefaultUser es un tipo de datos String, que puede tener entre 1 y 20 caracteres de longitud en
espacios de trabajo Microsoft Jet y cualquier longitud en espacios de trabajo ODBCDirect.
El DefaultPassword es un tipo de datos String que puede tener hasta 14 caracteres de longitud en bases
de datos Microsoft Jet y cualquier longitud en conexiones ODBCDirect. Puede contener cualquier
carcter excepto 0 ASCII.
De modo predeterminado, la propiedad DefaultUser se establece a "administrador" y la propiedad
DefaultPassword se establece a una cadena de longitud cero ("").
Para que estas propiedades tenga efecto, debe establecerla antes de llamar a cualquier mtodo DAO.
Propiedad LoginTimeout. Establece o devuelve el nmero de segundos que se esperar antes de que
se genere un error cuando se intenta conectar a una base de datos de ODBC. Tiene como valor
predeterminado, 20 segundos.
Propiedad IniPath. Devuelve la ubicacin de la informacin de Registro de Windows de Microsoft Jet. El
mtodo SetOption le permite sobrescribir los valores del Registro de Windows para el motor de base de
datos Microsoft Jet. (Recuerde que cualquier operacin indebida sobre el registro de Windows puede
hacerle perder toda la informacin de su PC)

Propiedad SystemDB

LSB

(Muy importante)

Visual Basic Gua del Estudiante

Captulo 1

Pgina 349

Establece o devuelve la ruta de acceso del archivo de informacin del grupo de trabajo (slo espacios de
trabajo Microsoft Jet). Este archivo es una base de datos Access, que normalmente se llama
System.Mdw (Observe que la extensin es distinta a la .Mdb a la que nos tiene acostumbrados Access)
Access usa este fichero y lo guarda generalmente en C:\Windows\System. Pero puede copiar esta base
con otro nombre, y colocarla en el directorio que quiera. Lo nico que tendr que hacer es indicarle al
dbEngine su nombre y ubicacin mediante esta propiedad SystemDB En esa base de datos se guarda
la informacin de los usuarios. Se guarda su nombre y su contrasea. Lgicamente no se puede leer con
Access, aunque la abre como si se tratase de una base de datos ordinaria, pero cuando pretende abrir
una tabla, no la visualiza.
(NOTA. - La ayuda dice que el nombre predeterminado es System.Mda. Ese era el nombre para
versiones antiguas del Motor Jet. En mi PC, con W98 y VB6, y con Access98 solamente encuentro
System.Mdw)

Creacin de nuevos usuarios Mtodo CreateUser


(Slo espacios de trabajo Microsoft Jet). Crea un nuevo Usuario, e introduce sus datos en el archivo de
informacin del grupo de trabajo (Base de Datos System.Mdw o la especificada en la propiedad
SystemDB) El mtodo CreateUser corresponde al Workspace o al Objeto Group.
Para crear un nuevo usuario deberemos suministrar la siguiente informacin:
Nombre del usuario, PID y contrasea. La sintaxis de CreateUser es:
Set User = Objeto.CreateUser (Nombre, PID, contrasea)
Donde User es la variable tipo objeto User que desea crear. Debe declararse como User)
Objeto El nombre del Workspace (o del objeto objeto Group) que quiere utilizar para crear el nuevo
objeto User.
Nombre Nombre del nuevo usuario
PID. Identificador de Usuario. Debe contener de 4 a 20 caracteres alfanumricos
Contraseal. Contrasea para el nuevo usuario. La contrasea puede tener hasta 14 caracteres de
longitud y puede incluir cualquier carcter excepto el carcter ASCII 0
Esto merece algn comentario. El nuevo usuario debe crearlo un Workspace (o un Group, pero de eso
no nos vamos a ocupar por ahora) Lo normal es crear el nuevo usuario con el Workspaces(0) que como
sabe, lo crea automticamente Visual Basic.
Recuerde que antes de crear un nuevo usuario, debe indicar donde est la base de datos con la
informacin del systema, mediante la propiedad SystemDB
DBEngine.SystemDB = "C:\Windows\System\System.Mdw")
Con las siguientes instrucciones se crea un nuevo usuario
Dim NuevoUser As User
Set NuevoUser = Workspaces(0).CreateUser("Luis", "EsteesmiPID", "MiContrasea")
Workspaces(0).Users.Append NuevoUser
Podemos saber cuantos usuarios tiene el Workspaces(0) y su nombre. Con las siguientes
instrucciones vamos a introducir los nombres de los usuarios en la lista ListUsers
ListUsers.Clear
For I = 0 To Workspaces(0).Users.Count - 1
NomUsuario = Workspaces(0).Users(I).Name
ListUsers.AddItem NomUsuario
Next I

Creacin de nuevos Workspaces. Mtodo CreateWorkspace


Podemos crear cuantos Workspaces necesitemos. Recuerde que un Workspace es una sesin de
trabajo. Y una sesin de trabajo se abre para que trabaje un usuario. Por eso, a la hora de crear
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 350

un Workspace debemos indicarle para que usuario, y la contrasea de ese usuario. Como el
objeto Workspace pertenece al dbEngine, es este objeto el que debe crearlo.
La sintaxis es la siguiente:
Set NuevoWorkSpace = DBEngine.CreateWorkspace (Nombre, Usuario, Contrasea, Tipo)
NuevoWorkSpace es el Workspace que queremos crear, que habremos declarado como variable tipo
objeto Workspace.
Nombre es el nombre del Workspace (P.e., MiSesion)
Usuario Nombre de un usuario registrado en la base de datos del sistema (Que lo habremos creado
con CreateUser) que ser el propietario del nuevo objeto Workspace.
Contrasea La contrasea del Usuario propietario del Workspace.
Tipo (Opcional). Indica el tipo de espacio de trabajo. Puede tomar los valores dbUseJet para crear un
espacio de trabajo Microsoft Jet, o dbUseODBC para crear un espacio de trabajo ODBCDirect. Si omite
tipo, la propiedad DefaultType del objeto DBEngine determinar a qu tipo de origen de datos est
conectado el Workspace
No es necesario aadir el nuevo Workspace a la coleccin Workspaces
Veamos un ejemplo de cmo crear un Workspace para el usuario Luis creado anteriormente:
Dim NewWS as Workspace
Set NewWS = DBEngine.CreateWorkspace("SesiondeLuis", "Luis", "MiContrasea")
DBEngine.Workspaces.Append NewWS
Podemos ver todos los Workspaces existentes. En las siguientes instrucciones podemos ver el cdigo
para listarlos en ListWS
ListWS.Clear
For I = 0 To DBEngine.Workspaces.Count - 1
NomWS = DBEngine.Workspaces(I).Name
ListWS.AddItem NomWS
Next I
Debe tenerse en cuenta que el objeto Workspace es un objeto que solamente existe mientras est
ejecutndose la aplicacin. Cuando salimos de la aplicacin, ese Workspace desaparece. No
ocurre lo mismo con el Usuario, que queda en la base de datos del sistema, es decir, es un objeto
persistente.
Las partes de cdigo expuestas se han sacado de un ejemplo creado para ver el nmero y nombre de
los usuarios existentes, Workspaces y DataBases. Es un ejemplo para explicar estos conceptos. No
tiene otra finalidad.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 351

Fig. 20.9 Aspecto de la interface grfica del ejercicio para crear Users y Workspaces

Cdigo de este ejercicio


General/Declaraciones
Option Explicit
Dim VarDrag As String
Dim NuevoWS() As Workspace

Private Sub BAnadirUser_Click()


On Error GoTo RutErr
Dim NomUsuario As String, I As Integer
If BAnadirUser.Caption = "Aadir" Then
TBNuevoUserName.Visible = True
TBNuvoUsePID.Visible = True
TBNuevoUserPw.Visible = True
LNUserName.Visible = True
LNuevoUserPID.Visible = True
LNuevoUserPw.Visible = True
BAnularUser.Left = 3480
BAnularUser.Visible = True
BBorrarUser.Visible = False
BAnadirUser.Caption = "O.K."
Exit Sub
End If
If BAnadirUser.Caption = "O.K." Then
Dim NuevoUser As User
Set NuevoUser = Workspaces(0).CreateUser(TBNuevoUserName, TBNuvoUsePID, TBNuevoUserPw)
Workspaces(0).Users.Append NuevoUser
TBNuevoUserName.Visible = False
TBNuvoUsePID.Visible = False
TBNuevoUserPw.Visible = False
LNUserName.Visible = False
LNuevoUserPID.Visible = False
LNuevoUserPw.Visible = False
BAnularUser.Visible = False
BBorrarUser.Visible = True
BAnadirUser.Caption = "Aadir"
ListUsers.Clear
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 352

For I = 0 To Workspaces(0).Users.Count - 1
NomUsuario = Workspaces(0).Users(I).Name
ListUsers.AddItem NomUsuario
Next I
BAnularUser.Visible = False
BAnadirUser.Visible = True
End If
RutErr:
If Err = 3304 Then
MsgBox "Debe introducir el PID (Mnimo 5 caracteres, mximo 20 caracteres)"
Exit Sub
Else
If Err > 0 Then MsgBox "Ha ocurrido el error " & Err & "."
End If
End Sub

Private Sub BAnadirWs_Click()


On Error GoTo RutErr
If BAnadirWs.Caption = "Aadir" Then
TBNuevoWorkspace.Visible = True
TBNombreUser.Visible = True
TBNuevoWSPw.Visible = True
LNWSName.Visible = True
LNombreUsuario.Visible = True
LUserPw.Visible = True
BAnularWS.Left = 5520
BAnularWS.Visible = True
BEliminarWs.Visible = False
BAnadirWs.Caption = "O.K."
Exit Sub
End If
If BAnadirWs.Caption = "O.K." Then
Dim NumWS As Integer
NumWS = Workspaces.Count
ReDim Preserve NuevoWS(NumWS)
Dim I As Integer, NomWS As String
Set NuevoWS(NumWS) = DBEngine.CreateWorkspace(TBNuevoWorkspace,
TBNuevoWSPw)
DBEngine.Workspaces.Append NuevoWS(NumWS)
ListWS.Clear
For I = 0 To DBEngine.Workspaces.Count - 1
NomWS = DBEngine.Workspaces(I).Name
ListWS.AddItem NomWS
Next I
BAnadirWs.Caption = "Aadir"
TBNuevoWorkspace = ""
TBNombreUser = ""
TBNuevoWSPw = ""
TBNuevoWorkspace.Visible = False
TBNombreUser.Visible = False
TBNuevoWSPw.Visible = False
LNWSName.Visible = False
LNombreUsuario.Visible = False
LUserPw.Visible = False
BAnularWS.Visible = False
BEliminarWs.Visible = True
End If
RutErr:
If Err = 3029 Then
MsgBox "El Password usado no coincide con el de ese Usuario (User)"
Exit Sub
LSB

Visual Basic Gua del Estudiante

Captulo 1

TBNombreUser,

Pgina 353

End If
End Sub
Private Sub BAnularUser_Click()
If BAnadirUser.Caption = "O.K." Then
TBNuevoUserName.Visible = False
TBNuvoUsePID.Visible = False
TBNuevoUserPw.Visible = False
LNUserName.Visible = False
LNuevoUserPID.Visible = False
LNuevoUserPw.Visible = False
BAnularUser.Visible = False
BBorrarUser.Visible = True
BAnadirUser.Caption = "Aadir"
End If
If BBorrarUser.Enabled = True Then
BBorrarUser.Enabled = False
BAnadirUser.Visible = True
BAnularUser.Visible = False
ListUsers.ListIndex = -1
End If
End Sub

Private Sub BAnularWS_Click()


If BAnadirWs.Caption = "O.K." Then
BAnadirWs.Caption = "Aadir"
TBNuevoWorkspace = ""
TBNombreUser = ""
TBNuevoWSPw = ""
TBNuevoWorkspace.Visible = False
TBNombreUser.Visible = False
TBNuevoWSPw.Visible = False
LNWSName.Visible = False
LNombreUsuario.Visible = False
LUserPw.Visible = False
BAnularWS.Visible = False
BEliminarWs.Visible = True
End If
If BEliminarWs.Enabled = True Then
BEliminarWs.Enabled = False
BAnadirWs.Visible = True
BAnularWS.Visible = False
End If
End Sub
Private Sub BBorrarUser_Click()
Dim NomUsuario As String, I As Integer
Workspaces(0).Users.Delete ListUsers.Text
ListUsers.Clear
For I = 0 To Workspaces(0).Users.Count - 1
NomUsuario = Workspaces(0).Users(I).Name
ListUsers.AddItem NomUsuario
Next I
BAnularUser.Visible = False
BAnadirUser.Visible = True
End Sub

Private Sub BEliminarWs_Click()


Dim I As Integer, NomWS As String, NumWS As Integer
For I = 0 To DBEngine.Workspaces.Count - 1
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 354

NomWS = DBEngine.Workspaces(I).Name
If NomWS = ListWS.Text Then NumWS = I
Next I
Workspaces(NumWS).Close
ListWS.Clear
For I = 0 To DBEngine.Workspaces.Count - 1
NomWS = DBEngine.Workspaces(I).Name
ListWS.AddItem NomWS
Next I
BEliminarWs.Enabled = False
BAnularWS.Visible = False
BAnadirWs.Visible = True
End Sub
Private Sub BSalir_Click()
End
End Sub
Private Sub BVerIni_Click()
Shell "Notepad.exe " & App.Path & "\Cap20Usr.INI", vbNormalFocus
End Sub
Private Sub Form_Activate()
On Error GoTo RutErr
Dim LineaEntr As String
Dim LineaEntr8 As String
Dim I As Integer, NomUsuario As String
Dim PathFichero As String
Open App.Path & "\Cap20Usr.INI" For Input As #1
Do Until EOF(1)
Line Input #1, LineaEntr
LineaEntr8 = ""
LineaEntr8 = Left(LineaEntr, 8)
If UCase(LineaEntr8) = "PROYCAPT" Then Me.Caption = Right(LineaEntr, Len(LineaEntr) - 9)
If UCase(LineaEntr8) = "DBENGINI" Then PathFichero = Trim(Right(LineaEntr, Len(LineaEntr) - 9))
Loop
Close #1
LBDSys = PathFichero
TBTextINI = PathFichero
DBEngine.SystemDB = PathFichero
For I = 0 To Workspaces(0).Users.Count - 1
NomUsuario = Workspaces(0).Users(I).Name
ListUsers.AddItem NomUsuario
Next I
For I = 0 To DBEngine.Workspaces.Count - 1
NomUsuario = Workspaces(I).Name
ListWS.AddItem NomUsuario
Next I
RutErr:
If Err = 3028 Then
MsgBox "No se puede abrir la base de datos del sistema. Compruebe que su Path y nombre son
correctos. Vealo en Ver Ini"
End If
End Sub
Private Sub ListUsers_Click()
BAnadirUser.Visible = False
BBorrarUser.Enabled = True
BAnularUser.Left = 4560
BAnularUser.Visible = True
End Sub
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 355

Private Sub ListWS_Click()


BEliminarWs.Enabled = True
BAnadirWs.Visible = False
BAnularWS.Left = 6600
BAnularWS.Visible = True
End Sub
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Shift = 1 And Button = 1 Then
VarDrag = Text1.Text
Text1.Drag
End If
End Sub

El fichero Cap20Usr.INI que debe estar necesariamente en la misma carpeta que el programa, en el
caso del PC del autor tiene esta forma
REM Visual Basic - Gua del Estudiante. Cap. 20. Creacin de Usuarios y WorkSpaces
DBEngINI=C:\WinNT\System32\System.mdw
(Deber cambiar el Path del fichero System.Mdw de acuerdo a como lo tenga en su ordenador.)

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 356

Mantenimiento y Copia de Bases de Datos.


Vamos a ver dos mtodos del Objeto DBEngine para el mantenimiento y copia de Bases de Datos
ACCESS.
En una Base de Datos ACCESS, cuando borramos un dato en realidad no lo estamos borrando, sino
marcndolo como borrado. (No intente recuperar un dato marcado y no borrado porque no se puede.)
Por lo tanto, ver que tras sucesivas operaciones de escritura / borrado en una BD, esta va aumentando
su tamao. Se necesita un mtodo que limpie todos los datos inservibles de la BD para disminuir su
tamao. Este mtodo tambin deber reorganizar los ndices y marcadores internos a esa BD. El objeto
DAO que debe hacer estas cosas es el Motor de Bases de Datos. Es decir, el Objeto DBEngine. Los
mtodos son CompactDatabase, que hace una copia de la base de datos (no borra la BD original) sin
copiar los datos intiles, y RepairDatabase, que intenta (no siempre lo consigue) reparar los datos
internos de una BD que presente datos corruptos (Se generan con bastante facilidad cuando apagamos
el ordenador con la base abierta)

Mtodo CompactDatabase
Copia, compacta y da la opcin de modificar la versin, el orden de intercalado y la codificacin de una
base de datos cerrada.
Sintaxis
DBEngine.CompactDatabase BaseDatosAnt, BaseDatosNva [, inf_local [, opciones]]
BaseDatosAnt es el nombre del fichero de la base de datos a compactar. Debe expresar el Path
completo y el nombre del fichero (C :\MiCarpeta\MiBase.MDB) Si el nombre de archivo tiene extensin,
deber especificarla. Si la red lo admite, tambin puede especificar una ruta de red, como por ejemplo
"\\MISERVID\MIDIR\MiBase.MDB".
BaseDatosNva es el nombre del fichero (con su Path completo) de la base de datos nueva, creada al
copiar la BaseDatosAnt, ya compactada. No es posible especificar en el argumento BaseDatosNva el
mismo archivo de base de datos que en BaseDatosAnt.
inf_local es una expresin de cadena utilizada para especificar el alfabeto usado a la hora de ordenar
datos de esa Base de Datos. El parmetro a introducir es el mismo que para el argumento similar usado
en la creacin de la Base de Datos (dbLangGeneral para el caso de Espaa). Este argumento es
opcional. Si se omite, la informacin local de BaseDatosNva ser la misma que la de BaseDatosAnt.
Opciones nos permite cambiar alguna caracterstica de la Base de Datos. Puede elegirse entre cifrarla o
no cifrarla y cambiar la versin del motor de bases de datos que va a usar la nueva Base de Datos.
dbEncrypt
dbDecrypt
dbVersion10
dbVersion11
dbVersion25
dbVersion30

Codifica la base de datos durante la compactacin.


Descodifica la base de datos durante la compactacin.
Crea una base de datos que utiliza la versin 1.0 del motor Jet
Crea una base de datos que utiliza la versin 1.1 del motor Jet
Crea una base de datos que utiliza la versin 2.5 del motor Jet
Crea una base de datos que utiliza la versin 3.0 del motor Jet

Se puede usar una constante (solamente) de encriptacin y una (solamente) de Versin. Slo se puede
compactar BaseDatosNva con una versin igual o posterior a la de BaseDatosAnt.
Lea detenidamente la ayuda en lnea de este Mtodo.

Mtodo RepairDatabase
Intenta reparar una base de datos daada que accede al motor de base de datos Microsoft Jet.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 357

Sintaxis

DBEngine.RepairDatabase NombreBase

Donde NombreBase es el nombre (Y path) del fichero que contiene la Base de Datos a reparar. Puede
especificar una ruta de red. P.e. : "\\MISERVID\ MIDIR\NombreBase.MDB".
Para poder reparar la base debe estar Cerrada. Recuerde, si est en un entorno multiusuario, que los
dems usuarios tampoco pueden tenerla abierta mientras la repara.
El mtodo RepairDatabase tambin intenta validar todas las tablas del sistema y todos los ndices. Los
datos que no puedan repararse se pierden. Si la base de datos no puede repararse, se producir un
error interceptable.
Sugerencia Despus de reparar una base de datos, es aconsejable compactarla con el mtodo
CompactDatabase para desfragmentar el archivo y recuperar espacio en disco.

METODOS DEL OBJETO DataBase


Mtodo Execute
Este Mtodo es para el Objeto DataBase y para el Objeto QueryDef.
Ejecuta una consulta de acciones o una instruccin SQL en el objeto Database especificado.
Sintaxis

Para un objeto DataBase

NombreBD.Execute origen[, opciones]

Donde NombreBD es el nombre del objeto DataBase


Origen es una instruccin SQL
Opciones es un entero o constante que determina las caractersticas de integridad de
datos de la consulta, segn se especifica mas adelante.

Para un objeto QueryDef

NombreQuerydef.Execute [opciones]

Donde NombreQuerydef es el nombre del objeto QueryDef cuya propiedad SQL especifica la
instruccin SQL a ejecutar.
Opciones igual que para el Objeto Database.
En opciones puede utilizar las siguientes constantes:
dbDenyWrite
dbInconsistent
dbConsistent
dbSQLPassThrough
dbFailOnError
dbSeeChanges

Deniega el permiso de escritura a los dems usuarios.


(Predeterminado) Actualizaciones inconsistentes.
Actualizaciones consistentes.
Paso a travs de SQL. Hace que se pase la instruccin SQL a una
base de datos ODBC para su procesamiento.
Deshace las actualizaciones en caso de error.
Genera un error en tiempo de ejecucin si otro usuario modifica los
datos que se estn editando.

El mtodo Execute slo es vlido para las consultas de acciones. Si utiliza Execute con otro tipo de
consultas, se producir un error. Debido a que las consultas de acciones no devuelven registros,
Execute no devuelve un conjunto de registros.
Ejemplo. En el siguiente ejemplo, usamos EXECUTE para cambiar el campo Nombre en una tabla
llamada CLIENTES de una Base de Datos abierta, cuyo Objeto DataBase se llama BaseDatos. Para
poder jugar con el nombre a cambiar y el nombre cambiado, se introduce el nombre que queremos
cambiar en TBNombre2 y el nuevo nombre en TBNombre1
Dim RegistrosCambiados As Long
Dim MiSQL As String
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 358

MiSQL = "UPDATE CLIENTES SET NOMBRE = '" & TBNombre2 & "' WHERE NOMBRE= '" &
TBNombre1 & "'"
BaseDatos.Execute MiSQL, dbFailOnError
RegistrosCambiados = BaseDatos.RecordsAffected
MsgBox RegistrosCambiados
Dada una instruccin SQL sintcticamente correcta y teniendo los permisos adecuados, el mtodo
Execute no fallar, an cuando no pueda modificarse ni eliminarse una lnea. Por lo tanto, debe
especificar siempre la opcin dbFailOnError cuando utilice el mtodo Execute para ejecutar una
consulta de actualizacin o eliminacin. Esta opcin generar un error interceptable y deshar todos los
cambios realizados con xito cuando alguno de los registros afectados se encuentre bloqueado y no
pueda actualizarse o eliminarse.

Propiedad RecordsAffected
Para determinar el nmero de registros afectado por el ltimo mtodo Execute, puede utilizar la
propiedad RecordsAffected del objeto Database o Querydef. Por ejemplo, RecordsAffected contienen el
nmero de registros eliminados, actualizados o insertados al ejecutar una consulta de acciones. Al
utilizar el mtodo Execute para ejecutar un objeto Querydef, en la propiedad RecordsAffected del
Querydef se establece el nmero de registros afectados.
Para obtener el mejor rendimiento, especialmente en un entorno multiusuario, puede anidar el mtodo
Execute dentro de una transaccin: Utilice el mtodo BeginTrans en el objeto Workspace actual, use
luego el mtodo Execute y complete la transaccin con el mtodo CommitTrans en el objeto Workspace.
De esta forma se guardarn los cambios en el disco y se liberarn los bloqueos que se hayan podido
producir durante la ejecucin de la consulta.

IMGENES EN UNA BASE DE DATOS ACCESS

Una imagen (la fotografa de una persona por ejemplo) puede guardarse en una base de datos tipo
ACCESS y presentarse en un control Picture. Imagine una aplicacin que sea una agenda de telfonos
y pueda insertar la foto de la persona !!
Para introducir una imagen en una BD, el campo de esa BD donde se va a introducir la imagen debe ser
LongBinary ( si esa versin de ACCESS lo tiene) u Objeto OLE.
Introducir y presentar un bit-map en una base de datos es necesario hacerlo mediante un Control Data.
Un bit-map puede presentarse en un control Picture o en un control Image. Ambos son controles
enlazados a datos. Si introducimos un Control Data y un Control Picture o Control Image en el
Formulario, asociamos el Control Data a la Base de Datos, y el campo que contiene el grfico a el
Control Picture (o Control Image) mediante sus propiedades DataSource = Nombre del Control data,
DataField = Nombre del Campo, tenemos el problema resuelto. Para meter un grfico en la BD basta
con introducir ese grfico en el Picture (o Image) mediante LoadPicture, por ejemplo, y guardar los datos
en la BD, bien cambiando el registro actual del Control data, bien mediante el mtodo UpdateRecord de
dicho Control Data.
La asociacin de la Base de datos al Control Data puede hacerse, bien mediante sus propiedades
DatabaseName y RecordSource, bien creando un Recordset con cdigo e igualando la propiedad
Recordset del Control Data a ese Recordset.
Es posible que se pueda introducir y presentar un bit-map en un control Picture o Image de otra forma,
sin usar el control Data. Eso s, complicando el cdigo. No merece la pena liarse con esto. Lo mismo que
decamos que necesitamos un Control Data cuando vamos a usar un DBGrid, debemos usar un Control
Data cuando vayamos a presentar una imagen.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 359

Visual Basic - Gua del Estudiante Cap. 13


Acceso a Bases de Datos remotas mediante el motor Jet
ODBCDirect
Acceso a Bases de Datos remotas mediante objetos RDO
Acceso a Bases de Datos remotas mediante el motor Jet
ODBCDirect
Hasta ahora todos los accesos realizados a una base de datos los hemos realizado directamente a travs del Motor de
bases de Datos Microsoft JET. Este motor de bases de datos abre, lee y graba el fichero .MDB (o el dBase,
FoxPro, Paradox, etc.) de la misma forma que un editor de textos puede abrir, leer o escribir un fichero creado por
el mismo o por otros editores conocidos.
Las bases de datos (las buenas) tienen unas herramientas comunes para manejarlas. Estas herramientas son, por una
parte el lenguaje SQL que puede dar instrucciones para leer o escribir una base abierta, mediante un lenguaje comn
para todas las bases, y por otra, la herramienta que abre esa base de datos y nos hace verla, desde el exterior, bajo
una forma nica para todas las bases: el ODBC.
El ODBC es una herramienta que nos permite ver a todas las bases de una forma nica. No es un lenguaje comn a
todas las Bases de datos. Ese es el SQL. Es la interface que adapta a una base de datos para que nos podamos
entender con ella en SQL. Por lo tanto es fcil pensar que esa interface deber fabricarla el mismo fabricante que ha
realizado la base de datos. El lenguaje SQL es conocido por todo el mundo, pero la forma interna de trabajar una
base de datos solamente la conoce su fabricante. Por eso, el Driver ODBC que es el que nos permite adaptar las
particularidades de esa base de datos al lenguaje comn, deber suministrarlo el fabricante de la base.
Microsoft desarroll varios drivers para otras tantas bases de datos y hojas de clculo. Entre ellas para Access y
Excel, dBase y FoxPro. Tambin lo desarroll para bases de datos tan populares como Oracle. Ese driver hay que
instalarlo en el ordenador, aunque Windows instala algunos por defecto.
Veamos ahora otro elemento fundamental para el trabajo con ODBC: la conexin. La conexin ODBC es el
conjunto de datos que hay que aportarle a Windows para que pueda enlazar nuestra aplicacin con la base de datos.
Estos datos son, al menos:
El nombre de la conexin, por el cual la podremos nombrar para referirnos a ella.
El driver que debe utilizar para entenderse con la base de datos
El nombre (y Path) de la base de datos que queremos manejar con esa conexin.
La conexin ODBC no la realiza Visual Basic. La realizar Windows. Veamos como podemos establecerla.
Vaya a Inicio | Configuracin | Panel de Control | ODBC de 32 Bits. Haga doble click y le aparecer un cuadro
como el de la figura 13-1. En este cuadro figuran todos los enlaces que estn establecidos. Estos enlaces puede
establecerlos para un usuario (DSN de usuario), de sistema o de archivo. La eleccin de uno u otro depender de los
permisos de acceso que quiera establecer (y eso es, de momento, para nota). En cualquier caso, todas los enlaces
ODBC que establezca funcionarn del mismo modo, exceptuando que puede otorgar unas prerrogativas distintas de
uso, dependiendo de como lo haya abierto.
Observe uno que figura en la lista: Luki. En esa lnea figura otro dato: Microsoft Access Driver.(*.mdb) Esto
significa que el enlace de nombre Luki est usando el driver ODBC de Access. Y significa tambin que si
queremos llamar a esa conexin deberemos llamarla por su nombre : Luki

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 360

Fig. 13-1 Creacin de un enlace ODBC. Muestra las conexiones existentes (una vez creada la conexin Luki)

Sigamos con la creacin del enlace ODBC. Para crear uno nuevo, haga click en el botn Agregar de la figura 13-1.
Le aparecer un cuadro donde le pide el driver que quiere utilizar.

Fig. 13 2 Eleccin del driver ODBC


Haciendo click en Finalizar, le pedir el nombre del nuevo enlace, un comentario, (no es necesario introducirlo), y
la base de datos con la que quiere enlazar

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 361

Fig. 13-3 Introduccin del nombre del enlace, comentario (descripcin) y base de datos asociada al
enlace ODBC
Veamos los datos que hemos introducido en nuestra conexin Luki
Nombre del Origen de datos. Luki
Descripcin (Opcional) Conexin ODBC Cap. 21
Haciendo click en Base de Datos | Seleccionar nos muestra un cuadro de dilogo donde `podemos buscar la base de
datos. Se elige la base de datos deseada. Hacemos click en ACEPTAR y ya est creada la nueva conexin.
La base de datos del sistema deber elegirla para poder introducir usuarios con distintas atribuciones de acceso a la
base de datos. Si no introduce esta base de datos de sistema, deber trabajar sin restriccin de acceso.
Una vez creada la conexin podemos utilizarla para conectar nuestra aplicacin con la base de datos. El proceso
para ello consiste en algo parecido a lo que hacamos trabajando con el motor Jet en el espacio de trabajo Microsoft
Jet, pero de distinta forma. En ese entorno se manejaba la base de datos creando un objeto Database, que
manipulaba el fichero de la base de datos directamente. En este caso, la base de datos se maneja mediante un objeto
Connection.
El trabajar sobre una conexin nos aporta mayor versatilidad a las aplicaciones. Piense por ejemplo un caso en el
que se emplea una base de datos Access. Si quisisemos ampliar las prestaciones de la base de datos de esa
aplicacin posiblemente pensaramos en migrar la BD a Oracle o SQLServer. Si atacamos a la base de datos a
travs de ODBC solamente deberamos cambiar la conexin, tal como vimos ms atrs. Nuestro programa seguira
llamando a la misma conexin ODBC, pero esta conexin, ahora, abrira una base Oracle o SQLServer en vez de la
Access que abra originalmente. No necesitaramos realizar ninguna modificacin en nuestro programa.
Este razonamiento es vlido para cualquier sistema de acceso a bases de datos a travs de ODBC. (RDO ADO)
Sin embargo el ODBCDirect tiene una ventaja `para los que trabajamos normalmente con DAO: usa los mismos
nombres para casi todos los mtodos y funciones, por lo que el cambio de cdigo es mnimo. El cambio se limita
prcticamente a crear el objeto Connection en vez del objeto Database. Comencemos a ver esto con u ejemplo. Es
un ejemplo uy simple, en el que abrimos una base de datos Access llamada Alumnos.Mdb que tiene una tabla
llamada Personas. Creamos la conexin Luki tal como se describi mas atrs. La tabla personas tiene solamente
tres campos: ID_Alumno, Nombre y Apellidos. Creamos una interface grfica sencilla

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 362

Fig. 13-4 Nuestra primera aplicacin con ODBCDirect


Mediante esta sencilla aplicacin queremos visualizar los datos existentes, aadir nuevos registros y borrar el
registro actual. Veamos el cdigo con los comentarios oportunos.
General/Declaraciones
Option Explicit
Dim MiSesion As Workspace
Dim MiConexion As Connection
Dim RsODBC As Recordset

'Declaramos las variables tipo objeto

Private Sub BCrearConexion_Click()


'Se le dice al DBEngine que debe trabajar en el espacio de trabajo ODBCDirect
DBEngine.DefaultType = dbUseODBC
Set MiSesion = Workspaces(0)
'Se crea el objeto conexin
Set MiConexion = MiSesion.OpenConnection("Conexion1", dbDriverNoPrompt, False, "ODBC;DSN=Luki")
Se crea el objeto Recordset
Set RsODBC = MiConexion.OpenRecordset("Personal", dbOpenDynamic, dbRunAsync, dbPessimistic)
'Es necesario recorrer el recordset para conocer cuantos registros tiene (Es Dynaset)
RsODBC.MoveLast
RsODBC.MoveFirst
If RsODBC.AbsolutePosition <> -1 Then
LNumRegs = RsODBC.RecordCount
LNumReg = RsODBC.AbsolutePosition + 1
PresentaDatos
Else
MsgBox "La base de datos no tiene ningn registro"
End If
End Sub
Public Sub PresentaDatos()
TB_ID = "": TB_Nombre = "" : TB_Apellido = ""
TB_ID = RsODBC!ID_Alumno
TB_Nombre = RsODBC!Nombre
TB_Apellido = RsODBC!Apellidos
LNumReg = RsODBC.AbsolutePosition + 1
End Sub
Private Sub BEliminar_Click()
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 363

RsODBC.Delete
LNumRegs = RsODBC.RecordCount
LNumReg = RsODBC.AbsolutePosition + 1
If RsODBC.AbsolutePosition <> -1 Then
RsODBC.MoveFirst
PresentaDatos
End If
End Sub
Private Sub BGuardarDatos_Click()
RsODBC.AddNew
RsODBC!ID_Alumno = TB_ID
RsODBC!Nombre = TB_Nombre
RsODBC!Apellidos = TB_Apellido
RsODBC.Update
LNumRegs = RsODBC.RecordCount
LNumReg = RsODBC.AbsolutePosition + 1
End Sub
Private Sub BMas_Click()
If RsODBC.AbsolutePosition <> -1 Then
RsODBC.MoveNext
If RsODBC.AbsolutePosition <> -1 Then
PresentaDatos
Else
RsODBC.MoveLast
PresentaDatos
End If
End If
End Sub
Private Sub BMenos_Click()
If RsODBC.AbsolutePosition <> -1 Then
RsODBC.MovePrevious
If RsODBC.AbsolutePosition <> -1 Then
PresentaDatos
Else
RsODBC.MoveFirst
PresentaDatos
End If
End If
End Sub
Private Sub BMMas_Click()
If RsODBC.AbsolutePosition <> -1 Then
RsODBC.MoveLast
PresentaDatos
End If
End Sub
Private Sub BMMenos_Click()
If RsODBC.AbsolutePosition <> -1 Then
RsODBC.MoveFirst
PresentaDatos
End If
End Sub
Private Sub BNuevoReg_Click()
Limpia
End Sub
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 364

Public Sub Limpia()


TB_ID = ""
TB_Nombre = ""
TB_Apellido = ""
End Sub
Observe que casi todo el cdigo es igual que el que escribiramos si hubisemos utilizado el espacio de trabajo
Microsoft Jet. Solamente hemos utilizado cdigo distinto el procedimiento BCrearConexion_Click. Vamos a
analizar las instrucciones de ese procedimiento que son distintas a las que estamos acostumbrados a manejar
DBEngine.DefaultType = dbUseODBC
Vea la propiedad DefaultType en el Captulo 20. Tenga en cuenta que el ODBCDirect lo ejecuta el motor Jet (que
como recordar es el objeto DBEngiine). La propiedad DefaulType debemos igualarla a dbUseODBC para que
trabaje en el espacio de trabajo ODBCDirect. Si no le disemos ningn valor a esa propiedad, tomara el otro valor
posible (dbUseJet) que es su valor por defecto. Por eso, cuando utilizbamos los mtodos CreateDataBase u
OpenDatabase no necesitbamos darle ningn valor a esa propiedad.
Set MiConexion = MiSesion.OpenConnection("Conexion1", dbDriverNoPrompt, False, "ODBC;DSN=Luki")
Vea mas abajo la informacin de OpenConnection para ver los parmetros que hay que pasarle a este mtodo.
Set RsODBC = MiConexion.OpenRecordset("Personal", dbOpenDynamic, dbRunAsync, dbPessimistic)
Vea mas abajo una ampliacin del mtodo OpenRecordset

Mtodo OpenConnection
Es un mtodo del Workspace que solamente es aplicable cuando el DBEngine est trabajando en el espacio de
trabajo ODBCDirect. Abre un objeto Connection usando un origen de datos ODBC ya creado.
El objeto Connection sera el equivalente en DAO al objeto Database. Debemos declararlo antes de usarlo
Dim MiConexion as Connection
Si MiSesion es el Workspace que queremos usar, la sintaxis de OpenConnection es la siguiente:
Set MiConexion = MiSesion.OpenConnection (Nombre, Opciones, Slolectura y Conectar)
En el ejemplo:
Set MiConexion = MiSesion.OpenConnection("Conexion1", dbDriverNoPrompt, False, "ODBC;DSN=Luki")
Veamos que son los parmetros Nombre, Opciones, Slolectura y Conectar
Nombre es el nombre de la conexin (no se debe confundir con el nombre del objeto Connection que es
MiConexion, y que es el nombre por el que nos tendremos que referir a esa conexin en toda la aplicacin. Nombre
no lo usar normalmente)
El parmetros Nombre puede ser una cadena cualquiera, o el nombre del enlace ODBC establecido en Windows
(que en nuestro ejemplo sera Luki). Si opta por poner una cadena cualquiera (como hicimos en el ejemplo,
Conexin1) deber poner el nombre del enlace ODBC en el parmetro Conectar. Si opta por poner el nombre del
enlace ODBC, Visual Basic interpreta que debe conectar a travs de ese enlace y ya no necesita poner ningn valor
al parmetro Conectar.
Opciones Este parmetro es para definir que tipo de respuesta va a dar el administrador del controlador de ODBC
para solicitar al usuario informacin sobre la conexin (Nombre del origen de datos (DSN), nombre del usuario y
contrasea). Puede tomar uno de los siguientes valores:
DbDriverNoPrompt El administrador del controlador de ODBC toma los datos de los parmetros
Nombre y Conectar para saber cual es el enlace ODBC que debe usar. Si no proporciona suficiente
informacin, se producir un error de tiempo de ejecucin.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 365

DbDriverPrompt El administrador del controlador de ODBC muestra el cuadro de dilogo de ODBC, que
muestra todos los enlaces ODBC existentes. La conexin se hace con el DSN que selecciona el usuario en
ese cuadro de dilogo.

Fig. 13.5 Cuadro de dilogo de ODBC


Una vez seleccionada la conexin, aparecer otro cuadro solicitando el nombre de inicio de sesin y la contrasea.
En resumen, con este parmetro DbDriverPrompt forzamos al programa a que utilice los recursos Windows para
seleccionar el enlace ODBC
DbDriverComplete (Este es el valor predeterminado). Se comporta (aparentemente) como si se pone
DbDriverNoPrompt
DbDriverCompleteRequired Al igual que la anterior, esta opcin se comporta (aparentemente) como si se
pone DbDriverNoPrompt
Slolectura (Opcional). True si la conexin se va a abrir con acceso de slo lectura y False si la conexin se va a
abrir para acceso de lectura/escritura (predeterminado)
Conectar (Opcional si se ha puesto el nombre del enlace en el parmetro Nombre). Este parmetro est formado
por varias partes. Una, obligatoria, que contiene la expresin "ODBC;" Otra parte obligatoria, si no ha puesto en el
parmetro Nombre el nombre del enlace ODBC es "DSN = NombredelaConexin;" Si desea especificar el usuario
propietario de esa conexin debe aadir "UID = usuario;" y como ese usuario tendr una contrasea, deber
aadirla tambin "PWD = contrasea;" Tambin puede indicar cuanto tiempo debe esperar el administrador del
controlador de ODBC para generar un error en caso de que no conteste el sistema a la peticin ODBC. Este tiempo
deber introducirlo con la expresin "LOGINTIMEOUT = segundos;" Observe que cada una de estas partes
lleva un identificador y un dato, ambos separados por un signo =, y siempre terminan con el signo punto y coma (;)
Si omite los parmetros UID y/o el PWD, estos datos se obtendrn de las propiedades UserName y Password del
objeto Workspace.

Mtodo OpenRecordset
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 366

Este mtodo ya se estudi en el captulo anterior, pero se van a ver ciertas peculiaridades que tiene cuando se abre
un recordset en el espacio de trabajo ODBCDirect
En este caso es el objeto Connection quien abre el recordset.:
Set MiRecordset =
= MiConexion.OpenRecordset (Origen, Tipo, Opciones, Bloquearmodificaciones)
Origen Puede ser un nombre de tabla, de una consulta o una instruccin SQL que devuelva registros.
Tipo Indica el tipo de recordset que queremos crear. El espacio de trabajo ODBCDirect no permite recordsets tipo
Tabla. Los tipos que se pueden elegir son:
DbOpenDynamic Abre un objeto Recordset de tipo Dynamic, que es parecido a un cursor dinmico
ODBC
DbOpenDynaset Abre un objeto Recordset de tipo Dynaset, similar al estudiado en el captulo 20 para el
espacio de trabajo Microsoft Jet
DbOpenSnapshot Abre un objeto Recordset de tipo Snapshot,
dbOpenForwardOnly Abre un objeto Recordset de tipo Forward-only, que tiene la particularidad de que
no permite movernos en el recordset de adelante hacia atrs. Este es el tipo que crear por defecto si no se
especifica nada en el parmetro Tipo.

Opciones Debe indicar uno de estos dos valores (si no pone alguno de ellos da error):
DbRunAsync
Ejecuta una consulta asncrona, que es la forma normal de trabajar del ODBC. Esto
permite a su aplicacin seguir procesando otras instrucciones mientras se ejecuta la consulta en segundo
plano (Vea mas adelante la propiedad StillExecuting
dbExecDirect Ejecuta una consulta saltando el mtodo SQLPrepare y llamando directamente al mtodo
SQLExecDirect. Utilice esta opcin slo cuando no se abra un objeto Recordset basndose en una
consulta de parmetros. Para obtener ms informacin, consulte la "Referencia del programador de
Microsoft ODBC 3.0."
Bloquearmodificaciones Este parmetro es fundamental si quiere escribir en la base de datos, pues si lo omite le
pone por defecto que la base es de solo lectura. Mediante este parmetro va a determinar el tipo de bloqueo de la
base de datos para entornos de trabajo multiusuario. Puede poner uno de estos valores:
DbReadOnly (Predeterminado) No permite que los usuarios hagan cambios en los registros del Recordset
DbPessimistic Permite cambiar datos y aadir registros en el recordset, utilizando el criterio de bloqueo
pesimista. Esto significa que bloquea la pgina donde se encuentra el registros desde que se ejecuta el
mtodo Edit hasta que se ejecuta el Update. Es el criterio mas seguro de bloqueo de datos, pero debe tener
en cuenta que tiene la base bloqueada desde el Edit hasta el Update. Si hace bloqueo pesimista, procure
que las instrucciones entre uno y otro no tengan ningn tiempo de espera, por ejemplo a que el usuario
introduzca un dato. (El tamao de una pgina depende de la base de datos que est usando. En Access es
de 2048 Bytes. Esto significa que solamente tendr bloqueada una parte relativamente pequea de la base
de datos, pudiendo modificar otros registros que estn fuera de ese segmento de 2 Kbytes. Lgicamente
este bloqueo solamente tendr efecto cuando est trabajando en un entorno multiusuario.
DbOptimistic Permite cambiar datos y aadir registros en el recordset, utilizando el criterio de bloqueo
optimista. El bloqueo optimista significa que solamente estar bloqueada la pgina que contiene el registro
mientras se ejecuta el mtodo Update. Esto puede ocasionarle que, si estn dos usuario trabajando sobre el
mismo registro, se introduzca un dato errneo. Parece as en principio que no se debe usar, pero todo va a
depender de la aplicacin, de sus datos, y de la probabilidad de que ocurra esa colisin. La ventaja que
tiene es que tiene menos tiempo bloqueada la pgina de la base de datos.
dbOptimisticValue Utiliza la concurrencia optimista basndose en valores de fila. Funciona de forma
similar al dbOptimistic.
dbOptimisticBatch Activa la actualizacin optimista por lotes.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 367

Actualizacin por lotes. Modelo de cursor para clientes que trabajan con cursores, pero no mantienen bloqueos en
el servidor o ejecutan actualizaciones por fila. En su lugar, el cliente actualiza muchas filas que estn almacenadas
en el bfer local y despus ejecuta una actualizacin por lotes. Este modelo de cursor tambin permite al cliente
cancelar la conexin con el servidor y volverla a establecerla con el mismo servidor o con otro diferente.
Para utilizar la actualizacin por lotes en DAO 3.5, debe utilizar un espacio de trabajo de ODBCDirect, la
propiedad DefaultCursorDriver se debe establecer a dbUseClientBatchCursor en el momento de abrir la conexin y
se debe abrir el Recordset con el argumento de tipo de bloqueo del mtodo OpenRecordset establecido a
dbOptimisticBatch.

Propiedad StillExecuting
Cuando abrimos una conexin mediante OpenConnection, un QueryDef o creamos un recordset y le ponemos en
Opciones DbRunAsync, la operacin se realiza de forma asncrona, por lo tanto no sabemos cuando tendremos
disponible el objeto a crear o los datos de la consulta. Para poder controlar si la operacin se est realizando todava
leeremos la propiedad StillExecuting, que devolver True si todava se est ejecutando, y False si ha terminado.
Basta con hacer un bucle del tipo
Do While MiConexion.StillExecuting = True
DoEvents
Loop
Mientras la propiedad StillExecuting sea True, no se puede tener acceso a ningn objeto devuelto. Por ejemplo, no
pretenda crear un recordset con MiConexion Mientras que StillExecuting sea True, pues MiConexin no existe an.
Esta propiedad puede ser muy til cuando tiene consultas encadenadas y necesita esperar a que termine una para
comenzar con la siguiente.
StillExecuting se utiliza con los objetos y para las operaciones siguientes:

Objeto Connection, para controlar que an se est ejecutando uno de los mtodos Execute u OpenConnection
Objeto QueryDef, para comprobar su mtodo Execute
Recordset, donde podr comprobar si an se estn realizando los mtodos Move, NextRecordset u
OpenRecordset
Para ver el valor que tiene la propiedad StillExecuting deber poner el nombre del objeto que quiere comprobar
(Connection, QueryDef o Recordset) despus de haber iniciado uno de los mtodos citados anteriormente. Por
ejemplo, para esperar a que se haya creado el objeto Connection MiConexion, haremos un bucle de la siguiente
forma
Set MiConexion = MiSesion.OpenConnection("Luki1", dbDriverNoPrompt)
Do While MiConexion.StillExecuting = True
Aqu las instrucciones que quiera
Loop

Mtodo Cancel
Cancela la ejecucin de un mtodo ascrono de llamada. Slo funciona espacios de trabajo ODBCDirect.
Sintaxis

objeto.Cancel

La sintaxis del mtodo Cancel consta de las siguientes partes:


Objeto puede ser:
Connection para cancelar el mtodo Execute u OpenConnection
QueryDef, para cancelar el mtodo Execute
Recordset para cancelar el mtodo OpenRecordset
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 368

El mtodo Cancel solamente sirve para cancelar la ejecucin de una llamada asncrona de los mtodos Execute,
OpenConnection u OpenRecordset que se hayan invocado con la opcin dbRunAsync. Cancel devolver un error
de tiempo de ejecucin si en el mtodo que est intentando finalizar no se utiliz dbRunAsync.

Objetos Database y QueryDef en el espacio de trabajo ODBCDirect


Repasemos la estructura jerrquica de los objetos de acceso a datos en el espacio de trabajo ODBCDirect. Podemos
ver que siguen existiendo, aparte de los ya estudiados en este captulo, dos objetos que ya nos son conocidos: el
QueryDef y el Database. Veamos cada uno de ellos.

Fig. 13-6 Estructura jerrquica de los objetos de acceso a datos en el espacio ODBCDirect

Objetos QueryDef en el espacio de trabajo ODBCDirect


Habamos visto en el captulo 20 que un QueryDef era una consulta cuando todava no estaba guardada en el disco.
Es decir, un QueryDef es una consulta en memoria RAM. Ese QueryDef se transforma en una consulta de la base de
datos una vez que se cierra el objeto Database.
En el espacio de trabajo ODBCDirect no se pueden crear bases de datos. Se pueden crear objetos QueryDef, que en
este caso sern objetos efmeros, que solamente existirn en la memoria RAM, desapareciendo en el momento que
cerremos ese QueryDef o cerremos la aplicacin.
Puede crear un QueryDef para crear posteriormente a partir de l un Recordset con el que puede presentar o escribir
el contenido de los registros. En el siguiente ejemplo hemos abierto la conexin, y como paso previo a la creacin
del recordset hemos creado un QueryDef con todos aquellos registros cuyo campo Apellidos sea igual a Alvarez
Prez. Una vez creado ese QueryDef, hemos creado un recordset a partir de l. No tiene mucho sentido hacer esto
ya que podramos crear directamente el recordset imponiendo esa condicin en el campo Apellidos. Se expone aqu
con fines didcticos, no prcticos.
DBEngine.DefaultType = dbUseODBC
Set MiSesion = Workspaces(0)
Set MiConexion = MiSesion.OpenConnection("Conexion1", dbDriverNoPrompt, False, "ODBC;DSN=Luki")

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 369

Set MiConsulta = MiConexion.CreateQueryDef ("Pepito", "Select * From Personal Where Apellidos = "Alvarez
Prez")
Set RsODBC = MiConsulta.OpenRecordset(dbOpenDynaset, dbRunAsync, dbOptimistic)
If RsODBC.AbsolutePosition <> -1 Then
RsODBC.MoveLast
RsODBC.MoveFirst
LNumRegs = RsODBC.RecordCount
LNumReg = RsODBC.AbsolutePosition + 1
PresentaDatos
Else
MsgBox "El recordset no tienen ningn registro"
End If
Puede apreciar en la fig. 13-6 otro objeto que est jerrquicamente debajo del QueryDef. El Objeto Parameter. Este
objeto sirve para cambiar los parmetros que se le pasan al QueryDef para crearlo. Le remito a la ayuda de VB para
mayor explicacin de este objeto.

El objeto Database en el espacio de trabajo ODBCDirect


En el espacio ODBCDirect puede tambin abrir un objeto Database en vez de un objeto Connection. La diferencia a
la hora de crear un objeto Database (abrir una base d e datos) entre el espacio de trabajo Microsoft Jet y
ODBCDirect es que en el primero abrimos directamente el fichero de la base de datos, y en el segundo, abrimos el
fichero que indique el enlace ODBC. Deberemos suministrarle informacin del enlace ODBC que debe usar. La
sintaxis sigue siendo igual que en el espacio de trabajo Microsoft Jet:
Set MiBaseDatos = MiSesion.OpenDatabase (Nombre, Opciones, Slolectura, Conexin)
Para indicarle el enlace ODBC que debe usar puede hacerlo de las dos formas que venimos viendo para los
parmetros Nombre y Conexin. Si indica el nombre del enlace en el parmetro Nombre lo aceptar y ser
necesario poner el parmetro Conexin. Si `pone un nombre cualquiera en el parmetro Nombre deber indicar el
nombre del enlace en el parmetro Conexin.
Esta posibilidad de crear un objeto Database nos aproxima an ms al cdigo empleado en el espacio de trabajo
Microsoft Jet. Por lo tanto puede ser muy til usar este objeto en aquellos casos en los que ya se haba escrito el
cdigo, y pasamos posteriormente a usar ODBC.
DBEngine.DefaultType = dbUseODBC
Set MiSesion = Workspaces(0)
'En la siguiente lnea le pasamos el nombre del enlace ODBC en el parmetro Nombre
Set MiBaseDatos = MiSesion.OpenDatabase("Luki", dbDriverNoPrompt)
'Pero podramos haberselo pasado en el parmetro Conexin y ponerle como parmetro 'nombre cualquier cadena
de caracteres
Set MiBaseDatos =
MiSesion.OpenDatabase("BaseDatos1", dbDriverNoPrompt, False, "ODBC;DSN=Luki")
'Ahora creamos el recordset, como en los otros casos
Set RsODBC = MiBaseDatos.OpenRecordset("Personal", dbOpenDynaset, dbRunAsync, dbOptimistic)
If RsODBC.AbsolutePosition <> -1 Then
RsODBC.MoveLast
RsODBC.MoveFirst
LNumRegs = RsODBC.RecordCount
LNumReg = RsODBC.AbsolutePosition + 1
PresentaDatos
Else
MsgBox "La base de datos no tiene ningn registro"
End If
Mediante los ejemplos expuestos en este captulo espero que el alumno comprenda como trabaja DAO a travs de
ODBC, mediante el ODBCDirect.
No olvide que sigue tratndose de DAO, y que por lo tanto deber poner la misma referencia (En Proyecto |
referencia) que en el caso del DAO trabajando en el espacio de trabajo Microsoft Jet. En la siguiente parte de este
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 370

captulo se estudiarn los objetos RDO, objetos que trabajan exclusivamente a travs de ODBC. Con las ideas
captadas hasta aqu ver que es sencillo abordar estos nuevos objetos.

Visual Basic - Gua del Estudiante Cap. 13 Continuacin


Acceso a Bases de Datos remotas mediante objetos RDO
En la primera parte de esta captulo hemos visto como acceder a bases de datos a travs de ODBC usando el motor
JET. El acceso se realizaba mediante ODBCDirect, modo de operacin del motor JET, y podamos usar la misma
sintaxis y objetos que habamos visto con los objetos DAO. Tambin vimos como crear un enlace ODBC, enlace
que vamos a utilizar en este captulo. Como ya se explic en el captulo anterior, damos por supuesto que el alumno
conoce como crear ese enlace.
Los objetos RDO se crearon para cubrir el hueco que tena VB para conectar con bases de datos distintas a las que
trabaja el motor JET. (Access, dBase, FoxPro, etc.). Esta forma de trabajar nos permite enlazar con bases de datos
tipo Oracle o SQLServer, pero tambin nos permite trabajar con Access, dBase o FoxPro, que tambin tienen su
propio driver ODBC.
Lo primero que nos encontramos al trabajar con RDO es que es ms lento que DAO. Si creamos dos aplicaciones
que trabajen sobre una base Access, una directamente a travs de DAO y otra a travs de RDO, observaremos que la
primera accede a la BD con una rapidez mayor que la segunda. Normal, no es lo mismo abrir un fichero y leerlo
(que es lo que hace DAO) que pasar unos parmetros a otro programa (Driver ODBC de Access) para que este abra
el fichero, obtenga los datos y nos los pase. Lo mismo podemos decir cuando tenemos que contar registros,
movernos de un registro a otro, editar o aadir nuevos registros. Esa falta de rapidez es el coste de la tecnologa de
bases abiertas.
Lo segundo que nos va a llamar la atencin es el nombre de los objetos de acceso a datos. Una vez que nos
habamos familiarizado con palabras como Recordset, DataBase o Dynaset, nos las cambian por rdoResultset,
rdoConnection o Keyset respectivamente. Y lo peor no es solamente tener que aprender sus nombres, sino que en
una aplicacin hecha en DAO que sea necesaria cambiarla a RDO, nos vemos obligados a retocar la mayor parte de
las lneas de cdigo (Cosa que no ocurra con ODBCDirect)
Y lo tercero, RDO no tiene la posibilidad de crear bases de datos como hacamos en DAO. Normal, ya que en este
caso no trabajamos directamente sobre la BD sino sobre la conexin ODBC que Windows realiz a una base de
datos. Podemos aadir mas desventajas de RDO: no puede contar los registros que tiene, tiene un comportamiento
muy irregular con la propiedad AbsolutePosition, y varios detalles que procuraremos explicar en este captulo para
ahorrar al alumno el trabajo de tener que experimentarlos por s mismo. (Aunque, consejo de viejo profesor, es la
forma ms segura de aprenderlos).
Tras estos inconvenientes parece lgico encontrar alguna contrapartida positiva. Por ejemplo poder conectar con
cualquier tipo de base de datos, pudiendo incluso realizar la aplicacin atacando una base Access, para luego
trabajar con una base SQLServer u Oracle sin variar ni una lnea de cdigo. Esa debera ser la gran ventaja de RDO.
Pero lamentablemente, y en contra de toda teora de ODBC, no es cierto. Si preparamos una aplicacin en RDO
trabajando con una base Access y pretendemos cambiar la base por otra SQLServer, observaremos que lo que
funciona perfectamente en la primera no funciona en la segunda. (Y esto no es teora. Es simplemente experiencia
del autor). Y Access y SQLServer son del mismo fabricante!. La razn est en que los drivers de una base y otra no
trabajan exactamente igual. Tampoco son iguales las protecciones y los permisos de acceso. Consejo de viejo
profesor: Si va a trabajar con una determinada base de datos a travs de RDO comience el proyecto usando esa base
de datos. Y puestos a dar consejos, si piensa usar SQLServer u Oracle y si la aplicacin va a escribir datos en la
base no use RDO. Si solamente los va a leer no tendr problemas. Y si tiene problemas nadie se los va a resolver,
argumentando que deje RDO y use ADO. De hecho RDO ya se ha quedado obsoleto al nacer ADO. Pero eso ser
objeto de otro captulo de esta Gua del Estudiante y hoy nos toca aprender RDO. Comencemos.

RDO y DAO. Comparacin de sus objetos. El control RemoteData


Al igual que DAO, RDO tiene objetos de acceso a datos, que deberemos declarar y crear. Mediante estos objetos
podemos leer y escribir datos en una BD mediante cdigo. Tambin, al igual que en DAO exista el Control Data,
con el que podamos acceder a la base de datos sin escribir ni una lnea de cdigo, en RDO existe un control similar:
el Control RemoteData. El funcionamiento es similar, pero las propiedades son distintas y tienen distintos
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 371

nombres. Mediante el control RemoteData podemos enlazar una base de datos a los tpicos controles enlazados a
datos (Label, TextBox, DBGrid), pero en este caso se enlazan a travs de una conexin ODBC, por lo que es fcil
pensar que las propiedades de este control y los valores que deben tomar son distintas a los del control Data. Como
es mucho ms sencillo (sencillo no quiere decir mejor) usar el control RemoteData que trabajarse con cdigo los
objetos de acceso a datos, vamos a comenzar estudiando este control.
Pero antes vamos adelantar la equivalencia entre los objetos DAO y los objetos RDO. La lista siguiente est copiada
literalmente de la informacin de Microsoft MSDN Library Visual Studio, informacin que merece la pena
instalarla en su ordenador pese a lo que ocupa.
Objetos de datos remotos y los objetos de DAO/Jet equivalentes
Objeto de RDO
Objeto de DAO/Jet equivalente
rdoEngine
DBEngine
rdoError
Error
rdoEnvironment
Workspace
rdoConnection
Database
rdoTable
TableDef
No est implementado
Index
rdoResultset
Recordset
No implementado
Tipo Table
Tipo Keyset
Tipo Dynaset
Tipo static
Tipo Snapshot
Tipo dynamic
(ninguno)
Tipo forward-only
Tipo forward-only
No implementado (*)
User
RdoColumn
Field
rdoQuery
QueryDef
rdoParameter
Parameter
No implementado (**)
Relation
No implementado (*)
Group
Control RemoteData
Control Data
(*) En RDO, los usuarios y grupos de usuarios son precisamente los que lleve implcitos la conexin ODBC.
(**) Al no trabajar directamente sobre la base de datos, no se pueden crear relaciones en ella.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 372

El control RemoteData
Este control nos permite crear una aplicacin de acceso a datos completa sin utilizar cdigo. Eso s, ser necesario
tener una conexin ODBC hecha, ya que el control RemoteData no abre un fichero de BD sino una conexin ya
establecida.
No est normalmente en la caja de herramientas, por lo que habr que aadirlo en Proyecto | Componentes
introduciendo el Microsoft Remote Data Control 6.0 El control Remote Data tiene un aspecto similar al control
Data, tanto en la caja de herramientas como en el formulario:

El control RemoteData toma por defecto el nombre MSRDCx.


Algunas Propiedades del Control RemoteData
DatasourceName
Devuelve o establece el nombre del origen de datos (DSN). El DSN No es ms que el nombre de la conexin
ODBC.
Esta propiedad se puede dejar en blanco si la propiedad Connect del control identifica un nombre de origen de
datos (DSN) registrado en el Registro de Windows.
Sintaxis NombredelControlRDO.DatasourceName = MiConexin
Puede cambiarse en tiempo de ejecucin. En este caso, inmediatamente debe utilizar el mtodo Refresh para abrir la
nueva conexin con la base de datos.
Puede leer el valor de esta propiedad. Le devolver precisamente el DNS que est utilizando. Esta propiedad slo le
devolver un valor si ha introducido previamente algn valor en la propiedad DatasourceName. No le devolver
valor alguno si ha introducido la conexin a travs de la propiedad Connect.
Propiedad Connect
Esta propiedad cumple la misma funcin que la anterior, pero por otro camino. Mediante la propiedad Connect le
introducimos al control RemoteData la informacin necesaria para abrir la conexin, incluyendo en esta
informacin, no solamente el nombre de la conexin, como hacamos con la propiedad DatasourceName, sino
ampliarla con otros datos de la conexin, tal como el nombre del usuario, su contrasea, nombre del controlador
ODBC a usar, el nombre de la base de datos, el servidor donde se ubica esta base de datos, nombre de la estacin de
trabajo desde la que vamos a trabajar e incluso el nombre de la aplicacin en la que vamos a usar los datos de esa
base. Esta propiedad es mucho ms completa que la anterior, pero un poco ms complicada de usar.
Para introducir los datos de la propiedad Connect deber usar una palabra para definir el dato, seguido del signo = y
del dato a introducir. Como final del dato debe introducir necesariamente el signo punto y coma ;
DSN
Origen de datos ODBC registrado.
DSN=MiConexinODBC;
UID
Nombre de un usuario reconocido
UID=Luis;
PWD Contrasea asociada al usuario
PWD=MiContrasea;
DRIVER
Descripcin del controlador
DRIVER=SQL Server;
DATABASE
Base de datos predeterminada
para usarla una vez conectado
DATABASE=MiBase;
SERVER
Nombre del servidor donde se
aloja la base de datos
SERVER=MiServidor;
WSID
Nombre de la estacin de trabajo
(Nombre del PC que se va a
comunicar con el servidor
WSID=NombredemiPC;
APP
Nombre de la Aplicacin que va a
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 373

Usar la Base de Datos

APP=MiAplicacin

NOTA - Si conoce SQLServer, DATABASE es el nombre de la base de datos que quiere utilizar una vez realizada
la conexin. Para los que no conocen SQLServer, dentro de un fichero de esta base de datos pueden existir varias
bases de datos. Y cada una de ellas puede tener varias tablas. Es decir, la configuracin de esta BD no es tan
simple como la de Access. Cada una de estas bases de datos tiene un propietario y varios usuarios. Cada usuario
tiene habilitadas unas funciones (p.e. un usuario puede leer y escribir y otro solamente leer) Este parmetro le
indica cual de esas bases de datos que contiene el fichero de SQLServer (para hablar con mas propiedad, el
sistema de ficheros de SQLServer)

SQLServer mostrando su carpeta de Bases de Datos (BDGepa, master, model, )


Observe que tras cada parmetro existe un separador ; No es necesario introducir todos los datos. Depender del
driver, de cmo haya creado la base de datos, los atributos que le dio a cada uno de los usuarios. Y como no,
depender del tipo de base de datos que est usando (SQLServer, Oracle, etc.). Recuerde lo mencionado ms atrs.
No se fe nunca de que su aplicacin trabaja perfectamente sobre una base de datos. Lo ms probable es que si
cambia de BD ya no le trabajar tan perfectamente.
Veamos un ejemplo de cmo introducir esta propiedad:
Dim MiVariable As String
MiVariable = "DSN=MiConexionODBC;UID=Luis;PWD=MiContrasea;DATABASE=BaseGE;"
RemoteData1.Connect = MiVariable
El hecho de que podamos abrir una base de datos mediante DatasourceName o Connect tiene su explicacin. Si
tenemos creada una conexin ODBC con todos los datos necesarios para que pueda abrir una base de datos, es
mucho ms simple usar la propiedad DatasourceName y el Control RemoteData le abrir perfectamente la BD.
Pero cuando usamos una BD a travs de Red de Area Local, lo normal es que esa base est compartida por varios
usuarios, que cada uno tendr un nombre y un Password, que puede estar habilitado para trabajar desde un
puesto o desde varios puestos, e incluso puede estar habilitado para trabajar sobre una BD utilizando una
determinada aplicacin, y no estarlo para utilizar esa misma BD con una aplicacin distinta. Por eso este control
nos brinda las dos posibilidades, una sencilla, DatasourceName, para trabajar con los datos ya introducidos en la
conexin ODBC, y la otra, para variar los datos de esa conexin ODBC ya existente y lograr con ello todas las
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 374

ventajas que nos ofrece ODBC respecto a restricciones de usuarios, contraseas, etc. (la conexin ODBC en este
caso es muy normal que tenga solamente el nombre, y que no apunte a ninguna base de datos concreta). Puede
incluso utilizar ambas propiedades. Es muy tpico por ejemplo, que la conexin apunte a una determinada base de
datos, (el nombre de la conexin se lo pasamos en la propiedad DatasourceName) y que en la propiedad Connect
le pasamos el nombre del usuario y la contrasea.
Puede utilizar el control, RemoteData incluso sin tener una conexin preestablecida. Pero deber establecer
mediante el programa, utilizando los mtodos OpenConnection o EstablishConnection. Se sale del contenido
deseado para este curso comentar estos mtodos, pero el alumno aventajado puede intentar obtener informacin
en la escasa bibliografa existente. No le recomiendo que se complique la vida rizando el rizo, pudiendo establecer
previamente la conexin ODBC.

Propiedad SQL
Mediante las dos propiedades estudiadas, DatasourceName y Connect hacemos que el control RemoteData sepa la
conexin sobre la que va a trabajar - y por lo tanto la base de datos que utilizar. Ahora nos falta indicarle los datos
que deseamos leer o escribir. Nos falta lo que sera en DAO, darle los datos para crear el Recordset (Por ejemplo el
nombre de una tabla o una sentencia SQL, tal como hacamos en la propiedad RecordSource del control Data).
Para el control RemoteData esta informacin se le introduce en la propiedad SQL
La propiedad SQL establece o devuelve una instruccin SQL vlida para crear un conjunto de registros a partir del
origen de datos establecido en las propiedades DatasourceName o Connect. Esta instruccin SQL debe comenzar
necesariamente por SELECT, En tiempo de ejecucin, podemos asignar a esta propiedad el nombre de una
Consulta ya almacenada en la BD, pero en este caso, debemos anteponer la palabra EXECUTE. Tambin podemos
introducir en esta propiedad un rdoQuery, un rdoResultset o un rdoTable. Eso lo veremos ms adelante.
Para establecer esta propiedad en tiempo de diseo, basta con escribir la instruccin SQL en la ventana de
propiedades. Una instruccin tpica sera
SELECT * From Alumnos
SELECT * From Alumnos Where Apellido1= 'Surez'
En tiempo de ejecucin podemos introducir una de estas instrucciones en la propiedad SQL
MSRDC1.SQL = "SELECT * From Alumnos Where Apellido1= 'Surez'"
Si la BD tiene una consulta (la tpica consulta de Access) llamada C_Suarez, donde hemos seleccionado todos los
registros cuyo campo Apellido1 sea Surez, podemos poner:
MSRDC1.SQL = EXECUTE C_Suarez
(No intente hacer esto mismo con el nombre de una tabla. Solamente sirve para consultas)
Con los registros seleccionados por la propiedad SQL, formamos lo que en DAO era un recordset, pero en este caso
adopta otro nombre: rdoResultset. En RDO se ha buscado otra terminologa, posiblemente para diferenciarlo
claramente de DAO. Por ejemplo, en vez de registros es habitual hablar de Filas, y en vez de campos, hablamos de
Columnas.
Si pudisemos crear un rdoResultset mediante algn procedimiento, (y seguro que podremos hacerlo), podemos
introducir directamente ese rdoResultset como rdoResultset del control RemoteData, al igual que lo hacamos con
el Recordset del Control Data en DAO:
Set MSRDC1.Resultset = rdoResultsetYaCreado

Propiedad Connection
Veamos previamente que es un objeto rdoConnection. Un Objeto rdoConnection es un objeto de acceso a datos
remotos. Es el equivalente al objeto Database en DAO (Vea cuadro pgina 2) El control RemoteData tiene un
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 375

objeto rdoConnection subyacente y podemos "verlo" mediante esta propiedad. El poner verlo entre comillas no
significa otra cosa que, al igual que ocurra con el objeto Database, el objeto rdoConnection es un objeto de acceso
a datos del que podemos ver sus propiedades y ejecutar sus mtodos. Por ejemplo, si queremos ver la cadena de
conexin completa podemos analizar la propiedad Connect del Objeto Connection:
Label1 = MSRDC1.Connection.Connect
Si deseamos saber si el control RemoteData sigue conectado para realizar una determinada operacin:
If MSRDC1.Connection.StillConnecting Then .
Podemos ejecutar uno de sus mtodos. Por ejemplo, cerrar la conexin
MSRDC1.Connection.Close

Propiedades EOFAction y BOFAction


Establecen el comportamiento del RemoteData cuando llega a la fila anterior a la primera o a la fila posterior a la
ltima. (Y no es un juego de palabras) Puede establecerse en tiempo de diseo, mediante la caja de propiedades, o
en tiempo de ejecucin mediante la siguiente sintaxis:
MSRDC1.BOFAction = valor
MSRDC1.EOFAction = valor
Los valores (o constantes) que puede tomar son los siguientes:
Para la propiedad BOFAction
Valor

Constante

Efecto

0
1

rdMoveFirst
rdBOF

Se mueve a la primera fila


Se mantiene en la fila anterior a la primera. Se genera el evento
Validate y a continuacin el evento Reposition, y se desactiva el botn de desplazar
hacia abajo

Para la propiedad EOFAction


Valor
0
1

Constante
rdMoveLast
rdEOF

rdAddNew

Efecto
Se mueve a la ltima fila
Se queda en la fila posterior a la ltima. Se genera el evento Validate
y a continuacin el evento Reposition. Se desactiva el botn de
desplazar hacia arriba.
Crea una nueva fila.

La propiedad EOFAction slo tiene efecto cuando se manipula el cambio de filas mediante el ratn, sobre los
botones del control RemoteData. No tiene efecto si se llega a la fila posterior a la ltima mediante cdigo. (Por
ejemplo, mediante la instruccin MSRDC1.resultset.MoveNext)
NO es recomendable establecer la propiedad BOFAction a 1 (rdBOF) ni la propiedad EOFAction a 1 (rdEOF),
ya que puede entrar en una situacin de la que es imposible salir. Si ve aparecer un aviso de error parecido a Estado
del conjunto de datos no vlido para Update le est indicando que se ha metido en un proceso del que no puede
salir, debido a que se encuentra en el EOF BOF intentando introducir un nuevo dato, y no puede.

Propiedad CursorDriver
Devuelve o establece un valor que especifica el tipo de cursor que se va a crear. Veamos primero qu es un cursor.
Segn la definicin de Microsoft:
Conjunto lgico de filas administrado por el origen de datos o por el administrador de controladores ODBC. Los
cursores reciben dicho nombre porque indican la posicin actual dentro del conjunto de resultados, igual que el
cursor de la pantalla indica la posicin actual. (#G!*&@%)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 376

Vamos a no complicarnos la vida para intentar comprenderlo. El mecanismo de ODBC espera una base de datos
albergada en un servidor, a la que le vamos a manipular sus registros desde un puesto conectado al servidor donde
se encuentra la base de datos a travs de una red de rea local. Cuando creamos un recordset, el conjunto de
registros que forma ese recordset deber estar en la memoria RAM de algn equipo. Del servidor? Del cliente?
En cualquiera de ellos que est deber estar en la memoria RAM, ocupando cierto espacio. A esa memoria ocupada
por el recordset, y a la forma en la que estn guardados los datos dentro de ella es a lo que llamamos Cursor. Este
concepto de cursores es nuevo (No exista en DAO) debido a que RDO se utiliza fundamentalmente en sistemas
basados en un servidor, donde se alberga la base de datos, y una serie de puestos de operacin, unidos al servidor a
travs de una red. El trfico de datos a travs de la red es algo que se debe optimizar. Y en algunos casos puede ser
beneficioso llevarse todas las filas de un rdoResultset al puesto, operar con ellas e introducirlas de nuevo, si es
necesario, en la base de datos, una vez procesadas, o puede ser beneficioso mantener ese conjunto de filas en la
memoria RAM del servidor para tener disponibles all los datos y acceder a ellos de forma rpida a travs de la red.
En un caso lograremos o rapidez y en otro poco trfico, pero en ambos casos gastaremos recursos. Podemos no
crear un cursor, no usaremos memoria pero, o empleamos mas tiempo, o introducimos ms trfico en la red.
El crear un cursor de lado cliente o de lado servidor puede hacer que su cdigo funciones o no
funcione. Los cursores lado cliente suelen ser de lectura / escritura, que permiten avanzar hacia a
delante y hacia atrs. Los cursores lado servidor suelen ser solamente de lectura y de avance
solamente hacia delante. Hemos empleado una palabra no muy exacta: suelen ser. Y es que eso
depender de la base de datos (Oracle no se comporta como SQLServer, y ninguna de ellas se
comporta como Access) y depende tambin del controlador ODBC que utilice (Hay controladores
de varias marcas para la misma base de datos) Es muy frecuente realizar un cdigo que funciona
perfectamente con un controlador ODBC, y cuando se cambia de controlador o de versin ya
no funciona. Le recomiendo mucho cuidado.
El control RemoteData permite elegir el crear un cursor en el servidor, en el puesto, o crearlo solamente si es
necesario. Para ello usamos la propiedad CursorDriver. Puede tomar los siguientes valores:
Constante

Valor

Descripcin
El controlador ODBC elegir el tipo de cursores adecuado. Se usarn
0
rdUseIfNeeded
cursores del servidor si hay alguno disponible.
1
RemoteData usar la biblioteca de cursores de ODBC .
rdUseOdbc
2
Se usarn cursores del lado del servidor.
rdUseServer
3
RDO usar la biblioteca de cursores por lotes de tipo optimista.
rdUseClientBatch
Le recomiendo que repase el tema de cursores de la base de datos concreta que est usando, y espero que la
bibliografa que le brinda el fabricante sea suficiente. No suelen ser muy explcitos con los manuales aportados, o al
menos tienen la habilidad de explicarlo de una forma tan sutil que es a veces inescrutable. Casi siempre esas dudas
se resuelven en el curso que cada marca tienen para su base de datos, que es estrictamente de pago.

Mtodos del control RemoteData


Mtodo UpdateRow
Es equivalente al mtodo UpdateRecord del Control Data. Guarda los valores actuales de los controles enlazados en
la base de datos. El mtodo UpdateRow tiene el mismo efecto que ejecutar el mtodo Edit, modificar una columna
y despus ejecutar el mtodo Update, excepto que no ocurre ningn evento.
Nota Cuando usa una biblioteca de cursores ClientBatch, todas las actualizaciones a las tablas base se retrasan hasta
que use el mtodo BatchUpdate. En este caso, el mtodo UpdateRow actualiza el rdoResultset local, pero no
actualiza las tablas base. Estos cambios pueden perderse si la aplicacin termina antes de que se haya completado el
mtodo BatchUpdate.

Mtodo BatchUpdate (Mtodo del rdoResultset)


Este mtodo no es del control RemoteData, sino de su rdoResultset asociado.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 377

De igual forma que un control data tena asociado un recordset, un RemoteData tiene asociado un Resultset. El
Resultset es el objeto rdoResultset del control RemoteData (Coleccin de registros, o si lo prefiere, de filas ya que
estamos en RDO), y que como cualquier objeto de acceso a datos, tiene sus mtodos, y este es uno.
Realiza una actualizacin optimista por lotes.
Sintaxis

MSRDC1.Resultset.BatchUpdate (filaunica, forzar)

Donde MSRDC1 es el nombre del control RemoteData


Filaunica (Booleano) indica si es True, que solamente actualizar la fila actual, si es False, actualiza todo el lote. El
lote es un conjunto de filas. Pueden ser las filas del cursor.
Forzar (Booleano)indica si est a True que sobreescribir la fila actual, independientemente de si causa o no
colisiones. Si est a False, no sobreescribir si va a ocurrir una colisin.
Este mtodo es un mtodo del rdoResultset. Si tenemos un rdoResultset creado con cdigo (Ahora veremos como se
hace) la sintaxis sera
MirdoResultset. BatchUpdate (filaunica, forzar)
Con esta introduccin ya podemos pensar que el alumno tiene cierta idea respecto a lo que es el control
RemoteData. Vamos a comenzar a explicar lo que son los objetos de acceso remoto a datos (Objetos RDO) y
podremos seguir viendo cosas acerca del control RemoteData como aplicacin de estos nuevos objetos.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 378

Objetos de datos remotos (Objetos RDO)


Como ya conocemos los objetos de acceso a datos DAO, veremos los objetos RDO basndonos un poco en este
conocimiento.
Los objetos de datos remotos nos permiten manipular componentes de un sistema de base de datos ODBC remoto.
Lo de remoto no implica que la base de datos deba estar en un ordenador distinto al que tiene la aplicacin.
(Aunque esta sea la disposicin ms usual en aplicaciones que usan RDO). El significado de RDO es que se accede
a la base de datos a travs de una conexin ODBC.
RDO solamente funciona en plataformas de 32 bits. (Windows 95/98/2000 o Windows NT). Para usar objetos de
datos remotos, debe establecer una referencia a Microsoft Remote Data Object 2.0 en Proyecto | Referencias.
Al igual que en DAO, los objetos RDO tienen una estructura jerrquica que se puede ver en la siguiente figura:

Estructura jerrquica de los objetos RDO


Los objetos RDO siguen la misma regla para su creacin que los objetos DAO: el objeto jerrquicamente
superior crea al objeto inferior.

El Objeto rdoEngine
El objeto rdoEngine representa el origen de datos remoto. Es el equivalente al dbEngine de DAO, es decir, el
motor de bases de datos. Es el objeto de nivel jerrquico superior, por lo tanto no se crea por otro objeto, sino que
est creado simplemente al introducir la referencia.
La caracterstica del rdoEngine es que trabaja siempre a travs del Administrador de controladores. El objeto
rdoEngine contiene al objeto rdoEnvironments (Coleccin de objetos rdoEnvironment) y el rdoErrors.
Los objetos rdoEnvironment de nueva creacin se inicializan de acuerdo a los valores predeterminados
establecidos en el objeto rdoEngine. Se crea de forma automtica el objeto rdoEnvironments(0), al igual que lo
haca el dbEngine con el Workspaces(0) en DAO.
El objeto rdoErrors contiene todos los mensajes de error enviados desde el origen de datos remoto. Cada vez que
se recibe uno de estos mensajes, se produce el evento InfoMessage del rdoEngine

Propiedades del objeto rdoEngine


rdoDefaultLoginTimeout Determina el valor predeterminado la propiedad LoginTimeout de los objetos
rdoEnvironment que se creen. Esta propiedad se utiliza en la administracin del tiempo disponible para la
conexin. Si la conexin no se ha realizado en el nmero de segundos indicado, dar error.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 379

Sintaxis rdoEngine.rdoDefaultLoginTimeout = NumeroDeSegundos


Si el valor NumeroDeSegundos es cero, esperar indefinidamente a que se realice la conexin.

rdoDefaultCursorDriver Determina el valor predeterminado de la propiedad CursorDriver de los objetos


rdoEnvironment. Esta propiedad determina si el Administrador de controladores ODBC crea cursores por lotes del
lado del cliente, locales, del servidor o si no crea cursores.
Sintaxis rdoEngine.rdoDefaultCursorDriver = valor
Donde Valor es un valor o contante segn puede verse en la siguiente tabla
RdUseIfNeeded (Predeterminado) elige el estilo de cursores ms apropiado para el
Controlador
RdUseODBC
Utiliza la biblioteca de cursores ODBC.
RdUseServer
Utiliza cursores del servidor
RdUseClientBatch
Usa la biblioteca de cursores optimista por lotes
RdUseNone
No crea un cursor desplazable. Bsicamente es un conjunto de
resultados de slo lectura de tipo forward-only

rdoDefaultUser y rdoDefaultPassword Determinan los valores predeterminados de las propiedades


UserName y Password de los objetos rdoEnvironment cuando se abren conexiones sin suministrar valores para
estos parmetros.

rdoVersion Examina la versin de RDO en uso.


rdoLocaleID Devuelve o establece un valor que indica la configuracin regional de la biblioteca RDO,
para mostrar los mensajes de error.
Sintaxis rdoEngine.rdoLocaleID = valor
Por defecto, esta propiedad toma el valor 0, que pone la configuracin establecida en Windows.
Si el archivo DLL del idioma especificado no est presente en el equipo del usuario, RDO se establece como
rdLocaleEnglish, lo cual no requiere un archivo DLL independiente. Cuando esto ocurre, se coloca un mensaje
informativo en la coleccin rdoErrors para indicar que RDO no pudo cargar el archivo DLL de recursos para la
configuracin regional especificada.
Cuando distribuya la aplicacin, asegrese de incluir el archivo DLL del lenguaje apropiado.

Mtodos del rdoEngine


rdoCreateEnvironment Este mtodo es equivalente al CreateWorkspace de DAO. Crea un nuevo
objeto rdoEnvironment. (Es decir, una sesin de trabajo)
Sintaxis

Set MiSesion = rdoEngine.rdoCreateEnvironment(Nombre, Usuario, Contrasea)

Donde:
Nombre es la propiedad Name del nuevo objeto rdoEnvironment. (En el cdigo, para nombrar a este
rdoEnvironment debemos hacerlo con MiSesion). Debe suministrar un nombre, ya que si no lo hace, este
rdoEnvironment creado no se suma a la coleccin rdoEnvironments.
Usuario es el nombre del usuario.
Contrasea es la contrasea usada en esa sesin. Puede tener hasta 14 caracteres.
Cuando se inicializa el rdoEngine se crea automticamente una sesin de trabajo predeterminada, el
rdoEnvironments(0), con el nombre de usuario que tenga el rdoEngine en su propiedad rdoDefaultUser y con
contrasea igual a la propiedad rdoDefaultPassword. En una aplicacin multiusuario es necesario crear un
rdoEnvironment para cada uno de ellos, siempre que empleemos transacciones. En este mtodo es necesario
suministrar todos los parmetros (Nombre, Usuario y Contrasea)

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 380

rdoRegisterDataSource Introduce la informacin de conexin en el Registro de Windows para un


origen de datos ODBC (Crea una conexin ODBC igual que lo haramos en Windows)
Sintaxis

rdoEngine.rdoRegisterDataSource DSN, controlador, silencio, atributos

DSN es el nombre que queremos dar a la conexin ODBC


Controlador es el nombre del controlador ODBC. Debe ser uno de los instalados y hay que poner el nombre exacto
por el que se le conoce en Windows, NO el nombre de la DLL. Por ejemplo, debe poner Microsoft Access Driver
y no odbcjt32.dll
Silencio es un valor True / False y se refiere a si queremos que presente el cuadro de creacin de un enlace ODBC
(El mismo que aparece en Windows) Si ponemos False en esta propiedad, le introducimos los datos de la conexin
a travs de ese cuadro. Si le ponemos True, no mostrar el cuadro, y por lo tanto deberemos pasarle todos los
parmetros correctamente. Si la informacin suministrada no es completa, mostrar el cuadro citado.
Atributos. Una expresin de cadena que es una lista de palabras clave que se van a agregar al archivo ODBC.INI.
Las palabras claves estn en una cadena delimitadas por retornos de carro. No es trivial esta cadena de caracteres y
es propia de cada controlador. Por lo tanto, le recomiendo que si no conoce muy bien la cadena a introducir, ponga
el parmetro Silencio a False y se olvide de este parmetro de atributos. Eso s, deber ser el usuario quien
introduzca los datos a travs del cuadro de creacin del enlace ODBC.
Hasta aqu las propiedades y mtodos del rdoEngine. Vamos a bajar un nivel jerrquico y ver el siguiente objeto
RDO

El Objeto rdoEnvironment
Un objeto rdoEnvironment es una sesin de trabajo en RDO. Equivale al Workspace de DAO. En un
rdoEnvironment podemos tener varios objetos Connection (varias conexiones) de la misma forma que en un
Workspace podamos tener varias objetos Database.
La coleccin de todos los objetos rdoEnvironment es el objeto rdoEnvironments. Visual Basic crea
automticamente un rdoEnvironment, de la misma forma que creaba un Workspace. El objeto rdoEnvironment
creado es el rdoEnvironments(0) y el nombre de usuario ser el que tenga el rdoEngine en su propiedad
rdoDefaultUser y la contrasea igual a la propiedad rdoDefaultPassword
NOTA. Visual Basic crea automticamente un Workspace o un rdoEnvironment si el proyecto contiene la referencia
al motor de bases de datos correspondiente. Visual Basic no crear ninguno de ellos si no tiene la referencia a
ningn motor de bases de datos.
Los objetos rdoEnvironment se anexan automticamente a la coleccin rdoEnvironments a menos que no
proporcione un nombre para el nuevo objeto cuando utilice el mtodo rdoCreateEnvironment.

Propiedades del Objeto rdoEnvironment


Propiedad CursorDriver Ya hemos visto esta propiedad para el control RemoteData. La aplicacin al objeto
rdoEnvironment es similar, por lo que solamente exponemos su sintaxis:
MiSesin.CursorDriver = Valor donde Valor toma uno de estos valores o constantes:
0

rdUseIfNeeded

1
2
3

rdUseOdbc
rdUseServer
rdUseClientBatch

LSB

El controlador ODBC elegir el tipo de cursores adecuado. Se


usarn cursores del servidor si hay alguno disponible.
Usar la biblioteca de cursores de ODBC .
Se usarn cursores del lado del servidor.
RDO usar la biblioteca de cursores por lotes de tipo optimista.

Visual Basic Gua del Estudiante

Captulo 1

Pgina 381

Propiedad hEnv
Esta propiedad es el Handle de la conexin ODBC. Es similar a la propiedad hDC (para controles) o hWnd (para
formularios) que ya hemos visto en captulos anteriores. Esta propiedad es slo de lectura y devuelve un Long. Este
valor lo usan las APIs de Windows para trabajar. Alguna instruccin nos pedir el hEnv como parmetro.

Propiedad LoginTimeout
Devuelve o establece el nmero de segundos que el Administrador de controladores ODBC espera antes de que se
produzca un error de espera al abrir una conexin.
Sintaxis NombreDelObjetordoEnvironment.LoginTimeout = NumeroDeSegundos
El valor predeterminado es el de la propiedad rdoDefaultLoginTimeout del objeto rdoEngine, y en su defecto, de
15 segundos. Si este valor es igual a 0 se espera indefinidamente y no se producir ningn error.
Si establece un valor para esta misma propiedad en uno de sus objetos rdoConnection, este valor es prioritario al
establecido en el objeto rdoEnvironment.

Mtodos del objeto rdoEnvironment


Mtodo OpenConnection
Abre una conexin con un origen de datos ODBC. En otras palabras, crea un objeto rdoConnection, objeto que
deber declarar antes de abrirlo:
Dim MiConexion as rdoConnection
Set MiConexin = MiSesion.OpenConnection(Nombre, LineaComandos, SloLectura, Conectar, Opciones)
Nombre puede ser una conexin ya creada, en cuyo caso se abrir esa conexin. Si este parmetro es una cadena
vaca, deber obtener los datos de la conexin, o bien del argumento Conectar, o mediante el cuadro de dialogo de
abrir la conexin.
LineaComandos. Determina si muestra o no muestra el cuadro de dilogo de abrir la conexin ODBC. Puede tomar
estos valores
rdDriverPrompt (0)
Muestra el cuadro de dilogo
rdDriverNoPrompt
(1)
No muestra nunca el Cuadro de dilogo
rdDriverComplete
(2)
Muestra el cuadro de dilogo solamente si la informacin
facilitada no es suficiente para abrir la conexin.
RdDriverComplete
(3)
Igual que rdDriverComplete pero deshabilita las opciones
Required
que ya estn bien pasadas en la informacin facilitada.
SloLectura Determina si la conexin se abre como slo lectura o para lectura / escritura. Si no se especifica nada,
se abre para lectura / escritura.
Conectar Este es el argumento que lleva los datos completos de la conexin. Es similar a la propiedad Connect del
control RemoteData, cuyo contenido repetimos aqu por comodidad.
Para introducir los datos de la propiedad Connect deber usar una palabra para definir el dato, seguido del signo = y
del dato a introducir. Como final del dato debe introducir necesariamente el signo punto y coma ;

DSN
Origen de datos ODBC registrado.
UID
Nombre de un usuario reconocido
PWD Contrasea asociada al usuario
DRIVER
Descripcin del controlador
DATABASE
Base de datos predeterminada
para usarla una vez conectado
LSB

Visual Basic Gua del Estudiante

Captulo 1

DSN=MiConexinODBC;
UID=Luis;
PWD=MiContrasea;
DRIVER=SQL Server;
DATABASE=MiBase;
Pgina 382

SERVER
WSID

APP

Nombre del servidor donde se


aloja la base de datos
SERVER=MiServidor;
Nombre de la estacin de trabajo
(Nombre del PC que se va a
comunicar con el servidor
WSID=NombredemiPC;
Nombre de la Aplicacin que va a
Usar la Base de Datos
APP=MiAplicacin

Estos datos complementan la informacin de la conexin. Si ya habamos establecido la conexin mediante el


argumento Nombre, y en esa conexin ya estaban perfectamente definidos todos los parmetros de esa conexin, de
este argumento Conectar solamente tomar el nombre de usuario y la contrasea.
Puede comprobar si se ha completado la conexin examinando la propiedad StillConnecting del objeto
rdoConnection recin creado, que debe devolver False cuando se ha completado la operacin de conexin.
If MiConexion.StillConnecting = false then .

BeginTrans, CommitTrans, RollbackTrans (Transacciones)


Son los mtodos para realizar transacciones.
* BeginTrans comienza una nueva transaccin.
* CommitTrans finaliza la transaccin actual y guarda los cambios.
* RollbackTrans finaliza la transaccin actual y restaura las bases de datos del objeto rdoEnvironment al
estado en que estaban cuando comenz la transaccin actual.
El funcionamiento en RDO es distinto al de DAO. Adems, es distinto para cada base de datos. La forma de trabajar
de SQLServer es distinta de cmo lo hace Oracle. Y muy distinta de cmo lo hace Access. Le recomiendo que
estudie las transacciones en el manual de su gestor de base de datos.
Hay algunas bases de datos que no aceptan transacciones. Puede comprobarlo analizando la propiedad Transactions
del objeto Connection.

Mtodo Close
Cierra un el rdoEnvironment y todas las conexiones que tena abiertas. Las modificaciones pendientes
de los objetos RDO inferiores que estuviesen abiertos se deshacen.
Sintaxis

MiSesion.Close

No se puede cerrar el rdoEnvironments(0) Si utiliza Close con el objeto ya cerrado, se producir un error
interceptable..

El objeto rdoConnection
Un objeto rdoConnection representa una conexin abierta con un origen de datos a travs de ODBC. Es el
equivalente al Objeto DataBase de DAO
Un objeto rdoConnection (es decir, una conexin a una base de datos a trvs de ODBC) se crea o con un control
RemoteData o mediante el mtodo OpenConnection del objeto rdoEnvironment.
Puede tambin crear un nuevo objeto rdoConnection que no est vinculado de forma inmediata con una conexin
fsica especfica a un origen de datos. Por ejemplo, el siguiente cdigo crea un objeto rdoConnection
independiente:
Dim OtraConexion as New rdoConnection.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 383

Posteriormente puede introducir las caractersticas que desee y establecer la conexin real con la base
de datos. No es normal hacer esto, por lo que le remito en caso necesario, a la ayuda de VB de este
objeto.

Propiedades del Objeto rdoConnection


Un objeto rdoConnection tiene Propiedades. Muchas de ellas ya se han visto, bien al estudiar el control
RemoteData o los objetos RDO ya estudiados. Las propiedades que se han visto se describirn slo de
forma somera.

Propiedad Connect Devuelve o establece un valor que proporciona informacin sobre el origen de un objeto
rdoConnection abierto. La propiedad Connect contiene la cadena de conexin ODBC. Esta propiedad puede leerse
siempre, pero no puede modificarse una vez establecida la conexin.
Sintaxis objeto.Connect = CadenaDeConexin
Las partes de CadenaDeConexin son: (Puede no usar alguna de ellas)
DSN
UID
PWD
DRIVER
DATABASE
SERVER
WSIS
APP

Nombre del origen de datos (Nombre de la conexin ODBC)


Nombre del usuario (Puede no tener nombre de Usuario)
Password. (Puede no tener Password)
Nombre del driver ODBC empleado
Nombre de la base de datos que se va a emplear
Nombre del servidor remoto
Nombre de la estacin de trabajo dentro de la red
Nombre de la Aplicacin

(El separador es el carcter punto y coma (;)


No es necesario aportar estos datos para crear la conexin, ya que son los que se han introducido en
Windows al crear la conexin ODBC. Estos datos solamente son necesarios si la conexin ODBC se
cre sin aportarle datos acerca de la base de datos.

Propiedad hDbc
Devuelve el controlador de conexin ODBC.
Sintaxis

MiConexion.hDbc

La propiedad hDbc devuelve un valor de tipo Long. Este valor lo utilizan las APIs de Windows. Y es similar a hDc
o hWnd

Propiedad LastQueryResults
Devuelve un objeto rdoResultset, precisamente el que se ha generado la ltima consulta, si la ha habido. Esta
propiedad podemos utilizarla para crear un nuevo Resultset, clnico del ultimo que se ha generado.
Sintaxis
Dim MiRs as rdoResultset
Set MiRs = MiConexion.LastQueryResults
Si no se haba creado todava ningn Resultset, devuelve Nothing.

Propiedad QueryTimeout
Devuelve o establece un valor que especifica el nmero de segundos que espera el Administrador de
controladores ODBC antes de que se produzca un error de tiempo de espera al ejecutarse una consulta.
El valor predeterminado es de 30 segundos.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 384

Propiedad StillConnecting
Devuelve un valor que indica si la conexin se est estableciendo todava.
Sintaxis MiConexion.StillConnecting
Esta propiedad devuelve True si la conexin no ha terminado de establecerse, y False si ya est
establecida. Es fundamental saber que la conexin ya est establecida antes de realizar ninguna
operacin con ella, por ejemplo, crear un Resultset

Propiedad StillExecuting
Devuelve un valor que indica si una consulta est an ejecutndose. Esta propiedad se usa cuando creamos un
rdoResultset o un rdoQuery, para conocer si ya se ha finalizado el proceso de seleccin de filas que esa operacin
implica. Esta propiedad puede aplicarse al rdoConnection, rdoQuery y rdoResultset. Devuelve True cuando la
consulta est ejecutndose todava, False si ya se ha finalizado.
Sintaxis

objeto.StillExecuting

Propiedad Transactions
Devuelve un valor que indica si se pueden realizar transacciones con un objeto rdoConnection rdoResultset. Esta
propiedad le permite asegurarse de esta circunstancia antes de ejecutar la instruccin BeginTrans.
La propiedad Transactions llama a la funcin SQLGetInfo de ODBC para determinar si el controlador ODBC es
capaz de permitir transacciones, no si el conjunto de resultados actual es actualizable.

Propiedad AsyncCheckInterval
Devuelve o establece un valor que especifica el nmero de milisegundos que espera RDO entre dos comprobaciones
para ver si se ha completado una consulta asncrona.
Sintaxis

MiConexion.AsyncCheckInterval = valor

El valor por defecto es de 1 segundo (1000 mseg)


Comentarios Al usar la opcin rdAsyncEnable para ejecutar una consulta de forma asncrona, RDO comprueba
peridicamente el origen de datos para determinar si la consulta se ha completado. Puede modificar la duracin del
intervalo entre comprobaciones mediante la propiedad AsyncCheckInterval. RDO tambin comprueba el estado de
las consultas asncronas cuando se examina la propiedad StillExecuting.

Propiedad UpdateOperation
Esta propiedad afecta a la forma en la que se realiza la modificacin de una fila en una actualizacin
optimista por lotes. Si a esta propiedad se le pone el valor 0 (Predeterminado) la modificacin de la fila
se realiza mediante una instruccin Update. Si el valor es 1, la operacin de modificacin se realiza
mediante dos instrucciones, primero una instruccin Delete (borra la fila) y a continuacin otra
instruccin Insert (Crea la fila con los nuevos valores).
Sintaxis objeto.UpdateOperation [= valor]

El Objeto rdoResultset
El Objeto rdoResultset es el conjunto de filas que devuelve la ejecucin de una consulta. Es el equivalente al
Recordset de DAO
El Objeto rdoResultset se crea mediante el mtodo OpenResultset del rdoConnection.
Ejemplo:
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 385

Creamos el objeto rdoEnvironment utilizando el objeto creado automticamente por VB


Set GepaWs = rdoEnvironments(0)
El objeto rdoEnvironment crea el objeto rdoConnection
Set GepaConex = GepaWs.OpenConnection(Gepa, rdDriverNoPrompt, False)
(Gepa es el nombre de la conexin ODBC creada en el ordenador)
El objeto rdoConnection crea el objeto rdoResultset
Set GepaRs = GepaConex.OpenResultset("Select Ex_expedite, Ex_numproye, " & _
"Ex_presenta, Ex_plan, Ex_tipoexpe, Ex_tipoprop, Ex_tipotram, Ex_redaproy, Ex_situxpe, " & _
"Ex_Numero_Ini, Ex_subsiste " & _
"From Expedientes Order By Ex_Numero_Ini", rdOpenDynamic, rdConcurRowVer)
Puede ver que el proceso de creacin de un rdoResultset en RDO no difiere demasiado de la creacin
de un recordset en DAO.
Veamos cada una de las partes del Mtodo OpenResultset
Set MirdoResultset = MiConexin.OpenResultset(nombre [,tipo [,tipoBloq [,opciones]]])
Donde
MirdoResultset = variable tipo rdoResultset que debe estar declarada.
MiConexin = Objeto Connection con el que se crea el rdoRsultset
Nombre =
Nombre de una tabla o consulta de la base de datos, o una sentencia
SQL que pueda devolver filas.
Tipo =
Tipo de cursor que se va a crear
TipoBloq =
Tipo de bloqueo de la base de datos. Por defecto, lo crea solo lectura.
Opciones =
Opciones que puede tener el rdoResultset
El argumento Tipo puede tener una de estos valores:
Constante
rdOpenForwardOnly
rdOpenKeyset
rdOpenDynamic 2
rdOpenStatic

Valor Descripcin
0
(Predeterminado) Abre un rdoResultset tipo forward-only.
1
Abre un rdoResultset tipo Keyset
Abre un rdoResultset tipo Dinamico
3
Abre un rdoResultset tipo esttico

El tipo forwar-only es un rdoResultset en el que las filas solamente se pueden explorar en sentido
ascendente. No se puede retroceder .
El tipo Keyset es un rdoResultset que se puede actualizar, insertar nuevas filas, y se puede recorrer en
ambos sentidos sin limitacin. Los miembros de este rdoResultset son fijos.
El tipo Dinmico es un rdoResultset que se puede actualizar, insertar nuevas filas, y se puede recorrer
en ambos sentidos sin limitacin. Los miembros de este rdoResultset no son fijos.Es similar al Dynaset
de DAO.
El tipo esttico presenta los valores existentes en la BD en el momento de su creacin y no detecta las
posibles variaciones de los datos en la misma. Es similar al Snapshot de DAO
Para el parmetro Tipo de Bloqueo acepta los siguientes datos:
Constante
Valor Descripcin
rdConcurReadOnly
1
(Predeterminado) Slo lectura.
RdConcurLock 2
Concurrencia pesimista.
rdConcurRowVer
3
Concurrencia optimista basada en el Id. de fila. rdConcurValues
4
Concurrencia optimista basada en valores de filas. rdConcurBatch
5
Concurrencia optimista
usando actualizaciones de modo por
lotes. Valores Status devueltos por
cada fila actualizada con
xito.
El parmetro opciones acepta estos valores: (Se pueden sumar ambas)
Constante
LSB

Valor

Descripcin

Visual Basic Gua del Estudiante

Captulo 1

Pgina 386

rdAsyncEnable 32
rdExecDirect

Ejecuta la operacin de forma asncrona.


64
(Predeterminado) Evita la creacin de procedimientos
almacenados para ejecutar la consulta.

El objeto rdoResultset tiene algunas particularidades que no tienen los recordsets de DAO, por ejemplo,
poder obtener resultados mltiples, es decir, se pueden introducir varias sentencias SELECT y cada una
de ellas crea un conjunto de registros. Esto no significa que haya mas de un rdoResultset, sino que
existe un nico rdoResultset con resultados mltiples. Se puede ir accediendo a cada uno de los
conjuntos de registros mediante el mtodo MoreResults.

Propiedades del Objeto rdoResultset


El rdoResultset no tiene exactamente las mismas propiedades que el Recordset. Y adems no siempre funcionan tal
como lo hacan en el recordset. En RDO van a depender del tipo de cursor y del tipo de bloqueo. Veamos las
propiedades del rdoResultset
AbsolutePosition. Igual que en RDO, pero no siempre funciona, ya que depende del tipo de cursor.
ActiveConnection Devuelve una referencia a la conexin con la que est asociado el rdoResultset
BatchCollisionCount Devuelve un valor que especifica el nmero de filas que no finalizaron la ltima
actualizacin por lotes. Devuelve un Long. En caso de que esta propiedad sea mayor de 0 significa que
la actualizacin por lotes no se ha completado con xito. En este caso habr que ejecutar el mtodo
BatchUpdate para completar la actualizacin.
BatchCollisionRows
Devuelve una matriz de marcadores que indica las filas que han provocado colisiones en la ltima
operacin de actualizacin por lotes. Devuelve un Variant con una matriz de las filas que han provocado
una colisin la ltima vez que se invoc el mtodo BatchUpdate. El nmero de elementos de esta matriz
es el que indica la propiedad BatchCollisionCount
BatchSize (Propiedad)
Devuelve o establece un valor que especifica el nmero de instrucciones enviadas al servidor en cada
lote. De forma predeterminada se envan 15 instrucciones al servidor en cada lote. Esta propiedad puede
modificarse en cualquier momento. Si un DBMS no admite lotes de instrucciones, puede establecer esta
propiedad a 1, con lo que cada instruccin se enviar por separado.
BOF, EOF

Son idnticas a las mismas propiedades del Recordset de DAO

Bookmark Funciona igual que en el Recordset de DAO. Pero en RDO es posible que esa propiedad no se pueda
usar. Depende del tipo de cursor. Para asegurarse de que el objeto rdoResultset admite marcadores, examine el valor
de su propiedad Bookmarkable antes de usar su propiedad Bookmark. Si Bookmarkable es False, el objeto
rdoResultset no admite marcadores y el uso de Bookmark producir un error
La propiedad Bookmark no se aplica a los objetos rdoResultset de tipo forward-only.
En DAO la variable donde se guarda el Bookmark deba se un String. En RDO es un variant.
Desconozco la razn, pero usando una variable String para almacenar el Bookmark falla.
Bookmarkable Devuelve un valor que indica si un objeto rdoResultset admite marcadores, es decir, si
acepta la propiedad Bookmark.
EditMode
Devuelve un valor que indica el estado de edicin de la fila actual. Devuelve un integer o
una constante de acuerdo con la tabla siguiente:
Constante
LSB

Valor

Descripcin

Visual Basic Gua del Estudiante

Captulo 1

Pgina 387

RdEditNone
RdEditInProgress

0
1

No se est efectuando ninguna operacin de modificacin.


Se ha invocado el mtodo Edit y la fila est en buffer de copia.

RdEditInProgress

Se ha invocado el mtodo AddNew y la fila actual del bfer de


copia es una fila nueva que no se ha guardado en la B. D.

LastModified Devuelve un marcador que indica la ltima fila modificada o agregada ms


recientemente. Este marcador es el Bookmark de esa fila. Devuelve un Variant.
LockEdits Devuelve un valor de tipo Booleano que indica el tipo de bloqueo en vigor. Si devuelve True
utiliza bloqueo pesimista. Si devuelve False utiliza bloqueo optimista.
Si LockEdits es True y otro usuario ya tiene la pgina bloqueada, se producir un error al
intentar usar el mtodo OpenResultset. En general, los dems usuarios pueden leer datos de las
pginas bloqueadas.
Si LockEdits es False (valor predeterminado) y utiliza despus Update mientras la pgina est bloqueada
por otro usuario, se producir un error.
El bloqueo se realiza sobre una pgina de datos. La pgina suele se de 2 K (Ese es el tamao que utiliza
Microsoft SQL Server)

LockType Devuelve o establece un valor entero de tipo Long que indica el tipo de tratamiento de
concurrencia. Los valores admitidos son:
Constante
rdConcurReadOnly
rdConcurLock
rdConcurRowVer
rdConcurValues

Valor
1
2
3
4

Descripcin
(Predeterminado) El cursor es de slo lectura. No se admiten actualizaciones.
Concurrencia pesimista.
Concurrencia optimista basada en el identificador de fila.
Concurrencia optimista basada en los valores de las filas.
Concurrencia optimista con actualizaciones por lotes. Se obtienen valores de
5
rdConcurBatch
estado para cada fila actualizada correctamente.
Lea la ayuda de VB para obtener mayor informacin de cada uno de los tipos.
Restartable Devuelve un valor que indica si un objeto rdoResultset admite el mtodo Requery, que
vuelve a ejecutar la consulta en la que est basado el objeto rdoResultset. Debe usarse antes de utilizar
el mtodo Requery para evitar que se produzca un error.
PercentPosition
Devuelve o establece un valor que indica o modifica la ubicacin aproximada de la fila actual en el objeto
rdoResultset, basndose en el porcentaje con respecto al total de filas de dicho objeto. El valor devuelto es un
Single entre 0,0 y 100,0
Puede usar la propiedad PercentPosition con una barra de desplazamiento de un control Form o TextBox para
indicar la ubicacin de la fila actual en un objeto rdoResultset. Esta propiedad solamente se aplica a los
rdoResultset tipo Keyset y Dynamic.
RowCount Devuelve el nmero de filas a las que se ha tenido acceso en un objeto rdoResultset. Es un
Long.
Esta propiedad no indica el nmero de filas del Resultset, sino el nmero de filas a las que se ha
accedido. No es por lo tanto, el equivalente a la propiedad RecordCount del Recordset DAO.
Si esta propiedad no est disponible en el controlador, devuelve -1
Status Devuelve o establece el estado de la fila o columna actual. El valor de esta propiedad indica si la fila o la
columna estarn implicadas en la prxima actualizacin optimista por lotes y de qu modo lo estarn.
Los valores admitidos para la propiedad Status son:
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 388

Constante

Valor

rdRowUnmodified

rdRowModified

rdRowNew

rdRowDeleted

rdRowDBDeleted

Valor de la propiedad Prepared


(Predeterminado) La fila o la columna no se han modificado o se han
actualizado correctamente.
La fila o la columna se han modificado y an no se han actualizado en
la base de datos.
La fila o la columna se han insertado con el mtodo AddNew, pero an
no se han insertado en la base de datos.
La fila o la columna se han eliminado, pero an no se han eliminado de
la base de datos.
La fila o la columna se han eliminado localmente y tambin de la base
de datos.

StillExecuting Devuelve un valor de tipo Booleano que indica si una consulta est an ejecutndose.
Esta propiedad es muy til (muy necesaria) para saber si la consulta ya est disponible, antes de presentar los datos
de esa consulta. La propiedad debe ser False para poder presentarlos. Es tpico crear un bucle parecido a este:
Do While GepaRs.StillExecuting = True
DoEvents
Loop
Transactions Devuelve un valor Booleano que indica si un rdoResultset permite transacciones.
Type Devuelve un Long el tipo de rdoResultset. (0 = rdOpenForwardOnly, 1 = rdOpenKeyset, 2 =
rdOpenDynamic, 3 = rdOpenStatic)

Updatable Devuelve un valor Booleano que indica si se pueden efectuar cambios en el rdoresultset

Mtodos del Objeto rdoResultset


El rdoResultset tiene algunos mtodos comunes con el Recordset de DAO, sin embargo no se puede
esperar que funcionen siempre de la misma forma. En DAO era Visual Basic quien abra la base de
datos, y una base muy concreta, Access, dBase, etc., bases que controla directamente Visual Basic a
travs de la dll correspondiente a la versin de la BD que vamos a abrir. Esto no es exactamente igual en
RDO. Aqu quien abre el fichero que contienen la base de datos no es Visual Basic, sino el driver de
ODBC. Y no solamente eso, dependiendo de la base de datos, unas permiten hacer unas operaciones y
otras no. Lo mismo podemos decir del tipo de rdoResultset, del cursor y de si es lado cliente o lado
servidor. Por lo tanto no se asuste si pretende ejecutar un mtodo y no funciona. Probablemente es que
Visual Basic ha puesto por defecto unas caractersticas a los objetos que no son las adecuadas. Y si no
fuese posible, en ltima instancia nos queda realizar directamente la operacin que pretendamos
realizar con el mtodo, es decir, mediante las operaciones que nos permite el propio driver de ODBC.
Eso s, en este caso estamos en sus manos. Lo veremos ms adelante.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 389

Mtodo AddNew
Crea una nueva fila para un objeto rdoResultset actualizable.
Sintaxis

MirdoResultset..AddNew

Funciona igual que el mismo mtodo de DAO, se ejecuta el mtodo AddNew, se introducen los datos en los campos
y se termina la operacin con el mtodo Update, que es cuando los datos entran en la base de datos. Si se est
usando cursores de tipo Client Batch los datos se escribitrn en la BD cuando se ejecute el mtodo BatchUpdate.
Hay que tener cuidado, pues el mtodo AddNew no devuelve ningn error si se intenta aadir una nueva fila a un
rdoResultset no actualizable. Ese error va a salir cuando ejecutemos el mtodo Update. Para evitar este error hay
que comprobar la propiedad Updatable del rdoResultset.
Debe tener cuidado tambin con asegurarse que tras el mtodo AddNew ejecuta el mtodo Update antes de
cambiar de fila, ya que de no hacerlo se pierden los cambios realizados y VB no avisa de ese error.
Si desea interrumpir la entrada de datos, una vez ejecutado el mtodo AddNew puede anularse usando el mtodo
CancelUpdate
MirdoResultset. CancelUpdate
La fila recin aadida no pasa a ser la fila actual. Sigue siendo fila actual la que era anteriormente. Para que sea la
nueva la fila actual basta con poner el siguiente cdigo:
MirdoResultset.BookMark = MirdoResultset.LastModified
Pero eso s, el rdoResultset debe aceptar marcadores. Para comprobarlo, se usa la propiedad Bookmarkable.

Mtodo BatchUpdate
Realiza una actualizacin optimista por lotes. Veamos que significa esto.
Este mtodo solamente se puede aplicar a un rdoResultset del tipo Client Batch (Cuando se crea el rdoResultset
usando como tercer parmetro rdUseClientBatch) El tipo de rdoResultset puede ser Keyset o Dynamic. En estas
condiciones, cuando usamos el mtodo Update para guardar los datos, solamente se guardan en el rdoResultset
local, pero no se meten en la base de datos. Cuando se ejecuta este mtodo, se envan a la base de datos todos los
cambios pendientes.
Sintaxis MirdoResultset.BatchUpdate (filanica, forzar)
El parmetro filanica es un Booleano que si es True, hace que la actualizacin sea solamente de la fila actual. Si
es False, se actualizan todas las filas pendientes.
forzar es tambinun Booleano que si es True fuerza a escribir los valores, aunque puedan causar colisiones.
Si usa el mtodo CancelBatch, se descartan los cambios guardados en el objeto rdoResultset local.

Mtodo Close
Cierra un rdoResultset abierto. Es igual al mtodo Close del Recordset de DAO
Sintaxis

MirdoResultset.Close

Mtodo Delete
Elimina la fila actual de un objeto rdoResultset actualizable.
Sintaxis MirdoResultset.Delete

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 390

Es posible deshacer la eliminacin de una fila si emplea transacciones y el mtodo RollbackTrans, suponiendo que
usa BeginTrans antes que el mtodo Delete.
Se producir un error al utilizar Delete si:
No hay ninguna fila actual.
La conexin o el rdoResultset es de slo lectura.
Ninguna columna de la fila es actualizable.
La fila ya se ha eliminado.
Otro usuario ha bloqueado la que contiene la fila.
El usuario no tiene permiso para realizar la operacin.

Mtodo Edit
Inicia la operacin de cambiar los valores de los datos de la fila actual o en un objeto rdoResultset actualizable.
Funciona de la misma forma que el mtodo del mismo nombre del Recordset de DAO. Al igual que en el mtodo
AddNew, es necesario terminar la operacin con el mtodo Update.
Sintaxis

MirdoResultset.Edit

Si cambia la fila actual antes de ejecutar el mtodo Update, se perdern los cambios. Si desea anular el cambio que
est realizando, basta con ejecutar el mtodo CancelUpdate.
Cuando la propiedad LockEdits del objeto rdoResultset es True (bloqueo pesimista), todas las filas del conjunto
de filas del objeto rdoResultset se bloquean en cuanto se ejecuta Edit, y se mantienen bloqueadas hasta que se
ejecuta Update.

Mtodo GetRows
Recupera mltiples filas de un rdoResultset y las introduce en una matriz.
Sintaxis

matriz = MirdoResultset.GetRows (filas)

Donde filas es el nmero de filas que se quieren recuperar. Es un Long


matriz es un Variant
El primer subndice de la matriz identificar la columna y el segundo identifica el nmero de fila, de esta forma:
matriz(intColumn)(intRow)

Mtodo MoreResults
Este mtodo se utiliza cuando se ha creado un rdoResultset de resultados mltiples, es decir, se han
empleado varias sentencias SELECT para crearlo. Cada sentencia formar dentro del rdoResultset un
juego de filas. Cuando se utiliza el mtodo MoreResults se borran las filas del conjunto de resultados
actual y se colocan en su lugar las filas correspondientes al siguiente. El mtodo devuelve un Booleano
que es True si ha encontrado un nuevo conjunto de resultados, o False si no lo ha encontrado. No todas
las bibliotecas de cursores son compatibles con consultas de conjuntos de resultados mltiples. Por
ejemplo, la biblioteca de cursores del servidor no es compatible con este tipo de consultas si no
desactiva el procesamiento del cursor en un cursor de slo lectura slo hacia adelante con la propiedad
RowsetSize a 1.

Mtodo Move
Cambia la posicin de la fila actual en un objeto rdoResultset. Funciona igual que el mismo mtodo del Recordset
de DAO
Sintaxis

LSB

MirdoResultset.Move filas[, inicio]

Visual Basic Gua del Estudiante

Captulo 1

Pgina 391

Mtodos MoveFirst, MoveLast, MoveNext y MovePrevious


Funciona de la misma forma que los mtodos del mismo nombre en el Recordset de DAO.
Mtodo Requery
Actualiza los datos de un objeto rdoResultset volviendo a ejecutar la consulta en la que est basado el objeto.
Sintaxis

MirdoResultset.Requery [opciones]

El valor admitidi para Opciones es rdAsyncEnable (32) que ejecuta la operacin de forma asncrona

Mtodo Update
Termina una operacin de modificacin de datos o de aadir una nueva fila. Ya se ha comentado su funcionamiento
con los mtodos AddNew y Update.

No vamos a profundizar ms en los objetos RDO. Su comportamiento es muy parecido a DAO,


exceptuando los nombres de los objetos, y las particularidades del ODBC en cuanto a la situacin de los
cursores.
ODBC es una tecnologa ya obsoleta (En el ao 2002) y no debe emplearse para nuevos proyectos.
Lgicamente un curso de Visual Basic debe incluir RDO, pero siempre para aplicarlo al mantenimiento
de aplicaciones ya existentes. No se debe emplear para nuevos proyectos, ya que si se quiere emplear
ODBC es mucho ms prctico y sencillo emplear DAO en su versin de ODBCDirect. Tendr cdigo
compatible con DAO, y ms rapidez que con RDO. Adems RDO es una tecnologa considerada
obsoleta por Microsoft, con lo que ello conlleva.
Microsoft dice, y este autor recomienda: USE ADO EN TODOS SUS NUEVOS PROYECTOS
Pero si usa Access con la base de datos instalada en el mismo ordenador que el programa, use
directamente DAO. Si usa Access olvdese de nuevas tecnologas. Con Access DAO significa: Rapidez,
sencillez, eficacia, control sobre el programa, independencia de drivers.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 392

Visual Basic - Gua del Estudiante Cap. 14


ACTIVE X DATA OBJECT (ADO)
ADO es lo ltimo de Microsoft en acceso a bases de datos. No se porqu, pero desde su inicio, ADO
est como metido en una aureola de dificultad a la que solamente pueden acceder informticos
especialmente elegidos. Quizs sea el uso de palabras de argot muy rebuscadas, que ms que facilitar
el estudio, atemorizan al principiante. La Gua del Estudiante pretende quitar esos velos que ocultan la
sencillez de lo cotidiano y mostrar la facilidad de esta tcnica. Con el estilo didctico que caracteriza a
este libro, pasaremos de las definiciones gloriosas e iremos a lo verdaderamente importante: saber
programar con ADO
ADO permite crear aplicaciones capaces de manipular bases de datos a travs de un proveedor OLE DB
(Object Linking and Embedding for DataBase). El objetivo de OLE DB es poner a disposicin del
programador una herramienta de nivel inferior que le de acceso universal a los datos con independencia
del origen de datos, ya sea un servidor de correo electrnico, una hoja de clculo u otro tipo de
almacenamiento de datos. Debido a la complejidad de los elementos de OLE DB, no se puede acceder a
ellos directamente desde Visual Basic; para ello utilizaremos los objetos ADO que permiten acceder a la
prctica totalidad de las funciones de OLE DB.

Aplicacin que accede a los datos

O
L
E

Bases de datos
Relacionales

D
B

A
D
O

O
D
B
C

Texto

Modelo de datos ADO


R
D
O
D
A
O

O
D
B
C

Bases de datos
relacionales

Modelo DAO/RDO

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 393

Las caractersticas generales de ADO son:

Mayor velocidad y facilidad de uso.


Menor carga de memoria y de espacio en el disco duro.

Las caractersticas especficas que proporciona ADO para entornos de Cliente/Servidor (C/S) son:
Creacin de los objetos de forma independiente. No se necesita navegar por ninguna jerarqua
de objetos para poder crearlos. La mayora de los objetos se pueden instanciar de forma
independiente. De esta forma crearemos solo los objetos que necesitemos.

ADO nos permite utilizar los procedimientos almacenados en el sistema gestor de la base de
datos (si este soporta esta funcionalidad), pudiendo recoger los resultados devueltos por dichos
procedimientos como parmetros de salida. Esta caracterstica permite mejorar el rendimiento y
la rapidez de las aplicaciones.
Diferentes tipos de cursores.
Soporte para limitar el nmero mximo de registros devueltos de una sola vez en un recordset.
Esta caracterstica mejora el rendimiento tanto de la aplicacin como de la red.
Soporte para recibir varios recordset como resultados devueltos de un procedimiento
almacenado.
Hay que tener en cuenta que todas estas caractersticas estn limitadas por el servidor de los datos. Es
decir, si el servidor de datos no soporta procedimientos almacenados, no podremos utilizar con l las
caractersticas de ADO que se refieren a dichos tipos de procedimientos.
Fig 72.1 Jerarqua de Objetos ADO.
Connection*
Error*

Errors
Command*

Parameter*

Parameters
Recordset
*

Field*

Fields

* Todos los objetos marcados con un asterisco contienen la coleccin Properties con un subconjunto
de objetos Property.
Properties
Property
Como puede verse en la figura, existen tres objetos principales dentro de ADO: El objeto Connection, el
objeto Command y el objeto recordset. Luego veremos algunas de las caractersticas principales de
cada uno de estos objetos.
Antes de proseguir con estos objetos vamos a explicar donde y porqu se deben utilizar objetos ADO en
vez de objetos DAO u objetos RDO
Hasta ahora habamos utilizado bases de datos Access, y tambin otras bases de datos sencillas como
dBase. Acceder a Access es extremadamente fcil. Y ello es debido a que Access es una base de datos
sin grandes aspiraciones en cuanto a seguridad. Es una gran base de datos, y tiene sus dispositivos de
seguridad en cuanto a permisos de acceso (Vea El dbEngine. Visin desde DAO y la propiedad
SystemDB en el Captulo 12) sin embargo estas posibilidades se usan en muy pocas ocasiones, y estos
mecanismos de seguridad de Access tampoco son una maravilla. Por lo tanto Access se ha quedado
como una gran base de datos para aplicaciones que no pasen de algunos centenares de miles de
registros y con pocos puestos de operacin. En esta base de datos, el mtodo ideal de acceso es DAO,
bien directamente o a travs de ODBC Direct. Cuando se accede directamente, la BD se suele buscar

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 394

bien mapeando el disco del servidor como una unidad ms del puesto cliente, o bien accediendo a travs
de la direccin IP del servidor.
Cuando queremos empezar a tener una seguridad en los accesos, disponer de privilegios distintos para
cada usuario, trabajar en una red de rea local con muchos usuarios, hay que recurrir a bases de datos
tipo Oracle o SQLServer. Ya empezamos a tener problemas: Visual Basic no puede acceder
directamente a abrir estas bases de datos. Podemos acceder a travs de ODBC, pero como ya se dijo
en el, captulo correspondiente, ODBC se ha quedado obsoleto. Y Microsoft ha sacado para ello ADO. Y
ADO permite abrir la base de datos usando para ello un dispositivo intermedio que es el proveedor OLE
DB. Este no es ms que una DLL. Mejor dicho, un juego de DLLs que puede ver en la carpeta:
C:\Archivos de Programa\Archivos Comunes\System\Ado
Estas DLLs permiten conectar con las bases de datos ms conocidas (Oracle, SQLServer, Access y las
dems BD controladas por el motor Jet). ADO funciona de forma diferente a ODBC. Con ODBC se
preparan conexiones permanentes en el ordenador, y cualquier programa puede acceder a la BD a
travs de esas conexiones. Con ADO no hay que preparar previamente ninguna conexin. Es el propio
programa el que llama al proveedor de datos OLE DB y le pasa como parmetros los datos necesarios
para que este realice la conexin y abra la BD. Si hubiese dos programas ejecutndose
simultneamente y accediendo a la misma base de datos a travs de ADO, cada programa prepara una
conexin a esa BD. En ODBC podramos ver las conexiones existentes en el PC a travs del Panel de
Control | Fuentes de Datos ODBC. En ADO no existe esa posibilidad ya que, como se ha dicho, es el
propio programa quien crea esa conexin al ajecutarse.
Para que VB pueda acceder a ADO es necesario introducir en el programa la referencia a Microsoft
ActiveX Data Objets 2.1 Library (Proyecto|Referencias)
Una particularidad de ADO frente a lo ya visto con DAO o RDO es que ADO se salta la jerarqua a la
hora de crear nuevos objetos. En DAO, el objeto DAO superior creaba al objeto DAO inferior (Recuerde
aquello del juego de nios). En ADO podemos crear cada objeto sin que exista el objeto inmediatamente
superior. Por ejemplo podemos crear un recordset sin que exista el objeto Connection. Claro que en
este caso, a la hora de crear el objeto recordset deberemos indicarle, mediante los parmetros que
debemos aportar en la sintaxis de creacin del recordset, todos aquellos datos que le aportaramos a la
creacin del objeto Connection. Como ve no tiene ventajas. Solamente que nos desentendemos un poco
de abrir y cerrar el objeto Connection.
Veamos como se crea la conexin: Mediante el Objeto Connection

EL OBJETO CONNECTION
El objeto Connection representa una sesin con el origen de los datos. Dependiendo de la funcionalidad
del proveedor de los datos podremos utilizar determinadas propiedades, mtodos y colecciones de este
objeto. La funcin de este objeto es recoger toda la informacin del proveedor de los datos que se va a
utilizar para crear un objeto recordset.
Para crear un objeto Connection, previamente debemos declararlo como variable objeto Connection:
Dim MiConexion as ADODB.Connection
El sitio donde se debe declarar depende como siempre, del mbito que deseamos que tenga ese objeto.
Para crear el objeto Connection deberemos utilizar la siguiente sintaxis:
Set MiConexion = New ADODB.Connection
Nota: En el caso de que ejecutemos la aplicacin y nos salga un error diciendo que el tipo no est
definido por el usuario, es que no hemos aadido la referencia de Microsoft Actives Data Objects Library
x.x
La conexin est creada?. S, pero de momento es completamente intil ya que no sabe ni siquiera
que base de datos debe abrir, ni con que usuario, ni las condiciones en las que debe abrir esa base
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 395

(Solo lectura, etc.) Esta informacin se la pasamos mediante la propiedad ConnectionString (Cadena de
conexin)
La propiedad ConnectionString
Es la propiedad ms importante del objeto Connection. Se basa en encadenar una serie de argumentos
en una cadena de caracteres. Los diferentes argumentos son (dependiendo del proveedor OLE DB y de
la configuracin de la red, se necesitarn todos o parte de ellos)
Provider

Especifica el nombre del proveedor que se usa en la conexin. (Oracle, SQLServer, Jet,
etc)
Data Source Especifica el nombre de la fuente de datos para la conexin. (Nombre de la base de
datos a la que se va a acceder.
User Id
Especifica el nombre de usuario que abre la conexin. Debe ser un usuario ya declarado
en la base de datos.
Password
Especifica la clave utilizada por el usuario para abrir la conexin. Debe coincidir con el
que tiene ese usuario registrado en la Base de datos.
File Name
Especifica el nombre del fichero especfico de proveedor, que contiene la informacin de
configuracin de la conexin. Este fichero es til en instalaciones en red que requieran
modificaciones de conexin frecuentes.
Remote Provider
Especifica el nombre de un proveedor de datos remoto cuando se utiliza una
conexin cliente/servidor
Remote Server
Especifica el nombre del camino al servidor que se va a usar cuando se
establece una conexin cliente/servidor
Como ejemplo para la conexin a una base de datos Oracle, con el usuario que esa BD tiene por
defecto (scott) y el Password de este usuario (tiger) tendremos que especificar en el ConnectionString
la siguiente cadena de caracteres.
Provider=MSDAORA.1;Password=tiger;User ID=scott;Data Source=MADRID;
donde el valor de Source es la cadena de conexin de Oracle que previamente tiene que estar
configurada con el SQL*Net o Net8 de Oracle.
Si lo que queremos es crear una conexin con una base de datos Access 2000

Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\GuiadelEstudiante\PruebaADO.mdb;
Si la base de datos es de Access 97 entonces tendremos que especificar otro provider:
Provider=Microsoft.Jet.OLEDB.3.5;Data Source=C:\GuiadelEstudiante\db1.mdb;

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 396

Para una base de datos SQLServer


"Provider=SQLOLEDB.1;Password=ayudas01; User ID=ayudas01; Initial Catalog=Ayudas_M; Data
Source=ayudas_sql" (en una lnea nica)
Como puede comprobar, resulta una tanto complicado construir la cadena de conexin y mientras que
seamos novatos en ADO podemos tener problemas para crear esta cadena. Pero es que no existe una
manera ms fcil de construir esta cadena? Efectivamente. Hay un pequeo truco mediante el cual no
solo podemos crearla con un asistente, sino que adems probaremos si la conexin es satisfactoria o
no.
Truco para construir la cadena de conexin.
1) Primero tenemos que incluir el componente Microsoft ADO data control 6.0 (OLEDB). Podemos
hacerlo pulsando Ctrl.-T o en el men Proyecto Componentes.
2) Metemos en nuestro formulario el control y pulsamos F4 para ver sus propiedades.
3) Hacemos Click en la propiedad
ConnectionString y nos
aparecer el botn de puntos
suspensivos. Hacemos Click en
el botn.
4) Ahora nos aparece el asistente
que nos mostrar 3 opciones.
Utilizar un DSN de archivo,
utilizar un controlador ODBC o
utilizar una cadena de conexin.
En todos los casos, a la
derecha de la opcin hay una
opcin
que
nos
permite
seleccionar o generar el origen
de los datos. Usaremos la
cadena de conexin (opcin por
defecto) y pulsaremos el botn
generar.

5) Al pulsar el botn generar, nos aparece otra ventana en la que tenemos cuatro pestaas aunque
nicamente necesitaremos dos de ellas para crear una cadena de conexin correcta y probada.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 397

El resto de las pestaas forman parte de otro captulo exclusivo del control data de ADO, aunque
le invito a que curiosee por ellas. Seleccionaremos el proveedor de datos que queramos utilizar y
pulsaremos el botn siguiente para pasar a la siguiente pestaa.

6) En la Pestaa conexin, tenemos que proporcionar los datos correspondientes al proveedor de


la base de datos a la que queremos conectar. Por ejemplo para conectar con una base de datos
de tipo MS Access (MS Jet 4.0 OLEDB Provider para la versin 2000 de Access, MS Jet 3.5
OLEDB Provider para la versin 97 de Access), tenemos que decirle el nombre y path de la BD.
Para ello podemos utilizar el botn de los puntos suspensivos, que abrir una ventana que
permitir seleccionar el archivo .mdb . Si utilizamos el proveedor de datos de Oracle, tendremos
que indicarle como nombre de servidor la cadena de conexin utilizada en el SQL Net o en el
Net8 de Oracle (la misma cadena que especifica cuando se conecta a travs de SQL*Plus).
En esta pestaa existen dos opciones interesantes:
Contrasea en Blanco, si la marcamos no nos permitir teclear la contrasea.
Permitir guardar la contrasea, dependiendo de si est o no seleccionada, incluir o no
en la cadena de conexin la clave del usuario. Para la primera prueba le recomiendo
que la marque. No obstante, haga diferentes pruebas con ellas para ver los resultados.
Despus de haber dado esta informacin, pulsaremos el botn Probar conexin. En el caso de
que haya algn error, el asistente nos lo indicar con un mensaje.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 398

Prueba de conexin (fallida) con Proveedor de datos de Oracle

Prueba satisfactoria
7) Una vez que hemos probado satisfactoriamente la conexin, pulsaremos aceptar y volveremos a
la pantalla inicial, la de las 3 opciones. La diferencia es que ahora tenemos la cadena de
conexin rellenada por el asistente. Ahora podemos copiarla con ctrl.-C y llevarla a la parte del
cdigo donde queremos establecer la conexin. No se olvide de que es una cadena y que
cuando se asigne a la propiedad ConnectionString debe ir entre comillas dobles.
8) Una vez que hemos probado que funciona al abrir el objeto Connection, No debemos olvidarnos
de eliminar el control data de ADO y de quitar el componente de nuestro proyecto, salvo que lo
vayamos a utilizar para otra cosa.
Ya conocemos el truco para formar la cadena de conexin y se la hemos introducido en la propiedad
ConnectionString Ya est creada la conexin? S, pero todava no sirve para obtener datos de la
base de datos. Pero ya hemos avanzado mucho. Ahora nuestro programa ya sabe al menos, como
poder abrir esa base de datos, pues conoce su nombre, usuario que la abre y Password. Solamente
queda aplicar un mtodo del objeto Connection: el mtodo Open con una sintaxis que no es
excesivamente difcil:
Miconexin.Open
La conexin se va a realizar a una base de datos que est en un servidor. Este servidor puede definirse,
bien por su direccin IP o por su nombre. Lo normal es definirlo por su nombre (Server_SQL_Mae) y no
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 399

por su direccin IP. Obviamente el nombre del servidor corresponder a una direccin IP (Vamos a
considerar una red IP esttica, pues si pretendemos entrar a explicar lo que es una red con direcciones
IP asignadas dinmicamente se nos complica la explicacin). Esa direccin IP debemos indicrsela al
PC en el fichero Hosts (o Lmhosts) que estn en la carpeta Windows o en una de sus subcarpetas. En
estos ficheros explica como hacerlo. No se extrae si, una vez indicado en ese fichero, sigue sin
encontrarlo. La primera conexin con el servidor la busca mediante llamadas broadcast en la red que no
siempre son bien tratadas por los routers. En muchas ocasiones he tenido que buscar el servidor a mano
(entorno de red) y, milagros de Windows, a partir de esa operacin ya lo encuentra sin problemas.

Para seguir un poco el ejemplo que acompaa a este captulo, vamos a ver el cdigo utilizado para crear
la conexin. En el ejemplo usamos una base de datos Access (No es la mejor para demostrar como
funciona ADO, pero es la que los alumnos van a tener con mayor facilidad. Una base Oracle o SQL no
se instala fcilmente en un ordenador personal)
Set MiConexion = New ADODB.Connection
'MiConexion.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\GuiaDelEstudiante\ADO\PruebaADO.mdb;Persist Security Info=False"
'MiConexion.Open
Ahora nuestro programa ya est en contacto con la base de datos. Lo que falta ya lo puede suponer:
crear un recordset.
Aqu vamos a ver la primera diferencia con DAO. El recordset no lo crea el objeto Connection. Se crea l
a s mismo. Para que pueda existir un objeto Recordset primero hay que declararlo:
Dim MiRecordset As ADODB.Recordset

(Hay que declararlo en el sitio adecuado dependiendo


del mbito que necesite)

En el procedimiento donde se vaya a crear el recordset, para crearlo utilizaremos la siguiente sintaxis:
Set MiRecordset = New ADODB.Recordset

(Ya est creado. Pero no est abierto, ahora hay que


abrirlo)

MiRecordset.Open "Alumnos", MiConexion, adOpenDynamic, adLockOptimistic


Ya tenemos abierto el recordset. En este caso el recordset est formado por todos los registros con
todos sus campos de la tabla Alumnos, que est en la base de datos definida en la conexin
MiConexion, es del tipo Dynamic y el bloqueo de escritura es optimista.
Podramos elegir ciertos registros, y solamente unos campos. Utilizaramos una sentencia SQL
MiRecordset.Open "Select Alumno_Nombre, Alumno_Ape1, Alumno_Ape2 From Alumnos " _
& Where Alumno_Nombre = Luis, MiConexion, adOpenDynamic, adLockOptimistic
Si no hubisemos creado previamente el objeto Connection, podramos crear y abrir igualmente este
objeto recordset, pero, en vez de pasarle el nombre de la conexin (MiConexion) le pasaramos la
cadena de conexin usada para crear ese objeto Connection.

Set MiRecordset = New ADODB.Recordset


MiRecordset.Open "Alumnos", "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\GuiaDelEstudiante\ADO\PruebaADO.mdb;Persist Security Info=False", adOpenDynamic,
adLockOptimistic
(Es solamente una lnea. Ha sido Word quien la ha troceado)
Ahora ya podemos presentar los campos del recordset, usando la sintaxis que ya conocemos de DAO
TbNombre = & MiRecordset!Alumno_Nombre
TbApe1 = & MiRecordset!Alumno_Ape1
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 400

TbApe2 = & MiRecordset!Alumno_Ape2


Hagamos una pequea pausa. Observe que hay diferencias de trabajar con ADO o hacerlo con DAO.
Con DAO.
Declarar MiSesion, MiBase y MiRecordset
Dim MiSesion as Workspace
Dim MiBase As DataBase
Dim MiRecordset as Recordset
Crear el objeto Workspace, el objeto DataBase y el objeto Recordset
Set MiSesion = Workspaces(0)
Set MiBase = MiSesion.OpenDatabase (C:\GuiadelEstudiante\Alumnos.Mdb)
Set MiRecordset = MiBase.OpenRecordset (Alumnos, dbOpenDynaset)
Con ADO (Creando el objeto Connection)
Declarar MiConexion y MiRecordset
Dim MiConexion As ADODB.Connection
Dim MiRecordset As ADODB.Recordset
Crear la conexin y ponerle la cadena de conexin en su propiedad ConnectionString
Set MiConexion = New ADODB.Connection
MiConexion.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\GuiaDelEstudiante\ADO\PruebaADO.mdb;Persist Security Info=False"
Abrir el objeto Connection
MiConexion.Open
Crear el objeto recordset
Set MiRecordset = New ADODB.Recordset
Abrir el objeto Recordset
MiRecordset.Open "Alumnos", MiConexion, adOpenDynamic, adLockOptimistic
Con ADO (Sin crear el objeto Connection)
Declarar MiRecordset
Dim MiRecordset As ADODB.Recordset
Crear el Recordset
Set MiRecordset = New ADODB.Recordset
Abrir el Recordset
MiRecordset.Open "Alumnos", "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\GuiaDelEstudiante\ADO\PruebaADO.mdb;Persist Security Info=False", adOpenDynamic,
adLockOptimistic
Observe siempre que tanto en las declaraciones del objeto Connection y del objeto Recordset, como en
su creacin, debemos anteponer siempre la palabra ADODB
Tanto el objeto Recordset como el objeto Connection se debern cerrar cuando ya no se utilicen, o al
menos, al cerrar la aplicacin. Esto es tanto ms necesario cuanto mayor sea la seguridad de la base de
datos que vamos a utilizar. En algunas bases de datos, dejar una sesin abierta significa dejar una
aplicacin zombie ejecutndose en el servidor, que habr que cerrar desde su propio sistema operativo.
Este problema no le va a ocurrir utilizando Access, pero como ya se dijo al principio, Access no es el
mejor ejemplo de utilizacin de ADO. Para cerrar una sesin y un recordset utilizaremos el mtodo Close
MiRecordset.Close
MiSesion.Close
LSB

(Recuerde que debe cerrar antes el recordset que la conexin)

Visual Basic Gua del Estudiante

Captulo 1

Pgina 401

Qu pasa con el equivalente del Workspace?


Cuando resumamos en la pgina anterior el cdigo a usar si usbamos DAO o ADO, pareca (aunque
no fuese cierto) que podamos asimilar estos objetos
DAO

ADO

Recordset
DataBase
WorkSpace

Recordset
Connection

Efectivamente el Workspace no tiene algo que pudisemos decir equivalente en ADO. Esto es debido
a que ADO ya considera que el acceso desde los usuarios lo gestiona directamente la base de datos.
Recuerde que el Workspace en DAO era una sesin de trabajo de la base de datos, donde podamos
asociar un Workspace a cada usuario. ADO ya le pasa a la BD el nombre del usuario y su Password
para que la propia base de datos quien autorice a ese usuario.
Algunas cosas que le van a ocurrir cuando ya haya creado el recordset.
El empleo de bases de datos complejas en cuanto a seguridad nos va a obsequiar con limitaciones a los
recordsets que vamos a abrir en ADO. Y adems esas sorpresas van a ser distintas si usa uno u otro
tipo de base de datos. (nos centraremos solamente en Oracle y SQLServer. Access, con la modestia
que le caracteriza, no va a dar ningn problema.)
Los recordsets abiertos mediante una consulta SQL (aquellos en los que seleccionamos parte de los
registros mediante
Select Where van a crearse solo de lectura. Independientemente de los
parmetros que le pasemos a la hora de crearlos. La descripcin del error va a ser algo as como que el
cursor es solamente de lectura. Tambin observar con frecuencia, cuando intente ir a un registro
anterior al actual, MiRecordset.MoveFirst, p.e.) que le enviar un error diciendo que el cursor es
solamente de avance hacia a delante. Estos efectos los observar tambin cuando use la instruccin
SQL Order By. No hay que arrojar la toalla solamente por esto. Cuando eso ocurra, lo que hay que
hacer es volver a crear el recordset de forma que acepte escritura y movimiento hacia atrs. Eso
generalmente se logra abriendo el recordset con todos los registros de la tabla, e incluyendo en l todos
los campos.
En vez de :
MiRecordset.Open "Select Alumno_Nombre, Alumno_Ape1, Alumno_Ape2 From Alumnos " _
& Where Alumno_Nombre = Luis, MiConexion, adOpenDynamic, adLockOptimistic
usar esta otra alternativa:
MiRecordset.Open "Alumnos", MiConexion, adOpenDynamic, adLockOptimistic
Posiblemente necesitemos crear dos recordsets en un mismo procedimiento. Por ejemplo, es muy tpico
tener que buscar el ltimo registro para ver el ltimo nmero de un identificador de registro (Alumno_ID)
y poner en este campo, al registro que vamos a crear, un nmero igual a ese ms 1. En ese caso,
abriramos el recordset usando la sentencia Order By Alumno_ID. Cuando queramos introducir un
nuevo registro mediante:
MiRecordset.AddNew
nos dir que el cursor (el recordset, para entendernos) es solamente de
lectura. La solucin es, abrir el recordset con la sintaxis anterior, leer el nmero de Alunmo_ID, cerrar el
recordset, crear otro recordset con el mismo nombre, usando la sintaxis:
MiRecordset.Open "Alumnos", MiConexion, adOpenDynamic, adLockOptimistic
Ahora ya nos permitir usar el mtodo AddNew. Basta con aadir las lneas de cdigo adecuado para
introducir los valores en cada campo:
Mirecordset.AddNew
MiRecordset!Alumno_ID = Valor numrico
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 402

MiRecordset!Alumno_Nombre = Valor string


Etc.
.
MiRecordset.Update
No renuncie nunca a intentar hacer esto. No siempre funciona. Pero esto es mucho ms sencillo que
introducir los datos a capn utilizando la instruccin SQL Insert que ya veremos ms adelante.
SQLServer es bastante ms dcil que Oracle para usar el mtodo AddNew.
A este respecto, hay que citar la propiedad CursorLocation que veremos ms adelante. Si creamos un
cursor lado cliente, seguramente nos permitir utilizar ms opciones (entre ellas AddNew) que si lo
establecemos de lado servidor. Tenga en cuenta que si usa un cursor lado cliente, el recordset no se
actualiza cuando otro usuario realiza modificaciones en la base.
Modificar datos mediante EDIT
En ADO no hace falta usar Edit para modificar los datos del registro actual. Edit no existe en ADO.
Para modificar un dato basta con poner el mismo cdigo que utilizbamos en DAO, pero sin comenzar
por la lnea Mirecordset.Edit. Colocndonos en el registro a modificar pondremos:
MiRecordset!Alumno_Nombre = Pedro
MiRecordset!Alumno_Ape1 = Perez
MiRecordset.Update
De cualquier forma, esto tampoco tiene porque funcionar en todas las bases de datos. En ese caso
tendremos que recurrir, al igual que para un registro nuevo, a las instrucciones SQL, que en este caso
ser Update. Pero ya lo veremos ms adelante. Hasta ahora solamente he querido usar el cdigo
ms simple para que pueda empezar con ADO, y sobre todo, para que vea que esta es una tcnica
completamente accesible, aunque, dadas las grandes prestaciones que tiene, un poco ms adelante se
va a complicar algo.
Ya ha visto que podemos trabajar perfectamente con recordsets, tal como lo hemos hecho con el DAO
de toda la vida. Pero ya lo comentbamos al principio, parece que hay que adornar lo obvio para que no
lo parezca tanto. Y ah viene el Objeto Command, que como habr podido ver en la figura de la Jerarqua
de los objetos ADO, es un objeto que an no sabemos lo que hace.
El objeto Command lo que va a hacer es crear un recordset. O tambin, meter a capn un nuevo
registro, o borrarlo, utilizando directamente instrucciones SQL. Hay que darse cuenta que ADO trabaja
con una gran diversidad de bases de datos, y no todas trabajan igual. Por eso, muchas veces fallan
operaciones tan sencilla como aadir un nuevo registro con el mtodo AddNew del recordset
MiRecordset.AddNew
Y hay que emplear una instruccin SQL: INSERT
En estos casos, en ADO utilizamos el mtodo EXECUTE sobre el objeto Connection. Creamos una
variable, StrIntroducir, con el contenido de la instruccin SQL y ejecutbamos esa instruccin mediante
Execute
StrIntroducir = "Insert Into INT_DOCUMENTOS " _
& "(CL_DOC,NOM_DOC,TITULO_DOC,AUTOR_DOC,CL_TEMA_DOC,CL_DPT_DOC, _
& L_TIPO_DOC,FICH_DOC,FECHA_EMISION_DOC,ULTIMA_HORA_DOC,VISIBLE_DOC)"_ &
"Values (" & NumeroDocumento & ",'" & TbTitulo & "','" & TbTitulo & "','" & TbTitulo.Tag _
& "',19,2,1,'" & HRefPrensa & "/" & TbNombFichTIF & "','" & Date & "',0,1)"
ConexBDPrensa.Execute StrIntroducir
Esta lnea (StrIntroducir) es el contenido de la propiedad CommandText de un objeto Command de ADO.
Ni ms ni menos que una instruccin que queremos realizar sobre la BD. Un objeto Command tiene
pocas cosas ms. Como objeto ADO que es tiene sus propiedades y mtodos. Pero en esencia es lo
que acaba de ver con la instruccin EXECUTE del objeto Connection. Lo que pasa, que ADO lo han
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 403

hecho muy organizado, y por eso tiene la categora de Objeto. Es hacer lo mismo, utilizando las mismas
expresiones, pero dndole ms cuerpo.
Con la instruccin anterior, lo que hacamos era aadir un registro. Si lo que queremos hacer es crear
un recordset, la instruccin SQL comenzara por Select * From . Y el mtodo EXECUTE devolvera
un Recordset
StrIntroducir = Select * From Alumnos Where Apellido1 = Suarez
Podemos crear un recordset (MiRecordset, previamente declarado como tal) con esta instruccin
MiRecordset = ConexBDPrensa.Execute StrIntroducir
O con estas otras
Set MiComando as New ADODB.Command
MiComando.ActiveConnection = ConexBDPrensa
MiComando.CommandText = Select * From Alumnos Where Apellido1 = Suarez
MiRecordset = MiComando.Execute
Ver el ejemplo completo al final del captulo.
Ahora, tras la explicacin informal de cmo se crea una conexin y un recordset en ADO, y que es un
Command, vamos a entrar a conocer sus propiedades y mtodos. Al final, y con un buen ejemplo
realizado de varias formas, entender perfectamente la forma de trabajar con ADO.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 404

ADO. El Objeto Connection


Un objeto Connection representa una conexin abierta con un origen de datos. Ya hemos visto como
crear un objeto Connection, por lo que vamos a pasar directamente a ver sus
objetos, colecciones, propiedades y mtodos.
Como puede verse en la figura, el Objeto Connection tienen los objetos Command
y Recordset, y la coleccin Errors.
El Objeto Recordset es el recordset de toda la vida: un conjunto de registros que
contienen datos. El Objeto Recordset, aunque pertenece al objeto Connection,
puede crearse sin que exista previamente un objeto Connection. Esta es una de las propiedades de los
objetos ADO: no necesita cumplir estrictamente con la jerarqua.
El Objeto Command es una definicin de un comando especfico que se piensa ejecutar contra un
origen de datos. Los objetos Command sirven para tener almacenadas operaciones de acceso a datos y
usarlas en el momento adecuado, simplemente citndolas. Lo que obtenemos de un objeto Command
es, o un recordset (ver que no merece la pena usar un objeto Command para crear un recordset,
puesto que se pueden crear directamente) o una operacin que afecte a los registros de la base de
datos (aadir registros, borrarlos, si es que no se deja hacer eso mediante recordsets)
La Coleccin Errors es el conjunto de errores generados por el proveedor de datos ante el fallo de una
operacin de acceso. La coleccin Errors se refiere nicamente a los errores generados por el
proveedor, no a los fallos interceptables producidos por el programa, que deben ser tratados de la forma
habitual: mediante Err
Propiedades del Objeto Connection (Lea esto de las propiedades sin complicarse demasiado la vida.
Las realmente importantes ver que estn advertidas debidamente)
Las propiedades del objeto Connection dependen de cada proveedor. No todos se comportan de igual
forma, por lo que cada propiedad debe condicionarse a si el proveedor es capaz de ofrecerla.
Propiedad Attributes
Es un Long. Acepta dos valores o la suma de los dos:
adXactCommitRetaining
adXactAbortRetaining
Estos atributos condicionan el modo de operacin de la conexin con los mtodos CommitTrans y
RollBackTrans.
Propiedad CommandTimeout
Indica, en segundos, el intervalo de espera para que se ejecute un comando (Objeto Command) antes
de que finalice el intento y se genere un error. Es un Long. El valor predeterminado es 30.
Propiedad ConnectionTimeout
Indica, en segundos, el intervalo de espera para establecer una conexin antes de que finalice el intento
y se genere un error. Es un Long y el valor predeterminado es 15.
Propiedad ConnectionString (IMPORTANTE)
Es una cadena de caracteres que contiene la informacin que se utiliza para establecer una conexin a
un origen de datos. (Vea la explicacin amplia ms atrs)
La cadena de conexin tiene varios argumentos, todos ellos separados por un punto y coma (;) de la
forma
argumento1 = valor; argumento2 = valor; argumento3 = valor etc.
ADO procesa solamente cuatro argumentos: Provider, File Name, Remote Provider y Remote Server.
Los dems argumentos los pasa al proveedor para que el los procese (Usuario, Password, etc)

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 405

Si al emplear el mtodo Open se utiliza el parmetro Connection String, este parmetro utilizado en el
mtodo Open sustituir a cualquier otro existente anteriormente. Una vez abierta la conexin, esta
propiedad no se puede cambiar puesto que es solamente de lectura.
Los argumentos File Name y Provider son excluyentes.
Propiedad CursorLocation

(IMPORTANTE)

Establece o devuelve la posicin de un servicio de cursores. Es un Long, y acepta las siguientes


constantes:
AdUseNone
No se usan servicios de cursor. (Esta constante es obsoleta y aparece
nicamente por compatibilidad con versiones anteriores.)
AdUseClient Usa cursores del lado del cliente.
AdUseServer Predeterminado. Usa cursores del lado servidor.
Esta propiedad parece que no dice nada. Y es sumamente importante.
Los cursores son, por decirlo de alguna manera, los mecanismos de la base de datos donde se crean los
recordsets. Se estar dando cuenta que las bases de datos que tienen cursores son ya bases de datos
con mecanismos propios para la creacin de recordsets. (SQL Server u Oracle, p.e.) Estas bases de
datos trabajan como aplicaciones cliente servidor. Tienen en el servidor, aparte de los datos, la
mayora de sus recursos. En el cliente tienen prcticamente los recursos de conectividad, y poco ms.
Esta conectividad permite enviar desde el cliente una peticin a la base de datos alojada en el servidor.
Esa peticin ser el resultado por ejemplo, de una sentencia SQL. Al recibirla el servidor, gestionar la
obtencin de los resultados y una vez que los haya conseguido viene su primera duda: Dnde los
almaceno? Puede almacenarlos en el servidor, y cada vez que necesitemos un nuevo registro, por
ejemplo al ejecutar la sentencia MiRecordset.MoveNext, el cliente se lo indica al servidor y este le enva
el nuevo registro. Tambin puede almacenar los datos obtenidos en el cliente, y de esta forma el cliente
puede moverse con entera libertad a lo largo de los registros del recordset. Puede hasta contarlos y
saber en que posicin est. La diferencia entre uno y otro sistema es que en el primer caso el trfico por
la red es mnimo (solamente se enva la informacin estrictamente necesaria) y en el segundo caso, se
enva mucha informacin de un golpe, la correspondiente a todos los registros del recordset,
independientemente de si se va a usar en el servidor o no.
Considerando el trfico generado, parece que es mejor crear los cursores en el lado servidor. Pero esto
trae tambin sus dificultades. Nos priva de muchas propiedades del recordset. Una propiedad muy
usada, AbsolutePosition, no la tienen los cursores de lado servidor, circunstancia que no nos debe
sorprender, ya que al no estar todos los registros en el cliente, ste, aunque disponga de todos los datos
guardados en todos los campos de un determinado registro, no puede saber que posicin ocupa ese
registro dentro de la totalidad de registros del recordset. Por lo tanto, usar cursores de lado cliente o lado
servidor ser siempre una decisin a tomar dependiendo de la velocidad de la red, de la memoria
disponible en el cliente, de la complejidad del programa, etc.
Recuerde que por defecto, ADO crea cursores de lado servidor. Para que la conexin le cree todos los
cursores de lado cliente basta ejecutar la instruccin:
MiConexion.CursorLocation = adUseClient
Si desea hacer transacciones, deber crear cursores del lado servidor, ya que los de lado cliente no las
admiten. Comprender segn vaya programando y encontrndose con problemas, que esta propiedad
es absolutamente importante.
Este valor debe establecerlo antes de crear la conexin. De esta forma, todos los cursores creados con
esa conexin sern de lado cliente o lado servidor, segn haya elegido. Pero muchas veces sera ideal
que unos recordsets tuvieran el cursor de un tipo y otros de otro. Los recordsets tambin tienen esta
propiedad, por lo que puede elegir el lado deseado para cada recordset utilizando esta propiedad
aplicada no a la conexin, sino al recordset.
El nmero de registros que el servidor enva al cliente, cuando el cursor es de lado servidor, se controla
mediante la propiedad CacheSize del recordset. Lo ver ms adelante.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 406

Propiedad DefaultDatabase
Establece la base de datos predeterminada para un objeto Connection. Es un string con el nombre de la
base de datos por defecto de esa conexin. Solamente es vlida con aquellos proveedores que permiten
varias bases de datos por conexin.
IsolationLevel
Esta propiedad afecta al comportamiento de un objeto Connection durante una transaccin. Una vez
establecida esta propiedad, solamente ser efectiva cuando se invoque el mtodo BeguinTrans. Vea la
ayuda para mayor informacin de los valores posibles.
Propiedad Mode,
Establece los permisos disponibles para modificar datos en un objeto Connection.
Los valores aceptados son:
AdModeUnknown
Predeterminada. Indica que los permisos no se han establecido an o
que no se pueden determinar.
AdModeRead
Indica que son permisos de slo lectura.
AdModeWrite
Indica que son permisos de slo escritura.
AdModeReadWrite
Indica que son permisos de lectura/escritura.
AdModeShareDenyRead
Impide que otros abran una conexin con permisos de lectura.
AdModeShareDenyWrite
Impide que otros abran una conexin con permisos de
escritura.
AdModeShareExclusive

Impide que otros abran una conexin.

AdModeShareDenyNone
Impide que otros abran una conexin con cualquier tipo de
permiso.
Slo puede establecer la propiedad Mode cuando el objeto Connection est cerrado. Cuando se usa en
un objeto Connection del lado del cliente, la propiedad Mode slo se puede establecer a
adModeUnknown.
Propiedad Provider
Es un string que indica el nombre del proveedor de un objeto Connection. Si no se especifica ningn
proveedor, la propiedad tendr el valor predeterminado MSDASQL (Proveedor de Microsoft OLE DB
para ODBC).

Propiedad State
Devuelve el estado del objeto Connection: abierto (adStateOpen = 1) o cerrado (adStateClosed = 0).
Propiedad Version
Devuelve el nmero de versin de ADO. Es un String.

Mtodos del Objeto Connection


Mtodos BeginTrans, CommitTrans y RollbackTrans
Estos mtodos de transaccin administran el proceso de la transaccin dentro de un objeto Connection
de la forma siguiente:
BeginTrans: inicia una nueva transaccin.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 407

CommitTrans: guarda las modificaciones y termina la transaccin actual. Tambin puede iniciar
una nueva transaccin.

RollbackTrans: cancela las modificaciones efectuadas durante la transaccin actual y termina la


transaccin. Tambin puede iniciar una nueva transaccin.

Despus de invocar el mtodo BeginTrans, el proveedor ya no aplicar inmediatamente las


modificaciones hasta que invoque CommitTrans o RollbackTrans para terminar la transaccin. Los
mtodos BeginTrans, CommitTrans y RollbackTrans no estn disponibles en los objetos Connection
del lado del cliente.

Mtodo Cancel
Cancela la ejecucin de una llamada asncrona pendiente a un mtodo Execute u Open.
Sintaxis

NombreConection.Cancel

El mtodo Cancel se utiliza para terminar la ejecucin de una llamada asncrona a un mtodo Execute o
Open (es decir, el mtodo fue invocado con la opcin adAsyncConnect, adAsyncExecute o
adAsyncFetch). Cancel devolver un error de ejecucin si no se utiliz adAsyncExecute en el mtodo
que quiere terminar.
Close, mtodo
Cierra el objeto Connection.
Sintaxis

NombredelObjetoConnection.Close

El cierre de un objeto Connection mientras hay objetos Recordset abiertos en la conexin cancela las
modificaciones pendientes en todos los objetos Recordset. El cierre explcito de un objeto Connection
(llamando a su mtodo Close) mientras una transaccin est en progreso genera un error. Si un objeto
Connection cae fuera del alcance mientras la transaccin est en progreso, ADO cancela
automticamente la transaccin.
El cierre de un objeto Connection no lo elimina de la memoria; puede modificar los valores de sus
propiedades y volver a abrirlo ms tarde. Para eliminar completamente un objeto de la memoria,
establezca la variable de objeto a Nothing.
Set NombredelObjetoConnection = Nothing
Mtodo Execute (Vea tambin Mtodo Execute para el objeto Command)
Ejecuta una consulta, instruccin SQL, procedimiento almacenado especificados o texto especfico del
proveedor.
Sintaxis (Para una cadena de comando que no devuelva filas):
conexin.Execute CommandText, RecordsAffected, Options
(Para una cadena de comando que devuelva filas):
Set MiRecordset = connection.Execute (CommandText, RecordsAffected, Options)
(MiRecordset debe ser una variable declarada tipo ADODB.Recordset)
CommandText Es un String que contiene la instruccin SQL, el nombre de la tabla, el procedimiento
almacenado o el texto especfico del proveedor que se va a ejecutar.
RecordsAffected Opcional. Una variable Long en la que el proveedor devuelve el nmero de registros
afectados por la operacin.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 408

Options Opcional. Una constante o valor Long que indica cmo debe evaluar el proveedor el argumento
CommandText. Puede ser uno de los siguientes valores.
Constante

Descripcin
Indica que el proveedor tiene que evaluar CommandText como
definicin textual de un comando, como una instruccin SQL.
Indica que ADO tiene que generar una consulta SQL para devolver
todas las filas de la tabla mencionada en CommandText.
Indica que el proveedor tiene que devolver todas las filas de la tabla
mencionada en CommandText.
Indica que ADO tiene que generar una consulta SQL para devolver
todas las filas de la tabla mencionada en CommandText.
Indica que el proveedor tiene que evaluar CommandText como
procedimiento almacenado.
Indica que el tipo de comando en CommandText es desconocido.
Indica que el comando se tiene que ejecutar de forma asncrona.
Indica que el resto de las filas siguientes a la cantidad inicial
especificada en la propiedad CacheSize tiene que ser recuperada
de forma asncrona.

adCmdText
adCmdTable
adCmdTableDirect
adCmdTable
adCmdStoredProc
adCmdUnknown
adAsyncExecute
adAsyncFetch

Cuando esta operacin termina se genera el evento ExecuteComplete.


Mtodo Open

(IMPORTANTE)

Abre una conexin a un origen de datos.


Sintaxis

MiConnection.Open ConnectionSTring, UserID, Password, Options


MiConnection.Open

Los parmetros ConnectionSTring, UserID, Password, Options puede introducirlos previamente a abrir la
conexin, y utilizar la segunda sintaxis cuando desee abrirla realmente. Estos parmetros se le pasan en
la cadena de conexin:
ConexBDPrensa.ConnectionString = "Provider=MSDAORA.1;User ID=INTRANET; & _
Password=INTRANET;Data Source=intranet;Persist Security Info=False"
Options Opcional. Puede ser una de las constantes siguientes:
AdConnectUnspecified Abre la conexin de forma sincrona
AdAsyncConnect
Abre la conexin de forma asncrona
Cuando se usa un objeto Connection del lado del cliente, el mtodo Open no establece realmente una
conexin con el servidor hasta que se abre un Recordset del objeto Connection.

Colecciones del Objeto Connection


Coleccin Errors
Contiene todos los objetos Error creados en respuesta a un nico fallo relacionado con el proveedor.
Cada objeto Error representa un error especfico del proveedor, no un error ADO. Los errores ADO se
exponen al mecanismo de control de excepciones en tiempo de ejecucin. Por ejemplo, en Microsoft
Visual Basic, cuando ocurre un error especfico de ADO dispara un evento On Error y aparece en el
objeto Err.
Cuando otra operacin ADO genera un error, se borra la coleccin Errors y el nuevo conjunto de objetos
Error se coloca en la coleccin Errors. Las operaciones ADO que no generan un error no tienen ningn
efecto sobre la coleccin Errors. Para borrar manualmente la coleccin Errors utilice el mtodo Clear.
Cada objeto Error de la coleccin, nos dar informacin sobre un error producido en la conexin. Sus
propiedades son las siguientes:
Description: Contiene la descripcin del error producido (String).
NativeError: Indica el error devuelto por la base de datos (Long).
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 409

Number: Es el cdigo de error (Long).


Source: Indica el nombre del objeto o aplicacin que ha generado el error (String).
SQLState: Indica el error SQL estndar asociado.(String).
Debido a que este objeto ser de gran utilidad a continuacin se incluye un ejemplo de su uso.
Ejemplo del tratamiento de errores:
El resultado de la ejecucin es el siguiente:
Private Sub CBConexion_Click()
Dim MiConex1 As ADODB.Connection
Dim MiError As ADODB.Error
On Error GoTo RutErr
Set MiConex1 = New ADODB.Connection
MiConex1.ConnectionString = "Provider=MSDAORA.1;Password=tiger;User
ID=EScot;Data Source=MADRID;Persist Security Info=True"
MiConex1.Open
Exit Sub
RutErr:
For Each MiError In MiConex1.Errors
MsgBox ("Error VB:" & MiError.Number & vbCrLf _
& "Error Oracle:" & MiError.NativeError & vbCrLf _
& "Error SQL:" & MiError.SQLState & vbCrLf _
& "Generado Por:" & MiError.Source & vbCrLf _
& "Descripcin:" & MiError.Description)
Next
End Sub

Como
puede
observ
arse,
alguna
s
de
las
propiedades no devuelven los valores esperados: NativeError vale 0 cuando debera valer 1017, que es
el error asociado de Oracle. An as podemos capturar el cdigo del error desde la cadena de caracteres
description. Con este comentario se pretende sugerir que se realicen pruebas con el proveedor de
datos que vayamos a utilizar para conocer su comportamiento respecto a este objeto error y dnde nos
devuelve los cdigos.
Observese en el cdigo que la declaracin de MiError se hace con ADODB.Error

Coleccin Properties
Es el conjunto de objetos Property
Objeto Property
Un objeto Property representa una caracterstica dinmica de un objeto ADO que est definida por el
proveedor.

Los objetos ADO tienen dos tipos de propiedades: intrnsecas y dinmicas.


Las propiedades intrnsecas son aquellas propiedades implementadas en ADO e inmediatamente
disponibles para cualquier nuevo objeto, utilizando la sintaxis Objeto.Propiedad. No aparecen como
objetos Property en la coleccin Properties de un objeto, de forma que aunque puede modificar sus
valores, no puede modificar sus caractersticas.
Las propiedades dinmicas estn definidas por el proveedor de los datos y aparecen en la coleccin
Properties del objeto ADO apropiado. Por ejemplo, una propiedad especfica del proveedor puede
indicar si un objeto Recordset acepta transacciones o actualizaciones. Estas propiedades adicionales
aparecern como objetos Property en la coleccin Propiedades de dicho objeto Recordset. A las
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 410

propiedades dinmicas se les puede hacer referencia slo a travs de la coleccin, utilizando la sintaxis
Objeto.Properties(0) u Objeto.Properties("Name").
Un objeto Property dinmico tiene cuatro propiedades incorporadas propias:
La propiedad Name es una cadena que identifica la propiedad.
La propiedad Type es un entero que especifica el tipo de datos de la propiedad.
La propiedad Value es un variant que contiene el valor de la propiedad.
La propiedad Attributes es un valor Long que indica caractersticas de la propiedad especficas
del proveedor.

El Objeto Recordset de ADO


El objeto Recordset representa un conjunto de registros. El recordset en ADO puede crearse abrindolo,
tomando todos los registros de una tabla o seleccionndolos con una consulta SQL, o ejecutando un
comando que contienen el nombre de esa tabla o la consulta. En un momento determinado, el objeto
Recordset slo hace referencia a un nico registro dentro del conjunto de registros, llamado registro
actual.

Propiedades del Objeto Recordset


El recordset de ADO tiene propiedades iguales al recordset de DAO, pero tienen otras que no tienen el
de DAO. Se van a estudiar todas, profundizando ms en las que son particulares del recordset ADO.
Propiedad AbsolutePosition (ADO)
Especifica la posicin ordinal del registro actual de un objeto Recordset. Esta propiedad devuelve un
Long con el nmero de orden del registro. Es posible que el recordset no acepte esta propiedad,
dependiendo del proveedor de datos, y del tipo de cursor (lado cliente o lado servidor. El cursor tipo
lado servidor no permite esta propiedad) Esta propiedad devolver 1 cuando el registro actual sea el
primer registro del recordset.
Propiedades BOF y EOF
Indican si la posicin del puntero del Recordset est apuntando a un registro anterior al primero (BOF =
True) o posterior al ltimo (EOF = True). Esta propiedad siempre la podremos mirar,
independientemente si el cursor es lado cliente o lado servidor.
Propiedad ActiveConnection (ADO)
Indica a qu objeto Connection pertenece actualmente el objeto Recordset especificado. Devuelve un
string con el nombre del objeto Connection.
Propiedad Bookmark
Devuelve un marcador que identifica unvocamente al registro actual de un objeto Recordset o establece
el registro actual de un objeto Recordset al registro identificado por un marcador vlido. El valor del
Bookmark hay que introducirlo en una variable tipo Variant.
La propiedad Bookmark solo podr establecerse cuando el proveedor lo permita. Puede utilizarse el
mtodo Supports para averiguarlo. Cuando el recordset es de lado cliente, siempre est disponible el
Bookmark.
Propiedad CacheSize
Indica el nmero de registros del objeto Recordset que estn en la memoria cach local. Es un Long de
lectura y escritura. El valor predeterminado es 1.
Esta propiedad nos permite conocer cuantos registros estn en la memoria local. Si ponemos esta
propiedad por ejemplo a 10, al abrir la primera vez el objeto Recordset, el proveedor recupera los 10
primeros registros en la memoria local. A medida que se desplaza por el objeto Recordset, el proveedor
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 411

devuelve los datos desde el bfer de memoria local. Tan pronto como pasa del ltimo registro de la
memoria cach, el proveedor recupera los 10 registros siguientes desde el origen de datos y los carga
en la memoria cach.
Los registros recuperados desde la memoria cach no reflejan los cambios concurrentes que hagan
otros usuarios en el origen de datos. Para forzar una actualizacin de todos los datos en la memoria
cach, debe usarse el mtodo Resync.
Propiedad MaxRecords
Indica el nmero mximo de registros que se devuelven a un Recordset desde una consulta. Es un Long
y el valor predeterminado es 0, que significa sin lmite (Obtienen todos los registros). Esta propiedad es
de lectura y escritura cuando el recordset est cerrado, y solamente de lectura cuando est abierto.
Esta propiedad debe usarse solamente cuando se prev que se pueden obtener un nmero muy grande
de registros. Es prudente tomar medidas frente a aquellas operaciones en las que el ordenador pueda
meterse en un proceso excesivamente largo o que ocupe ms recursos de los disponibles. Estas cosas
son las que suelen colgar al ordenador y en las que es muy frecuente echarle luego la culpa a Windows
Si estamos frente a una base de datos con todos los datos de los afiliados a la Seguridad Social, no es
del todo prudente crear un recordset mediante esta sentencia:
SELECT * From Afiliados Where Apellido1 = Fernandez
Incluso las hay peores:
SELECT * From Afiliados
A nadie se le ocurrira, pero puede surgir involuntariamente cuando ese acceso se realiza desde un
puesto de operacin pblico (Acceso desde Internet por ejemplo). Con la propiedad MaxRecords puede
limitar el nmero de registros obtenidos. Posiblemente no llegue a obtener el dato deseado, y se vea en
la obligacin de realizar la misma consulta sucesivas veces hasta encontrarlo.
Propiedad CursorLocation
Establece o devuelve la posicin de un servicio de cursores. Es idntica a la propiedad del mismo
nombre vista ms atrs con todo detalle para el objeto Connection.
Propiedad CursorType
Indica el tipo de cursor que se usa en un objeto Recordset. Es de lectura y escritura si el recordset est
cerrado, y solo de lectura si est abierto. Puede tomar uno de los siguientes valores:
AdOpenForwardOnly Predeterminado. Idntico a un cursor esttico, excepto slo permite
desplazarse hacia delante en los registros. Esto mejora el rendimiento en situaciones en las que
slo se quiere pasar una vez por cada registro.
En muchas ocasiones es necesario moverse por el recordset hacia delante y hacia atrs. Este
tipo de cursor solamente permite moverse hacia delante. Tenga presente que este es el tipo
predeterminado.
AdOpenKeyset Cursor de conjunto de claves. Igual que un cursor dinmico, excepto que no se
pueden ver los registros que agregan otros usuarios, aunque los registros que otros usuarios
eliminan son inaccesibles desde su conjunto de registros. Los cambios que otros usuarios hacen
en los datos permanecen visibles.
AdOpenDynamic Cursor dinmico. Las incorporaciones, cambios y eliminaciones que hacen
otros usuarios permanecen visibles, y se admiten todo tipo de movimientos entre registros, a
excepcin de los marcadores si el proveedor no los admite. Es el equivalente en DAO al tipo
Dynaset
AdOpenStatic Cursor esttico. Una copia esttica de un conjunto de registros que se puede
usar para buscar datos o generar informes. Las incorporaciones, cambios o eliminaciones que
hacen otros usuarios no son visibles. Es el equivalente en DAO al tipo Snapshot
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 412

NOTA. Si un proveedor no admite el tipo de cursor solicitado, el proveedor puede que devuelva otro tipo
de cursor. La propiedad CursorType cambiar para coincidir con el tipo de cursor en uso cuando el
objeto Recordset se abra. Para comprobar la funcionalidad especfica del cursor devuelto, use el
mtodo Supports. Cuando cierre el Recordset, la propiedad CursorType volver a su configuracin
original.

Propiedad LockType
Indica el tipo de bloqueo que se pone en los registros durante el proceso de edicin. Establece tambin
si el recordset se actualiza registro a registro o por lotes. Este ltimo sistema permite realizar varios
cambios en el recordset y mantenerlos en la cach durante cierto tiempo, y proceder a la actualizacin
de todos los cambios pendientes en una sola operacin. Esto es muy importante cuando se est
trabajando con una base de datos situada en un servidor con un acceso lento (conexin va Internet, por
ejemplo)
Los valores de la propiedad LockType pueden ser:
AdLockReadOnly
Predeterminado. Slo lecturano puede modificar los datos
AdLockPessimistic
Bloqueo pesimista, registro a registro: el proveedor hace lo necesario
para asegurar la modificacin correcta de los registros, generalmente
bloqueando registros en el origen de datos durante todo el proceso de
modificacin. Este valor solamente es vlido si el cursor (Propiedad
CursorLocation) esta establecido a lado servidor.
AdLockOptimistic
Bloqueo optimista, registro a registro: el proveedor usa bloqueo
optimista, bloqueando registros slo cuando llama al mtodo Update.
AdLockBatchOptimistic
Actualizaciones optimistas por lotes: requerido para el modo de
actualizacin por lotes como contraposicin al modo de
actualizacin inmediata.
Propiedad EditMode
Indica el estado de modificacin del registro actual. Es solamente de lectura. Devuelve uno de las
siguientes constantes:
AdEditNone
Indica que no hay ninguna operacin de modificacin en ejecucin.
AdEditInProgress
Indica que los datos del registro actual se han modificado pero que no
se han guardado.
AdEditAdd
Indica que se ha invocado el mtodo AddNew y que el registro situado
actualmente en el bfer de copia es un nuevo registro que no se ha
guardado en la base de datos.
AdEditDelete
Indica que el registro actual se ha eliminado.

Propiedad Filter
Esta propiedad solamente la tienen los recordset ADO. Y es que ADO presupone que est obteniendo
datos de una base de datos alojada en un servidor y que la comunicacin entre servidor y cliente puede
ser especialmente lenta. Mediante Filter puede descartar registros que no cumplan una determinada
condicin. En realidad lo que hacemos mediante Filter es crear un nuevo Recordset a partir de otro
Recordset.
La propiedad Filter se utiliza tambin para actuar sobre determinados registros en varios mtodos del
recordset (Resync, Save, ) pero no se va a explicar en este manual la explicacin de la utilizacin de
esta propiedad en esos mtodos, ya que el nivel del programador que utiliza esos recursos debe ser
elevado. Le reservamos por tanto la posibilidad de conocerlo directamente desde la ayuda de Visual
Basic, que en este caso es bastante buena.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 413

De momento lo que vamos a hacer con Filter es crear un nuevo recordset Por qu no creamos
directamente el nuevo recordset utilizando una sentencia SQL que lleve implcito ese filtro?
Personalmente no me gusta utilizar la propiedad Filter, y prefiero crear un nuevo recordset. Creo que
solamente lo he usado para rellenar un MSHFlexGrid con parte de los datos del recordset que uso en
una parte de la aplicacin. Veamos un ejemplo:
(MiConexion es una conexin ya creada)
Dim RsInicial As ADODB.Recordset
Dim RsFiltrado As ADODB.Recordset
Set RsInicial = New ADODB.Recordset
Set RsFiltrado = New ADODB.Recordset
RsInicial.Open "Autores", MiConexion, adOpenDynamic, adLockOptimistic
Este es el recordset que uso para muchas cosas dentro de la aplicacin. Ahora quiero presentar en un
MSHFlexGrid solamente los datos de los autores de nacionalidad espaola. Filtro el recordset anterior
utilizando un criterio de igualdad de un campo: Nacionalidad
RsFiltrado = RsInicial.Filter (Nacionalidad = Espaola)
Ahora ya podemos aplicar este recordset al MSHFlexGrid:
Set MSHFlexG1.Recordset = RsFiltrado
Y cuando queremos presentar todos los autores, basta con poner la lnea:
Set MSHFlexG1.Recordset = RsInicial
Este es el nico ejemplo que puedo sacar de todas mis aplicaciones. Seguro que el alumno va a ver ms
aplicaciones de esta propiedad.
La propiedad Filter puede mostrar tambin aquellos registros que han sido manipulados recientemente,
mediante las constantes siguientes:
AdFilterNone

Quita el filtro actual y vuelve a poner todos los registros a la


vista.
AdFilterPendingRecords
Permite ver slo los registros que han cambiado, pero que no
han sido enviados an al servidor. Aplicable slo para el modo
de actualizacin por lotes.
AdFilterAffectedRecords
Permite ver slo los registros afectados por la ltima llamada a
Delete, Resync, UpdateBatch o CancelBatch
AdFilterFetchedRecords
Permite ver los registros de la cach actual, es decir, los
resultados de la ltima llamada para recuperar registros de la
base de datos
AdFilterConflictingRecords Permite ver los registros que fallaron en el ltimo intento de
actualizacin por lotes.

Propiedad Index
Indica el nombre del ndice que se utiliza actualmente en el Recordset. Es un String con el nombre del
ndice.
El ndice se utiliza para moverse a lo largo del recordset mediante el mtodo Move. El ndice ya debe
estar creado en la tabla de la base de datos.
Al utilizar un ndice, el orden de los registros se cambia al orden establecido en ese ndice. Por lo tanto,
los valores obtenidos anteriormente por la propiedad AbsolutePosition cambiarn completamente.
No todos los proveedores de datos aceptan la propiedad Index. Puede comprobarlo mediante el mtodo
Supports.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 414

Propiedad MarshalOptions
Esta propiedad se usa cuando estamos trabajando con cursores lado cliente. En este caso, como
vimos ms atrs, los registros del recordset estn en el equipo cliente. Todas las operaciones realizadas
sobre el recordset se realizan en el cliente, por lo tanto llegar el momento en que habr que actualizar
en el servidor los datos que hayamos modificado en el recordset que est en el equipo cliente. Mediante
esta propiedad podemos hacer que se enven al servidor todos los registros (filas) o solamente los que
han cambiado. Acepta estas dos constantes:
AdMarshalAll

Predeterminada. Indica que todos los registros se devuelven al


servidor.
AdMarshalModifiedOnly
Indica que slo los registros modificados se devuelven al
servidor.
Esta propiedad puede mejorar el rendimiento de la aplicacin para aquellos casos en los que se use un
canal de comunicacin lento.
Propiedad PageSize
Indica cuntos registros constituyen una pgina del objeto Recordset. Es de lectura y escritura. Devuelve
un Long y su valor predeterminado es 10.
Esta propiedad permite determinar cuntos registros componen una pgina lgica de datos. Al
establecer un tamao de pgina, puede utilizar la propiedad AbsolutePage y se mover al primer
registro de una pgina especfica. Esto es til en las situaciones de servidor Web cuando se desea
permitir que el usuario pase pginas de datos y vea cierto nmero de registros al mismo tiempo. Esta
propiedad se puede establecer en cualquier momento y su valor se utilizar para calcular la ubicacin del
primer registro de una pgina especfica.
Propiedad PageCount
Indica cuntas pginas de datos contiene el objeto Recordset. Es solamente de lectura. Devuelve un
Long. Si el objeto Recordset no admite esta propiedad, el valor ser -1 para indicar que no se puede
determinar el valor de PageCount.
Propiedad AbsolutePage
Especifica en qu pgina reside el registro actual. Es de lectura y escritura. Devuelve un Long o una de
las siguientes constantes:
AdPosUnknown
El objeto Recordset est vaco, la posicin actual se desconoce o el
proveedor no admite la propiedad AbsolutePage.
AdPosBOF

El puntero del registro actual est al comienzo del archivo (es decir, la
propiedad BOF tiene el valor True).

AdPosEOF
El puntero del registro actual est al final del archivo (es decir, la
propiedad EOF tiene el valor True).
Propiedad RecordCount
Indica el nmero actual de registros de un objeto Recordset. Devuelve un Long
Es posible que esta propiedad no la permita el proveedor de datos, o que no pueda llegar a averiguarse,
ya que dependiendo del tipo de cursor utilizado puede que no suministre ese dato.
Propiedad Source
Devuelve la tabla, consulta o sentencia SQL utilizado en el mtodo Open para crear el recordset. Es un
String.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 415

Propiedad State
Indica el estado (abierto, cerrado, proceso de ejecucin) en el que se encuentra el recordset. Devuelve
uno de los siguientes valores:
Constante

Descripcin
Valor predeterminado. Indica que el objeto est
adStateClosed
cerrado.
Indica que el objeto est abierto.
adStateOpen
Indica que el objeto Recordset se est
adStateConnecting
conectando.
Indica que el objeto Recordset est ejecutando un
adStateExecuting
comando.
Indica que se est obteniendo el conjunto de filas
adStateFetching
del objeto Recordset.
Puede tener una combinacin de valores. Por ejemplo, si se est ejecutando una instruccin, esta
propiedad tendr un valor combinado de adStateOpen y adStateExecuting.
Propiedad Status
Esta propiedad se refiere al registro actual. Indica el estado de este registro respecto a las operaciones
de actualizacin por lotes u otras operaciones masivas. No es una propiedad que se use todos los das.
Vea la ayuda para mas detalles.

Propiedades dinmicas del objeto recordset


Las propiedades anteriores se refieren a propiedades del recordset que se refieren a unas
caractersticas propias del recordset una vez creado. Son estas:
Unique Table, Unique Schema y Unique Catalog
Unique Table especifica la tabla sobre la que se permite realizar modificaciones de datos (Insertar o
actualizar), en el caso de que el recordset se haya creado mediante una operacin JOIN
Unique Schema indica el nombre del propietario de la tabla
Unique Catalog indica el nombre de la base de datos a la que pertenece la tabla. Estas dos ltimas
propiedades deben tener un valor para poder poner valor a la propiedad Unique Table. Estas
propiedades son tipo String
Estas propiedades dinmicas se anexan a la coleccin Properties del objeto Recordset al asignar el
valor adUseClient a la propiedad Cursor Location.

Mtodos del objeto Recordset de ADO


METODO Supports
Este mtodo es muy til para ver si un recordset acepta una determinada funcionalidad. Devuelve un
Booleano y es solamente de lectura. De esta forma puede consultar si un recordset admite el mtodo
MoveFirst, la propiedad AbsolutePosition, Bookmark, etc., antes de invocar ese mtodo o leer esa
propiedad, y evitar de esta forma un error en la ejecucin. Esto es muy til habida cuenta que no todos
los proveedores funcionan de la misma forma. Es por lo tanto muy prudente consultar si el Recordset
soporta una funcionalidad antes de pedrsela.
Estas funcionalidades se le pasan como parmetro mediante una de las siguientes constantes:
AdAddNew
Puede usar el mtodo AddNew para agregar nuevos registros.
AdApproxPosition
Puede leer y establecer las propiedades AbsolutePosition y
AbsolutePage.
AdBookmark
Puede usar la propiedad Bookmark para tener acceso a registros
especficos
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 416

AdDelete
Puede usar el mtodo Delete para eliminar registros.
AdHoldRecords
Puede recuperar ms registros o cambiar la posicin de recuperacin
siguiente sin efectuar todos los cambios pendientes.
AdMovePrevious
Puede usar los mtodos MoveFirst y MovePrevious, y los mtodos
Move o GetRows para desplazar hacia atrs la posicin del registro
actual sin que se requiera marcadores.
AdResync
Puede usar el mtodo Resync para actualizar el cursor con los datos
visibles en la base de datos subyacente.
AdUpdate
Puede usar el mtodo Update para modificar datos existentes.
AdUpdateBatch
Puede usar actualizacin por lotes (mtodos UpdateBatch y
CancelBatch) para transmitir grupos de cambios al proveedor.
AdIndex
Puede utilizar la propiedad Index para dar nombre a un ndice.
AdSeek
Puede utilizar el mtodo Seek para encontrar una fila en un Recordset.
En este ejemplo vemos la sintaxis de Supports:
If RsSeg.Supports(adApproxPosition) = True Then
MsgBox "SI"
Else
MsgBox "NO"
End If
Nota Aunque el mtodo Supports puede devolver True para una funcionalidad determinada, eso no
garantiza que el proveedor pueda hacer que la caracterstica est disponible bajo cualquier
circunstancia. El mtodo Supports devuelve simplemente si el proveedor puede admitir la funcionalidad
especificada, dando por supuesto que se renen determinadas condiciones. Por ejemplo, el mtodo
Supports puede indicar que un objeto Recordset admite actualizaciones aunque el cursor se base en
una unin de mltiples tablas, de las que algunas columnas no son actualizables.
El valor devuelto por el mtodo Supports depender del tipo de recordset elegido. En la siguiente tabla
puede ver el tipo de recordset y las constantes para las que va a devolver True:
AdOpenForwardOnly
AdOpenKeyset
AdOpenDynamic
AdOpenStatic

Ninguna
adBookmark, adHoldRecords, adMovePrevious, adResync
AdMovePrevious
adBookmark, adHoldRecords, adMovePrevious, adResync

Mtodo Open
Es el mtodo que ABRE el recordset. Este mtodo es el que busca los registros que han de rellenar el
recordset.
Sintaxis. Esta es la sintaxis general:
MiRecordset.Open Source, ActiveConnection, CursorType, LockType, Options
Un recordset puede abrirse partiendo de una conexin ya abierta. Pero tambin puede crearse
directamente, sin abrir previamente la conexin. Al final, deber aportar todos los datos necesarios para
determinar en que base de datos se abre ese recordset. Sobre que tabla, consulta o sentencia SQL.,
que tipo de cursor va a ser, etc. Lo que ocurre es que ADO es muy flexible y nos permite hacerlo de
varias formas, aunque todas ellas conducen a lo mismo.
Source (Opcional) Es el nombre de una tabla, consulta o sentencia SQL de la cual se obtienen los
registros del Recordset.
ActiveConnection (Opcional). Es el nombre de un objeto Connection abierto o una cadena de conexin
vlida. Esta cadena es la misma que la que emplearamos para abrir el objeto Connection.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 417

CursorType (Opcional). Un valor que determina el tipo de cursor que el proveedor debe usar al abrir el
Recordset. Puede ser una de las siguientes constantes
AdOpenForwardOnly
AdOpenKeyset
AdOpenDynamic
DAO)
AdOpenStatic

(Predeterminado) Abre un cursor de tipo slo avance.


Abre un cursor de tipo conjunto de claves.
Abre un cursor de tipo dinmico. (Igual que el Dynaset de
Abre un cursor de tipo esttico.

LockType (Opcional). Un valor que determina el tipo de bloqueo que debe usar el proveedor al abrir el
Recordset. Con este parmetro se le indica tambin si debe hacer las actualizaciones registro a registro
o en bloque. Puede ser una de las siguientes constantes
AdLockReadOnly
(Predeterminado) Slo lectura. No puede modificar los datos.
AdLockPessimistic
Bloqueo pesimista, registro a registro. El proveedor hace lo
necesario para asegurar una modificacin correcta de los
registros, normalmente bloqueando registros en el origen de
datos inmediatamente antes de la modificacin.
AdLockOptimistic
Bloqueo optimista, registro a registro. El proveedor usa
bloqueooptimista, bloqueando registros slo cuando se llama al
mtodo Update.
AdLockBatchOptimistic
Actualizaciones optimistas por lotes. Requeridas en el
modo de actualizacin por lotes en oposicin al modo
de actualizacin inmediata. (Actualizacin en bloque)
Options (Opcional). Constante que determina como va a evaluar el proveedor de datos el argumento
Source. Puede ser una de las siguientes constantes de esta lista.
AdCmdText
Indica que el proveedor debe evaluar Source como una definicin
textual de un comando.
AdCmdTable Indica que ADO debe generar una consulta SQL para devolver
todaslas filas de la tabla nombrada en Source.
AdCmdTableDirect
Indica que el proveedor debe devolver todas las filas de la
tabla nombrada en Source.
AdCmdStoredProc
Indica que el proveedor debe evaluar Source como un
procedimiento almacenado
AdCmdUnknown
Indica que el tipo de comando del argumento Source es
desconocido.
AdCmdFile
Indica que el Recordset guardado se debe restaurar desde el
archivo nombrado en Source.
AdAsyncExecute
Indica que Source se debe ejecutar de forma asncrona.
AdAsyncFetch
Indica que, tras alcanzar la cantidad inicial especificada en la
propiedad Initial Fetch Size, las filas restantes deben buscarse de
forma asncrona. Si se requiere una fila que no se
ha encontrado, se
bloquear el subproceso principal hasta que
se disponga de la fila solicitada.
AdAsyncFetchNonBlocking Indica que el subproceso principal nunca se bloquea
durante la bsqueda. Si no se encuentra la fila
solicitada, la fila actual se desplaza automticamente
al final del archivo.
Habr observado que hemos remarcado que el mtodo Open ABRE un recordset. No lo crea. El
recordset debe estar creado previamente. Qu cuando se crea? Mediante la instruccin:
Set MiRecordset = New ADODB.Recordset

Metodo Requery
Actualiza los datos de un objeto Recordset volviendo a ejecutar la consulta utilizada para abrirlo. Se
obtiene el mismo resultado que si se cerrara el recordset y se volviera a abrir.
Sintaxis
LSB

MiRecordset.Requery Opciones

Visual Basic Gua del Estudiante

Captulo 1

Pgina 418

Optiones Opcional. Mscara de bits que indica opciones que afectan a esta operacin. Si el valor de
este parmetro est establecido a adAsyncExecute, esta operacin se ejecutar de forma asncrona y
se emitir un evento RecordsetChangeComplete cuando concluya.

Mtodo Resync
Actualiza los datos del objeto Recordset actual. Este mtodo, a diferencia del mtodo Requery, no
vuelve a ejecutar el comando de creacin del recordset, sino que lee los registros existentes en el
recordset para actualizar su valor, pero no presenta aquellos registros que hubieran sido creados con
posterioridad a la apertura del recordset. Es ms rpido que el mtodo Requery, y en muchos casos
solamente nos interesa actualizar los registros sobre los que estamos trabajando.
Sintaxis

MiRecordset.Resync AffectRecords, ResyncValues

Los parmetros AffectRecords y ResyncValues determinan que registros se van a volver a leer y
sobreescribir. Vea la ayuda para mas detalles.

METODO AddNew
Crea un nuevo registro en un objeto Recordset actualizable.
Sintaxis

NombreDelRecordset.AddNew FieldList, Values

Los parmetros FieldList y Values son opcionales. En caso de ponerlos, FieldList sern los nombres de
los campos a los que se les va a poner un valor, y Values son los valores de cada uno de estos campos.
El orden nombre - valor debe mantenerse estrictamente.
Siempre recomendar que, en vez de meter los datos mediante estos parmetros, se metan
posteriormente linera a lnea, tal como se hizo siempre con los recordsets
NombreDelRecordset!NombredelCampo = ValorDelCampo

NombreDelRecordset(NombredelCampo) = ValorDelCampo
Esta segunda forma es necesaria cuando el nombre del campo tiene espacios. Nunca es recomendable
poner espacios en los nombres de campos, pero en caso de que existan, debe optar por utilizar la
sintaxis segunda, con los parntesis y comillas dobles.
No siempre se puede utilizar el mtodo AddNew. Puede comprobar si se puede utilizar, usando el
mtodo Supports visto anteriormente.
El mtodo AddNew convierte a este registro recin creado en registro actual. Pero este registro
solamente existe en el recordset. Para introducir los datos en la base de datos, (Y por lo tanto en el disco
duro) es necesario invocar el mtodo Update una vez introducidos todos los valores de los campos que
deseamos introducir. Con algn tipo de cursor es necesario tambin utilizar el mtodo Requery para
poder acceder al registro recin creado.
Si se invoca el mtodo AddNew mientras se est editando el registro actual, o durante otra operacin
AddNew, ADO invoca automticamente el mtodo Update para guardar los cambios. Vea ms adelante
los mtodos Update y UpdateBatch.

Mtodo Update
Guarda los cambios realizados en el registro actual de un objeto Recordset. Se utiliza tanto para
rematar una operacin de creacin de un registro iniciada con AddNew, como para guardar los nuevos
datos del registro actual (Recuerde que en ADO no existe el mtodo Edit, tal como ocurra en DAO)
.
Sintaxis
NombreDelRecordset.Update Fields, Values

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 419

En esta sintaxis, Fields y Values son opcionales, y solamente tienen aplicacin cuando se trata de
cambiar los valores del registro actual, no de terminar una operacin de creacin de un nuevo registro
mediante AddNew.
Vuelvo a recomendar lo anterior. Para cambiar los valores de varios campos de un registro, nos
colocaremos sobre ese registro, y sin invocar ningn mtodo, ejecutaremos este cdigo
MiRecordset!Campo1 = Valor1
MiRecordset!Campo2 = Valor2
.
MiRecordset!CampoN = ValorN
MiRecordset.Update
Pero en ADO pasa una cosa que no pasaba en DAO. Si cambiamos de registro una vez modificado el
valor de un registro, ADO invoca automticamente el mtodo Update. Por lo tanto, el cdigo siguiente:
MiRecordset!Campo1 = Valor1
MiRecordset!Campo2 = Valor2
.
MiRecordset!CampoN = ValorN
Tendr el mismo resultado que el anterior cuando cambiemos de registro actual. Esto puede ser bueno a
malo, pero personalmente pienso que no es prctico porque implica tener mucho ms cuidado que en
DAO. Hace lo mismo que cuando tenemos unos controles enlazados a datos mediante un control Data.
Si una vez que ejecutamos una lnea tal como esta
MiRecordset!Campo1 = Valor1
Queremos que ese nuevo valor no entre en la base de datos, debemos cancelarlo mediante el mtodo
CancelUpdate.

Mtodo UpdateBatch
Escribe en disco todas las actualizaciones pendientes de proceso por lotes. En ADO un recordset puede
actualizarse registro a registro o por lotes. Todo depender de cmo se ha abierto (Si el valor LockType
se ha puesto a AdLockBatchOptimistic)
Sintaxis

MiRecordset.UpdateBatch AffectRecords

AffectRecords Constante que determina a cuntos registros afectar el mtodo


UpdateBatch. Puede tomar uno de los siguientes valores.
AdAffectCurrent
Escribe solamente los cambios pendientes en el
registro actual.
AdAffectGroup
Escribe los cambios pendientes que cumplen el valor
de la propiedad Filter.
AdAffectAll
(Predeterminado) Escribe los cambios pendientes en
todos los registros del objeto Recordset.

Mtodo Cancel
Cancela la ejecucin del mtodo Open.
Sintaxis

NombreDelRecordset.Cancel

El mtodo Cancel solamente puede usarse si el mtodo Open fue invocado con la opcin
adAsyncConnect, adAsyncExecute o adAsyncFetch.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 420

Mtodo Delete
Elimina el registro actual o un grupo de registros. Por defecto elimina solamente el registro actual. Vea la
ayuda para ampliar los detalles respecto al parmetro opcional AffectRecords
Sintaxis

MiRecordset.Delete AffectRecords

Mtodo CancelUpdate
Habamos visto ms atrs que el ADO no existe el mtodo Edit. Para modificar un registro basta con
poner una instruccin tal como esta:
MiRecordset!MiCampo = MiNuevoValor
Y a continuacin rematar la operacin mediante el mtodo Update
MiRecordset.Update
Si por cualquier circunstancia se ha ejecutado la primera instruccin, y luego queremos volvernos atrs,
antes de ejecutar el mtodo Update debemos deshacer el cambio con el mtodo CancelUpdate, con lo
que el registro afectado recuperar nuevamente su valor original.
Sintaxis

MiRecordset.CancelUpdate

Recuerde que ADO funciona de forma distinta a DAO con estos mtodos de modificacin de los
registros. Recuerde que si est en proceso de modificacin de un registro (Ha ejecutado la primera lnea
del ejemplo anterior) y cambia de registro, por el hecho de cambiar de registro, ADO invoca
automticamente el mtodo Update.

Mtodo CancelBatch
Cancela una actualizacin por lotes pendiente. Es similar a la anterior, pero para actualizacin por lotes.
Sintaxis

MiRecordset.CancelBatch AffectRecords

Mtodo Clone
Crea un objeto Recordset duplicado a partir de un objeto Recordset existente. Opcionalmente, puede
especificarse que el nuevo recordset sea solamente de lectura
Sintaxis

Set rstDuplicate = rstOriginal.Clone (LockType)

(El objeto rstDuplicate debe estar declarado previamente como objeto ADODB.Recordset)
LockType puede tomar uno de los siguientes valores:
AdLockUnspecified
(Predeterminado) El recordset resultante tendr el mismo tipo de
bloqueo que el original.
AdLockReadOnly
El recordset creado es solamente de lectura.
El recordset resultante del mtodo Clone, aunque igual al original en el momento de su creacin, es
completamente independiente de este a partir de ese momento, por lo que las actualizaciones
efectuadas en el original no afectan al clonado.

Mtodo Move
Mueve la posicin del registro actual de un objeto Recordset
.
Sintaxis
MiRrecordset.Move NumRecords, Start
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 421

NumRecords Un valor Long con signo que especifica el nmero de registros que debe moverse a
partir de la posicin del registro actual o del registro especificado en el parmetro Start, si es que se
especifica.
Start Opcional. Un String o Variant cuyo resultado sea un marcador del tipo Bookmark. Puede utilizar
tambin una de las siguientes constantes:
AdBookmarkCurrent
AdBookmarkFirst
AdBookmarkLast

(Predeterminado) Cuenta a partir del registro actual


Cuenta a partir del primer registro
Cuenta a partir del ltimo registro

Mtodos MoveFirst, MoveLast, MoveNext y MovePrevious


Pasa al primer, ltimo, siguiente o anterior registro de un objeto Recordset especificado y lo convierte en
el registro actual. Funciona igual que en DAO
Tenga en cuenta a la hora de usar los mtodos Move que pueden existir Recordsets que no permiten el
movimiento hacia atrs.

Mtodo Find
Busca el primer registro del recordset que satisfaga los criterios especificados en el criterio de bsqueda.
Si se cumple el criterio de bsqueda, la posicin del recordset se establece en el primer registro
encontrado; si no, la posicin se establece al final del recordset.
Sintaxis

MiRecordset.Find (criterio, SkipRows, searchDirection, start)

criterio
Es el criterio de bsqueda. Por ejemplo Pais = Espaa siendo Pais el nombre del
campo en el cual buscamos el valor Espaa
SkipRows
(Opciopnal) Es un Long, cuyo valor predeterminado es cero, que especifica el nmero
de registros a partir del registro actual donde debe empezar la bsqueda.
searchDirection (Opcional) Un valor que especifica si la bsqueda se realiza en direccin al final del
recordset (adSearchForward) o en direccin hacia el principio del recordset (adSearchBackward). La
bsqueda termina al final o al principio del recordset, dependiendo del valor de searchDirection.
start
bsqueda.

(Opcional) Un marcador tipo BookMark que se utiliza como posicin inicial de la

El operador de comparacin de criterio puede ser ">", "<", "=", ">=" , "<=", "<>" (distinto de) o "like"
(coincidencia parcial de cadenas). El valor de comparacin puede ser una cadena, un nmero en coma
flotante o una fecha. Los valores de cadena estn delimitados con comillas sencillas (por ejemplo, "Pais
= 'Espaa'"). Los valores de fecha estn delimitados con signos "#" y con formato mm/dd/yy (por
ejemplo, "fecha_inicial > #7/22/97#"). Si el operador de comparacin es "like", el valor de la cadena
puede contener los caracteres comodn "*" o "_". (Funcionan de forma idntica, sustituyendo a cualquier
sucesin de caracteres.) No acepta el carcter ? (Por ejemplo, "Pais like Es_" o Pais Like Es*
encuentra Espaa y Estonia)

ADO no tiene los mtodos FindFirst, FindNext, FindPrevious y FindLast. Deber emplear el mtodo Find
de forma inteligente para implementar estos otros.

Mtodo Save
Este mtodo permite guardar el contenido de un Recordset en un fichero. Puede ser muy til cuando
queremos exportar ese recordset hacia otra aplicacin.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 422

Sintaxis

MiRecordset.Save FileName, PersistFormat

FileName es la ruta completa del fichero en el que se guardar el Recordset.


PersistFormat (Opcional). Un valor que especifica el formato en que se guardar el
Recordset. Puede ser una de las constantes siguientes.
AdPersistADTG
(Valor predeterminado) Se guarda en un formato propietario
(Advanced Data Tablegram). No es inteligible a simple vista,
pero genera ficheros bastante cortos.
AAdPersistXML
Se guarda en formato XML. Es un formato puramente en ASCII
donde pueden verse los nombres de los campos y su
contenido. Este formato genera ficheros ms grandes que el
ADT
Si el recordset tienen aplicado un filtro (Mediante la propiedad Filter) solamente guarda los registros que
deja ver ese filtro.
Si ya existe el fichero le dar un error. Cercirese que no existe (Mediante la funcin Dir) y brrelo antes
de volver a utilizar el mtodo Save.

Mtodo Seek
Este mtodo busca un registro desplazndose por el recordset a lo largo de un ndice o un conjunto de
ndices. La bsqueda mediante Seek es mucho ms rpida que con Find, ya que la realiza siguiendo el
ordenamiento de los registros segn un ndice.
Para poder usar el mtodo Index es necesario que el proveedor acepte ndices en el objeto recordset.
Esto ha llevado al autor a no poder presentar ningn ejemplo de este mtodo, ya que todas las bases de
datos ensayadas no permitan ndices. Puede ver si acepta ndices mediante el mtodo Supports:
If MiRecordset1.Supports(adIndex) = True Then
Vea la ayuda de VB para mayor informacin

Mtodo NextRecordset
Para entender este mtodo es necesario explicar previamente como se puede crear un recordset
compuesto.
Un recordset compuesto es un recordset que se crea concatenando sentencias SELECT, y cada una de
ellas crear, dentro del mismo Recordset, un recordset particular. Al crear el recordset, el recordset
particular que va a estar activo es el correspondiente a la primera sentencia SELECT. Mediante el
mtodo NextRecordset podemos ir avanzando a travs de los siguientes recordsets particulares. El
carcter de separacin entre las sentencias SELECT es el punto y coma ( ; )

MiRecordset1.Open "Select * From Regimenes; Select * From Regimen_Seguimiento Where Rs_Origen


= 'LSB'", MiConexionADO, adOpenDynamic, adLockOptimistic
(La instruccin anterior debe leerse como una sola lnea)
MiRecordset es un recordset compuesto. Toma datos de dos tablas distintas, pero podra haberlo hecho
solamente de una tabla con una condicin distinta en la SELECT.
Cuando se ejecuta esa lnea, el recordset actual es el correspondiente a la primera seleccin. (Select *
From Regimenes). Ejecutando el mtodo NextRecordset ese recordset primero se borra y pasa a ser
recordset actual el creado con la seleccin segunda (Select * From Regimen_Seguimiento Where
Rs_Origen = 'LSB'")
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 423

Set MiRecordset1 = MiRecordset1.NextRecordset


Puede usar tambin este recordset para crear un nuevo recordset a partir del primero
Set MiRecordset2 = MiRecordset1.NextRecordset
MiRecordset2 debe estar declarado como objeto recordset, y creado con la instruccin New:
Set MiRecordset2 = New ADOBD.Recodset

La coleccin Fields de un recordset ADO


Contiene todos los objetos Field de un objeto Recordset.

Un objeto Recordset tiene una coleccin Fields que contiene todos los objetos Field. Cada objeto Field
se corresponde a una columna del Recordset.
Vamos a ver aqu un truco que nos permite ADO. Podemos crear un recordset Sin necesidad de una
base de datos!
Cuando estudiamos el objeto recordset vimos que el recordset se crea con una instruccin como esta:
Set MiRecordset1 = New ADODB.Recordset
Ahora ya podemos abrir el recordset leyendo los datos desde una base de datos. Utilizamos para ello el
mtodo Open del recordset:
MiRecordset1.Open "Select * From Regimenes", MiConexionADO, adOpenDynamic, adLockOptimistic

Mediante el mtodo Open lo que hace el recordset es conocer su estructura (Que campos tiene,
propiedades de estos campos, etc) y el valor de cada uno de los campos de sus registros. Qu pasara
si en vez de abrir el recordset le vamos aadiendo objetos Field a su coleccin Fields? Lo hacemos
mediante el mtodo Append:
MiRecordset1.Fields.Append "MiCampo1", adBigInt
MiRecordset1.Fields.Append "MiCampo2", adChar, 25
MiRecordset1.Fields.Append "MiCampo3", adBSTR
Lo que ocurre es que el recordset ya tiene tres campos, el primero de nombre MiCampo1, numrico
Long, el segundo, un string de 25 caracteres de nombre MiCampo2, y el tercero, de nombre MiCampo3,
una cadena de caracteres de longitud indefinida, terminada en un carcter nulo. Ya tenemos una
estructura de un recordset sin necesidad de haber ledo la base de datos. No es necesario por lo tanto
que exista una tabla o consulta almacenada con esa estructura. Ahora podemos abrir el recordset:
MiRecordset1.Open
Lo abrimos sin pasarle ningn parmetro. Ahora ya est abierto y podemos trabajar con el como con un
recordset cualquiera. Recuerde que al principio est vaco.
MiRecordset1.AddNew
MiRecordset1!MiCampo1 = 34
MiRecordset1!MiCampo2 = "Gua del Estudiante"
MiRecordset1!MiCampo3 = "Hola mi amor" & vbCrLf & "Yo soy tu lobo"
MiRecordset1.Update
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 424

Ya tenemos un registro dentro del recordset. Podemos introducirle tantos registros como queramos, y
luego movernos por el recordset mediante los mtodos Movexxxx. Ahora podremos leer el contenido del
registro actual:
Label1 = MiRecordset1!MiCampo1
Label2 = MiRecordset1!MiCampo2
Label3 = MiRecordset1!MiCampo3
El resultado del cdigo de el ejemplo se traducir en algo como esto:

Y ahora vienen lo mejor. Para que queremos un recordset que no tienen datos ledos desde una base
de datos? Las aplicaciones de esto solamente est limitadas por la imaginacin. Pienso, por ejemplo, en
introducir en un recordset todos los datos ledos de un fichero de configuracin, y as tener todos esos
datos disponibles durante toda la aplicacin, en vez de en variables, como
MiRecordset!MiDato1
Es una idea, pero piense que esto no regala nada. El espacio de memoria consumido ser similar a si
usa variables. Pero posiblemente estar ms cmodo y ms inteligible su cdigo.
Veamos los mtodos de la coleccin Fields

Mtodo Append
Agrega un campo a una coleccin Fields de un Recoprdset.
Sintaxis

MiRecordset.Fields.Append Name, Type, DefinedSize, Attrib

Name Un String con el nombre del nuevo objeto Field, que tiene que ser nico dentro de la coleccn
Fields.
Type

Tipo de datos que va a contener ese campo. Puede tomar uno de estos valores:

adArray
adBigInt
adBinary
adBoolean
adByRef
adBSTR
adChar
adCurrency

adDate
adDBDate
adDBTime
adDBTimeStamp
adDecimal
LSB

Se une en una instruccin OR lgica con otro tipo para indicar que los
datos son una matriz segura de ese tipo (DBTYPE_ARRAY).
Un entero con signo de 8 bytes (DBTYPE_I8).
Un valor binario (DBTYPE_BYTES).
Un valor Boolean (DBTYPE_BOOL).
Se une en una instruccin OR lgica con otro tipo para indicar que los
datos son un puntero a los datos del otro tipo (DBTYPE_BYREF).
Una cadena de caracteres terminada en nulo (Unicode)
(DBTYPE_BSTR).
Un valor de tipo String (DBTYPE_STR).
Un valor de tipo Currency (DBTYPE_CY). Un valor Currency es un
nmero de coma fija con cuatro dgitos a la derecha del signo decimal.
Se almacena en un entero con signo de 8 bytes en escala de 10.000.
Un valor de tipo Date (DBTYPE_DATE). Un valor Date se almacena
como un valor de tipo Double; la parte entera es el nmero de das
transcurridos desde el 30 de diciembre de 1899 y la parte fraccionaria
es la fraccin de un da.
Un valor de fecha (aaaammdd) (DBTYPE_DBDATE).
Un valor de hora (hhmmss) (DBTYPE_DBTIME).
Una marca de fecha y hora (aaaammddhhmmss ms una fraccin de
miles de millones) (DBTYPE_DBTIMESTAMP).
Un valor numrico exacto con una precisin y una escala fijas

Visual Basic Gua del Estudiante

Captulo 1

Pgina 425

adDouble
adEmpty
adError
adGUID
adIDispatch
adInteger
adIUnknown
adLongVarBinary
adLongVarChar
adLongVarWChar
adNumeric
adSingle
adSmallInt
adTinyInt
adUnsignedBigInt
adUnsignedInt
adUnsignedSmallInt
adUnsignedTinyInt
adUserDefined
adVarBinary
adVarChar
adVariant
adVector

adVarWChar
adWChar

(DBTYPE_DECIMAL).
Un valor de coma flotante de doble precisin (DBTYPE_R8).
No se ha especificado ningn valor (DBTYPE_EMPTY).
Un cdigo de error de 32 bits (DBTYPE_ERROR).
Un identificador nico global (GUID) (DBTYPE_GUID).
Un puntero a una interfaz Idispatch de un objeto OLE
(DBTYPE_IDISPATCH).
Un entero firmado de 4 bytes (DBTYPE_I4).
Un puntero a una interfaz Iunknown de un objeto OLE
(DBTYPE_IUNKNOWN).
Un valor binario largo (slo para el objeto Parameter).
Un valor largo de tipo String (slo para el objeto Parameter).
Un valor largo de tipo String terminado en nulo (slo para el objeto
Parameter).
Un valor numrico exacto con una precisin y una escala exactas
(DBTYPE_NUMERIC).
Un valor de coma flotante de simple precisin (DBTYPE_R4).
Un entero con signo de 2 bytes (DBTYPE_I2).
Un entero con signo de 1 byte (DBTYPE_I1).
Un entero sin signo de 8 bytes (DBTYPE_UI8).
Un entero sin signo de 4 bytes (DBTYPE_UI4).
Un entero sin signo de 2 bytes (DBTYPE_UI2).
Un entero sin signo de 1 byte (DBTYPE_UI1).
Una variable definida por el usuario (DBTYPE_UDT).
Un valor binario (slo para el objeto Parameter).
Un valor de tipo String (slo para el objeto Parameter).
Un tipo Variant de automatizacin (DBTYPE_VARIANT).
Se une en una instruccin OR lgica con otro tipo para indicar que los
datos son una estructura DBVECTOR, tal como est definida por OLE
DB, que contiene un contador de elementos y un puntero a los datos
del otro tipo (DBTYPE_VECTOR).
Una cadena de caracteres Unicode terminada en nulo (slo para el
objeto Parameter).
Una cadena de caracteres Unicode terminada en nulo
(DBTYPE_WSTR).

DefinedSize
string)

Un Long que define el tamao del campo si fuese necesario. (Por ejemplo para un

Attrib

(Opcional). Especifica los atributos del campo a aadir. Puede tomar estos valores:

adFldMayDefer
adFldUpdatable
adFldUnknownUpdatable
adFldFixed
adFldIsNullable
adFldMayBeNull
adFldLong

adFldRowID

adFldRowVersion
adFldCacheDeferred
LSB

Indica que el campo se aplaza, es decir, los valores del campo no se


recuperan del origen de datos con todo el registro, sino solamente
cuando se tiene acceso explcito a los mismos.
Indica que se puede escribir en el campo.
Indica que el proveedor no puede determinar si se puede escribir en el
campo.
Indica que el campo contiene datos de longitud fija.
Indica que el campo acepta valores Null.
Indica que se pueden leer valores Null del campo.
Indica que se trata de un campo binario largo. Tambin indica que se
pueden utilizar los mtodos AppendChunk y GetChunk.
Indica que el campo contiene un identificador de fila persistente en el
que no se puede escribir y que no tiene ningn valor significativo
excepto la identificacin de la fila (como por ejemplo un nmero de
registro, un identificador nico, etc.).
Indica que el campo contiene algn tipo de marca de hora o de fecha
que se utiliza para efectuar actualizaciones.
Indica que el proveedor almacena los valores del campo en la memoria
cach y que las lecturas siguientes se efectan en dicha memoria .

Visual Basic Gua del Estudiante

Captulo 1

Pgina 426

Mtodo Delete
Tericamente elimina un objeto de la coleccin Fields.
Sintaxis

Fields.Delete Field

Field
Un Variant que designa el objeto Field que se va a eliminar. Este parmetro tiene que ser el
nombre del objeto Field; no puede ser una posicin ordinal o el propio objeto Field.
Comentarios
La llamada al mtodo Fields.Delete en un Recordset abierto provoca un error de ejecucin.
(Como ha ocurrido en otras ocasiones, al autor le ha sido imposible ejecutar este mtodo con los
resultados esperados)

Mtodo Item
Sintaxis

MiRecordset.Fields.Item (Index)

Devuelve el elemento de la coleccin Fields especificado en el ndice. Devuelve el objeto, por lo tanto, y
sobre ese objeto, podemos obtener las propiedades que deseemos. En el ejemplo siguiente,
introducimos los nombres de todos los campos en un ComboBox llamado ComboCampos
Dim MM As String, I As Integer
For I = 0 To MiRecordset1.Fields.Count - 1
MM = MiRecordset1.Fields.Item(I).Name
ComboCampos.AddItem MM
Next I

Mtodo Refresh
Aunque la coleccin Fields tiene este mtodo, la verdad es que no tienen efectos visibles sobre esa
coleccin.

Propiedades de la coleccin Fields


Propiedad Count
Devuelve el nmero de campos de la coleccin Fields. Es un Long.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 427

El Objeto Command
Un objeto Command es la definicin de un comando especfico que se piensa ejecutar contra un origen
de datos. Mediante un objeto Command podemos crear un recordset, pero recuerde que un recordset lo
podemos tambin crear directamente.
Utilice un objeto Command para consultar una base de datos y obtener registros en un objeto
Recordset, para aadir o eliminar registros, ejecutar una operacin de manejo masivo de datos o para
manipular la estructura de una base de datos.
Propiedades del Objeto Command
Propiedad ActiveConnection
Indica a qu objeto Connection pertenece actualmente el objeto Command. Es un string con el nombre
de la conexin.
Propiedad CommandText
Contiene el texto del comando que se quiere emitir al proveedor. Es un string. Suele ser una instruccin
SQL, un nombre de tabla o un procedimiento almacenado, o cualquier otra instruccin que reconozca el
proveedor. El valor predeterminado es una cadena vaca.
Propiedad CommandTimeout
Especifica el intervalo de espera para que se ejecute un comando antes de que finalice el intento y se
genere un error. Es un Long que indica en segundos ese tiempo. El valor predeterminado es 30.
Propiedad CommandType

(IMPORTANTE)

Indica el tipo de un objeto Command. Esta propiedad se usa para optimizar la evaluacin de la propiedad
CommandText, ya que de esta forma el proveedor no tiene que perder tiempo examinando si es una
instruccin SQL, un procedimiento almacenado o un nombre de tabla. Si el valor de esta propiedad es
adCmdUnknown (valor predeterminado), estamos forzando al proveedor a que realice esa investigacin
lo que provocar probablemente un descenso en su rendimiento. Si sabe qu tipo de comando est
usando, el establecimiento de la propiedad CommandType instruye a ADO a que vaya directamente al
cdigo relevante. Si la propiedad CommandType no coincide con el tipo de comando de la propiedad
CommandText, ocurre un error cuando llama al mtodo Execute.
Valores posibles
AdCmdText

Indica que es una definicin textual de un comando o una llamada a un


procedimiento almacenado.

AdCmdTable

Indica que es un nombre de tabla cuyas columnas se devuelven todas


mediante una consulta SQL generada internamente.

AdCmdTableDirect
Indica que es un nombre de tabla en la que se devuelven todas las
columnas.
AdCmdStoredProc

Indica que es un nombre de procedimiento almacenado

AdCmdUnknown
Predeterminado. El tipo de comando de la propiedad CommandText
es desconocido.
AdCmdFile

Evala CommandText como el nombre de archivo de un valor


Recordset persistente.

AdExecuteNoRecords Indica que es un comando o un procedimiento almacenado que no devuelve


filas (por ejemplo, un comando que slo inserta datos). Si se recupera alguna fila, se descarta y no se
devuelve. Siempre se combina con adCmdText o adCmdStoredProc.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 428

Propiedad Prepared
Es un Booleano que indica si se debe guardar una versin compilada de un comando antes de su
ejecucin. Esta propiedad fuerza al proveedor a guardar una versin preparada (compilada) de la
consulta especificada en la propiedad CommandText antes de la primera ejecucin de un objeto
Command. Esto puede disminuir el rendimiento de la primera ejecucin de un comando, pero cuando el
proveedor haya compilado el comando, utilizar la versin compilada del mismo para las ejecuciones
siguientes, lo cual aumentar el rendimiento.
Si el proveedor no admite la preparacin del comando, puede devolver un error cuando esta propiedad
se establezca a True. Si no devuelve un error, simplemente ignora la solicitud de preparar el comando y
establece la propiedad Prepared a False.
Propiedad State
Describe el estado del objeto: abierto o cerrado. Devuelve un Long o una constante: adStateClosed o
adStateOpen

Mtodos del Objeto Command


Mtodo Execute

(IMPORTANTE, ms bien diramos, el objetivo del Command)

Ejecuta la consulta, la instruccin SQL o el procedimiento almacenado especificado en la propiedad


CommandText. Devuelve un recordset o modifica la base de datos.
Sintaxis
Para un Command que devuelva filas:
Set recordset = command.Execute(RecordsAffected, Parameters, Options)
Para un Command que no devuelva filas:
command.Execute RecordsAffected, Parameters, Options
command es el nombre del Objeto Command
RecordsAffected Opcional. Una variable Long en la que el proveedor devuelve el nmero de registros
afectados por la operacin.
Parameters Opcional. Una matriz Variant con los valores de los parmetros pasados con una
instruccin SQL. (Los parmetros de salida no devuelven valores correctos cuando se pasan en este
argumento).
Options Opcional. Un valor Long o una constante. Acepta estos valores
adCmdText

Indica que el proveedor tiene que evaluar CommandText como


definicin textual de un comando, como una instruccin SQL.
adCmdTable
Indica que ADO tiene que generar una consulta SQL para devolver
todas las filas de la tabla mencionada en CommandText.
adCmdTableDirect
Indica que el proveedor tiene que devolver todas las filas de la tabla
mencionada en CommandText.
AdCmdStoredProc
Indica que el proveedor tiene que evaluar CommandText como
procedimiento almacenado.
adCmdUnknown
Indica que el tipo de comando en CommandText es desconocido.
adAsyncExecute
Indica que el comando se tiene que ejecutar de forma asncrona.
adAsyncFetch Indica que el resto de las filas siguientes a la cantidad inicial especificada en la
propiedad CacheSize tiene que ser recuperada de forma asncrona.
Mtodo Cancel
Cancela la ejecucin de una llamada asncrona pendiente al mtodo Execute
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 429

Sintaxis

NombredelObjetoCommand.Cancel

Utilice el mtodo Cancel para terminar la ejecucin de una llamada asncrona a un mtodo Execute (es
decir, el mtodo fue invocado con la opcin adAsyncExecute o adAsyncFetch).

Comandos parametrizados.
Los objetos Command pueden utilizar parmetros. De esta forma, podemos construir una consulta
utilizando la interrogacin (?) como comodn. As cada vez que ejecutemos el comando, V.B. se
encargar de sustituir el comodn por los parmetros asociados a dicho command. Adems podemos
utilizar los parmetros para recoger los valores devueltos por un Procedimiento almacenado en la base
de datos. Para entender mejor este tipo de consultas primero veremos qu es el objeto parameter.

Ejemplo de la utilizacin de Command


Veamos un ejemplo de cmo usar el Objeto Command. Pero previamente vamos a ver un cdigo del
que hemos partido para hacer ver al alumno que ADO permite hacer las cosas de muchas maneras.
Este cdigo mete los datos de un documento en una base de datos Oracle, leyendo previamente el
nmero ms alto del documento para poner al nuevo documento un nmero igual al ltimo + 1.:
Declaraciones
Dim ConexBDPrensa As ADODB.Connection
Dim RsBDPrensa1 As ADODB.Recordset
Dim StrIntroducir As String, NumeroDocumento as long
Rem Se abre un objeto Connection para crear sobre l el recordset
Set ConexBDPrensa = New ADODB.Connection
ConexBDPrensa.ConnectionString = "Provider=MSDAORA.1; & _
User ID=INTRANET;Password=INTRANET;Data Source=intranet; & _
Persist Security Info=False"
ConexBDPrensa.Open

Rem Se abre un recordset para leer el nmero, se lee y se vuelve a cerrar


RsBDPrensa1.Open "Int_Documentos Order By CL_DOC", ConexBDPrensa,
adLockOptimistic
RsBDPrensa1.MoveLast
NumeroDocumento = RsBDPrensa1!CL_DOC
NumeroDocumento = NumeroDocumento + 1
RsBDPrensa1.Close

adOpenDynamic,

(* Este es el punto donde cambia el cdigo que ver ms adelante)


Rem Se introduce en una variable tipo String una instruccin para aadir un nuevo registro
Rem Esa instruccin se va a ejecutar desde el objeto Connection mediante su mtodo Execute

StrIntroducir = "Insert Into INT_DOCUMENTOS " & _


"(CL_DOC,NOM_DOC,TITULO_DOC,AUTOR_DOC,CL_TEMA_DOC,CL_DPT_DOC, & _
CL_TIPO_DOC,FICH_DOC,FECHA_EMISION_DOC,ULTIMA_HORA_DOC, & _
VISIBLE_DOC) Values (" & NumeroDocumento & ",'" & TbTitulo & "','" & TbTitulo & _
"','" & TbTitulo.Tag & "',19,2,1,'" & HRefPrensa & "/" & TbNombFichTIF & "','" & Date & "',0,1)"
Rem Observe que los valores tipo string introducidos (TbXXX) van entre comilla simple
Rem Se ejecuta esa instruccin desde el objeto Connection ConexBDPrensa
ConexBDPrensa.Execute StrIntroducir
Rem Se cierra el Objeto Connection
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 430

ConexBDPrensa.Close
Rem Aqu termina la operacin de crear un nuevo registro
MsgBox "Documento enviado"
Este es el cdigo real de una aplicacin que introduce los datos el resumen de prensa diario en una base
de datos. Se introduce un nuevo registro en la tabla INT_DOCUMENTOS. El resumen de prensa es un
fichero .Tiff de nombre TbNombFichTIF que se mete en una carpeta del servidor mediante FTP, y para
su loccalizacin y presentacin en una pgina Web es necesario introducir su nombre y Path y otros
datos en una base de datos. Los campos que se introducen y los valores de cada uno son:
Campo

Valor

CL_DOC,
NumeroDocumento
(Long calculado)
NOM_DOC
TbTitulo
(String contenido en TbTitulo.Text)
TITULO_DOC
TbTitulo
(String contenido en TbTitulo.Text se repite-)
AUTOR_DOC
TbTitulo.Tag
(String contenido en TbTitulo.Tag)
CL_TEMA_DOC
19
(Integer, dato fijo)
CL_DPT_DOC
2
(Integer, dato fijo)
CL_TIPO_DOC
1
(Integer, dato fijo)
FICH_DOC
HRefPrensa & "/" & TbNombFichTIF Un string que indica el nombre
del fichero (TbNombFichTIF.Text) y su carpeta (Variable HrefPrensa)
FECHA_EMISION_DOC
Date
(Fecha actual)
ULTIMA_HORA_DOC 0
(Byte, dato fijo)
VISIBLE_DOC
1
(Byte, dato fijo)

Esta forma de introducir los datos, mtodo que los lingistas especializados en la jerga informtica
llaman a capn, es la que nunca falla. Exige un poco de cdigo, con muchas probabilidades de
equivocarse, pero muchas veces se prefiere esta forma de meter datos a utilizar el mtodo AddNew.
Tiene la gran ventaja de que la acepta cualquier base de datos, independientemente de donde est el
cursor. Habr observado que utilizamos el mtodo Execute del objeto Connection. Y as funciona
perfectamente. Vamos a hacer lo mismo, pero introduciendo la cadena de caracteres un objeto
Command, (Que pertenece al mismo objeto Connection sobre el que ahora hemos ejecutado el
Execute) y vamos a ejecutar el Execute de ese Command. Se da cuenta que estamos haciendo lo
mismo? El nuevo cdigo creado a partir del anterior es el siguiente:
(* Este es el mismo punto de antes. Aqu comienza el cambio del cdigo)
Dim MiComando As ADODB.Command
Set MiComando = New ADODB.Command
MiComando.ActiveConnection = ConexBDPrensa
MiComando.CommandText = "Insert Into INT_DOCUMENTOS " _
&
"(CL_DOC,NOM_DOC,TITULO_DOC,AUTOR_DOC,CL_TEMA_DOC,CL_DPT_DOC,CL_TIPO_DOC,FI
CH_DOC,FECHA_EMISION_DOC,ULTIMA_HORA_DOC,VISIBLE_DOC) " _
& "Values (" _
& NumeroDocumento & ",'" & TbTitulo & "','" & TbTitulo & "','" & TbTitulo.Tag & "',19,2,1,'" & HRefPrensa
& "/" & TbNombFichTIF & "','" & Date & "',0,1)"
MiComando.Execute
ConexBDPrensa.Close
ADO le permite hacer las cosas de maneras muy distintas, pero siempre debe aportar la misma
informacin. En este caso ha visto que el objeto Command no hace falta para nada. Entonces, para
que existe? La respuesta es sencilla: facilita la comprensin del cdigo. Pero que el objeto Command
no le perjudique precisamente eso, la comprensin del cdigo. No se preocupe de no ser estrictamente
acadmico. Este humilde autor nunca usa Command excepto para explicarlo. ADO nos permite eso.
Vamos a ver ahora cmo haramos esto mismo con el mtodo AddNew.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 431

Deberemos crear un recordset. Lo primero, lo declaramos:


Dim RsBDPrensa as ADODB.Recodset
Luego lo creamos:
Set RsBDPrensa = New ADODB.Recordset
Lo abrimos. Pero primero tomamos la precaucin de poner la propiedad CursorLocation del Objeto
Connection a adUseClient (Lado cliente) y de esta forma los cursores creados para los recordsets
abiertos sobre ese objeto connection estarn del lado cliente. Si el cursor est de lado servidor es
posible que no nos deje usar el mtodo AddNew. (Vea Nota 1)
ConexBDPrensa.CursorLocation = adUseClient
Abrimos el Recordset:
RsBDPrensa.Open "Int_Documentos", ConexBDPrensa, adOpenDynamic, adLockOptimistic
Ejecutamos el mtodo AddNew
RsBDPrensa.AddNew
Metemos los datos
RsBDPrensa!CL_DOC = NumeroDocumento
RsBDPrensa!NOM_DOC = TbTitulo
RsBDPrensa!TITULO_DOC = TbTitulo
RsBDPrensa!AUTOR_DOC = TbTitulo.Tag
RsBDPrensa!CL_TEMA_DOC = 19
RsBDPrensa!FECHA_EMISION_DOC = Date
RsBDPrensa!CL_DPT_DOC = 2
RsBDPrensa!CL_TIPO_DOC = 1
RsBDPrensa!FICH_DOC = HRefPrensa & "/" & TbNombFichTIF
RsBDPrensa!VISIBLE_DOC = 1
RsBDPrensa!ULTIMA_HORA_DOC = 0
Rematamos con el mtodo Update
RsBDPrensa.Update
Cerramos el recordset.
RsBDPrensa.Close
Cerramos la conexin
ConexBDPrensa.Close
Nota 1. Muchos programadores se rinden cuando ven que no les funciona los mtodos AddNew /
Update para introducir nuevos datos. Cierto es que cada base de datos se comporta de forma distinta
respecto a este mtodo. Pero antes de rendirse y usar el cdigo a capn intente ver como tienen la
propiedad CursorLocation, el tipo de recordset abierto y el tipo de bloque elegido (Recuerde que por
defecto es de solo lectura). Eso s, el mtodo a capn funciona siempre (Excepto que sea solo lectura),
independientemente del bloqueo y del tipo de cursor

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 432

El Control Data de ADO - (Adodc ADO Data Control)


Este captulo parece que quedaba un poco corto. No por el nmero de pginas, sino porque tanto en
DAO como en RDO nos explayamos con el control Data, y en ADO parece que solamente lo hemos visto
de pasada para explicar cmo se compone la cadena de conexin. Vemoslo un poco ms en
profundidad.
El control Data para ADO es el Microsoft ADO data control 6.0 (OLEDB) que se encuentra en
Proyecto | Componentes. La apariencia es similar a la del Data de DAO

Hagamos un repaso de sus propiedades. Veremos solamente aquellas que son especficas de ADO:

Propiedad BOFAction.
Establece la forma de proceder cuando llega a la fila anterior a la primera. Toma uno de estos valores:
0 adDoMoveFirst
1 adDoStayBOF

Vuelve a la primera fila


Permanece en la fila BOF

Propiedad CommandType
Es idntica a la misma propiedad del objeto Command. Acepta los valores:
AdCmdText

Indica que es una definicin textual de un comando o una llamada a un


procedimiento almacenado.

AdCmdTable

Indica que es un nombre de tabla cuyas columnas se devuelven todas


mediante una consulta SQL generada internamente.

AdCmdStoredProc

Indica que es un nombre de procedimiento almacenado

AdCmdUnknown
Predeterminado. El tipo de comando de la propiedad CommandText
es desconocido.

Propiedad ConnectionString
Esta propiedad ya le hemos visto ms atrs. Es la cadena de conexin con la base de datos.

Propiedad CursorLocation
Es la misma que la vista para el objeto Recordset.

Propiedad CursorType
Es la misma que para el objeto Recordset. Acepta los valores:
1 adOpenKeyset
2 - adOpenDynamic
3 adOpenStatic

Propiedad EOFAction
Establece la forma de proceder cuando llega a la fila EOF. Acepta los valores:
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 433

0 adDoMoveLast
1 adStayEOF
2 adDoAddNew

Vuelve a la ltima fila


Permanece en la fila EOF
Aade una nueva fila

Propiedad LockType
Tipo de Bloque. Igual a la misma propiedad del Objeto Recordset

Propiedad MaxRecords
Es similar a la del Objeto Recordset. Establece el nmero de filas que obtiene en su recordset asociado.

Propiedad Mode.
Igual a la misma propiedad del objeto Recordset

Propiedades Password
Establece la contrasea para crear la cadena de conexin durante la creacin del objeto Recordset
asociado. Esta contrasea es la contrasea del usuario en la base de datos.
Esta propiedad es solamente de escritura. Si se pretende leer da error.

Propiedad UserName
Establece el nombre del usuario. Debe ser uno de los usuarios registrados en la base de datos. Esta
propiedad es de lectura y escritura. El valor de la propiedad Password debe ser el asociado a este
usuario.

Propiedad RecordSource
Es una cadena de caracteres con el nombre de una tabla o una sentencia SQL que devuelve filas.

Mtodos del control Adodc


UpdateControls
Actualiza la informacin de los controles enlazados a datos. No existe el mtodo UpdateRecords.

Refresh
Vuelve a construir el recordset. Es idntico al del control Data de DAO.

Vistas ya las propiedades y mtodos del control Adodc, vamos a ver un poco como funciona y cuales son
sus diferencias con el control data de DAO

Funcionamiento del Adodc


El Adodc puede enlazar una base de datos a los tpicos controles enlazados (Label, TextBox) usando la
tecnologa ADO. Los dems controles enlazados no tienen un comportamiento igual con el Adodc,
Control Data o RDODataControl. En la siguiente lista puede ver que controles trabajan con uno u otro
control Data.

Control

ADO

RDO

DAO

Referencia

DBGrid
DataGrid

NO
SI

SI
NO

SI
NO

Microsoft Data Bound Grid Control 5.0 SP3


Microsoft DataGrid Control 6.0 (OLEDB)

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 434

DataList
DataCombo
DBList
DBCombo
MSFlexGrid
MSHFlexGrid

SI
SI
SI
SI
NO
SI

SI
SI
SI
SI
SI
NO

SI
SI
SI
SI
SI
NO

Microsoft Data List Controls 6.0 (OLEDB)


Microsoft Data List Controls 6.0 (OLEDB)
Microsoft Data Bound List Controls 6.0
Microsoft Data Bound List Controls 6.0
Microsoft FlexGrid Control 6.0
Microsoft Hierarchical FlexGrid Control 6.0 (OLEDB)

Por lo dems el funcionamiento del Adodc es similar al Control data y al RDODataControl.

Con este captulo creo que ya tienen conocimientos suficientes para empezar a trabajar con ADO, y por
la tanto, ya tiene permiso para aprender a programar con esta tecnologa. Le recomiendo paciencia, y
sobre todo no tener miedo a esta tecnologa. Y como se dijo al principio, sela siempre que tenga que
usar una base de datos instalada en un servidor y conectada al usuario a travs de una red de rea
local. En el prximo captulo ver como se enlazan un cliente con el servidor SQL Server.
De cualquier forma no olvide la tecnologa DAO para sus pequeas aplicaciones, con la base de datos
en el mismo ordenador que la aplicacin. Personalmente creo que es mucho ms rpida y ms sencilla.
Suerte.

Agradecimientos. En este captulo particip activamente mi alumno del CEU Csar Moreno Fernndez.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 435

Visual Basic - Gua del Estudiante Cap. 15


Apuntes finales sobre bases de datos y Visual Basic

Bases de Datos SQL Server y Oracle


Las bases de datos ms conocidas de las utilizadas en plataforma Windows son posiblemente Oracle y
SQL Server. Cualquier programador conoce al menos unas de ellas. Queremos explicar aqu los pasos
que hay que realizar para poder ver la base de datos y trabajar con ella desde Visual Basic.
Una base de datos de esta categora va a estar instalada con toda seguridad en un servidor, y accederemos a ella
desde otro ordenador, que ser el cliente. Puede estar instalada si lo desea en el mismo ordenador, pero en ese caso
deber tratarlo como si su ordenador trabajase al tiempo como servidor y como cliente.
La instalacin de la base de datos dentro del servidor es bastante compleja, y no se va a explicar en este curso. Se
supone que el suministrador de la BD explicar como hacerlo. La instalacin de SQL Server exige que se haga
sobre un PC o Net Server que tenga Windows 2000 Server (o NT Server), sistema operativo que no se suele
instalar en los PCs de cliente y mucho menos en los PC domsticos. Oracle dispone de una versin con
prestaciones algo reducidas que le permite instalarla en un puesto con Windows 98, en configuracin monousuario,
circunstancia que permite hacer pruebas de funcionamiento en PCs particulares, pero que no es la instalacin tpica
que puede existir en una organizacin o empresa. Nos referiremos siempre en este captulo a la instalacin
convencional, de un servidor donde se aloja la base de datos, y una serie de puestos clientes conectados a l
mediante Red de Area Local.
En la base de datos es necesario introducir los nombres de usuario que estn permitidos, y la clave de acceso para
cada usuario. Lgicamente para que un puesto pueda acceder a la BD debe conocer su nombre de usuario y la clave
de acceso. Estos datos normalmente se introducen en el cliente en su configuracin, y no es necesario teclearlas
cada vez que se inicia una sesin.
La configuracin del sistema de la base de datos es la de cliente - servidor.
El servidor tiene un programa que es el Gestor de la Base de Datos. La base de datos propiamente dicha estar
formada por uno o ms ficheros con los datos que tienen introducidos y la estructura de tablas, consultas e ndices
que tenga. El programa gestor es quien controla estos ficheros y puede obtener de ellos los datos en una forma
adecuada.
El cliente necesita tener un programa que ser el que se comunique con el programa gestor que est en el servidor.
Este programa lo realiza el mismo fabricante de la base de datos y se distribuye en el mismo disco que el programa
servidor y el resto del sistema. A esta parte de la aplicacin cliente servidor que se instala en cada cliente se le
llama Componentes de Conectividad. Y la misin de estos componentes de conectividad es servir de intermediario
entre el gestor de la base de datos instalado en el servidor, y el programa que en el equipo cliente va a manejar los
datos de esa base de datos. Este programa que va a manejar los datos puede ser el Administrador Corporativo de
SQL Server, el Developper 2000 de Oracle, o una aplicacin realizada por nosotros en Visual Basic. Pero el
funcionamiento es siempre el mismo, el programa que va a manejar los datos en el cliente conecta con el programa
Componentes de Conectividad y es este quien conecta con el Gestor de la Base de Datos para que realice la
operacin que tenga que realizar y le devuelva, si ha lugar, la informacin extrada de la base de datos. Por lo tanto
para poder trabajar desde un cliente con la base de datos, es necesario que en el servidor est corriendo el programa
gestor de la base de datos, y en el cliente, que estn instalados los componentes de conectividad.
Los componentes de conectividad, tal como se dijo ms atrs, estn fabricados por el mismo fabricante de la BD,
pero no se extrae si encuentra algn programa fabricado por otro fabricante. Para Oracle hay varios fabricantes que
han realizado un producto de este tipo. No es difcil, ya que al tratarse de una aplicacin cliente servidor, lo nico
importante es el protocolo de comunicacin entre el programa gestor de la BD y los componentes de conectividad.
Vea el capitulo correspondiente a aplicaciones cliente servidor para ms detalles.

Instalacin de los componentes de conectividad para SQL Server


Para instalar los componentes de conectividad de SQL Server en un puesto cliente basta con introducir el disco de
distribucin de SQL Server y dejar que se ejecute el Autorun.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 436

Se le indica que instale el servidor de bases de datos. Al darse cuenta que no tiene Windows 2000, dice que no
puede instalar ms que los componentes del cliente.

Deje que siga la instalacin aceptando todos los aviso que se produzcan. Llegar a esta ventana:

SQL Server tiene dos discos, Standard y Profesional. El Profesional le permite hacer instalaciones en equipos
remotos, y en ese caso estara la opcin Equipo Remoto habilitada. No es nuestro caso, ya que solamente debemos
instalar en el equipo local. Siga la instalacin en la que en sucesivas ventanas le aparecer la opcin: Crear una
nueva instancia de SQL Server o instalar herramientas de cliente. Acepte esa opcin. A continuacin le pide el
nombre y contrasea. Se refiere a la del equipo, no al de la base de datos. Acepte. Llegar a la ventana siguiente:

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 437

En esta ventana puede elegir instalar Solo conectividad (es lo que necesita para que un programa realizado en visual
basic funcione), Solo herramientas cliente (le instalar, adems de la conectividad, el Administrador Corporativo,
Analizador de consultas, y otras herramientas de SQL Server. El Administrado Corporativo es la interfase que SQL
Server suministra para ver la base de datos, tanto la estructura como los datos. No es necesario para que funcione
una aplicacin realizada en Visual Basic, que lo nico que necesita es conectarse a travs de los Componentes de
Conectividad.
Vaya aceptando todas las ventanas y la instalacin terminar con xito.
Una vez instalada la conectividad debe asegurarse que desde el cliente ve al servidor y que no est cerrado el paso
al puerto 1433 mediante algn Firewall u otro dispositivo. Ya puede trabajar con la base de datos SQL Server.
Posiblemente le surja una pregunta Contra que base, en qu servidor, con qu usuario y clave de acceso? Con lo
Ud. ponga en el programa de Visual Basic en la propiedad ConnectionString del objeto Connection de ADO. Vea
un ejemplo real:
ConexRAEN.ConnectionString = "Provider=SQLOLEDB.1;Password=lsuarez;Persist Security Info=True;User
ID=lsuarez;Initial Catalog=Ayudas_M;Data Source=seae_sql"
Aqu tienen todos los datos necesarios para conocer todas las preguntas que se haca antes:
Provider=SQLOLEDB.1
Nombre del proveedor de datos
Data Source=seae_sql
Nombre del servidor donde est la base de datos.
Initial Catalog=Ayudas_M Nombre de la base de datos contra la que se abre la conexin.
User ID=lsuarez
Nombre de Usuario
Password=lsuarez
Clave de acceso
Persist Security Info=True

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 438

Instalacin de la conectividad de Oracle


Para instalar la conectividad de Oracle ocurre algo parecido a SQL Server. Le recomiendo que se
instruya adecuadamente con los manuales de Oracle para su correcta instalacin. No es complicado,
pero este autor no conoce Oracle como SQL Server.
Con el disco Oracle 7 Client Software
(He empleado la versin 7.3.4.0.0)
introduzca el CD-Rom y deje que se
ejecute el Autorun. Le aparecer esto.
Acepte

Le pide el idioma:
Le
van
apareciendo
sucesivas ventanas en
una le pide el directorio
donde quiere instalar el
programa, en otra le pide
permiso para cambiar
una lnea del Autoexec,
etc. Acepte los valores
hasta que la instalacin
se haya realizado por
completo.

Una vez terminada ver que le ha creado una carpeta llamada Orant que puede ver
expandida en esta figura.
En \Orant\Network\Admin tiene un fichero llamado Sqlnet.Ora que contienen algo
como esto.
AUTOMATIC_IPC = OFF
TRACE_LEVEL_CLIENT = OFF
names.directory_path = (TNSNAMES)
names.default_domain = world
name.default_zone = world
Fjese en la lnea
names.directory_path = (TNSNAMES)
Esta lnea indica que el fichero TNSNAMES.ORA que est en la misma carpeta
contiene el fichero de configuracin de SQL Net. Contiene varios ejemplos, que le
pueden servir para configurar la conexin a su servidor.
El contenido de ese fichero en mi PC es esto:

#Este es un fichero de Configuracin de SQL*Net generado por la Configuracin Rpida de SQL*Net.


#Atencin: No modifique este fichero.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 439

#Si lo hace, la Configuracin Rpida de SQL*Net puede no funcionar correctamente.


Tcp-loopback.world =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(COMMUNITY = tcp.world)
(PROTOCOL = TCP)
(Host = 127.0.0.1)
(Port = 1521)
)
)
(CONNECT_DATA = (SID = ORCL)
)
)
Beq-Local.world =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(COMMUNITY = beq.world)
(PROTOCOL = BEQ)
(PROGRAM = oracle73)
(ARGV0 = oracle73ORCL)
(ARGS = '(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))')
)
)
(CONNECT_DATA = (SID = ORCL)
)
)
Intranet.world =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(COMMUNITY = tcp.world)
(PROTOCOL = TCP)
(Host = 10.3.22.4)
(Port = 1521)
)
(ADDRESS =
(COMMUNITY = tcp.world)
(PROTOCOL = TCP)
(Host = 10.3.22.4)
(Port = 1526)
)
)
(CONNECT_DATA = (SID = SEUE2)
)
)

La parte que afecta a la aplicacin en la que me conecto con Oracle es la que comienza por la linea:
Intranet.world =
Los datos son reales. Pero he de manifestar que no conozco Oracle tan bien como para explicarlo, y que la
instalacin la hizo personal de una distribuidora de Oracle. De cualquier forma puede verse que est definiendo la
conexin Intranet , que tienen el Host en la direccin 10.3.22.4 y el puerto de comunicacin es el 1521, con una
segunda alternativa en el puerto 1526.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 440

Le recomiendo que si su caso es una conexin a Oracle se informe mejor de la configuracin de sus clientes. Es de
suponer que los tcnicos de Oracle le resuelvan las grandes dudas que le pueden surgir por las escasa explicaciones
de este cursode Visual Basic.
Visual Basic con el que se escribi estas lneas para crear una conexin ADO con esa base de datos:
Set ConexBDPrensa = New ADODB.Connection
ConexBDPrensa.ConnectionString = "Provider=MSDAORA.1;User ID=INTRANET; & _
Password=INTRANET;Data Source=intranet;Persist Security Info=False"
ConexBDPrensa.Open
El parmetro Data Source=intranet es el que emplea la conectividad de Oracle para buscar en el fichero
TNSNAMES.ORA la direccin del Host y el puerto empleado.
Puede darse cuenta que tanto en SQL Server como en Oracle estamos empleando conexiones ADO. Podra hacerse
tambin mediante RDO, creando un enlace ODBC (Para poder crear ese enlace ODBC tambin es necesario instalar
previamente la conectividad). Pero ODBC es una tecnologa que ya est considerada obsoleta, por lo que
prescindimos de cualquier ejemplo.
Se sale necesariamente de este curso una explicacin ms profunda de estas dos bases de datos.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 441

Visual Basic - Gua del Estudiante Cap. 16


CONTROLES AVANZADOS DE VISUAL BASIC
Este captulo pretende ampliar el conocimiento de ciertos controles introducidos con la versin 6 de VB,
que, aunque ya son de uso habitual en cualquier aplicacin, se salen un poco de los conceptos
estudiados en los controles de los captulos 1 y 2. Vienen generalmente como un paquete OCX que
contiene varios de ellos.
Se estudian algunos de los paquetes distribuidos por Microsoft, sean o no fabricados por esta compaa.
Sera interminable comentar los paquetes realizados por casas especializadas, controles de gran
calidad, normalmente caros y para aplicaciones especficas dentro del mbito comercial en el que se
mueve la empresa que lo realiza. Existen tambin gran cantidad de controles realizados por particulares,
con la mejor intencin, que se pueden encontrar en Internet distribuidos de forma gratuita. Son
desaconsejables. No porque no funcionen, sino simplemente porque no ofrecen ningn tipo de garanta,
estn normalmente sin informacin de funcionamiento, y en caso de problemas no se puede recurrir a
nadie para resolverlos. Una aplicacin profesional nunca deber llevar un control shareware.
Paquete MSCOMCTL.OCX
Este paquete se denomina Microsoft Windows Common Controls 6.0 Contiene los siguientes controles:
TabStrip

Es un control de pestaas. Pero este control no hace de contenedor de otros controles,


por lo que hay que introducir un control Frame o PictureBox por cada una de las
pestaas. No es prctico. Utilice en su lugar el SSTab.

Fig. 16.1 Aspecto del TabStrip


ToolBar

Este es el control que presenta una barra de tareas. Es configurable, pudiendo poner los
botones que queramos con el icono apropiado. Es el control que el alumno introduce por
norma en sus primeras aplicaciones. Luego se va dando cuenta de que hay cosas
mejores y ms simples. (Un Picture Box con varios controles Image).Se coloca
automticamente en la parte superior del formulario.
Fig. 16.2 ToolBar con cuatro botones

StatusBar
Similar al anterior, pero para la barra de estado
en la parte inferior del formulario. Personalmente, creo que es ms til que el anterior.
Puede presentar automticamente algunos parmetros del PC (Bloq. Maysculas, Bloq.
Nmeros, Hora, Fecha) o el texto que se desee.
Fig. 16.3

StatusBar
ProgressBar

Es la tpica barra de progreso de Windows.


Fig. 16.4

Slider
LSB

Es un control que permite introducir valores mediante un cursor


Visual Basic Gua del Estudiante

Captulo 1

Pgina 442

Fig. 16.5
Los controles anteriores se parecen a otros similares ya explicados en los captulos anteriores, y la
profundizacin en sus propiedades y mtodos no va a ser problema para el alumno sin ms
explicaciones. Reservemos el tiempo de estudio para lo interesante, que es lo que viene ahora
ImageList

Es un almacn de imgenes. Este control es necesario para poder poner imgenes en el


resto de los controles de este paquete. Se pueden usar varios controles ImageList dentro
del mismo formulario, y con la propiedad ImageList de cada control utilizar uno u otro en
cada uno de los controles que se usen en el mismo formulario. Ya se ha visto en un
captulo anterior, pero ampliaremos aqu los detalles de su funcionamiento.

TreeView

Es un control que permite presentar de forma grfica datos estructurados de forma


jerrquica, pudiendo usar grficos y textos para presentarlos.

ListView

Es un control que permite presentar datos en una lista, utilizando para ello grficos y
texto, con cuatro disposiciones distintas.

ImageCombo Es como un combo convencional, pero en este se pueden insertar tambin grficos y hacer
sangras independientes para cada elemento.

Estos cuatro ltimos controles se explican a continuacin con detalle.

Control ImageList
Es un almacn de imgenes. Se representa en la caja de herramientas de esta
Fig. 16.6

forma:

En tiempo de ejecucin no tiene presentacin grfica. No tiene eventos y solamente un Mtodo.


Como todos los controles de este paquete, tiene un cuadro de propiedades personalizado que facilita la
introduccin de las mismas.
El cuadro de propiedades tiene tres pestaas, de las cuales solamente tienen importancia dos de ellas:
General e Imgenes. La tercera se refiere a los colores que en este caso no tienen funcin alguna. Las
pestaas pueden verse en las figuras 16.7 y 16.8

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 443

Fig. 16.7 Pestaa General.


En esta pestaa se elige el ancho y alto de la imagen. Es importante esto a la hora de presentar los
iconos sobre un ListView o TreeView, ya que el tamao con el que aparecen en estos controles es
precisamente el elegido en esta pestaa. Mediante el uso de dos ImageList, uno con imgenes de 32 x
32 y otro, con las mismas imgenes, pero de 16 x 16, podemos cambiar el tamao de los iconos en los
controles ListView o TreeView. Este truco es la nica solucin para poder poner iconos grandes o
pequeos en el TreeView. Para cambiar el tamao es necesario que el ImageList no tenga cargada an
ninguna imagen.
Fig. 16.8 Pestaa de Imgenes

En esta se pueden introducir las imgenes que vamos a utilizar en los controles que tengan asociado
este ImageList. Es importante citar la propiedad Key de cada imagen, que sirve para elegir la imagen.
Una imagen de un ImageList se puede elegir mediante su ndice (El ndice va de 1 a n, siendo n el
nmero de imgenes), pero eso puede llevarnos a error, ya que dice muy poco el nmero de la imagen
dentro del ImageList, adems de que ese nmero puede variar si introducimos posteriormente una
imagen nueva en una posicin central. Podemos utilizar para definir la imagen el texto que
introduzcamos en la propiedad Key. Por ejemplo, en la figura anterior, la imagen que presenta una
interrogacin tiene el valor Question, valor que expresa de forma inconfundible el contenido de esa
imagen, y que es inalterable sea cual sea la posicin que ocupa esa imagen en el ImageList. De esta
forma, para poner esa imagen en el nodo nmero 1 del TreeView1 basta con poner:
TreeView1.Nodes(1).Image = "Question"
Otras propiedades y mtodos del control ImageList
Propiedad ListImages. Esta propiedad representa al conjunto de imgenes del control ImageList.
Pueden introducirse ms imgenes en tiempo de ejecucin, utilizando el mtodo Add sobre esta
propiedad, cuya sintaxis es la siguiente:
ImageList.ListImages.Add Index, Key, Picture
Por ejemplo:
ImageList1.ListImages.Add 6, "Imagen1TE", Picture1.Picture
(Se ha introducido en la coleccin ListImages la imagen que tienen el Picture1 como imagen con Index =
6 y con Key = Imagen1TE)
Tambin se puede vaciar un ImageList usando el mtodo Clear:
ImageList1.ListImages.Clear
Propiedad MaskColor
Devuelve o establece el color que se usa para crear las mscaras de un control ImageList.
Sintaxis
LSB

ImageList.MaskColor = color

Visual Basic Gua del Estudiante

Captulo 1

Pgina 444

Esta propiedad se usa en el mtodo Overlay. La propiedad MaskColor determina qu color de una
imagen ser transparente en el mtodo Overlay. Slo es aplicable cuando la imagen del ImageList es
un BMP
Mtodo Overlay
Dibuja una imagen utilizando dos imgenes de la coleccin ListImages de un control ImageList, y pone
esa imagen dentro de un control
Sintaxis

Control.Picture = ImageList.Overlay (ndice1, ndice2)

Donde Indice1 e Indice2 son la propiedad Index o la propiedad Key de la imagen que
se va a superponer (Indice1) y de la imagen sobre la que se va a superponer la
primera (Indice2). Control es un control capaz de contener una imagen (Picture,
Image, Formulario)
Antes de utilizar el mtodo Overlay deberemos poner un valor a la propiedad MaskColor. (La
transparencia de un color solamente va a funcionar cuando vamos a superponer dos imgenes en
formato BMP)
Control TreeView.
Es un control que permite presentar datos que estn estructurados de forma jerrquica. Los datos se
pueden presentar como un texto, acompaados de un icono que determina el tipo de dato. Puede por
ejemplo presentar el organigrama de una empresa, mostrando los departamentos que la componen, y
dentro de estos, las personas que pertenecen a cada departamento, y para cada persona, su nmero de
telfono, fax, E-Mail y domicilio, y todos ellos, representados con un icono. Al hacer doble clic sobre un
icono se despliegan los
elementos que existen bajo
ese icono. Volviendo a hacer
doble clic, se ocultan. Es lo
ms
parecido
al
funcionamiento
del
explorador de Windows.

Fig. 16.9 TreeView mostrando seis nodos, a la izquierda con iconos grandes y a la derecha con iconos
pequeos.
La vista de la Fig. 16.9 nos lleva a la primera idea acerca del TreeView: los Nodos. En cualquier
estructura jerrquica, un elemento tiene contenido en s mismo, pero de l pueden depender otros
elementos. Esto nos lleva al concepto de Nodo. En el TreeView los datos se presentan mediante nodos.
El conjunto de todos los nodos es la coleccin Nodes. Esta coleccin como cualquier coleccin en
visual basic tiene sus propiedades y mtodos.
Para empezar, la coleccin Nodes tiene el mtodo Add. De esta forma ya podemos introducir nodos en
el TreeView. Tambin tienen los mtodo Remove, para eliminar uno de los nodos, y Clear, para eliminar
todos los nodos del TreeView.
El TreeView tiene varios estilos de presentacin. Puede presentar los datos solamente con textos, con
texto y un icono, con un signo + para indicar que ese nodo tiene elementos bajo l, puede tener
lneas o no. El estilo de presentacin lo elegimos mediante la propiedad Style del TreeView.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 445

Propiedad Style.
Determina el estilo de presentacin del TreeView. Es de lectura y escritura
Sintaxis
NombredelTreeView.Style = Nmero
(Establece el estilo)
Nmero = NombredelTreeView.Style
(Devuelve el estilo)
El parmetro Nmero puede ser un nmero del 0 al 7. El estilo correspondienta a cada valor es:
0 = Slo Texto
1 = Imagen y Texto
2 = +/- y Texto
4 = Lneas y texto
5 = Lneas, imagen y Texto
7 = Lneas, +/-, Imagen y Texto (Valor predeterminado)

3 = +/- imagen y texto


6 = Lneas, +/- y texto

Con lo visto hasta ahora ya podemos ver cmo introducimos nodos en un TreeView. Para poder
introducir nodos con grficos, es necesario poner en el mismo formulario, un control ImageList con todas
las imgenes que queremos poner en los nodos (Observe en la Fig. 16.8 que contiene todos los iconos
que aparecen en la Fig. 16.9 Izda.) En ese ImageList hay que poner a cada imagen un valor en su
propiedad Key (En la Fig. 16.8, la imagen correspondiente a la carpeta cerrada tiene en su propiedad
Key la cadena Cerrado, la imagen con una carpeta abierta, Abierto, la correspondiente al sobre tiene
Sobre y la cara, Cara. Ya podemos introducir los nodos mediante el mtodo Add:
Mtodo Add para la coleccin Nodes de un TreeView
Aade un nodo a la coleccin Nodes de un TreeView
Para aadir un nodo, primero debemos declarar una variable tipo Node. (Dim MiNodo As Node)
A continuacin ejecutar el mtodo Add, que tiene la siguiente Sintaxis
Set VariableTipoNode =
NombredelTreeView.Nodes.Add (RelativoA, TipodeRelacion, Key, Texto, Imagen1, Imagen2)
Donde:
VariableTipoNode es la variable declarada como tipo Node (MiNodo en el ejemplo)
NombredelTreeView es el nombre del TreeView
RelativoA es el Key o el Index del nodo del cual depender este nodo que estamos introduciendo. Si el
nodo no va a pertenecer a ningn otro (caso del nodo Raiz) este valor se deja en blanco, pero recuerde
que debe poner la coma de separacin. Lgicamente el nodo indicado en este parmetro ya debe estar
introducido antes de introducir este.
TipodeRelacion es un valor o constante que determina la situacin del nodo respecto al nodo indicado
en el parmetro RelativoA. Vea ms abajo los valores aceptados en este parmetro.
Key es una cadena de caracteres que define a este nodo. Esta cadena de caracteres debe ser nica, es
decir, no se puede repetir en dos o ms nodos. Debe empezar por letra, aunque puede contener
nmeros.
Texto es el texto que va a figurar en el nodo. Es un parmetro obligado.
Imagen1 es la propiedad Index o Key de la imagen que queremos poner en el nodo. Este Index o Key es
el que tiene esa imagen en el control ImageList asociado a este TreeView. Imagen1 es la imagen que
mostrar el TreeView para ese nodo cuando ese nodo NO est seleccionado.
Imagen2 es la propiedad Index o Key de la imagen que queremos que aparezca en ese nodo cuando
est seleccionado. Si no se pone este parmetro, la imagen del nodo cuando est seleccionado, es la
misma que cuando no lo est.
Los valores para TipoRelacion pueden ser:
Constante
Valor Descripcin
TvwFirst
0
Primero. El objeto Node se sita antes de todos los dems nodos al
mismo nivel que el especificado en RelativoA
TvwLast
1
Ultimo. El objeto Node se sita despus de todos los dems nodos al
mismo nivel que el especificado en RelativoA. Los objetos Node que se agregan
secuencialmente se irn situando detrs del ltimo agregado.
TvwNext
2
(Predeterminado) Siguiente. El objeto Node se sita despus del
especificado en RelativoA.
TvwPrevious 3
Anterior. El objeto Node se sita antes del especificado en RelativoA
TvwChild
4
Secundario. El objeto Node es secundario con respecto al
nodoespecificado en RelativoA.
El Index de la coleccin Nodes comienza a numerar por el 1. Cada vez que se aade un nodo, el
Index de ese nodo ser el Index del ltimo + 1, independientemente de la posicin que va a
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 446

ocupar ese nodo dentro del TreeView. No controlamos directamente esta propiedad. Por eso, es
mucho ms prctico definir a los nodos mediante su propiedad Key.
Ya estamos en condiciones de rellenar un TreeView con varios nodos. El cdigo para colocar los nodos
de la figura 16.9 es: (El nombre del TreeView es TreeV1)
Dim MiNodo As Node Declaramos la variable tipo Node
TreeV1.Style = 7
Hacemos que el estilo sea Lneas, +/-, Imagen y Texto
Set MiNodo = TreeV1.Nodes.Add(, , "R", "Raz") No tienen parmetro RelativoA
Los siguientes nodos,dependen del nodo Raiz, que tiene Key = R
Set MiNodo = TreeV1.Nodes.Add("R", tvwChild, "C1", "Secundario 1", "Cerrado")
Set MiNodo = TreeV1.Nodes.Add("R", tvwChild, "C2", "Secundario 2", "Cerrado")
Set MiNodo = TreeV1.Nodes.Add("R", tvwChild, "C3", "Secundario 3", "Sobre")
Set MiNodo = TreeV1.Nodes.Add("R", tvwChild, "C4", "Secundario 4", "Cerrado")
El siguiente nodo depende de Secundario 4, que tienen Key = C4, y adems tiene un icono
distinto (Question) para cuando est seleccionado.
Set MiNodo = TreeV1.Nodes.Add("C4", 4, "C4b", "Terciario C41" , "Cara", "Question")
Ahora se introduce una propiedad a cada uno de los nodos todava no explicada: la imagen que
va a tener cuando ese nodo est expandido, es decir, cuando se ven los nodos que dependen
de l. Vea que se le pone un valor a esta propiedad incluso a los nodos que no tienen otros
nodos que dependan de ellos.
TreeV1.Nodes(1).ExpandedImage = "Abierto"
TreeV1.Nodes(2).ExpandedImage = "Abierto"
TreeV1.Nodes(3).ExpandedImage = "Abierto"
TreeV1.Nodes(4).ExpandedImage = "Abierto"
TreeV1.Nodes(5).ExpandedImage = "Abierto"
TreeV1.Nodes(6).ExpandedImage = "Abierto"
Y ahora otra propiedad no explicada. Con esto hacemos que se vean todos los nodos.
MiNodo.EnsureVisible
El resultado de este cdigo es la Fig. 16.9. Y la Fig. 16.10
es lo que pasa cuando se selecciona el nodo cuyo texto
es Terciario C41. Observe en el cdigo que al introducir
este nodo habamos puesto un parmetro ms,
precisamente, el de la imagen que tendr cuando est
seleccionado.

Fig. 16.10
Propiedades de la coleccin Nodes del TreeView
Propiedad ExpandedImage
Establece la imagen del nodo cuando est expandido, es
decir, cuando se ven los nodos que dependen de l. Es la
propiedad Index o Key que tiene esa imagen en el control
ImageList asociado al TreeView.
Sintaxis
NombredelTreeView.Nodes(Index).ExpandedImage = Valor
Donde Valor puede ser, o bien el Index o el Key de la imagen en el ImageList asociado al TreeView.
Propiedad Expanded
Devuelve o establece un valor que determina si un objeto Node de un control TreeView se encuentra
expandido o contrado. Es una propiedad Booleana
Sintaxis

NombredelTreeView.Nodes(Index).Expanded = True/False

Esta propiedad puede usarse para expandir por programa un objeto Node. Si un objeto Node no
tiene nodos secundarios, el valor de esta propiedad se pasa por alto.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 447

Propiedad Children
Devuelve el nmero de objetos Node secundarios contenidos en un objeto Node. Esta propiedad es
solamente de lectura.
Sintaxis

VariableNumerica = NombredelTreeView.Nodes(Index).Children

Propiedad FullPath
Devuelve la ruta completa de un objeto Node. El valor devuelto es una cadena de caracteres que es el
resultado de concatenar el texto de la propiedad Text del objeto Node referenciado con los valores de
las propiedades Text de todos sus predecesores. El valor de la propiedad PathSeparator del TreeView
determina el delimitador utilizado para separar el Text de uno y otro nodo.
Sintaxis

NombredelTreeView.Nodes(Index).FullPath

Esta propiedad puede usarse en el procedimiento NodeClick del TreeView, que ya pasa como
parmetro el nodo sobre el que hemos hecho click:
Private Sub TreeV1_NodeClick(ByVal Node As MSComctlLib.Node)
VariableTipoString = Node.FullPath
End Sub
Propiedad Count
Devuelve el nmero de elementos de la coleccin Nodes
Sintaxis

VariableNumerica = NombredelTreeView.Nodes.Count

Propiedades Child, FirstSibling, LastSibling, Previous, Parent, Next y Root


Estas propiedades devuelven una referencia a otro objeto Node. Con esa referencia que nos devuelve,
podremos conocer los valores de las propiedades del nodo cuya referencia nos devuelve (Text, Key,
FullPath, etc)
Sintaxis

NombredelTreeView.Nodes(Index).Xxxx

Donde Xxxx es la propiedad deseada de las mencionadas.


Dependiendo de la propiedad, nos devuelve la referencia de:
Child
FirstSibling
LastSibling
Previous
Next
Parent
Root

Primer elemento secundario


Primer nodo del mismo nivel
Ultimo nodo del mismo nivel
Nodo anterior del mismo nivel
Siguiente nodo del mismo nivel
Nodo primario (Nodo del que depende)
Nodo Raiz

Propiedad Key
Esta propiedad establece o devuelve una cadena de caracteres que identifica unvocamente a un nodo.
Esta propiedad se le asigna normalmente durante la creacin de ese nodo mediante el mtodo Add, pero
puede cambiarse posteriormente por programa.
La propiedad Key puede usarse para nombrar al nodo, al tratarse de una cadena nica. No puede haber
dos nodos con el mismo Key. Si la cadena no es nica, se produce un error.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 448

Sintaxis

NombredelTreeView.Nodes(Index).Key = cadena

Es muy prudente usar la propiedad Key para "autodocumentar" su proyecto de Visual Basic si asigna
nombres significativos a los objetos de una coleccin.
Propiedad Sorted
Esta propiedad la tiene tanto el control TreeView como la coleccin Nodes. Si esta propiedad est a True
en el TreeView, se ordenan alfabticamente los elementos de nivel superior de la coleccin Nodes.
Cada elemento de la coleccin Nodes puede tener su propiedad Sorted a True. En este caso, los nodos
que dependen de ese nodo estarn ordenados por orden alfabtico.
Puede tener nodos con la propiedad Sorted = True, y otros con esa propiedad = False.
Propiedad Image
Establece la imagen que presenta un nodo. El valor de esta propiedad es, o bien el Index de la
imagen dentro del ImageList asociado al TreeView, o su propiedad Key.
Sintaxis

NombredelTreeView.Nodes(Index).Image= Valor

Propiedad SelectedImage
Es lo mismo que la propiedad anterior, pero en este caso se establece la imagen que presenta el nodo
cuando est seleccionado.
Recuerde que estas propiedades son de la coleccin Nodes del TreeView. Veremos ahora las
propiedades del TreeView.
Propiedades del Control TreeView
Ya se han visto algunas ms atrs. Se comentan solamente aquellas propiedades que no son comunes
al resto de los controles.
Propiedad Checkboxes
Establece si se muestran las casillas de verificacin. (True/False)
Sintaxis

NombredelTreeView.Checkboxes = True/False

Estas casillas de verificacin no se suelen usar en el TreeView porque no son precisamente


bonitas. Si esta propiedad est a True, es preciso usar una propiedad de la coleccin Nodes, la
propiedad Checked, que es tambin booleana. Si ese nodo tiene esa propiedad a True, su casilla
de verificacin aparece marcada.
Propiedad FullRowSelect
Establece si al seleccionar un nodo se marca solamente el texto del nodo (False) o si se marca
toda la horizontal del mismo (True).
Propiedad HideSelection
Establece si el texto seleccionado aparece resaltado cuando un control pierde el enfoque.
Propiedad HotTracking
Determina si est activado el resalte sensible al puntero del ratn. Una lnea por debajo del texto cuando
pasamos el ratn por encima.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 449

Propiedad ImageList
Establece el control ImageList que est asociado al TreeView. El ImageList debe estar en el mismo
formulario que el TreeView al que se asocia, pero un mismo ImageList puede estar asociado a ms de
un TreeView u otros controles.
El TreeView necesita un ImageList para tomar de l las imgenes que va a colocar en los nodos. Esta
propiedad se puede cambiar en tiempo de ejecucin, y es este precisamente, el truco que nos permite
cambiar en el TreeView el tamao de los iconos.
En la Fig. 16.9 (Pgina 5) puede ver el mismo TreeView con dos tipos de iconos. El TreeView no nos
permite cambiar de tipo de iconos, (tal como lo hace el ListView) por lo tanto hay que inventar algo que
permita cambiarlos y as obtener la misma esttica que en el ListView. Esto se logra colocando dos
ImageList en el formulario con las mismas imgenes e idnticos Key para ellas. En uno de ellos se pone
la resolucin de las imgenes a 32 x 32 y en el otro a 16 x 16 (Vea Fig. 16.7 Pgina 3) Cuando quiera
usar iconos pequeos, se asocia al TreeView el ImageList con la resolucin de 16 x 16, mediante la
sintaxis:
NombredelTreeView = ImageList1 Set NombredelTreeView = ImageList1
Y a continuacin se aaden los nodos mediante el mtodo Add. Si quiere cambiar los iconos durante la
ejecucin del programa (es muy tpico colocar en una lnea del men el tipo de iconos a presentar)
observar que al cambiar el ImageList desaparecen los iconos. No hay otro remedio ms que volver a
cargarlos, usando los mtodos de la coleccin Nodes Clear (para vaciarla) y Add. Este es el cdigo que
he usado en el ejemplo que ilustra este captulo:
Set TreeV1.ImageList = ImageList2
TreeV1.Nodes.Clear
cmdIntroducirNodos_Click
(cmdIntroducirNodos es un botn con el cdigo para aadir los nodos)
Propiedad Indentation
Establece el ancho de la sangra de los nodos. Afecta a todos los niveles de nodos. Puede cambiarse
en tiempo de ejecucin.
Propiedad LabelEdit
Devuelve o establece un valor que determina si el usuario puede modificar la propiedad Text de los
objetos Node de un control TreeView.
Sintaxis

NombredelTreeView.LabelEdit = entero

Donde entero puede ser:


Constante
tvwAutomatic

Valor
0

TvwManual

Descripcin
Predeterminado) Automtico. Se genera el evento
BeforeLabelEdit cuando el usuario hace clic en la etiqueta de
un nodo seleccionado.
Manual. El evento BeforeLabelEdit slo se genera al invocar el
mtodo StartLabelEdit.

La edicin de la etiqueta de un objeto se inicia al hacer clic en un objeto seleccionado (si la propiedad
LabelEdit est establecida a Automatic). Es decir, el primer clic en un objeto lo selecciona y un
segundo clic (simple) inicia la operacin de edicin de la etiqueta.
La propiedad LabelEdit, junto con el mtodo StartLabelEdit, permite determinar por programa qu
etiquetas se pueden modificar y cundo hacerlo. Cuando LabelEdit tiene el valor 1, no puede
modificarse ninguna etiqueta, a menos que se invoque el mtodo StartLabelEdit.

Propiedad LineStyle
Establece el estilo de las lneas que aparecen entre los objetos Node.
Sintaxis
LSB

NombredelTreeView.LineStyle = nmero

Visual Basic Gua del Estudiante

Captulo 1

Pgina 450

Acepta los valores 0 (tvwTreeLines) con lo que presentar solamente las lneas entre los nodos
de un mismo nivel y su nodo primario, y 1 (tvwRootLines) que presenta, adems de las
anteriores, lneas entre los nodos raiz.
Propiedad Nodes
Devuelve una referencia a la coleccin de objetos Node de un control TreeView
Parent (Propiedad)
Devuelve una referencia al formulario que contiene un control u otro objeto o coleccin.
Propiedad PathSeparator
Establece el carcter delimitador utilizado en la ruta devuelta por la propiedad FullPath. El carcter
predeterminado es "\".
Scroll (Propiedad)
Devuelve o establece un valor que especifica si se muestran barras de desplazamiento.
SelectedItem (Propiedad, controles ActiveX)
Devuelve la referencia al objeto Node seleccionado.
Propiedad SingleSel
Establece si un nodo debe expandirse cuando se selecciona. Un nodo, con otros nodos dependiendo de
l, se expande al hacer doble clic sobre l, o al hacer clic sobre el + asociado a ese nodo. Se contrae
volviendo a realizar la misma operacin. Si esta propiedad est a True, se expande o contrae cuando se
hace clic sobre l.
Propiedad Sorted
Ya explicada para la coleccin Nodes.

Mtodos del TreeView.


Mtodo GetVisibleCount
Devuelve el nmero de objetos Node que caben en el rea interna de un control TreeView.
El nmero de objetos Node viene determinado por la cantidad de lneas que caben en una ventana. El
nmero total de lneas posibles lo determina el alto del control y la propiedad Size del objeto Font. En
este nmero se cuenta el elemento situado al final de la lista y que slo es visible parcialmente.
Puede usar la propiedad GetVisibleCount para asegurarse de que es visible un nmero mnimo de
lneas que permita al usuario hacerse una idea de la jerarqua. Si no es visible este mnimo, puede
restablecer el tamao del control TreeView mediante la propiedad Height. Si un determinado objeto
Node debe ser visible, utilice el mtodo EnsureVisible para desplazar y expandir el control TreeView.
Mtodo HitTest
Devuelve la referencia del objeto Node situado en las coordenadas x e y. Se utiliza sobre todo en las
operaciones de arrastrar y colocar para determinar si hay disponible en la ubicacin actual un elemento
de destino de colocacin. Si no hay ningn objeto en las coordenadas especificadas, el mtodo HitTest
devuelve Nothing.
El mtodo HitTest se utiliza casi siempre junto con la propiedad DropHighlight para resaltar un objeto
cuando se arrastra el mouse sobre l durante una operacin de Drag & Drop. La propiedad
DropHighlight requiere una referencia a un objeto especfico para resaltarlo. Para determinar el objeto,
se usa el mtodo HitTest junto con un evento que devuelva las coordenadas x e y, como DragOver, con
el siguiente cdigo:
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 451

Private Sub TreeV1_DragOver(Source As Control, x As Single, y As Single, State As Integer)


Set TreeV1.DropHighlight = TreeV1.HitTest(x, y)
End Sub
Mtodo StartLabelEdit
Inicia el proceso de modificacin de la propiedad Text de un nodo, cuando la propiedad LabelEdit est
puesta a 1 (Manual).
Sintaxis

NombredelTreeView.StartLabelEdit

Cuando la propiedad LabelEdit est a 0 (Automtico) la edicin del texto comienza automticamente
cuando se hace clic sobre un nodo ya seleccionado. Si esta propiedad est en manual es cuando
debemos forzar el inicio de la edicin
Cuando se invoca el mtodo StartLabelEdit para un objeto, tambin se genera el evento
BeforeLabelEdit.

Eventos del TreeView


Se mencionan solamente aquellos que no son comunes a otros controles ya estudiados.
Evento BeforeLabelEdit
Se produce cuando el usuario intenta modificar la etiqueta (Propiedad Text) de un Node.
Sintaxis

Private Sub NombredelTreeView _BeforeLabelEdit(cancelar As Integer)

Donde Cancelar es un entero que si no es 0, cancela la operacin de edicin.


El evento BeforeLabelEdit se produce despus del evento Click estndar.
Los eventos AfterLabelEdit y BeforeLabelEdit slo se generan si el valor de la propiedad LabelEdit es 0
(Automtica) o si se invoca el mtodo StartLabelEdit.
Para comenzar a modificar una etiqueta, el usuario debe hacer clic primero en el objeto para
seleccionarlo y hacer clic una segunda vez para iniciar la operacin. El evento BeforeLabelEdit se
produce despus del segundo clic.
Para determinar a qu objeto pertenece la etiqueta que se va a modificar, utilice la propiedad
SelectedItem. En el ejemplo siguiente se comprueba el ndice de un objeto Node antes de permitir su
edicin. Si el ndice es 1, se cancela la operacin.
Private Sub TreeView1_BeforeLabelEdit(Cancel As Integer)
If TreeView1.SelectedItem.Index = 1 Then
Cancel = True ' Se cancela la operacin
End If
End Sub

Evento AfterLabelEdit
Se produce cuando se termina de modificar la etiqueta (Propiedad Text) de un Node
Sintaxis
Private Sub NombredelTreeView_AfterLabelEdit(cancelar As Integer, nuevaCadena As String)
Donde cancelar es un entero que, si no es 0, se cancela la operacin de edicin, y NuevaCadena es la
cadena de caracteres que el usuario ha escrito en esa etiqueta, o Null si se ha cancelado la operacin de
edicin.
El evento AfterLabelEdit se genera despus de que el usuario termina la operacin de edicin, lo que
ocurre cuando hace clic en otro objeto Node o cuando presiona la tecla ENTRAR.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 452

Para cancelar una operacin de edicin de etiqueta, establezca True o cualquier valor distinto de cero en
cancelar. Al cancelar la operacin, se restaurar la etiqueta existente anteriormente.
El argumento nuevaCadena puede usarse para comprobar una condicin antes de cancelar una
operacin. Por ejemplo, el cdigo siguiente cancela la operacin si nuevaCadena es un nmero:
Private Sub TreeView1_AfterLabelEdit(Cancel As Integer, NewString As String)
If IsNumeric(NewString) Then
MsgBox "No se permiten nmeros"
Cancel = True
End If
End Sub
Los eventos AfterLabelEdit y BeforeLabelEdit slo se generan si el valor de la propiedad LabelEdit es 0
(Automtica) o si se invoca el mtodo StartLabelEdit.
Evento Collapse
Se genera al contraer cualquier objeto Node de un control TreeView, es decir, cuando sus nodos
secundarios se ocultan.
Sintaxis

Private Sub NombredelTreeView _Collapse(ByVal nodo As Node)

El evento Collapse se produce antes del evento Click estndar.


Existen tres formas de contraer un objeto Node: establecer a False su propiedad Expanded, hacer
doble clic en un objeto Node y hacer clic en una imagen ms/menos cuando la propiedad Style del
control TreeView se ha establecido a un estilo que incluye estas imgenes. Todos estos mtodos
generan el evento Collapse.
Evento Expand
Se produce al expandir un objeto Node de un control TreeView, es decir, cuando sus nodos secundarios
se hacen visibles.
Sintaxis

Private Sub NombredelTreeView _Expand(ByVal nodo As Node)

El evento Expand se produce despus de los eventos Click y DblClick.


El evento Expand se puede generar de tres formas: cuando el usuario hace doble clic en un objeto Node
que tiene nodos secundarios, cuando se establece a True la propiedad Expanded de un objeto Node y
cuando se hace clic en la imagen ms/menos.
Evento NodeClick
Se produce al hacer clic en un objeto Node.
Sintaxis

Private Sub NombredelTreeView _NodeClick(ByVal nodo As Node)

Cuando el usuario hace clic en cualquier punto de un control TreeView, fuera de un objeto nodo, se
genera el evento Click estndar. El evento NodeClick se genera cuando el usuario hace clic en un objeto
Node determinado y devuelve una referencia al objeto Node que puede usarse para validarlo antes de
realizar alguna otra accin.
El evento NodeClick se produce antes del evento Click estndar.
Evento Validate
Ocurre cuando el foco cambia a otro control que tiene su propiedad CausesValidation establecida a
True. (Este evento es comn a todos los controles ActiveX)
Sintaxis

Private Sub NombredelTreeView _Validate(mantenerFoco As Boolean)

Donde mantenerFoco es un Booleano que si es True, fuerza al TreeView a recuperar el foco. Se emplea
para evitar que un control pierda el foco hasta que se cumplan ciertas condiciones.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 453

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 454

El control ListView
Este control es el complemento ideal para el TreeView. En el TreeView se presentaban datos de forma
jerrquica. Es el control ideal para presentar, por ejemplo, los departamentos de una empresa u
organismo.
Pero el TreeView solamente presenta un pequeo texto, acompaado generalmente de un icono. Si
seguimos hacia abajo por la estructura jerrquica del TreeView que muestra los departamentos de un
organismo, llegaremos al final a las personas. Y aqu ya ser necesario introducir ms datos.
Supongamos que estamos haciendo una lista de todas las personas, y que la informacin de stas ser
su nombre, puesto de trabajo, despacho que ocupa, telfono, etc. El TreeView no es control aconsejado
para mostrar esa cantidad de datos. Estara muy bien poder mostrar todos los datos de esa persona en
un control que tambin permita grficos y textos, de forma que el domicilio figure al lado de un icono con
una casa, el telfono al lado de un icono con un telfono, etc. Esto lo vamos a lograr mediante el
TreeView.
El ListView puede presentar los datos de cuatro formas distintas:
- Iconos.
Al
en el

Cada informacin se presenta con un icono y un texto. La posicin de


los iconos puede cambiarse por el usuario. El texto puede editarse.
hacer clic sobre uno de los iconos, se produce el evento ItemClick
que podemos desencadenar otras operaciones tomando como dato el
icono sobre el que se ha hecho clic (presentar ms datos, por

ejemplo)
- SmallIcons

(Iconos pequeos). Igual que el anterior, pero puede presentar ms


iconos.
- Lista
Presenta la informacin en lneas, acompaada de un icono. El texto de
cada lnea puede editarse, pero no puede cambiarse el orden de las
lneas.
- Report
(Informe) La informacin se divide en varios campos (SubItems) y se
presenta en columnas encabezadas por un texto indicativo.

Fig. 16.11 Las 4 formas de presentacin del ListView: Iconos grandes, pequeos, Lista y Report
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 455

Propiedades del ListView


Propiedades Icons y SmallIcons
El ListView necesita DOS ImageList para almacenar los iconos. Uno para los iconos grandes y otro para
los iconos pequeos. Las imgenes en cada uno de ellos pueden (deben) ser las mismas, con el mismo
truco explicado para el TreeView: el de los iconos grandes con una resolucin de 32 x 32 y el de los
iconos pequeos con una
resolucin de 16 x 16. Esta
propiedad puede establecerse
en tiempo de diseo, mediante
el cuadro de propiedades
personalizado, o en tiempo de
ejecucin mediante las
propiedades Icons y SmallIcons
Fig. 16.12 Pgina de
propiedades del ListView
mostrando los ImageList
ListView1.Icons =
IMList1
ListView1.SmallIcons =
IMList2
Las propiedades Icons y SmallIcons deben estar puestas antes de aadir elementos a la coleccin
ListItems del ListView. Si no es as, dar un error que dice que es necesario inicializarlas.
Propiedad ListItems (Coleccin ListItems)
Esta propiedad es la equivalente a la propiedad Nodes del TreeView. Pero en este caso, un elemento de
esta coleccin no solamente contiene un dato, sino que adems puede tener dentro de s otra coleccin
de datos. Por ejemplo, pensando en una agenda, un elemento de la coleccin puede tener como
propiedad Text el alias de una persona, y como subitems de ese elemento, el nombre y apellidos de la
persona a la que se refiere el alias, su telfono y su domicilio. Un elemento de la coleccin ListItems
puede tener tantos subitems como queramos.
Los elementos de la coleccin ListItems se aaden mediante el mtodo Add, con la siguiente sintaxis
NombreDelListView.ListItems.Add(ndice, clave, texto, icono, iconoPequeo)
Donde
NombreDelListView es el nombre del ListView al que pertenece la coleccin ListItems
Indice es el ndice de ese elemento. Comienzan por 1. No es obligatorio poner este parmetro, y en
ese caso, pone el nmero siguiente al mayor Index que tenga.
Clave Es una cadena de caracteres por la que se puede nombrar a ese elemento. Esta cadena es
nica para cada elemento de la coleccin. Puede contener nmeros, pero el
primer carcter debe
ser una letra
Texto Es el texto que se va a ver en el ListView, bien solo, bien acompaado de un icono
Icono Es una cadena de caracteres con la propiedad Key, dentro del ImageList destinado a
los
iconos grandes, del icono que queremos poner en
ese elemento, cuando el
ListView est
en modo de presentacin Iconos grandes. Tambin podemos poner aqu
el nmero del ndice de
ese icono dentro del mismo ImageList.
IconoPequeo Idntica a la anterior, pero referida al icono mostrado cuando el ListView est
en modo de presentacin de iconos pequeos.
Propiedades de la coleccin ListItems
La coleccin ListItems tambin tiene sus propiedades. Se enumeran a continuacin las ms
importantes.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 456

Propiedad ListSubItems (Propiedad de la coleccin ListItems)


Una coleccin ListSubItems pertenece a cada uno de los elementos de la coleccin ListItems. Cada
ListItem puede tener varios ListSubItems, que son los elementos de informacin relativos al ListItem del
que dependen. Los ListSubItems se aaden a la coleccin mediante el mtodo Add, con la suguiente
sintaxis:
ListView1.ListItems(1).ListSubItems.Add (Index, Key, Texto, ReportIcon, TextToolTip
Donde
ListView1
ListItems(1)
Index
Key
Texto
ReportIcon

TextToolTip

Es el nombre del control ListView


Significa que ese ListSubItem se agrega al ListItem con Index = 1
Es el ndice dentro de la coleccin ListSubItems
Es una cadena de caracteres que define a este ListSubIndex. Esta cadena de
caracteres debe ser nica para cada elemento.
Es la informacin que contienen ese ListSubItem
Es el Key del icono (dentro del ImageList que contienen los SmallIcons) que
aparecer al lado del texto cuando el ListView est con la forma de
presentacin Report (Informe).
Es la informacin que presentar en una etiqueta cuando acerquemos el
puntero del ratn sobre la zona donde est el texto.

Propiedad Ghosted (Propiedad)


Devuelve o establece un valor Booleano que determina si el icono de un objeto ListItem de un control
ListView aparece atenuado. Esta propiedad no afecta al funcionamiento normal de ese ListItem,
solamente es un efecto grfico.
Sintaxis

ListView.ListItems(5).Ghosted = True

Propiedad Selected
Devuelve un valor que determina si un elemento ListItem est seleccionado. Es una propiedad
solamente de lectura, por lo que no puede usarse para seleccionar un elemento.
Mtodos de la coleccin ListItems
Add
Agrega nuevos elemento a la coleccin ListItems.
Sintaxis

NombreDelListView.ListItems.Add(ndice, clave, texto, icono, iconoPequeo)

Clear
Quita todos los objetos que hay en una coleccin.
Sintaxis

ListView1.ListItems.Clear

Remove
Quita un miembro especfico de una coleccin.
Sintaxis

NombredelListView.ListItems.Remove Indice

Indice puede ser un nmero con la propiedad Index del elemento a quitar, o una cadena de
caracteres con su propiedad Key

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 457

CreateDragImage
Crea una imagen de arrastre con una versin difuminada de la imagen asociada a un elemento de la
coleccin ListImages. Normalmente, esta imagen se utiliza como DragIcon en las operaciones de
arrastrar y colocar.
Sintaxis

ListView1.DragIcon = ListView.SelectedItem.CreateDragImage

EnsureVisible
Asegura que el objeto ListItem especificado sea visible.

Propiedades del control ListView (Continuacin)


Propiedad Arrange
Establece cmo se organizan los iconos en la vista Iconos o Iconos pequeos de un control ListView.
Sintaxis

NombredelListView.Arrange = valor

Valor puede tomar uno de los siguientes valores o constantes


Constante
LvwNone
LvwAutoLeft
LvwAutoTop

Valor
0

Efecto
Ninguna. Los iconos pueden colocarse arrastrndolos con el
ratn en cualquier parte del ListView.
1
Izquierda. Los elementos se alinean automticamente a lo largo
de la parte izquierda del control.
2
Superior. Los elementos se alinean automticamente a lo largo
de la parte superior del control.

Propiedad Checkboxes
Establece si se muestran las casillas de verificacin.
Sintaxis

NombredelListView.Checkboxes = True / False

Propiedad ColumnHeaderIcons
Es similar a la propiedad Icons o SmallIcons, pero sta se refiere al ImageList que contiene los iconos
que se van a poner en las cabeceras de las columnas (cuando est en vista Report)
Sintaxis

NombredelListView.ColumnHeaderIcons = NombredelImageList

Puede ponerse tambin en tiempo de diseo (Fig. 16.12) en la casilla Encabezado de Columnas
Propiedad ColumnHeaders (Coleccin CulumnHeader del control ListView)
La coleccin ColumnHeaders representa las columnas que tiene el ListView en el modo de presentacin
Informe
El nmero de columnas del ListView debe ser igual al nmero de ListSubItems de cada elemento
ListItems. De esta forma, cada ListSubItem se presentar en una columna. Para aadir columnas al
ListView se usa el mtodo Add aplicado a la coleccin ColumnHeaders
Sintaxis
ListView1.ColumnHeaders.Add Index, Key, TextoCabecera, Ancho, Alineamiento, Icono
Index Indice de esa columna
Key
Cadena de caracteres nica que identifica esa columna
TextoCabecera
Texto que figurar en la cabecera de la columna
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 458

Ancho Ancho de la columna en unidades del Formulario que contiene al ListView


Alineamiento 0 = izquierda, 1 = Derecha, 2 = Centrado
Icono Key del icono a introducir en la cabecera de la columna
La coleccin ColumnHeaders tienen tambin sus propiedades y mtodos. Vamos a citar las ms
destacables:

Propiedades de la coleccin ColumnHeaders


Propiedad Alignment
Establece la alineacin del texto en la cabecera de un ColumnHeader. Acepta 3 valores:
0 = izquierda, 1 = Derecha, 2 = Centrado
Sintaxis

ListView1.ColumnHeaders(Indice). Alignment = Valor

Propiedad Position
Devuelve o establece la posicin de una columna.
Sintaxis

ListView1.ColumnHeaders(Index) = entero

Donde entero es un nmero entre 1 y n (n = nmero de columnas) que especifica la posicin de esa
columna. Index es, o bien el ndice, o el Key de la columna. Utilice esta propiedad para reorganizar el
orden de las columnas.

El control ImageCombo
Este control es un combo en el que se pueden introducir elementos. Estos elementos forman la
coleccin ComboItems. Cada elemento ComboItem puede tener un texto y una imagen. Este
combo presenta una enorme ventaja sobre el combo normal visto en captulos anteriores: cada
elemento tiene una propiedad Index o Key que le distingue de los dems elementos, y se puede
utilizar una de esas dos propiedades para actuar sobre el programa, dependiendo del ComboItem
seleccionado. Tienen la misma apariencia que un combo normal.

Fig. 16.13 ImageCombo


Los elementos ComboItem se aaden con el mtodo Add, que hemos visto en los controles TreeView y
ListView, con una sintaxis idntica. No va a ser difcil para el alumno trabajar con este control, una vez
conocida la forma de trabajar con los dos controles citados anteriormente.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 459

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 460

Mas controles avanzados: El grupo de controles de Microsoft Windows


Common Controls-2 6.0 (SP3)
Estos son los controles integrados en el paquete Mscomct2.Ocx. Son cinco controles:
-

MonthView
Animation
DTPicker
UpDown
FlatScrollBar

Control MonthView
El control MonthView permite crear aplicaciones donde los usuarios pueden elegir una fecha mediante
una interfaz parecida a un calendario.
Fig. 16.14 Control MonthView
Este control permite seleccionar de una forma muy sencilla una
fecha o un intervalo de fechas. Puede tener el aspecto mostrado
en la Fig. 16.14 o mostrar varios meses a la vez. Esto puede
lograrse mediante las propiedades MonthColumns y MonthRows.
Las fechas mnimas y mximas a presentar se pueden establecer
con las propiedades MinDate y MaxDate.
Este control est enlazado a datos. De esta forma puede presentar
un dato fecha hora existente en una base de datos.
Para permitir a los usuarios del programa seleccionar un intervalo continuo de fechas, asigne a la
propiedad MultiSelect el valor True y especifique con MaxSelProperty el nmero de das que podrn
seleccionar. Las propiedades SelStart y SelEnd devuelven las flechas del principio y el final de una
seleccin.
Existen muchas formas de personalizar la apariencia de un control MonthView. Existen varios atributos
de colores, como MonthBackColor, TitleBackColor, TitleForeColor y TrailingForeColor, que le
permiten crear combinaciones de colores exclusivas para el control.
Establezca las propiedades MonthRows y MonthColumns para mostrar ms de un mes a la vez (hasta
12 meses) en un control MonthView. El nmero total de propiedades MonthRows y MonthColumns
debe ser inferior o igual a 12.
Es un control enlazado a datos, por lo que puede presentar o introducir una fecha de una base de datos
a travs de este control, previamente enlazado a la base de datos mediante un control Data.

Propiedades del control MonthView


Propiedad Day
Devuelve o establece un valor numrico que especifica el nmero del da actual.
Sintaxis

NombredelMonthView.Day = nmero
Variable = NombredelMonthView.Day

La propiedad Day puede tomar cualquier valor entero entre 1 y 31.


Propiedad DayBold
Devuelve o establece un valor Booleano que determina si la fecha indicada se muestra en negrita
Sintaxis
NombredelMonthView.DayBold(fecha) = True/False
La propiedad DayBold es una matriz que corresponde a la propiedad VisibleDays. Cada elemento
booleano indica si la fecha correspondiente debe mostrarse o no en negrita.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 461

Son vlidas nicamente las fechas mostradas actualmente. Las fechas vlidas pueden buscarse en la
propiedad VisibleDays.
A medida que pasa de un mes a otro, no se conserva la informacin de la propiedad.
Propiedad DayOfWeek
Devuelve o establece un valor que especifica el da de la semana actual.
Sintaxis

objeto.DayOfWeek = nmero

Los valores admitidos para nmero son:


Constante
mvwSunday
mvwMonday
mvwTuesday
mvwWednesday
mvwThursday
mvwFriday
mvwSaturday

Valor
1
2
3
4
5
6
7

Descripcin
(Predeterminado) Domingo
Lunes
Martes
Mircoles
Jueves
Viernes
Sbado

La propiedad DayOfWeek puede tomar cualquier valor entero entre 1 y 7.


Propiedaddes MaxDate, MinDate
Devuelve o establece la primera y la ltima fecha permitida por el calendario.
Sintaxis
objeto.MaxDate = fecha
objeto.MinDate = fecha
La propiedades MaxDate y MinDate sirven para definir los lmites superior e inferior del calendario.
Propiedad MaxSelCount
Devuelve o establece el nmero mximo de das consecutivos que se pueden seleccionar de una vez.
Sintaxis

objeto.MaxSelCount = nmero

Obviamente esta propiedad solamente tiene sentido cuando la propiedad MultiSelect tiene el valor True.
Adems, el valor asignado a la propiedad MaxSelCount debe ser superior a la diferencia entre las
propiedades SelStart y SelEnd. Por ejemplo, si selecciona el periodo del 15/9 al 18/9,
MonthView.SelEnd - MonthView.SelStart = 3. Sin embargo, son cuatro los das seleccionados realmente,
por lo que MaxSelCount debe tener asignado el valor 4.
El valor predeterminado de la propiedad es una semana (7 das).
Propiedad Month
Devuelve o establece un valor que especifica el mes actual.
Sintaxis

objeto.Month = nmero

Valores admitidos.
La propiedad Month puede tomar cualquier valor o constante de las expresadas en la tabla siguiente:
Los valores admitidos para nmero son:
Constante
Valor
Descripcin
1
Enero
mvwJanuary
2
Febrero
mvwFebruary
3
Marzo
mvwMarch
4
Abril
mvwApril
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 462

5
6
7
8
9
10
11
12

mvwMay
mvwJune
mvwJuly
mvwAugust
mvwSeptember
mvwOctober
mvwNovember
mvwDecember

Mayo
Junio
Julio
Agosto
Septiembre
Octubre
Noviembre
Diciembre

Propiedad MonthBackColor
Devuelve o establece un valor que especifica el color de fondo mostrado para un mes.
Sintaxis

objeto.MonthBackColor = color

Color es una variable numrica Long comprendida entre el entre 0 y 16.777.215, o la expresin del color
mediante el esquema de color RGB.
Propiedades MonthColumns, MonthRows
Devuelve o establece un valor que especifica el nmero de meses que se muestran en sentido horizontal
o vertical.
Sintaxis

objeto.MonthColumns = nmero
objeto.MonthRows = nmero

El control puede mostrar hasta doce meses.


Proiedad MultiSelect
Devuelve o establece un valor que determina si es posible realizar una seleccin mltiple de fechas.
Sintaxis

objeto.MultiSelect = booleano

Los valores admitidos para booleano son:


True: Permite seleccionar mltiples das (Predeterminado)
False: permite seleccionar solamente un da

Propiedad Parent
Devuelve el formulario, objeto o coleccin que contiene un control u otro objeto o coleccin.
Sintaxis

objeto.Parent

Utilice la propiedad Parent para tener acceso a las propiedades, los mtodos o los controles del primario
de un objeto. Por ejemplo:
MiBotn.Parent.MousePointer = 4
Propiedad ScrollRate
Devuelve o establece un valor que especifica el nmero de meses que se desplazar cuando el usuario
haga clic en uno de los botones de desplazamiento. La propiedad ScrollRate permite al usuario realizar
desplazamientos de ms de un mes cada vez.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 463

Propiedad ShowToday
Devuelve o establece un valor Booleano que determina si se muestra la fecha actual en la parte inferior
del control.
Propiedades SelEnd, SelStart
Devuelve o establece los lmites inferior y superior del intervalo de fechas seleccionado.
Sintaxis

objeto.SelEnd = fecha
objeto.SelStart = fecha

Las propiedades SelStart y SelEnd definen el lmite inferior y superior del intervalo de fechas
seleccionado. El intervalo de fechas seleccionado puede abarcar varios meses. Es posible incluir fechas
que no estn visibles actualmente.
Para que la seleccin mltiple de fechas funcione correctamente, asigne a la propiedad MaxSelCount
un valor superior a la diferencia de los valores de las propiedades SelStart y SelEnd.
Los valores SelStart y SelEnd slo son vlidos cuando la propiedad MultiSelect tiene el valor True.
Propiedad ShowWeekNumbers
Devuelve o establece un valor que determina si los nmeros de semana aparecen junto a la semana.
Sintaxis

objeto.ShowWeekNumbers = booleano

Propiedad StartOfWeek
Devuelve o establece un valor que especifica el primer da de la semana.
Sintaxis

objeto.StartOfWeek = entero

Los valores admitidos para entero son iguales que para la propiedad DayOfWeek

Propiedades TitleBackColor, TitleForeColor


Devuelven o establecen valores que especifican los colores de fondo y primer plano del rea de ttulo del
control.
Sintaxis

objeto.TitleBackColor = color
objeto.TitleForeColor = color

Utilice las propiedades TitleBackColor y TitleForeColor con las propiedades MonthBackColor y


TrailingForeColor para personalizar los colores del control.
Propiedad TrailingForeColor
Devuelve o establece un valor que especifica el color de primer plano de las fechas restantes visibles
actualmente.
Sintaxis

objeto.TrailingForeColor = color

Propiedad Value
Devuelve o establece la fecha que se muestra actualmente. El valor devuelto es de tipo Date
Sintaxis

objeto.Value = fecha
VariableTipoDate = Objeto.Value

La propiedad Value es la propiedad por defecto.


LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 464

Propiedad Week
Devuelve o establece un valor que especifica el nmero de la semana actual.
VariableNumerica = NombredelControl.Week
NombredelControl.Week = VariableNumerica
La propiedad Week puede tomar cualquier valor entero entre 1 y 52.
Propiedad Year
Devuelve o establece un valor que especifica un ao de calendario.
VariableNumerica = NombredelControl.Year
NombredelControl.Year = VariableNumerica
Es posible asignar a la propiedad Year cualquier entero comprendido entre 1601 y 9999.

DataBindings, DataChanged, DataField, DataFormat, DataMember, DataSource,

Mtodos del control MonthView


Mtodo ComputeControlSize
Devuelve el ancho y el alto de un control MonthView para un nmero determinado de filas y columnas.
Sintaxis
objeto.ComputeControlSize(Rows, Columns, Width, Height)
Este mtodo se utiliza antes de cambiar el tamao del control MonthView restableciendo sus
propiedades MonthColumns o MonthRows, para ajustar el tamao del formulario si fuese necesario.
Para usar el mtodo ComputeControlSize, declare primero dos variable con tipo Single. A
continuacin, llame al mtodo pasando como argumentos las variables Width y Height. Una vez
ejecutado el mtodo podr obtener el ancho y el alto del control leyendo estas variables.
Mtodo HitTest
Devuelve la fecha ubicada en conjunto de coordenadas determinado. Se suele usar en operaciones de
arrastrar y colocar para determinar si existe un elemento en la ubicacin de destino de la operacin.
Sintaxis

objeto.HitTest(x as Single, y As Single, Date As Date)

Mediante el mtodo HitTest puede obtener una fecha del control MonthView simplemente haciendo clik
encima de ella. El mtodo HitTest devuelve Null si no existe ninguna fecha en las coordenadas
especificadas.
Private Sub MonthView1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim FechaElegida As Date
MonthView1.HitTest X, Y, FechaElegida
LabelFecha = FechaElegida
End Sub

Eventos del control MonthView


DateClick (Evento)
Ocurre cuando se hace clic en una fecha del control.
Private Sub objeto_DateClick([Index As Integer], DateClicked As Date)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 465

Se utiliza este evento para determinar la fecha en la que se hizo clic.


Private Sub MonthView1_DateClick(ByVal DateClicked As Date)
LabelFecha = MonthView1.Value
End Sub

Private Sub MonthView1_DateClick(ByVal DateClicked As Date)


LabelFecha = DateClicked
End Sub
DateDblClick (Evento)
Ocurre cuando el usuario hace doble clic en una fecha del control.
Private Sub objeto_DateDblClick([Index As Integer], DateDblClicked As Date)
Tiene la misma aplicacin que la anterior, pero esta vez haciendo doble click

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 466

Control DTPicker1
Este control es una especie de ComboBox, pero en vez de mostrar cuando est expandido una lista,
muestra el control MonthView. Funciona de forma anloga al MonthView, y cuando seleccionamos una
fecha en el calendario, deposita la fecha en la casilla desplegable y se cierra. Este control nos permite
ahorrar un buen espacio en el formulario sin perder prestaciones. Estas son las formas de presentarse
recogido y ampliado.

Se deja al alumno el estudio exahustivo de este control, que no se separa mucho del MonthView visto
anteriormente.

Control Animation
Este control nos permite introducir en nuestra aplicacin un elemento muy elegante: visualizacin de
ficheros .avi Existen en Windows muchos fichero .avi aplicados para distintas funciones: copiar
ficheros, bajar ficheros de Internet, y otros empleados como elemento tranquilizador en procesos lentos.
Veamos un par de ejemplos:

Para probar este control basta con poner un controlen el formulario,


un CommonDialog (CD1) y dos botones, uno para arrancar y otro
para parar la presentacin del fichero avi. El tamao que se le de en
el formulario debe ser suficientemente grande para que quepa la
presentacin en su tamao real. No acepta zoom.
En el procedimiento click del botn de arrancar basta con poner este
cdigo:
CD1.Filter = "avi (*.avi)|*.avi"
CD1.ShowOpen
With Animation1
.Open CD1.FileName
.Play
End With
Para parar la ejecucin:
Animation1.Stop
El control Animation tienen pocas propiedades distintas de los dems controles. Podemos citar estas:

Propiedad Center
Establece si el fichero .avi se presenta en el centro del control (Center = True) o si se presenta en
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 467

las coordenadas 0,0 del mismo (Center = False)

Propiedad AutoPlay
Devuelve o establece un valor que determina si el control Animation empezar a reproducir un archivo
.avi cuando ste se cargue en el control.
Mtodos del control Animation
Play
Stop

Ejecuta la animacin.
Detiene la animacin. No se puede ejecutar este mtodo si la propiedad AutoPlay est

a True.

Control UpDown
Este control sirve para introducir saltos de un paso en otros controles o en cualquier parte del
cdigo de la aplicacin.
Este control es tan sencillo que no se va a explicar. Solamente citar que sus dos procedimientos
ms importantes son el DownClick y el UpClick

Control FlatScrollBar
Es un control de scroll. Tiene como todos los controles de este
tipo, una propiedad Max para darle el valor mximo, Min para
ajustar el valor mnimo, SmallChange y LargeChange para fijar
las variaciones al hacer click en la fkecha o en el cuerpo respectivamente, y unna propiedad Value para
leer el valor actual.
Solamente tienen el procedimiento Scroll que se produce al variar la posicin del cursor.

Dejamos aqu el estudio de controles avanzados. No es que no haya ms, sino que el curso debe tener
un final. Para conocer a fondo los controles lo mejor es tomar un control de la lista que sale del men de
VB Proyecto | Componentes, y ponerse con el. No voy a decir que sea ms fcil que estudiarlos con la
ayuda de la Gua del Estudiante. Eso s, le va a resultar bastante ms divertido. Le recomiendo que si
estudia a fondo algn control interesante para Vd. apunte todo lo que vaya aprendiendo de l. Por
experiencia puedo decirle que se olvida. Crese su propia Gua del Estudiante. A final de cuentas esta
comenz as y ya va bastante adelantada.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 468

Visual Basic - Gua del Estudiante Cap. 16


CONTROLES AVANZADOS DE VISUAL BASIC
Este captulo pretende ampliar el conocimiento de ciertos controles introducidos con la versin 6 de VB,
que, aunque ya son de uso habitual en cualquier aplicacin, se salen un poco de los conceptos
estudiados en los controles de los captulos 1 y 2. Vienen generalmente como un paquete OCX que
contiene varios de ellos.
Se estudian algunos de los paquetes distribuidos por Microsoft, sean o no fabricados por esta compaa.
Sera interminable comentar los paquetes realizados por casas especializadas, controles de gran
calidad, normalmente caros y para aplicaciones especficas dentro del mbito comercial en el que se
mueve la empresa que lo realiza. Existen tambin gran cantidad de controles realizados por particulares,
con la mejor intencin, que se pueden encontrar en Internet distribuidos de forma gratuita. Son
desaconsejables. No porque no funcionen, sino simplemente porque no ofrecen ningn tipo de garanta,
estn normalmente sin informacin de funcionamiento, y en caso de problemas no se puede recurrir a
nadie para resolverlos. Una aplicacin profesional nunca deber llevar un control shareware.
Paquete MSCOMCTL.OCX
Este paquete se denomina Microsoft Windows Common Controls 6.0 Contiene los siguientes controles:
TabStrip

Es un control de pestaas. Pero este control no hace de contenedor de otros controles,


por lo que hay que introducir un control Frame o PictureBox por cada una de las
pestaas. No es prctico. Utilice en su lugar el SSTab.

Fig. 16.1 Aspecto del TabStrip


ToolBar

Este es el control que presenta una barra de tareas. Es configurable, pudiendo poner los
botones que queramos con el icono apropiado. Es el control que el alumno introduce por
norma en sus primeras aplicaciones. Luego se va dando cuenta de que hay cosas
mejores y ms simples. (Un Picture Box con varios controles Image).Se coloca
automticamente en la parte superior del formulario.
Fig. 16.2 ToolBar con cuatro botones

StatusBar
Similar al anterior, pero para la barra de estado
en la parte inferior del formulario. Personalmente, creo que es ms til que el anterior.
Puede presentar automticamente algunos parmetros del PC (Bloq. Maysculas, Bloq.
Nmeros, Hora, Fecha) o el texto que se desee.
Fig. 16.3

StatusBar
ProgressBar

Es la tpica barra de progreso de Windows.


Fig. 16.4

Slider
LSB

Es un control que permite introducir valores mediante un cursor


Visual Basic Gua del Estudiante

Captulo 1

Pgina 469

Fig. 16.5
Los controles anteriores se parecen a otros similares ya explicados en los captulos anteriores, y la
profundizacin en sus propiedades y mtodos no va a ser problema para el alumno sin ms
explicaciones. Reservemos el tiempo de estudio para lo interesante, que es lo que viene ahora
ImageList

Es un almacn de imgenes. Este control es necesario para poder poner imgenes en el


resto de los controles de este paquete. Se pueden usar varios controles ImageList dentro
del mismo formulario, y con la propiedad ImageList de cada control utilizar uno u otro en
cada uno de los controles que se usen en el mismo formulario. Ya se ha visto en un
captulo anterior, pero ampliaremos aqu los detalles de su funcionamiento.

TreeView

Es un control que permite presentar de forma grfica datos estructurados de forma


jerrquica, pudiendo usar grficos y textos para presentarlos.

ListView

Es un control que permite presentar datos en una lista, utilizando para ello grficos y
texto, con cuatro disposiciones distintas.

ImageCombo Es como un combo convencional, pero en este se pueden insertar tambin grficos y hacer
sangras independientes para cada elemento.

Estos cuatro ltimos controles se explican a continuacin con detalle.

Control ImageList
Es un almacn de imgenes. Se representa en la caja de herramientas de esta
Fig. 16.6

forma:

En tiempo de ejecucin no tiene presentacin grfica. No tiene eventos y solamente un Mtodo.


Como todos los controles de este paquete, tiene un cuadro de propiedades personalizado que facilita la
introduccin de las mismas.
El cuadro de propiedades tiene tres pestaas, de las cuales solamente tienen importancia dos de ellas:
General e Imgenes. La tercera se refiere a los colores que en este caso no tienen funcin alguna. Las
pestaas pueden verse en las figuras 16.7 y 16.8

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 470

Fig. 16.7 Pestaa General.


En esta pestaa se elige el ancho y alto de la imagen. Es importante esto a la hora de presentar los
iconos sobre un ListView o TreeView, ya que el tamao con el que aparecen en estos controles es
precisamente el elegido en esta pestaa. Mediante el uso de dos ImageList, uno con imgenes de 32 x
32 y otro, con las mismas imgenes, pero de 16 x 16, podemos cambiar el tamao de los iconos en los
controles ListView o TreeView. Este truco es la nica solucin para poder poner iconos grandes o
pequeos en el TreeView. Para cambiar el tamao es necesario que el ImageList no tenga cargada an
ninguna imagen.
Fig. 16.8 Pestaa de Imgenes

En esta se pueden introducir las imgenes que vamos a utilizar en los controles que tengan asociado
este ImageList. Es importante citar la propiedad Key de cada imagen, que sirve para elegir la imagen.
Una imagen de un ImageList se puede elegir mediante su ndice (El ndice va de 1 a n, siendo n el
nmero de imgenes), pero eso puede llevarnos a error, ya que dice muy poco el nmero de la imagen
dentro del ImageList, adems de que ese nmero puede variar si introducimos posteriormente una
imagen nueva en una posicin central. Podemos utilizar para definir la imagen el texto que
introduzcamos en la propiedad Key. Por ejemplo, en la figura anterior, la imagen que presenta una
interrogacin tiene el valor Question, valor que expresa de forma inconfundible el contenido de esa
imagen, y que es inalterable sea cual sea la posicin que ocupa esa imagen en el ImageList. De esta
forma, para poner esa imagen en el nodo nmero 1 del TreeView1 basta con poner:
TreeView1.Nodes(1).Image = "Question"
Otras propiedades y mtodos del control ImageList
Propiedad ListImages. Esta propiedad representa al conjunto de imgenes del control ImageList.
Pueden introducirse ms imgenes en tiempo de ejecucin, utilizando el mtodo Add sobre esta
propiedad, cuya sintaxis es la siguiente:
ImageList.ListImages.Add Index, Key, Picture
Por ejemplo:
ImageList1.ListImages.Add 6, "Imagen1TE", Picture1.Picture
(Se ha introducido en la coleccin ListImages la imagen que tienen el Picture1 como imagen con Index =
6 y con Key = Imagen1TE)
Tambin se puede vaciar un ImageList usando el mtodo Clear:
ImageList1.ListImages.Clear
Propiedad MaskColor
Devuelve o establece el color que se usa para crear las mscaras de un control ImageList.
Sintaxis
LSB

ImageList.MaskColor = color

Visual Basic Gua del Estudiante

Captulo 1

Pgina 471

Esta propiedad se usa en el mtodo Overlay. La propiedad MaskColor determina qu color de una
imagen ser transparente en el mtodo Overlay. Slo es aplicable cuando la imagen del ImageList es
un BMP
Mtodo Overlay
Dibuja una imagen utilizando dos imgenes de la coleccin ListImages de un control ImageList, y pone
esa imagen dentro de un control
Sintaxis

Control.Picture = ImageList.Overlay (ndice1, ndice2)

Donde Indice1 e Indice2 son la propiedad Index o la propiedad Key de la imagen que
se va a superponer (Indice1) y de la imagen sobre la que se va a superponer la
primera (Indice2). Control es un control capaz de contener una imagen (Picture,
Image, Formulario)
Antes de utilizar el mtodo Overlay deberemos poner un valor a la propiedad MaskColor. (La
transparencia de un color solamente va a funcionar cuando vamos a superponer dos imgenes en
formato BMP)
Control TreeView.
Es un control que permite presentar datos que estn estructurados de forma jerrquica. Los datos se
pueden presentar como un texto, acompaados de un icono que determina el tipo de dato. Puede por
ejemplo presentar el organigrama de una empresa, mostrando los departamentos que la componen, y
dentro de estos, las personas que pertenecen a cada departamento, y para cada persona, su nmero de
telfono, fax, E-Mail y domicilio, y todos ellos, representados con un icono. Al hacer doble clic sobre un
icono se despliegan los
elementos que existen bajo
ese icono. Volviendo a hacer
doble clic, se ocultan. Es lo
ms
parecido
al
funcionamiento
del
explorador de Windows.

Fig. 16.9 TreeView mostrando seis nodos, a la izquierda con iconos grandes y a la derecha con iconos
pequeos.
La vista de la Fig. 16.9 nos lleva a la primera idea acerca del TreeView: los Nodos. En cualquier
estructura jerrquica, un elemento tiene contenido en s mismo, pero de l pueden depender otros
elementos. Esto nos lleva al concepto de Nodo. En el TreeView los datos se presentan mediante nodos.
El conjunto de todos los nodos es la coleccin Nodes. Esta coleccin como cualquier coleccin en
visual basic tiene sus propiedades y mtodos.
Para empezar, la coleccin Nodes tiene el mtodo Add. De esta forma ya podemos introducir nodos en
el TreeView. Tambin tienen los mtodo Remove, para eliminar uno de los nodos, y Clear, para eliminar
todos los nodos del TreeView.
El TreeView tiene varios estilos de presentacin. Puede presentar los datos solamente con textos, con
texto y un icono, con un signo + para indicar que ese nodo tiene elementos bajo l, puede tener
lneas o no. El estilo de presentacin lo elegimos mediante la propiedad Style del TreeView.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 472

Propiedad Style.
Determina el estilo de presentacin del TreeView. Es de lectura y escritura
Sintaxis
NombredelTreeView.Style = Nmero
(Establece el estilo)
Nmero = NombredelTreeView.Style
(Devuelve el estilo)
El parmetro Nmero puede ser un nmero del 0 al 7. El estilo correspondienta a cada valor es:
0 = Slo Texto
1 = Imagen y Texto
2 = +/- y Texto
4 = Lneas y texto
5 = Lneas, imagen y Texto
7 = Lneas, +/-, Imagen y Texto (Valor predeterminado)

3 = +/- imagen y texto


6 = Lneas, +/- y texto

Con lo visto hasta ahora ya podemos ver cmo introducimos nodos en un TreeView. Para poder
introducir nodos con grficos, es necesario poner en el mismo formulario, un control ImageList con todas
las imgenes que queremos poner en los nodos (Observe en la Fig. 16.8 que contiene todos los iconos
que aparecen en la Fig. 16.9 Izda.) En ese ImageList hay que poner a cada imagen un valor en su
propiedad Key (En la Fig. 16.8, la imagen correspondiente a la carpeta cerrada tiene en su propiedad
Key la cadena Cerrado, la imagen con una carpeta abierta, Abierto, la correspondiente al sobre tiene
Sobre y la cara, Cara. Ya podemos introducir los nodos mediante el mtodo Add:
Mtodo Add para la coleccin Nodes de un TreeView
Aade un nodo a la coleccin Nodes de un TreeView
Para aadir un nodo, primero debemos declarar una variable tipo Node. (Dim MiNodo As Node)
A continuacin ejecutar el mtodo Add, que tiene la siguiente Sintaxis
Set VariableTipoNode =
NombredelTreeView.Nodes.Add (RelativoA, TipodeRelacion, Key, Texto, Imagen1, Imagen2)
Donde:
VariableTipoNode es la variable declarada como tipo Node (MiNodo en el ejemplo)
NombredelTreeView es el nombre del TreeView
RelativoA es el Key o el Index del nodo del cual depender este nodo que estamos introduciendo. Si el
nodo no va a pertenecer a ningn otro (caso del nodo Raiz) este valor se deja en blanco, pero recuerde
que debe poner la coma de separacin. Lgicamente el nodo indicado en este parmetro ya debe estar
introducido antes de introducir este.
TipodeRelacion es un valor o constante que determina la situacin del nodo respecto al nodo indicado
en el parmetro RelativoA. Vea ms abajo los valores aceptados en este parmetro.
Key es una cadena de caracteres que define a este nodo. Esta cadena de caracteres debe ser nica, es
decir, no se puede repetir en dos o ms nodos. Debe empezar por letra, aunque puede contener
nmeros.
Texto es el texto que va a figurar en el nodo. Es un parmetro obligado.
Imagen1 es la propiedad Index o Key de la imagen que queremos poner en el nodo. Este Index o Key es
el que tiene esa imagen en el control ImageList asociado a este TreeView. Imagen1 es la imagen que
mostrar el TreeView para ese nodo cuando ese nodo NO est seleccionado.
Imagen2 es la propiedad Index o Key de la imagen que queremos que aparezca en ese nodo cuando
est seleccionado. Si no se pone este parmetro, la imagen del nodo cuando est seleccionado, es la
misma que cuando no lo est.
Los valores para TipoRelacion pueden ser:
Constante
Valor Descripcin
TvwFirst
0
Primero. El objeto Node se sita antes de todos los dems nodos al
mismo nivel que el especificado en RelativoA
TvwLast
1
Ultimo. El objeto Node se sita despus de todos los dems nodos al
mismo nivel que el especificado en RelativoA. Los objetos Node que se agregan
secuencialmente se irn situando detrs del ltimo agregado.
TvwNext
2
(Predeterminado) Siguiente. El objeto Node se sita despus del
especificado en RelativoA.
TvwPrevious 3
Anterior. El objeto Node se sita antes del especificado en RelativoA
TvwChild
4
Secundario. El objeto Node es secundario con respecto al
nodoespecificado en RelativoA.
El Index de la coleccin Nodes comienza a numerar por el 1. Cada vez que se aade un nodo, el
Index de ese nodo ser el Index del ltimo + 1, independientemente de la posicin que va a
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 473

ocupar ese nodo dentro del TreeView. No controlamos directamente esta propiedad. Por eso, es
mucho ms prctico definir a los nodos mediante su propiedad Key.
Ya estamos en condiciones de rellenar un TreeView con varios nodos. El cdigo para colocar los nodos
de la figura 16.9 es: (El nombre del TreeView es TreeV1)
Dim MiNodo As Node Declaramos la variable tipo Node
TreeV1.Style = 7
Hacemos que el estilo sea Lneas, +/-, Imagen y Texto
Set MiNodo = TreeV1.Nodes.Add(, , "R", "Raz") No tienen parmetro RelativoA
Los siguientes nodos,dependen del nodo Raiz, que tiene Key = R
Set MiNodo = TreeV1.Nodes.Add("R", tvwChild, "C1", "Secundario 1", "Cerrado")
Set MiNodo = TreeV1.Nodes.Add("R", tvwChild, "C2", "Secundario 2", "Cerrado")
Set MiNodo = TreeV1.Nodes.Add("R", tvwChild, "C3", "Secundario 3", "Sobre")
Set MiNodo = TreeV1.Nodes.Add("R", tvwChild, "C4", "Secundario 4", "Cerrado")
El siguiente nodo depende de Secundario 4, que tienen Key = C4, y adems tiene un icono
distinto (Question) para cuando est seleccionado.
Set MiNodo = TreeV1.Nodes.Add("C4", 4, "C4b", "Terciario C41" , "Cara", "Question")
Ahora se introduce una propiedad a cada uno de los nodos todava no explicada: la imagen que
va a tener cuando ese nodo est expandido, es decir, cuando se ven los nodos que dependen
de l. Vea que se le pone un valor a esta propiedad incluso a los nodos que no tienen otros
nodos que dependan de ellos.
TreeV1.Nodes(1).ExpandedImage = "Abierto"
TreeV1.Nodes(2).ExpandedImage = "Abierto"
TreeV1.Nodes(3).ExpandedImage = "Abierto"
TreeV1.Nodes(4).ExpandedImage = "Abierto"
TreeV1.Nodes(5).ExpandedImage = "Abierto"
TreeV1.Nodes(6).ExpandedImage = "Abierto"
Y ahora otra propiedad no explicada. Con esto hacemos que se vean todos los nodos.
MiNodo.EnsureVisible
El resultado de este cdigo es la Fig. 16.9. Y la Fig. 16.10
es lo que pasa cuando se selecciona el nodo cuyo texto
es Terciario C41. Observe en el cdigo que al introducir
este nodo habamos puesto un parmetro ms,
precisamente, el de la imagen que tendr cuando est
seleccionado.

Fig. 16.10
Propiedades de la coleccin Nodes del TreeView
Propiedad ExpandedImage
Establece la imagen del nodo cuando est expandido, es
decir, cuando se ven los nodos que dependen de l. Es la
propiedad Index o Key que tiene esa imagen en el control
ImageList asociado al TreeView.
Sintaxis
NombredelTreeView.Nodes(Index).ExpandedImage = Valor
Donde Valor puede ser, o bien el Index o el Key de la imagen en el ImageList asociado al TreeView.
Propiedad Expanded
Devuelve o establece un valor que determina si un objeto Node de un control TreeView se encuentra
expandido o contrado. Es una propiedad Booleana
Sintaxis

NombredelTreeView.Nodes(Index).Expanded = True/False

Esta propiedad puede usarse para expandir por programa un objeto Node. Si un objeto Node no
tiene nodos secundarios, el valor de esta propiedad se pasa por alto.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 474

Propiedad Children
Devuelve el nmero de objetos Node secundarios contenidos en un objeto Node. Esta propiedad es
solamente de lectura.
Sintaxis

VariableNumerica = NombredelTreeView.Nodes(Index).Children

Propiedad FullPath
Devuelve la ruta completa de un objeto Node. El valor devuelto es una cadena de caracteres que es el
resultado de concatenar el texto de la propiedad Text del objeto Node referenciado con los valores de
las propiedades Text de todos sus predecesores. El valor de la propiedad PathSeparator del TreeView
determina el delimitador utilizado para separar el Text de uno y otro nodo.
Sintaxis

NombredelTreeView.Nodes(Index).FullPath

Esta propiedad puede usarse en el procedimiento NodeClick del TreeView, que ya pasa como
parmetro el nodo sobre el que hemos hecho click:
Private Sub TreeV1_NodeClick(ByVal Node As MSComctlLib.Node)
VariableTipoString = Node.FullPath
End Sub
Propiedad Count
Devuelve el nmero de elementos de la coleccin Nodes
Sintaxis

VariableNumerica = NombredelTreeView.Nodes.Count

Propiedades Child, FirstSibling, LastSibling, Previous, Parent, Next y Root


Estas propiedades devuelven una referencia a otro objeto Node. Con esa referencia que nos devuelve,
podremos conocer los valores de las propiedades del nodo cuya referencia nos devuelve (Text, Key,
FullPath, etc)
Sintaxis

NombredelTreeView.Nodes(Index).Xxxx

Donde Xxxx es la propiedad deseada de las mencionadas.


Dependiendo de la propiedad, nos devuelve la referencia de:
Child
FirstSibling
LastSibling
Previous
Next
Parent
Root

Primer elemento secundario


Primer nodo del mismo nivel
Ultimo nodo del mismo nivel
Nodo anterior del mismo nivel
Siguiente nodo del mismo nivel
Nodo primario (Nodo del que depende)
Nodo Raiz

Propiedad Key
Esta propiedad establece o devuelve una cadena de caracteres que identifica unvocamente a un nodo.
Esta propiedad se le asigna normalmente durante la creacin de ese nodo mediante el mtodo Add, pero
puede cambiarse posteriormente por programa.
La propiedad Key puede usarse para nombrar al nodo, al tratarse de una cadena nica. No puede haber
dos nodos con el mismo Key. Si la cadena no es nica, se produce un error.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 475

Sintaxis

NombredelTreeView.Nodes(Index).Key = cadena

Es muy prudente usar la propiedad Key para "autodocumentar" su proyecto de Visual Basic si asigna
nombres significativos a los objetos de una coleccin.
Propiedad Sorted
Esta propiedad la tiene tanto el control TreeView como la coleccin Nodes. Si esta propiedad est a True
en el TreeView, se ordenan alfabticamente los elementos de nivel superior de la coleccin Nodes.
Cada elemento de la coleccin Nodes puede tener su propiedad Sorted a True. En este caso, los nodos
que dependen de ese nodo estarn ordenados por orden alfabtico.
Puede tener nodos con la propiedad Sorted = True, y otros con esa propiedad = False.
Propiedad Image
Establece la imagen que presenta un nodo. El valor de esta propiedad es, o bien el Index de la
imagen dentro del ImageList asociado al TreeView, o su propiedad Key.
Sintaxis

NombredelTreeView.Nodes(Index).Image= Valor

Propiedad SelectedImage
Es lo mismo que la propiedad anterior, pero en este caso se establece la imagen que presenta el nodo
cuando est seleccionado.
Recuerde que estas propiedades son de la coleccin Nodes del TreeView. Veremos ahora las
propiedades del TreeView.
Propiedades del Control TreeView
Ya se han visto algunas ms atrs. Se comentan solamente aquellas propiedades que no son comunes
al resto de los controles.
Propiedad Checkboxes
Establece si se muestran las casillas de verificacin. (True/False)
Sintaxis

NombredelTreeView.Checkboxes = True/False

Estas casillas de verificacin no se suelen usar en el TreeView porque no son precisamente


bonitas. Si esta propiedad est a True, es preciso usar una propiedad de la coleccin Nodes, la
propiedad Checked, que es tambin booleana. Si ese nodo tiene esa propiedad a True, su casilla
de verificacin aparece marcada.
Propiedad FullRowSelect
Establece si al seleccionar un nodo se marca solamente el texto del nodo (False) o si se marca
toda la horizontal del mismo (True).
Propiedad HideSelection
Establece si el texto seleccionado aparece resaltado cuando un control pierde el enfoque.
Propiedad HotTracking
Determina si est activado el resalte sensible al puntero del ratn. Una lnea por debajo del texto cuando
pasamos el ratn por encima.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 476

Propiedad ImageList
Establece el control ImageList que est asociado al TreeView. El ImageList debe estar en el mismo
formulario que el TreeView al que se asocia, pero un mismo ImageList puede estar asociado a ms de
un TreeView u otros controles.
El TreeView necesita un ImageList para tomar de l las imgenes que va a colocar en los nodos. Esta
propiedad se puede cambiar en tiempo de ejecucin, y es este precisamente, el truco que nos permite
cambiar en el TreeView el tamao de los iconos.
En la Fig. 16.9 (Pgina 5) puede ver el mismo TreeView con dos tipos de iconos. El TreeView no nos
permite cambiar de tipo de iconos, (tal como lo hace el ListView) por lo tanto hay que inventar algo que
permita cambiarlos y as obtener la misma esttica que en el ListView. Esto se logra colocando dos
ImageList en el formulario con las mismas imgenes e idnticos Key para ellas. En uno de ellos se pone
la resolucin de las imgenes a 32 x 32 y en el otro a 16 x 16 (Vea Fig. 16.7 Pgina 3) Cuando quiera
usar iconos pequeos, se asocia al TreeView el ImageList con la resolucin de 16 x 16, mediante la
sintaxis:
NombredelTreeView = ImageList1 Set NombredelTreeView = ImageList1
Y a continuacin se aaden los nodos mediante el mtodo Add. Si quiere cambiar los iconos durante la
ejecucin del programa (es muy tpico colocar en una lnea del men el tipo de iconos a presentar)
observar que al cambiar el ImageList desaparecen los iconos. No hay otro remedio ms que volver a
cargarlos, usando los mtodos de la coleccin Nodes Clear (para vaciarla) y Add. Este es el cdigo que
he usado en el ejemplo que ilustra este captulo:
Set TreeV1.ImageList = ImageList2
TreeV1.Nodes.Clear
cmdIntroducirNodos_Click
(cmdIntroducirNodos es un botn con el cdigo para aadir los nodos)
Propiedad Indentation
Establece el ancho de la sangra de los nodos. Afecta a todos los niveles de nodos. Puede cambiarse
en tiempo de ejecucin.
Propiedad LabelEdit
Devuelve o establece un valor que determina si el usuario puede modificar la propiedad Text de los
objetos Node de un control TreeView.
Sintaxis

NombredelTreeView.LabelEdit = entero

Donde entero puede ser:


Constante
tvwAutomatic

Valor
0

TvwManual

Descripcin
Predeterminado) Automtico. Se genera el evento
BeforeLabelEdit cuando el usuario hace clic en la etiqueta de
un nodo seleccionado.
Manual. El evento BeforeLabelEdit slo se genera al invocar el
mtodo StartLabelEdit.

La edicin de la etiqueta de un objeto se inicia al hacer clic en un objeto seleccionado (si la propiedad
LabelEdit est establecida a Automatic). Es decir, el primer clic en un objeto lo selecciona y un
segundo clic (simple) inicia la operacin de edicin de la etiqueta.
La propiedad LabelEdit, junto con el mtodo StartLabelEdit, permite determinar por programa qu
etiquetas se pueden modificar y cundo hacerlo. Cuando LabelEdit tiene el valor 1, no puede
modificarse ninguna etiqueta, a menos que se invoque el mtodo StartLabelEdit.

Propiedad LineStyle
Establece el estilo de las lneas que aparecen entre los objetos Node.
Sintaxis
LSB

NombredelTreeView.LineStyle = nmero

Visual Basic Gua del Estudiante

Captulo 1

Pgina 477

Acepta los valores 0 (tvwTreeLines) con lo que presentar solamente las lneas entre los nodos
de un mismo nivel y su nodo primario, y 1 (tvwRootLines) que presenta, adems de las
anteriores, lneas entre los nodos raiz.
Propiedad Nodes
Devuelve una referencia a la coleccin de objetos Node de un control TreeView
Parent (Propiedad)
Devuelve una referencia al formulario que contiene un control u otro objeto o coleccin.
Propiedad PathSeparator
Establece el carcter delimitador utilizado en la ruta devuelta por la propiedad FullPath. El carcter
predeterminado es "\".
Scroll (Propiedad)
Devuelve o establece un valor que especifica si se muestran barras de desplazamiento.
SelectedItem (Propiedad, controles ActiveX)
Devuelve la referencia al objeto Node seleccionado.
Propiedad SingleSel
Establece si un nodo debe expandirse cuando se selecciona. Un nodo, con otros nodos dependiendo de
l, se expande al hacer doble clic sobre l, o al hacer clic sobre el + asociado a ese nodo. Se contrae
volviendo a realizar la misma operacin. Si esta propiedad est a True, se expande o contrae cuando se
hace clic sobre l.
Propiedad Sorted
Ya explicada para la coleccin Nodes.

Mtodos del TreeView.


Mtodo GetVisibleCount
Devuelve el nmero de objetos Node que caben en el rea interna de un control TreeView.
El nmero de objetos Node viene determinado por la cantidad de lneas que caben en una ventana. El
nmero total de lneas posibles lo determina el alto del control y la propiedad Size del objeto Font. En
este nmero se cuenta el elemento situado al final de la lista y que slo es visible parcialmente.
Puede usar la propiedad GetVisibleCount para asegurarse de que es visible un nmero mnimo de
lneas que permita al usuario hacerse una idea de la jerarqua. Si no es visible este mnimo, puede
restablecer el tamao del control TreeView mediante la propiedad Height. Si un determinado objeto
Node debe ser visible, utilice el mtodo EnsureVisible para desplazar y expandir el control TreeView.
Mtodo HitTest
Devuelve la referencia del objeto Node situado en las coordenadas x e y. Se utiliza sobre todo en las
operaciones de arrastrar y colocar para determinar si hay disponible en la ubicacin actual un elemento
de destino de colocacin. Si no hay ningn objeto en las coordenadas especificadas, el mtodo HitTest
devuelve Nothing.
El mtodo HitTest se utiliza casi siempre junto con la propiedad DropHighlight para resaltar un objeto
cuando se arrastra el mouse sobre l durante una operacin de Drag & Drop. La propiedad
DropHighlight requiere una referencia a un objeto especfico para resaltarlo. Para determinar el objeto,
se usa el mtodo HitTest junto con un evento que devuelva las coordenadas x e y, como DragOver, con
el siguiente cdigo:
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 478

Private Sub TreeV1_DragOver(Source As Control, x As Single, y As Single, State As Integer)


Set TreeV1.DropHighlight = TreeV1.HitTest(x, y)
End Sub
Mtodo StartLabelEdit
Inicia el proceso de modificacin de la propiedad Text de un nodo, cuando la propiedad LabelEdit est
puesta a 1 (Manual).
Sintaxis

NombredelTreeView.StartLabelEdit

Cuando la propiedad LabelEdit est a 0 (Automtico) la edicin del texto comienza automticamente
cuando se hace clic sobre un nodo ya seleccionado. Si esta propiedad est en manual es cuando
debemos forzar el inicio de la edicin
Cuando se invoca el mtodo StartLabelEdit para un objeto, tambin se genera el evento
BeforeLabelEdit.

Eventos del TreeView


Se mencionan solamente aquellos que no son comunes a otros controles ya estudiados.
Evento BeforeLabelEdit
Se produce cuando el usuario intenta modificar la etiqueta (Propiedad Text) de un Node.
Sintaxis

Private Sub NombredelTreeView _BeforeLabelEdit(cancelar As Integer)

Donde Cancelar es un entero que si no es 0, cancela la operacin de edicin.


El evento BeforeLabelEdit se produce despus del evento Click estndar.
Los eventos AfterLabelEdit y BeforeLabelEdit slo se generan si el valor de la propiedad LabelEdit es 0
(Automtica) o si se invoca el mtodo StartLabelEdit.
Para comenzar a modificar una etiqueta, el usuario debe hacer clic primero en el objeto para
seleccionarlo y hacer clic una segunda vez para iniciar la operacin. El evento BeforeLabelEdit se
produce despus del segundo clic.
Para determinar a qu objeto pertenece la etiqueta que se va a modificar, utilice la propiedad
SelectedItem. En el ejemplo siguiente se comprueba el ndice de un objeto Node antes de permitir su
edicin. Si el ndice es 1, se cancela la operacin.
Private Sub TreeView1_BeforeLabelEdit(Cancel As Integer)
If TreeView1.SelectedItem.Index = 1 Then
Cancel = True ' Se cancela la operacin
End If
End Sub

Evento AfterLabelEdit
Se produce cuando se termina de modificar la etiqueta (Propiedad Text) de un Node
Sintaxis
Private Sub NombredelTreeView_AfterLabelEdit(cancelar As Integer, nuevaCadena As String)
Donde cancelar es un entero que, si no es 0, se cancela la operacin de edicin, y NuevaCadena es la
cadena de caracteres que el usuario ha escrito en esa etiqueta, o Null si se ha cancelado la operacin de
edicin.
El evento AfterLabelEdit se genera despus de que el usuario termina la operacin de edicin, lo que
ocurre cuando hace clic en otro objeto Node o cuando presiona la tecla ENTRAR.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 479

Para cancelar una operacin de edicin de etiqueta, establezca True o cualquier valor distinto de cero en
cancelar. Al cancelar la operacin, se restaurar la etiqueta existente anteriormente.
El argumento nuevaCadena puede usarse para comprobar una condicin antes de cancelar una
operacin. Por ejemplo, el cdigo siguiente cancela la operacin si nuevaCadena es un nmero:
Private Sub TreeView1_AfterLabelEdit(Cancel As Integer, NewString As String)
If IsNumeric(NewString) Then
MsgBox "No se permiten nmeros"
Cancel = True
End If
End Sub
Los eventos AfterLabelEdit y BeforeLabelEdit slo se generan si el valor de la propiedad LabelEdit es 0
(Automtica) o si se invoca el mtodo StartLabelEdit.
Evento Collapse
Se genera al contraer cualquier objeto Node de un control TreeView, es decir, cuando sus nodos
secundarios se ocultan.
Sintaxis

Private Sub NombredelTreeView _Collapse(ByVal nodo As Node)

El evento Collapse se produce antes del evento Click estndar.


Existen tres formas de contraer un objeto Node: establecer a False su propiedad Expanded, hacer
doble clic en un objeto Node y hacer clic en una imagen ms/menos cuando la propiedad Style del
control TreeView se ha establecido a un estilo que incluye estas imgenes. Todos estos mtodos
generan el evento Collapse.
Evento Expand
Se produce al expandir un objeto Node de un control TreeView, es decir, cuando sus nodos secundarios
se hacen visibles.
Sintaxis

Private Sub NombredelTreeView _Expand(ByVal nodo As Node)

El evento Expand se produce despus de los eventos Click y DblClick.


El evento Expand se puede generar de tres formas: cuando el usuario hace doble clic en un objeto Node
que tiene nodos secundarios, cuando se establece a True la propiedad Expanded de un objeto Node y
cuando se hace clic en la imagen ms/menos.
Evento NodeClick
Se produce al hacer clic en un objeto Node.
Sintaxis

Private Sub NombredelTreeView _NodeClick(ByVal nodo As Node)

Cuando el usuario hace clic en cualquier punto de un control TreeView, fuera de un objeto nodo, se
genera el evento Click estndar. El evento NodeClick se genera cuando el usuario hace clic en un objeto
Node determinado y devuelve una referencia al objeto Node que puede usarse para validarlo antes de
realizar alguna otra accin.
El evento NodeClick se produce antes del evento Click estndar.
Evento Validate
Ocurre cuando el foco cambia a otro control que tiene su propiedad CausesValidation establecida a
True. (Este evento es comn a todos los controles ActiveX)
Sintaxis

Private Sub NombredelTreeView _Validate(mantenerFoco As Boolean)

Donde mantenerFoco es un Booleano que si es True, fuerza al TreeView a recuperar el foco. Se emplea
para evitar que un control pierda el foco hasta que se cumplan ciertas condiciones.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 480

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 481

El control ListView
Este control es el complemento ideal para el TreeView. En el TreeView se presentaban datos de forma
jerrquica. Es el control ideal para presentar, por ejemplo, los departamentos de una empresa u
organismo.
Pero el TreeView solamente presenta un pequeo texto, acompaado generalmente de un icono. Si
seguimos hacia abajo por la estructura jerrquica del TreeView que muestra los departamentos de un
organismo, llegaremos al final a las personas. Y aqu ya ser necesario introducir ms datos.
Supongamos que estamos haciendo una lista de todas las personas, y que la informacin de stas ser
su nombre, puesto de trabajo, despacho que ocupa, telfono, etc. El TreeView no es control aconsejado
para mostrar esa cantidad de datos. Estara muy bien poder mostrar todos los datos de esa persona en
un control que tambin permita grficos y textos, de forma que el domicilio figure al lado de un icono con
una casa, el telfono al lado de un icono con un telfono, etc. Esto lo vamos a lograr mediante el
TreeView.
El ListView puede presentar los datos de cuatro formas distintas:
- Iconos.
Al
en el

Cada informacin se presenta con un icono y un texto. La posicin de


los iconos puede cambiarse por el usuario. El texto puede editarse.
hacer clic sobre uno de los iconos, se produce el evento ItemClick
que podemos desencadenar otras operaciones tomando como dato el
icono sobre el que se ha hecho clic (presentar ms datos, por

ejemplo)
- SmallIcons

(Iconos pequeos). Igual que el anterior, pero puede presentar ms


iconos.
- Lista
Presenta la informacin en lneas, acompaada de un icono. El texto de
cada lnea puede editarse, pero no puede cambiarse el orden de las
lneas.
- Report
(Informe) La informacin se divide en varios campos (SubItems) y se
presenta en columnas encabezadas por un texto indicativo.

Fig. 16.11 Las 4 formas de presentacin del ListView: Iconos grandes, pequeos, Lista y Report
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 482

Propiedades del ListView


Propiedades Icons y SmallIcons
El ListView necesita DOS ImageList para almacenar los iconos. Uno para los iconos grandes y otro para
los iconos pequeos. Las imgenes en cada uno de ellos pueden (deben) ser las mismas, con el mismo
truco explicado para el TreeView: el de los iconos grandes con una resolucin de 32 x 32 y el de los
iconos pequeos con una
resolucin de 16 x 16. Esta
propiedad puede establecerse
en tiempo de diseo, mediante
el cuadro de propiedades
personalizado, o en tiempo de
ejecucin mediante las
propiedades Icons y SmallIcons
Fig. 16.12 Pgina de
propiedades del ListView
mostrando los ImageList
ListView1.Icons =
IMList1
ListView1.SmallIcons =
IMList2
Las propiedades Icons y SmallIcons deben estar puestas antes de aadir elementos a la coleccin
ListItems del ListView. Si no es as, dar un error que dice que es necesario inicializarlas.
Propiedad ListItems (Coleccin ListItems)
Esta propiedad es la equivalente a la propiedad Nodes del TreeView. Pero en este caso, un elemento de
esta coleccin no solamente contiene un dato, sino que adems puede tener dentro de s otra coleccin
de datos. Por ejemplo, pensando en una agenda, un elemento de la coleccin puede tener como
propiedad Text el alias de una persona, y como subitems de ese elemento, el nombre y apellidos de la
persona a la que se refiere el alias, su telfono y su domicilio. Un elemento de la coleccin ListItems
puede tener tantos subitems como queramos.
Los elementos de la coleccin ListItems se aaden mediante el mtodo Add, con la siguiente sintaxis
NombreDelListView.ListItems.Add(ndice, clave, texto, icono, iconoPequeo)
Donde
NombreDelListView es el nombre del ListView al que pertenece la coleccin ListItems
Indice es el ndice de ese elemento. Comienzan por 1. No es obligatorio poner este parmetro, y en
ese caso, pone el nmero siguiente al mayor Index que tenga.
Clave Es una cadena de caracteres por la que se puede nombrar a ese elemento. Esta cadena es
nica para cada elemento de la coleccin. Puede contener nmeros, pero el
primer carcter debe
ser una letra
Texto Es el texto que se va a ver en el ListView, bien solo, bien acompaado de un icono
Icono Es una cadena de caracteres con la propiedad Key, dentro del ImageList destinado a
los
iconos grandes, del icono que queremos poner en
ese elemento, cuando el
ListView est
en modo de presentacin Iconos grandes. Tambin podemos poner aqu
el nmero del ndice de
ese icono dentro del mismo ImageList.
IconoPequeo Idntica a la anterior, pero referida al icono mostrado cuando el ListView est
en modo de presentacin de iconos pequeos.
Propiedades de la coleccin ListItems
La coleccin ListItems tambin tiene sus propiedades. Se enumeran a continuacin las ms
importantes.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 483

Propiedad ListSubItems (Propiedad de la coleccin ListItems)


Una coleccin ListSubItems pertenece a cada uno de los elementos de la coleccin ListItems. Cada
ListItem puede tener varios ListSubItems, que son los elementos de informacin relativos al ListItem del
que dependen. Los ListSubItems se aaden a la coleccin mediante el mtodo Add, con la suguiente
sintaxis:
ListView1.ListItems(1).ListSubItems.Add (Index, Key, Texto, ReportIcon, TextToolTip
Donde
ListView1
ListItems(1)
Index
Key
Texto
ReportIcon

TextToolTip

Es el nombre del control ListView


Significa que ese ListSubItem se agrega al ListItem con Index = 1
Es el ndice dentro de la coleccin ListSubItems
Es una cadena de caracteres que define a este ListSubIndex. Esta cadena de
caracteres debe ser nica para cada elemento.
Es la informacin que contienen ese ListSubItem
Es el Key del icono (dentro del ImageList que contienen los SmallIcons) que
aparecer al lado del texto cuando el ListView est con la forma de
presentacin Report (Informe).
Es la informacin que presentar en una etiqueta cuando acerquemos el
puntero del ratn sobre la zona donde est el texto.

Propiedad Ghosted (Propiedad)


Devuelve o establece un valor Booleano que determina si el icono de un objeto ListItem de un control
ListView aparece atenuado. Esta propiedad no afecta al funcionamiento normal de ese ListItem,
solamente es un efecto grfico.
Sintaxis

ListView.ListItems(5).Ghosted = True

Propiedad Selected
Devuelve un valor que determina si un elemento ListItem est seleccionado. Es una propiedad
solamente de lectura, por lo que no puede usarse para seleccionar un elemento.
Mtodos de la coleccin ListItems
Add
Agrega nuevos elemento a la coleccin ListItems.
Sintaxis

NombreDelListView.ListItems.Add(ndice, clave, texto, icono, iconoPequeo)

Clear
Quita todos los objetos que hay en una coleccin.
Sintaxis

ListView1.ListItems.Clear

Remove
Quita un miembro especfico de una coleccin.
Sintaxis

NombredelListView.ListItems.Remove Indice

Indice puede ser un nmero con la propiedad Index del elemento a quitar, o una cadena de
caracteres con su propiedad Key

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 484

CreateDragImage
Crea una imagen de arrastre con una versin difuminada de la imagen asociada a un elemento de la
coleccin ListImages. Normalmente, esta imagen se utiliza como DragIcon en las operaciones de
arrastrar y colocar.
Sintaxis

ListView1.DragIcon = ListView.SelectedItem.CreateDragImage

EnsureVisible
Asegura que el objeto ListItem especificado sea visible.

Propiedades del control ListView (Continuacin)


Propiedad Arrange
Establece cmo se organizan los iconos en la vista Iconos o Iconos pequeos de un control ListView.
Sintaxis

NombredelListView.Arrange = valor

Valor puede tomar uno de los siguientes valores o constantes


Constante
LvwNone
LvwAutoLeft
LvwAutoTop

Valor
0

Efecto
Ninguna. Los iconos pueden colocarse arrastrndolos con el
ratn en cualquier parte del ListView.
1
Izquierda. Los elementos se alinean automticamente a lo largo
de la parte izquierda del control.
2
Superior. Los elementos se alinean automticamente a lo largo
de la parte superior del control.

Propiedad Checkboxes
Establece si se muestran las casillas de verificacin.
Sintaxis

NombredelListView.Checkboxes = True / False

Propiedad ColumnHeaderIcons
Es similar a la propiedad Icons o SmallIcons, pero sta se refiere al ImageList que contiene los iconos
que se van a poner en las cabeceras de las columnas (cuando est en vista Report)
Sintaxis

NombredelListView.ColumnHeaderIcons = NombredelImageList

Puede ponerse tambin en tiempo de diseo (Fig. 16.12) en la casilla Encabezado de Columnas
Propiedad ColumnHeaders (Coleccin CulumnHeader del control ListView)
La coleccin ColumnHeaders representa las columnas que tiene el ListView en el modo de presentacin
Informe
El nmero de columnas del ListView debe ser igual al nmero de ListSubItems de cada elemento
ListItems. De esta forma, cada ListSubItem se presentar en una columna. Para aadir columnas al
ListView se usa el mtodo Add aplicado a la coleccin ColumnHeaders
Sintaxis
ListView1.ColumnHeaders.Add Index, Key, TextoCabecera, Ancho, Alineamiento, Icono
Index Indice de esa columna
Key
Cadena de caracteres nica que identifica esa columna
TextoCabecera
Texto que figurar en la cabecera de la columna
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 485

Ancho Ancho de la columna en unidades del Formulario que contiene al ListView


Alineamiento 0 = izquierda, 1 = Derecha, 2 = Centrado
Icono Key del icono a introducir en la cabecera de la columna
La coleccin ColumnHeaders tienen tambin sus propiedades y mtodos. Vamos a citar las ms
destacables:

Propiedades de la coleccin ColumnHeaders


Propiedad Alignment
Establece la alineacin del texto en la cabecera de un ColumnHeader. Acepta 3 valores:
0 = izquierda, 1 = Derecha, 2 = Centrado
Sintaxis

ListView1.ColumnHeaders(Indice). Alignment = Valor

Propiedad Position
Devuelve o establece la posicin de una columna.
Sintaxis

ListView1.ColumnHeaders(Index) = entero

Donde entero es un nmero entre 1 y n (n = nmero de columnas) que especifica la posicin de esa
columna. Index es, o bien el ndice, o el Key de la columna. Utilice esta propiedad para reorganizar el
orden de las columnas.

El control ImageCombo
Este control es un combo en el que se pueden introducir elementos. Estos elementos forman la
coleccin ComboItems. Cada elemento ComboItem puede tener un texto y una imagen. Este
combo presenta una enorme ventaja sobre el combo normal visto en captulos anteriores: cada
elemento tiene una propiedad Index o Key que le distingue de los dems elementos, y se puede
utilizar una de esas dos propiedades para actuar sobre el programa, dependiendo del ComboItem
seleccionado. Tienen la misma apariencia que un combo normal.

Fig. 16.13 ImageCombo


Los elementos ComboItem se aaden con el mtodo Add, que hemos visto en los controles TreeView y
ListView, con una sintaxis idntica. No va a ser difcil para el alumno trabajar con este control, una vez
conocida la forma de trabajar con los dos controles citados anteriormente.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 486

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 487

Mas controles avanzados: El grupo de controles de Microsoft Windows


Common Controls-2 6.0 (SP3)
Estos son los controles integrados en el paquete Mscomct2.Ocx. Son cinco controles:
-

MonthView
Animation
DTPicker
UpDown
FlatScrollBar

Control MonthView
El control MonthView permite crear aplicaciones donde los usuarios pueden elegir una fecha mediante
una interfaz parecida a un calendario.
Fig. 16.14 Control MonthView
Este control permite seleccionar de una forma muy sencilla una
fecha o un intervalo de fechas. Puede tener el aspecto mostrado
en la Fig. 16.14 o mostrar varios meses a la vez. Esto puede
lograrse mediante las propiedades MonthColumns y MonthRows.
Las fechas mnimas y mximas a presentar se pueden establecer
con las propiedades MinDate y MaxDate.
Este control est enlazado a datos. De esta forma puede presentar
un dato fecha hora existente en una base de datos.
Para permitir a los usuarios del programa seleccionar un intervalo continuo de fechas, asigne a la
propiedad MultiSelect el valor True y especifique con MaxSelProperty el nmero de das que podrn
seleccionar. Las propiedades SelStart y SelEnd devuelven las flechas del principio y el final de una
seleccin.
Existen muchas formas de personalizar la apariencia de un control MonthView. Existen varios atributos
de colores, como MonthBackColor, TitleBackColor, TitleForeColor y TrailingForeColor, que le
permiten crear combinaciones de colores exclusivas para el control.
Establezca las propiedades MonthRows y MonthColumns para mostrar ms de un mes a la vez (hasta
12 meses) en un control MonthView. El nmero total de propiedades MonthRows y MonthColumns
debe ser inferior o igual a 12.
Es un control enlazado a datos, por lo que puede presentar o introducir una fecha de una base de datos
a travs de este control, previamente enlazado a la base de datos mediante un control Data.

Propiedades del control MonthView


Propiedad Day
Devuelve o establece un valor numrico que especifica el nmero del da actual.
Sintaxis

NombredelMonthView.Day = nmero
Variable = NombredelMonthView.Day

La propiedad Day puede tomar cualquier valor entero entre 1 y 31.


Propiedad DayBold
Devuelve o establece un valor Booleano que determina si la fecha indicada se muestra en negrita
Sintaxis
NombredelMonthView.DayBold(fecha) = True/False
La propiedad DayBold es una matriz que corresponde a la propiedad VisibleDays. Cada elemento
booleano indica si la fecha correspondiente debe mostrarse o no en negrita.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 488

Son vlidas nicamente las fechas mostradas actualmente. Las fechas vlidas pueden buscarse en la
propiedad VisibleDays.
A medida que pasa de un mes a otro, no se conserva la informacin de la propiedad.
Propiedad DayOfWeek
Devuelve o establece un valor que especifica el da de la semana actual.
Sintaxis

objeto.DayOfWeek = nmero

Los valores admitidos para nmero son:


Constante
mvwSunday
mvwMonday
mvwTuesday
mvwWednesday
mvwThursday
mvwFriday
mvwSaturday

Valor
1
2
3
4
5
6
7

Descripcin
(Predeterminado) Domingo
Lunes
Martes
Mircoles
Jueves
Viernes
Sbado

La propiedad DayOfWeek puede tomar cualquier valor entero entre 1 y 7.


Propiedaddes MaxDate, MinDate
Devuelve o establece la primera y la ltima fecha permitida por el calendario.
Sintaxis
objeto.MaxDate = fecha
objeto.MinDate = fecha
La propiedades MaxDate y MinDate sirven para definir los lmites superior e inferior del calendario.
Propiedad MaxSelCount
Devuelve o establece el nmero mximo de das consecutivos que se pueden seleccionar de una vez.
Sintaxis

objeto.MaxSelCount = nmero

Obviamente esta propiedad solamente tiene sentido cuando la propiedad MultiSelect tiene el valor True.
Adems, el valor asignado a la propiedad MaxSelCount debe ser superior a la diferencia entre las
propiedades SelStart y SelEnd. Por ejemplo, si selecciona el periodo del 15/9 al 18/9,
MonthView.SelEnd - MonthView.SelStart = 3. Sin embargo, son cuatro los das seleccionados realmente,
por lo que MaxSelCount debe tener asignado el valor 4.
El valor predeterminado de la propiedad es una semana (7 das).
Propiedad Month
Devuelve o establece un valor que especifica el mes actual.
Sintaxis

objeto.Month = nmero

Valores admitidos.
La propiedad Month puede tomar cualquier valor o constante de las expresadas en la tabla siguiente:
Los valores admitidos para nmero son:
Constante
Valor
Descripcin
1
Enero
mvwJanuary
2
Febrero
mvwFebruary
3
Marzo
mvwMarch
4
Abril
mvwApril
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 489

5
6
7
8
9
10
11
12

mvwMay
mvwJune
mvwJuly
mvwAugust
mvwSeptember
mvwOctober
mvwNovember
mvwDecember

Mayo
Junio
Julio
Agosto
Septiembre
Octubre
Noviembre
Diciembre

Propiedad MonthBackColor
Devuelve o establece un valor que especifica el color de fondo mostrado para un mes.
Sintaxis

objeto.MonthBackColor = color

Color es una variable numrica Long comprendida entre el entre 0 y 16.777.215, o la expresin del color
mediante el esquema de color RGB.
Propiedades MonthColumns, MonthRows
Devuelve o establece un valor que especifica el nmero de meses que se muestran en sentido horizontal
o vertical.
Sintaxis

objeto.MonthColumns = nmero
objeto.MonthRows = nmero

El control puede mostrar hasta doce meses.


Proiedad MultiSelect
Devuelve o establece un valor que determina si es posible realizar una seleccin mltiple de fechas.
Sintaxis

objeto.MultiSelect = booleano

Los valores admitidos para booleano son:


True: Permite seleccionar mltiples das (Predeterminado)
False: permite seleccionar solamente un da

Propiedad Parent
Devuelve el formulario, objeto o coleccin que contiene un control u otro objeto o coleccin.
Sintaxis

objeto.Parent

Utilice la propiedad Parent para tener acceso a las propiedades, los mtodos o los controles del primario
de un objeto. Por ejemplo:
MiBotn.Parent.MousePointer = 4
Propiedad ScrollRate
Devuelve o establece un valor que especifica el nmero de meses que se desplazar cuando el usuario
haga clic en uno de los botones de desplazamiento. La propiedad ScrollRate permite al usuario realizar
desplazamientos de ms de un mes cada vez.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 490

Propiedad ShowToday
Devuelve o establece un valor Booleano que determina si se muestra la fecha actual en la parte inferior
del control.
Propiedades SelEnd, SelStart
Devuelve o establece los lmites inferior y superior del intervalo de fechas seleccionado.
Sintaxis

objeto.SelEnd = fecha
objeto.SelStart = fecha

Las propiedades SelStart y SelEnd definen el lmite inferior y superior del intervalo de fechas
seleccionado. El intervalo de fechas seleccionado puede abarcar varios meses. Es posible incluir fechas
que no estn visibles actualmente.
Para que la seleccin mltiple de fechas funcione correctamente, asigne a la propiedad MaxSelCount
un valor superior a la diferencia de los valores de las propiedades SelStart y SelEnd.
Los valores SelStart y SelEnd slo son vlidos cuando la propiedad MultiSelect tiene el valor True.
Propiedad ShowWeekNumbers
Devuelve o establece un valor que determina si los nmeros de semana aparecen junto a la semana.
Sintaxis

objeto.ShowWeekNumbers = booleano

Propiedad StartOfWeek
Devuelve o establece un valor que especifica el primer da de la semana.
Sintaxis

objeto.StartOfWeek = entero

Los valores admitidos para entero son iguales que para la propiedad DayOfWeek

Propiedades TitleBackColor, TitleForeColor


Devuelven o establecen valores que especifican los colores de fondo y primer plano del rea de ttulo del
control.
Sintaxis

objeto.TitleBackColor = color
objeto.TitleForeColor = color

Utilice las propiedades TitleBackColor y TitleForeColor con las propiedades MonthBackColor y


TrailingForeColor para personalizar los colores del control.
Propiedad TrailingForeColor
Devuelve o establece un valor que especifica el color de primer plano de las fechas restantes visibles
actualmente.
Sintaxis

objeto.TrailingForeColor = color

Propiedad Value
Devuelve o establece la fecha que se muestra actualmente. El valor devuelto es de tipo Date
Sintaxis

objeto.Value = fecha
VariableTipoDate = Objeto.Value

La propiedad Value es la propiedad por defecto.


LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 491

Propiedad Week
Devuelve o establece un valor que especifica el nmero de la semana actual.
VariableNumerica = NombredelControl.Week
NombredelControl.Week = VariableNumerica
La propiedad Week puede tomar cualquier valor entero entre 1 y 52.
Propiedad Year
Devuelve o establece un valor que especifica un ao de calendario.
VariableNumerica = NombredelControl.Year
NombredelControl.Year = VariableNumerica
Es posible asignar a la propiedad Year cualquier entero comprendido entre 1601 y 9999.

DataBindings, DataChanged, DataField, DataFormat, DataMember, DataSource,

Mtodos del control MonthView


Mtodo ComputeControlSize
Devuelve el ancho y el alto de un control MonthView para un nmero determinado de filas y columnas.
Sintaxis
objeto.ComputeControlSize(Rows, Columns, Width, Height)
Este mtodo se utiliza antes de cambiar el tamao del control MonthView restableciendo sus
propiedades MonthColumns o MonthRows, para ajustar el tamao del formulario si fuese necesario.
Para usar el mtodo ComputeControlSize, declare primero dos variable con tipo Single. A
continuacin, llame al mtodo pasando como argumentos las variables Width y Height. Una vez
ejecutado el mtodo podr obtener el ancho y el alto del control leyendo estas variables.
Mtodo HitTest
Devuelve la fecha ubicada en conjunto de coordenadas determinado. Se suele usar en operaciones de
arrastrar y colocar para determinar si existe un elemento en la ubicacin de destino de la operacin.
Sintaxis

objeto.HitTest(x as Single, y As Single, Date As Date)

Mediante el mtodo HitTest puede obtener una fecha del control MonthView simplemente haciendo clik
encima de ella. El mtodo HitTest devuelve Null si no existe ninguna fecha en las coordenadas
especificadas.
Private Sub MonthView1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim FechaElegida As Date
MonthView1.HitTest X, Y, FechaElegida
LabelFecha = FechaElegida
End Sub

Eventos del control MonthView


DateClick (Evento)
Ocurre cuando se hace clic en una fecha del control.
Private Sub objeto_DateClick([Index As Integer], DateClicked As Date)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 492

Se utiliza este evento para determinar la fecha en la que se hizo clic.


Private Sub MonthView1_DateClick(ByVal DateClicked As Date)
LabelFecha = MonthView1.Value
End Sub

Private Sub MonthView1_DateClick(ByVal DateClicked As Date)


LabelFecha = DateClicked
End Sub
DateDblClick (Evento)
Ocurre cuando el usuario hace doble clic en una fecha del control.
Private Sub objeto_DateDblClick([Index As Integer], DateDblClicked As Date)
Tiene la misma aplicacin que la anterior, pero esta vez haciendo doble click

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 493

Control DTPicker1
Este control es una especie de ComboBox, pero en vez de mostrar cuando est expandido una lista,
muestra el control MonthView. Funciona de forma anloga al MonthView, y cuando seleccionamos una
fecha en el calendario, deposita la fecha en la casilla desplegable y se cierra. Este control nos permite
ahorrar un buen espacio en el formulario sin perder prestaciones. Estas son las formas de presentarse
recogido y ampliado.

Se deja al alumno el estudio exahustivo de este control, que no se separa mucho del MonthView visto
anteriormente.

Control Animation
Este control nos permite introducir en nuestra aplicacin un elemento muy elegante: visualizacin de
ficheros .avi Existen en Windows muchos fichero .avi aplicados para distintas funciones: copiar
ficheros, bajar ficheros de Internet, y otros empleados como elemento tranquilizador en procesos lentos.
Veamos un par de ejemplos:

Para probar este control basta con poner un controlen el formulario,


un CommonDialog (CD1) y dos botones, uno para arrancar y otro
para parar la presentacin del fichero avi. El tamao que se le de en
el formulario debe ser suficientemente grande para que quepa la
presentacin en su tamao real. No acepta zoom.
En el procedimiento click del botn de arrancar basta con poner este
cdigo:
CD1.Filter = "avi (*.avi)|*.avi"
CD1.ShowOpen
With Animation1
.Open CD1.FileName
.Play
End With
Para parar la ejecucin:
Animation1.Stop
El control Animation tienen pocas propiedades distintas de los dems controles. Podemos citar estas:

Propiedad Center
Establece si el fichero .avi se presenta en el centro del control (Center = True) o si se presenta en
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 494

las coordenadas 0,0 del mismo (Center = False)

Propiedad AutoPlay
Devuelve o establece un valor que determina si el control Animation empezar a reproducir un archivo
.avi cuando ste se cargue en el control.
Mtodos del control Animation
Play
Stop

Ejecuta la animacin.
Detiene la animacin. No se puede ejecutar este mtodo si la propiedad AutoPlay est

a True.

Control UpDown
Este control sirve para introducir saltos de un paso en otros controles o en cualquier parte del
cdigo de la aplicacin.
Este control es tan sencillo que no se va a explicar. Solamente citar que sus dos procedimientos
ms importantes son el DownClick y el UpClick

Control FlatScrollBar
Es un control de scroll. Tiene como todos los controles de este
tipo, una propiedad Max para darle el valor mximo, Min para
ajustar el valor mnimo, SmallChange y LargeChange para fijar
las variaciones al hacer click en la fkecha o en el cuerpo respectivamente, y unna propiedad Value para
leer el valor actual.
Solamente tienen el procedimiento Scroll que se produce al variar la posicin del cursor.

Dejamos aqu el estudio de controles avanzados. No es que no haya ms, sino que el curso debe tener
un final. Para conocer a fondo los controles lo mejor es tomar un control de la lista que sale del men de
VB Proyecto | Componentes, y ponerse con el. No voy a decir que sea ms fcil que estudiarlos con la
ayuda de la Gua del Estudiante. Eso s, le va a resultar bastante ms divertido. Le recomiendo que si
estudia a fondo algn control interesante para Vd. apunte todo lo que vaya aprendiendo de l. Por
experiencia puedo decirle que se olvida. Crese su propia Gua del Estudiante. A final de cuentas esta
comenz as y ya va bastante adelantada.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 495

Visual Basic Gua del Estudiante Captulo 17


Funciones API de Windows
Las APIs de Windows son un serie de funciones que Windows tienen implementadas al servicio del
programador. Estas funciones se llaman API (Interfaz para Programacin de Aplicaciones) y estn en las
innumerables DLLs que tiene Windows. Las APIs tienen la virtud de acceder a partes de la mquina o
del sistema operativo a las que no podramos acceder mediante Visual Basic. Las APIs pertenecen
como decamos a Windows, por lo que pueden ser usadas por programas escritos en cualquier lenguaje
de programacin. Es muy interesante utilizarlas, pues reducen el tamao del programa ejecutable frente
a otras posibilidades con controles, aparte de darle mayor rapidez de ejecucin, al tratarse de cdigo ya
compilado.
Dado que este libro tiene lgicamente un alcance limitado, y el tema de APIs es enorme, se
recomienda recurrir a un libro especfico de APIs. Este no puede ser otro que el siguiente :
TITULO
API de Win32. Gua del Programador de Visual Basic
AUTOR
Daniel Appleman.
Editorial InforBooks - Barcelona
ISBN
84-89700-22-2
Citaremos este libro repetidas veces a lo largo de este captulo.
Daniel Appleman es el fundador de Desaware Inc.
obligada.

http://www.desaware.com/

Su pgina es visita

Nota introducida en el 2001 - Aparte de este libro, existe un recurso en Internet que incluso le supera, y
que tiene la gran ventaja de que se trata de un sistema informtico donde puede copiar y pegar cdigo.
Puede encontrarlo en
http://www.allapi.net/
Desde que lo he descubierto he dejado el Libro de Appleman un poco aparcado. Sin embargo las
explicaciones aportadas en ese libro son difcilmente sustituibles.
Para usar una funcin API lo primeros que tenemos que hacer es declararla en nuestra aplicacin. La
declaracin debe hacerse en la seccin de declaraciones de un formulario o mdulo. Si la declaramos en
un formulario, necesariamente debemos declararla como privada.
Una declaracin sencilla podra ser la de la funcin API Sleep :
Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
Aqu se ha declarado como pblica. Es lo mismo que decir:
Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
En un formulario no se puede declarar como pblica. Deberemos poner
Private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
En esta declaracin lo que le estamos diciendo es que, en la librera kernel32 est escrita una funcin
llamada Sleep (Es el nombre que figura entre comillas en la declaracin) y que le tenemos que pasar un
parmetro, el tiempo que queremos que se pare la ejecucin de la aplicacin, expresado en
milisegundos. Nos dice la declaracin que el parmetro se le pasa Por Valor (ByVal) y que ese dato
debe ser un Long, es decir, si se lo pasamos como una variable, esa variable debe ser del tipo Long.
Una vez declarada esta funcin, en la seccin de declaraciones de un mdulo o de un formulario,
podremos acceder a ella en cualquier parte de la aplicacin (las partes de la aplicacin donde se puede
usar depender del mbito de la declaracin, que es idntica que para las variables) usando una lnea de
cdigo como esta :
Sleep (500)

LSB

y la aplicacin se detendr medio segundo cuando llegue a esa lnea

Sleep (tiempo) donde tiempo es una variable tipo Long que contiene el tiempo (en
milisegundos) que queremos detener el programa.
Visual Basic Gua del Estudiante

Captulo 1

Pgina 496

Esta API es muy sencilla. Por eso comenzamos por ella. La hay mas complicadas. Por ejemplo, la que
obtiene el nmero de serie del disco duro : GetVolumeInformation
Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal _
lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize _ As Long,
lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, _ lpFileSystemFlags As Long,
ByVal lpFileSystemNameBuffer As String, ByVal _ nFileSystemNameSize As Long) As Long
Aqu ya se ha complicado un poco la cosa. Pero tras un anlisis detenido veremos que esa complicacin
es slo aparente.
En primer lugar vemos que la librera donde est esta funcin es, como en la funcin Sleep, el kernel32
. Esto quiere decir que la librera kernel32 contiene varias funciones. Pero qu es la librera kernel32 ?
Ni mas ni menos que una DLL llamada kernel32.dll que puede encontrar en el directorio
C :\WINDOWS\SYSTEM, y que es el alma de Windows. (Kernell significa, como muy bien sabr, ncleo)
En segundo lugar, vemos que el nombre de esta funcin dentro de la DLL kernel32.dll es
GetVolumeInformationA, que es lo que figura entre comillas en la declaracin. El nombre
GetVolumeInformation que figura como nombre de la funcin, al principio de la declaracin, es el
nombre por el que nos vamos a referir a la funcin en nuestra aplicacin. Ese nombre puede cambiarse,
cambiando tambin el nombre con el que vamos a llamar a esta funcin a lo largo de nuestra aplicacin.
Esto se lo digo solamente a nivel informativo. No lo haga. Su aplicacin no podra ser interpretada por
otra persona. No es profesional y quien mas perder por ello es Vd. Le hago especial hincapi en esto,
porque es una forma de proteger sus programas por parte de algunos programadores. Pero un analista
experto encuentra enseguida el truco. Y algunos no perdonan. Seamos profesionales
En tercer lugar, vemos que la declaracin de esta funcin termina con la expresin As Long. Esto
significa que esta funcin devuelve un dato, y es concretamente, un Long. Por lo tanto, si ese dato nos
sirve para algo, podemos obtenerlo. Ver que no es necesario, pero en muchas ocasiones, ese dato nos
va a indicar si la funcin se ejecut correctamente. Concretamente, esta funcin devuelve un 0 si ha
existido algn problema para obtener el nmero del disco, o un nmero distinto de 0 si lo ha obtenido.
Las dems constantes deberemos declararlas en el procedimiento donde vamos a usar la funcin (o en
otro lugar, si as lo exige el mbito que les queramos dar, pero generalmente, en el mismo
procedimiento), e invocar la funcin pasndole los parmetros correctos.
La sintaxis de las Apis va a ser distinta si deseamos obtener el valor que devuelve o no. Por ejemplo,
para la funcin anterior podemos poner perfectamente estas dos expresiones
Dim Respuesta as Long
Respuesta = GetVolumeInformation("C:\", volbuf, 255, serialnum, componentlength, sysflags, _
sysname, 255)

GetVolumeInformation("C:\", volbuf, 255, serialnum, componentlength, sysflags, _


sysname, 255)

En el ejercicio realizado para hacer estos apuntes, este cdigo se meti en el procedimiento click de un
botn de comando.
Declaramos las variables. Observe que no tienen por qu tener el mismo nombre que en la
declaracin de la funcin.
Dim volbuf As String
Dim sysname As String
Dim serialnum As Long
esta variable ser la que contenga el nmero del disco
Dim sysflags As Long
lpFileSystemFlags
Dim componentlength As Long lpMaximumComponentLength
Dim res As Long
volbuf = String(256, 0)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 497

sysname = String(256, 0)
Estas variables son las que se van a pasar como parmetros a la funcin. La correspondencia entre el
nombre del parmetro y cada una de las variables es la siguiente :
lpRootPathName
Se lo metemos directamente : C :\ - no olvidar la barra \
lpVolumeNameBuffer
volbuf Label del disco
nVolumeNameSize
Tamao del buffer anterior. Directamente 255
lpVolumeSerialNumber
serialnum. Contendr el nmero del disco
lpMaximumComponentLength
componentlength
lpFileSystemFlags
sysflags
lpFileSystemNameBuffer
sysname
nFileSystemNameSize Tamao buffer anterior. Directo, 255
res = GetVolumeInformation("C:\", volbuf, 255, serialnum, componentlength, sysflags, _
sysname, 255)
If res = 0 Then ' ha ocurrido un error y no puede leer el VOL
MsgBox ("Ha ocurrido un error al intentar arrancar la aplicacin.")
Else
'lo ha ledo perfectamente
VOLUM = Trim(Str(serialnum)) 'convertimos un Long en String
'si tiene menos de 12 caracteres, le aadimos los ceros necesarios por la izquierda
If Len(VOLUM) < 12 Then VOLUM = String(12 - Len(VOLUM), "0") & VOLUM
' lo presentamos en el TextBox TBVOL
TBVOL.Text = VOLUM
End If
Repasemos la declaracin y veamos que es cada una de sus partes

Funcin GetVolumeInformation
Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal
lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long,
lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long,
ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long

lpRootPathName
Es un string que contiene el directorio raz del disco a analizar. Si es te parmetro es Null, se toma el
directorio raz del directorio actual. Esta parmetro puede indicar el disco de un servidor, en cuyo caso
debe indicarse con dos backslash. (\\Servidor\Disco)
lpVolumeNameBuffer
Apunta a una variable que va a recibir el nombre del Label del disco. Hay que declararla con un tamao
predeterminado, siempre mayor que el que va a tener el dato
p.e.
Dim VolBuf As String * 255
nVolumeNameSize
Especifica la longitud de la variable anterior. No importa que la hayamos declarado ya con determinado
tamao. Hay que poner aqu otra vez ese tamao, que ser el mismo que tena declarado la variable.
lpVolumeSerialNumber
Apunta a una variable tipo Long, donde se va a meter el nmero del disco.

lpMaximumComponentLength
Apunta a una variable Long (En realidad se mete en esta variable el resultado de la concatenacin de
dos bytes) donde se va a poner el nmero mximo de caracteres permitido por el sistema de ficheros.
Eeste nmero de caracteres corresponde con los caracteres comprendidos entre dos backslahs. Si ese
valor es 255 indica que el sistema de ficheros soporta nombres largos. Si indica 8.3 solamente acepta
nombres cortos
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 498

lpFileSystemFlags
Apunta a una variable tipo Long, (Igual que la anterior, concatenacin de dos bytes) que especifican los
Flags asociados al sistema de ficheros. Puede ser la combinacin de dos de los siguientes parmetros
(Excepcin: FS_FILE_COMPRESSION y FS_VOL_IS_COMPRESSED son mutuamente excluyentes).
FS_CASE_IS_PRESERVED
If this flag is set, the file system preserves the case of filenames when it places a name on disk.
FS_CASE_SENSITIVE
El sistema de ficheros diferencia maysculas y minsculas.
FS_UNICODE_STORED_ON_DISK
FS_PERSISTENT_ACLS
FS_FILE_COMPRESSION
FS_VOL_IS_COMPRESSED
El disco especificado se trata de un disco comprimido. Por ejemplo, es un disco al que se le ha aplicado
DoubleSpace.
lpFileSystemNameBuffer
Apunta a una variable tipo string, donde se mete el sistema de ficheros soportado (FAT or NTFS). Esta
variable debe declararse con un nmero prefijado de caracteres, siempre superior al que vaya a tener
realmente (p.e. Dim SysName As String * 255)
nFileSystemNameSize
Especifica el nmero de caracteres de la variable anterior. Debe introducirse el mismo nmero con el
que se ha declarado la longitud de esa variable. (255 en el ejemplo).

Ya vamos viendo que las APIs no son tan difciles de entender. Vamos a ver otra, la inversa de la
anterior, que pone el valor al parmetro Label del disco. Observe que el resto de los parmetros no
pueden variarse ya que vienen marcados en el disco (nmero) o implcitos en el sistema operativo.

Funcin SetVolumeLabel
Private Declare Function SetVolumeLabel Lib "kernel32" Alias
lpRootPathName As String, ByVal lpVolumeName As String) As Long

"SetVolumeLabelA"

(ByVal

lpRootPathName
Variable tipo string donde se introduce el directorio raz del disco al que se le va a poner o cambiar el
Label. Si este parmetro es Null, se entiende que es el raz del directorio actual.
lpVolumeName
Variable tipo string que contienen el Label a poner. Si es Null, borra el Label actual.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 499

Vemos que no es tan complicado operar con funciones API. Para trabajar con APIs solamente es
necesario conocer la sintaxis exacta de la declaracin. Pero parece en principio un poco difcil, a
sabiendas de que deben existir varios cientos de APIs. SOLUCION : Que VB nos aporte un chuleta con
todas las declaraciones.
Esta chuleta no es otro que el Visor de Texto API (API Text Wiever en Ingls). Este es un programa que
se distribuye con Visual Basic y que se instala al tiempo que este, formando parte del mismo grupo de
programas. Haciendo clic en su icono aparece esta ventana :

Haciendo Click sobre la palabra Archivo de la Barra de Men, aparecen unos ficheros que contienen las
declaraciones de las funciones API :
Win32Api.txt
Winmmsys.txt
Estos dos ficheros son los que suministra Microsoft con VB6. El primero contiene las declaraciones de
las funciones API no relacionadas con el tema multimedia. El segundo contiene las declaraciones de las
API relacionadas con este tema de multimedia.
Si ha adquirido el libro de Appleman puede tener otro fichero : Api32.txt. El autor de este libro asegura
que es mucho mas completo que el fichero que entrega Microsoft. De hecho contiene bastantes mas
declaraciones.
API-Guide presenta tambin la declaracin del API para ser copiada directamente en el
portapapeles y pegada en nuestra aplicacin. ltimamente es la nica que uso, ya que al
tiempo, se obtienen una explicacin de cada uno de los parmetros.

Estos ficheros estn en ASCII. Puede convertirlos a una base de datos ACCESS y el acceso ser un
poco ms rpido. No olvide que tambin le ocupar un sitio respetable en el disco duro de su ordenador.
Para obtener una o varias declaraciones, seleccione las funciones en la ventana de arriba del visor, haga
click en Agregar y esa funcin le pasar para la ventana de abajo. Una vez que tenga en esa ventana
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 500

todas las funciones que necesita, haga click en el botn Copiar y las declaraciones completas le pasarn
al portapapeles.
Una vez que ya sabemos donde se pueden copiar las declaraciones de las APIs, veamos una que nos
permitir obtener la hora desde el sistema operativo :
Declare Sub GetSystemTime Lib "kernel32" Alias "GetSystemTime" (lpSystemTime _
As SYSTEMTIME)
Ahora nos surge una duda Qu es SYSTEMTIME ? Es una variable que hay que declararla con la
instruccin Type, igual que hacamos con las variables con varios campos en los ficheros tipo Random.
Repase este captulo si no lo tiene claro.
Para poder declarar esta variable, podemos obtener su declaracin del mismo Visor de Texto API
Para ello, en la ventana Tipo API en vez de figurar Declaraciones debe poner Tipos. Busque esta
opcin desplegando la ventana con la flecha que tiene a la derecha. Busque ahora la variable cuya
declaracin quiere conocer. Repitiendo el proceso anterior, se llevar en el portapapeles la declaracin
de la variable :
Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Haga un pequeo ejercicio para obtener la fecha y hora usando un API :
Para ello debemos introducir un mdulo donde definiremos la variable SYSTEMTIME y donde podemos
declarar la funcin GetSystemTime :
Mdulo 1

Declaraciones

Option Explicit
Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME)

Ahora en un Formulario, ponemos 8 TextBox (uno para cada datos) y un botn de comando, donde
ponemos el siguiente cdigo:

Private Sub Command1_Click()


Dim Pepe As SYSTEMTIME
Pepe es una variable del tipo SYSTEMTIME
GetSystemTime Pepe
Text1 = Str(Pepe.wYear)
Text2 = Str(Pepe.wMonth)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 501

Text8 = (Pepe.wDayOfWeek)
Text3 = Str(Pepe.wDay)
Text4 = Str(Pepe.wHour)
Text5 = (Pepe.wMinute)
Text6 = (Pepe.wSecond)
Text7 = (Pepe.wMilliseconds)
End Sub
Este programa nos mostrar la hora (hasta milsimas de segundo), la fecha y el da de la semana.
An queda otro apartado en la ventana Tipo API : Las constantes.
En muchas declaraciones de funciones API se utilizan constantes, bien numricas o expresiones. El
Visor de testo API nos muestra tambin las constantes que nos podemos encontrar en las
declaraciones. Vayan un par de Ejemplos
Public Const SCROLLLOCK_ON = &H40 ' The scrolllock light is on.
Public Const SE_ASSIGNPRIMARYTOKEN_NAME = "SeAssignPrimaryTokenPrivilege"
Ver ms adelante mucho ms profusamente las declaraciones de constantes.

Vamos a entretenernos a lo largo de este captulo, en el estudio de varias APIs, relacionadas con
el registro de Windows y con la presentacin del icono en el System Tray. Se han puesto estas
porque son interesantes unas y llamativas las otras. Pero no son las ms importantes, ni las ms
difciles. La ms importante es la del da a da, que es la que nos va a proporcionar la solucin de
nuestro programa. La ms difcil siempre est por llegar.
Cuando necesite un API nuevo para su programa no se conforme con salir del paso. Eso se logra con el
libro de Appelman o con el API-Guide. Por experiencia propia, le recomiendo que haga una pequea
aplicacin para emplear esa o esas APIS que necesita. Estdielas, documntelas y gurdelas donde
guarda sus tesoros ms preciados. Hgalo, pues al cabo de una ao sin volver a usarlas se le van a
olvidar, y tendr que ponerse nuevamente al da. Hay APIs caprichosas, declaraciones que tienen que
ser as, sin ninguna razn ni criterio para ello. No duplique su trabajo. Crese una libreta de APIs y con el
tiempo, llegar a dominarlas como el mismsimo Appleman. Por mi parte, dejo como botn de muestra
las que presento a continuacin.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 502

APIS DE WINDOWS
Funcin Shell_NotifyIcon
Cmo presentar el icono de una aplicacin en la zona de acceso rpido de la barra de tareas (System
Tray)
La zona de acceso rpido de la barra de tareas es la parte derecha de esta barra en la que se
encuentra el reloj. En el ingls original se denomina System Tray, y no encuentro en espaol una
palabra del argot informtico que la defina.
Es muy cmodo, sobre todo para los programas que se deben estar ejecutando continuamente, poner su
icono en esta parte de la barra de tareas, ya que ocupan menos espacio que un programa minimizado
normalmente. Solamente se ve el icono representativo del programa. Por ello es necesario elegir un
icono que defina de forma sencilla e inequvoca la aplicacin. Generalmente se le pone un PopUp men
que muestra las opciones de restaurar (Muestra la aplicacin en su tamao normal) y Salir. Tambin se
suele poner un TextToolTip para mostrar de forma literal el nombre del programa minimizado en ese
icono.

Fig. 1 - Icono del programa Wsk colocado en el System Tray con su ToolTipText y PopupMen
Este sistema permite comunicar la aplicacin con el icono creado en el System Tray.
Lgicamente, primero debe crearse el icono (Se crea normalmente en el Load del formulario
inicial de la aplicacin), y permanece ah mientras dura la ejecucin de la aplicacin. Si se
minimiza la aplicacin, no aparece su icono en la barra de tareas. Por lo tanto se necesitar algn
artilugio para poder poner otra vez la aplicacin en su estado normal. Esto se hace mediante una
comunicacin entre el icono del System Tray y la aplicacin. Esa comunicacin es lo que
llamaremos mensaje de retorno. Al recibir ese mensaje de retorno, el formulario va a tratarlo en
uno de sus procedimientos. El procedimiento donde lo va a tratar se le especifica en la llamada a
la API como se ver mas adelante. El mensaje de retorno va a depender de lo que se haga sobre
el icono del System Tray, (Tecnologa Windows) y es en principio un poco complicado, pero ver
tambin ms adelante una breve explicacin sobre este valor devuelto. Para que el icono no siga
en el System Tray una vez hayamos salido de la aplicacin, es necesario eliminarlo en el
procedimiento Unload del formulario inicial.
El icono puede cambiarse en tiempo de ejecucin, y es una de las aplicaciones ms vistosas de
este sistema. Puede, por ejemplo, cambiar el color del icono para indicar que se ha recibido un
mensaje, que se est conectado, etc.
El API encargada de realizar esta funcin es Shell_NotifyIcon, cuya declaracin es:
Public Declare Function Shell_NotifyIcon Lib "shell32" _ Alias "Shell_NotifyIconA" _
(ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean
Vemos que la declaracin incluye una variable definida por el usuario: NOTIFYCONDATA. Se define de
esta forma
Public Type NOTIFYICONDATA
cbSize As Long
hwnd As Long
uId As Long
uFlags As Long
uCallBackMessage As Long
hIcon As Long
szTip As String * 64
End Type

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 503

El primer parmetro que se le pasa a la funcin (dwMessage) le va a indicar la operacin que debe
realizar, y puede tomar uno de los tres siguientes valores (Se indica tambin el nombre de la constante
que suele sustituir a esos valores):
Constante
NIM_ADD
NIM_MODIFY
NIM_DELETE

Valor
0
1
2

Operacin que realiza


Aade un icono al System Tray
Cambia el icono actual por otro
Quita el icono del System Tray

El segundo parmetro (pnid) es una variable tipo NOTIFYICONDATA tal como se defini ms atrs.
Vemos a continuacin cada componente de esta variable:
CbSize

Contiene el tamao de la variable pnid. Generalmente se le pasa este valor mediante la


funcin Len aplicada a la propia variable. (Vea ejemplo)

Hwnd

Es el controlador de la ventana sobre la que se va a aplicar la funcin Shell_NotifyIcon.


Si el cdigo donde se llama a esta funcin est en el formulario que se va a minimizar o
restaurar, en esta parte basta con poner Me.Hwnd.

UId
Es el identificador del icono del System Tray. Puede ser cualquier nmero Long. Solamente ser
necesario usar un nmero si hace falta identificar ese icono para una operacin posterior. Si no se va hacer
ninguna operacin con l, caso ms habitual, basta con poner vbNull como valor de esta parte.

UFlags

Un Long que va a indicar la validez de las tres partes siguientes de la variable

NOTIFYICONDATA. (uCallBackMessage, hIcon y szTip) Puede tomar uno de estos valores (Se especifica el
valor, la constante con la que se le suele denominar y el resultado de usarla):

Constante
NIF_MESSAGE 1
NIF_ICON
NIF_TIP

Valor
Resultado
El identificador del mensaje de retorno ser el
especificado en uCallBackMessage
2
El icono que se pone en el System Tray es el
que se le indica en hIcon.
4
El ToolTipText del icono del System Tray ser
el especificado en szTip.

Uflags puede contener los tres valores, validando de esta forma las tres condiciones anteriores. Es muy
tipico ver que UFlags toma el valor:
.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
Lo que estamos haciendo es que Uflags tome el valor de 2 Or 4 Or 1, siendo Or el operador lgico Or.
Esta operacin nos lleva al resultado de 7.
Resumiendo: Uflags es en realidad un conjunto de tres banderas, que puede tomar el valor 1, 3 7,
segn se haya aplicado NIF_MESSAGE (Pesa 1), NIF_ICON (Pesa 2) y NIF_TIP (Pesa 4)
uCallBackMessage

Identificador del mensaje de retorno. Este valor va determinar en que


procedimiento del formulario se va a procesar la informacin enviada desde el
icono. Si pone el valor Hexadecimal 200 (&H200) ese valor enviado se procesar
en el procedimiento MouseMove. Puede hacerlo en otros. Puede ver en la
siguiente lista el nmero que define a varios procedimientos del formulario, y la
constante con la que se definen normalmente
El valor del mensaje de retorno va a depender de lo que se haga sobre el icono
del System Tray. Y es concretamente, el valor que corresponde al evento que
se realice sobre el icono (Mouse down, Mouse Up, doble clic, etc) segn los

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 504

valores de la tabla siguiente. Eso s, estos valores se multiplican por el valor de


la propiedad TwipsPerPixelX del objeto Screen. Insisto, tecnologa Windows que
queda fuera de este manual de Visual Basic.
Los valores de la siguiente tabla son aplicables para establecer en que
procedimiento va a procesar la informacin del mensaje de retorno, como para
conocer el valor de ese mensaje.
Constante
Valor
WM_MOUSEMOVE
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_RBUTTONDOWN
WM_RBUTTONUP
WM_RBUTTONDBLCLK
HIcon

SzTip

&H200
&H201
&H202
&H203
&H204
&H205
&H206

Procedimiento del formulario


MouseMove
Mouse Down (botn izquierdo)
MouseUp (botn izquierdo)
Doble click (botn izquierdo)
MouseDown (botn derecho)
Mouse Up (botn derecho)
Doble click (botn derecho)

Icono que presentar en el System Tray. Es muy normal poner el icono del
formulario inicial de la aplicacin. Si el cdigo de creacin del icono est es ese
formulario (cosa muy normal) basta con poner aqu, Me.Icon
Aqu debe poner el ToolTipText que quiere que aparezca cuando mantiene el
cursor del ratn unos instantes sobre el icono del System Tray.

En la definicin del la variable NOTIFYICONDATA se estableca que la longitud de SzTip era de 64


caracteres (szTip As String * 64) No intente cambiar ese 64 por otro nmero porque no funciona. Esto
nos lleva a que si la cadena elegida para el ToolTipText no tiene 64 caracteres, aparecern unos
espacios en blanco detrs de la cadena elegida. Para evitar este efecto, aada a la cadena, la expresin
& vbNullChar. Quedr de esta forma:
.szTip = "Este es el ToolTipText" & vbNullChar

Una vez explicada la teora de funcionamiento de esta funcin, vayamos directamente a un ejemplo.
Este ejemplo est metido en el mismo ejercicio del control Winsock (Wsk) y se ha extrado aqu lo que
se refiere a la aplicacin de esta API. Puede cortarse y pegarse el cdigo a otra aplicacin, con garanta
total de funcionamiento.
EJERCICIO PRACTICO
En un mdulo del programa, en la seccin de declaraciones, debemos introducir la definicin de la
variable NOTIFYICONDATA
Public Type NOTIFYICONDATA
cbSize As Long
hwnd As Long
uId As Long
uFlags As Long
uCallBackMessage As Long
hIcon As Long
szTip As String * 64
End Type
En el mismo mdulo introducimos las constantes que va a requerir, tanto la llamada a la funcin
Shell_NotifyIcon como las que vamos a necesitar para analizar el mensaje de retorno:
Public Const NIM_ADD = &H0
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2
Public Const NIF_MESSAGE = &H1
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 505

Public Const WM_MOUSEMOVE = &H200


Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_RBUTTONUP = &H205
Public Const WM_RBUTTONDBLCLK = &H206
Y en ese mismo mdulo declaramos la funcin Shell_NotifyIcon
Public Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" _
(ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean
Declaramos otra API, con la que podemos hacer que un formulario tome el foco, y se coloque en primer
plano: SetForegroundWindow
Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Ahora declaramos una variable llamada Nid, que ser del tipo NOTIFYICONDATA
Public Nid As NOTIFYICONDATA

Ya hemos terminado con el cdigo del mdulo. Vayamos ahora al procedimiento Load del formulario
inicial. Adems de todo lo que debamos hacer en ese procedimiento, le aadiremos esta parte,
correspondiente a la creacin del icono en el System Tray

Procedimiento Load del formulario inicial:


Con estas dos lneas garantizamos que se va a presentar el formulario, si se hubiese abierto con la
instruccin Load
Me.Show
Me.Refresh
Damos los valores apropiados a cada una de las partes de la variable Nid
With Nid
.cbSize = Len(Nid)
.hwnd = Me.hwnd
.uId = vbNull
.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
.uCallBackMessage = WM_MOUSEMOVE
.hIcon = Me.Icon
.szTip = "SEAE - Conexin va IP" & vbNullChar
End With
Llamamos a la funcin para crear el icono (Parmetro NIM_ADD) y le pasamos la variable Nid con las
caractersticas del icono
Shell_NotifyIcon NIM_ADD, Nid
Veamos una a una las lneas de esta variable tipo NOTIFYICONDATA
cbSize = Len(Nid)
Tal como se dijo ms atrs, cbSize contiene un Long con el tamao de la
variable tipo NOTIFYICONDATA. Al poner cbSize = Len(Nid) se lo estamos pasando mediante el clculo
que realiza la funcin Len.
hwnd = Me.hwnd
Le pasa el .hwnd del formulario. As Windows ya sabe a qu formulario debe
enviar el mensaje de retorno.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 506

uId = vbNull

Se le pasa un Null ya que no se va a necesitar el identificador del icono

uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE


Se le est indicando que los valores de
las tres lneas siguientes son vlidos. Pero esta lnea merece una explicacin ms detallada.
NIF_ICON es una constante que vale 2, NIF_TIP es otra constante que vale 4 y NIF_MESSAGE es
otra que vale 1. Por lo tanto, esta lnea es exactamente igual a otra que pusiese
uFlags = 2 Or 4 Or 1

Si realizamos esta operacin matemtica, el resultado es 7.

Por lo tanto, tambin sera igual poner


uFlags = 7
La razn de poner una constante en vez del valor es solamente a efectos didcticos durante la
programacin. Es ms sencillo acordarse de un neumnico que de un nmero. Es costumbre de
programacin solamente. Y recuerde que esas constantes deben estar declaradas, cosa que hicimos en
el mdulo, cuya declaracin se repite aqu por facilidad de comprensin:
Public Const NIF_MESSAGE = &H1
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4

uCallBackMessage = WM_MOUSEMOVE
Con esta lnea le estamos indicando el
Identificador del mensaje de retorno. Y concretamente le estamos diciendo que ese valor es Hex 200
(Recuerde que declaramos la constante WM_MOUSEMOVE = &H200). Al ponerle este valor, la
informacin del mensaje de retorno la tratar en el procedimiento MouseMove del formulario. Habra
dado lo mismo poner uCallBackMessage = &H200 (O si lo prefiere uCallBackMessage = 512 y as lo
expresaramos en decimal) Volvemos a lo de antes, es costumbre utilizar constantes y no valores
durante la programacin. Ser porque parece que eleva el nivel del programador?
hIcon = Me.Icon
Con esta lnea le decimos que el icono que debe presentar en el System Tray es
precisamente el icono de este formulario. Podramos indicarle otro icono, pasndole la propiedad Icon de
otro objeto, o la propiedad picture de un picture box o control image, siempre y cuando en esa propiedad
hayamos puesto un icono.

szTip = "SEAE - Conexin va IP" & vbNullChar


Este es el ToolTipText que va a aparecer
cuando dejemos unos instantes el puntero del ratn encima del icono. Esta variable tiene 64 caracteres,
pues as se declar y no funciona si se declara de otro tamao en la definicin de la variable tipo
NOTIFYICONDATA. Para evitar que aparezcan como espacios los caracteres no usados, cosa que deja
muy fea la presentacin del ToolTipText, basta con poner & vbNullChar tras el texto deseado.

Con el cdigo introducido en el Load del formulario inicial ya hemos puesto el icono en el System Tray.
Ahora ya podemos hacer clic sobre este icono (y otros eventos) para que el icono enve al formulario el
mensaje de retorno. Ese mensaje ser tratado en el procedimiento MouseMove, puesto que as se lo
hemos indicado a la funcin Shell_NotifyIcon con uCallBackMessage = WM_MOUSEMOVE. En este
procedimiento prevemos todos los mensajes de retorno que puede recibir.

Evento MouseMove del formulario receptor de mensajes de retorno.


Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Este procedimiento espera recibir 4 parmetros, sin embargo solamente va a recibir 3. Por lo tanto, el
valor de Y ser siempre nulo a lo largo de este procedimiento.
Dim Result As Long
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 507

Dim msg As Long


'El valor recibido en la posicin X vara dependiendo del ScaleMode (Cosas de Windows)
If Me.ScaleMode = vbPixels Then
msg = X
Else
msg = X / Screen.TwipsPerPixelX
End If
El mensaje recibido del icono contiene un nmero. Si la propiedad ScaleMode del formulario estuviese
en Pixels, ese nmero coincidira con el que genera el icono. Si ScaleMode no est en Pixels, el valor
generado lo multiplica por el valor de la propiedad TwipsPerPixelX. Las lneas anteriores detectan el
valor de la propiedad ScaleMode y actan en consecuencia. Al final tenemos un nmero que es el que
metemos en la variable msg. Hacemos un Select Case para obtener un resultado distinto en funcin del
valor de msg
Select Case msg
Case WM_LBUTTONUP
'514 (&H202) restaura el formulario
Me.WindowState = vbMaximized
Result = SetForegroundWindow(Me.hwnd)
Me.Show
Case WM_LBUTTONDBLCLK
'515 (&H203) restaura el formulario
Me.WindowState = vbMaximized
Result = SetForegroundWindow(Me.hwnd)
Me.Show
Case WM_RBUTTONUP
'517 (&H205) Presenta el PopUp Men
Result = SetForegroundWindow(Me.hwnd)
Me.PopupMenu Me.mnuPopUpSys
End Select
End Sub

Solamente nos queda ver que nmeros genera el icono para el mensaje de retorno. Son unos valores
que Windows ya tiene predispuestos, y que para mayor facilidad de programacin ya hemos introducido
en unas constantes. Repetimos aqu el cdigo de declaracin de esas constantes:
Public Const WM_MOUSEMOVE = &H200
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_RBUTTONUP = &H205
Public Const WM_RBUTTONDBLCLK = &H206
(Recuerde que estos valores estn en Hexadecimal). Por ejemplo, cuando hacemos clic en el icono con
el botn derecho (R), en el instante de bajar el botn (ButtonDown) se genera como mensaje de retorno
el nmero 204 en hexadecimal. Ese valor, que no depende de la programacin, sino que es un valor que
Windows tiene prefijado, se lo asociamos a una constante llamada WM_RBUTTONDOWN (La
podramos haber llamado de otra forma, pero Microsoft la llama as, y si todos la llamamos as existir
cierta semejanza entre el cdigo de todos los programadores). Luego, en el procedimiento MouseMove
del formulario, en vez de preguntar si el mensaje de retorno vale &H204, preguntamos si vale
WM_RBUTTONDOWN

Podemos hacer que el icono del System Tray cambie en determinadas circunstancias. Por ejemplo, si el
programa minimizado es un correo electrnico, podemos hacer que cambie de color intermitentemente
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 508

cuando se ha recibido un mensaje nuevo. Esto podemos hacerlo con un control Timer, donde
pondramos un cdigo parecido a esto:
Picture1 es un array de Pictures con Index del 0 al 3, y cada uno con una imagen del icono distinta, para
producir un efecto agradable. El cdigo siguiente cambia el icono con 4 imgenes distintas.
Private Sub Timer1_Timer()
If mnuOn.Checked Then
I = I + 1: If I > 4 Then I = 0
t.hIcon = Picture1(I).Picture
Shell_NotifyIcon NIM_MODIFY, t
End If
End Sub

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 509

VISUAL BASIC Y LAS APIS DE WINDOS LAS APIS DEL REGISTRO


DE WINDOWS
El registro de Windows es sin duda el gran tab de los programadores. Hay quien cree que si se toca el
registro, el PC nunca ms va a volver a trabajar correctamente. Y desde luego no le falta razn a quien
as opina. No le falta razn, le falta matizar: Si se toca el registro de Windows sin saber, es muy probable
que el PC no vuelva a trabajar bien.
El nico secreto que tiene el registro de Windows es NO TOCAR lo existente. Podemos introducir cosas
nuevas y borrar estas cosas nuevas. Y qudese tranquilo que Visual Basic, solamente har lo que le
digamos que haga, por lo tanto podemos estar seguros que no tocar nada de lo que nosotros no le
hayamos indicado.
El registro puede manejarse mediante dos instrucciones de VB ya explicadas en captulos anteriores:
SaveSettings y GetSettings. Y es lo que se dice en un curso bsico de VB. Cuando termine de leer
este captulo Vd. Mismo se convencer que esas instrucciones son solamente para empezar. Un
programador profesional siempre usa APIS para leer y escribir el Registro de Windows.
Va a encontrar en este captulo una palabra muy repetida: Clave del registro. (Key) Una clave del
registro es una de las muchas informaciones que existen en el registro. Por ejemplo:

HKEY_CURRENT_USER/Software/VB And VBA Program


Settings/AgendaTel/Colores/Fondo
Esta clave contiene el color de fondo del formulario de la aplicacin AgendaTel, y debe contener un
valor, concretamente el nmero que expresa el color de fondo citado. En el caso del ejemplo, mi PC
contena el valor 8454016, (contiene la cadena de caracteres 8454016, no el nmero 8.454.016, por
eso va entre comillas). Por eso, al tratar ese dato, debe hacerse pensando que es un string.
Dim VarColor As String
VarColor = GetSetting(AppName:="AgendaTel", Section:="Colores", Key:="Fondo")
Me.BackColor = CLng(VarColor)
Lo mismo ocurre cuando se trate de una fecha.
Las claves se expresan con una estructura similar a la de las carpetas (directorios) del explorador de
Windows. No es que sea as, ya que el registro es un fichero nico, pero su estructura jerrquica es
similar. Por eso, hablaremos de Claves y Subclaves, lo mismo que hablamos de directorios y
subdirectorios (Carpetas y Subcarpetas). Una clave tendr subclaves si hay ms claves por debajo de su
nivel jerrquico. En el ejemplo anterior, la clave
HKEY_CURRENT_USER/Software/VB And VBA Program Settings/AgendaTel

tiene la subclave Colores y esta a su vez tiene la subclave Fondo. La clave Fondo no
tiene subclaves.
Los datos de una clave pueden ser cadenas de
caracteres o numricas. Puede diferenciar unas
de otras mediante el icono que aparece a su lado
al editar el registro. Una clave puede tener varios
datos. Cada dato tienen un nombre y un valor
(Nombre = fonts.fon y su valor vgafix.fon)
El valor de las claves numricas puede ponerse
como binario puro, o como un Long (32 bits), y en
este caso, con estructura Big Endian (El byte de mayor peso est en ltimo lugar) o Little Endian. (El byte
de menor peso est en ltimo lugar). En cualquier caso las claves numricas el editor del registro las
presenta en Hexadecimal. En la Fig. anterior, Hex(00000060) = 96 en decimal. Las claves que son
cadenas de caracteres las presenta entre comillas dobles.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 510

Se enumeran a continuacin las APIS relacionadas con el registro de 32 bits. Se incluye la declaracin
de cada una de ellas y la explicacin de cada uno de sus parmetros. Se omiten aquellas que
solamente funcionan en Windows 3.11 o que existen por compatibilidad con Windows 3.11.
Podramos clasificarlas en dos grupos, uno la de aquellas que sirven para leer y guardar valores, y otro,
con aquellas Apis que sirven para mantenimiento del registro.
La primera operacin que debemos hacer para trabajar sobre una clave es abrirla (Exceptuando
lgicamente la operacin de crearla). Para abrir una clave se usa el API RegOpenKeyEx. Al final, una
vez realizadas todas las operaciones deseadas, hay que cerrarla. Se cierra mediante el API
RegCloseKey
Handle = Manejador en espaol, pero esta es una de estas palabras que es mejor no traducirlas.
Utilizaremos la expresin Handle durante todo este captulo.

Funcin RegOpenKeyEx
Abre la clave especificada. Es la primera operacin que hay que hacer para trabajar con una clave. (Es
similar, en ficheros, a Open NombreFichero For xxx As #n)
Declaracin:
Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long,
ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As
Long
HKey es el Handle de la clave de nivel superior. Hkey acepta cualquiera de los valores
predefinidos:

HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS

(= Hex 80000000)
(= Hex 80000001)
(= Hex 80000002)
(= Hex 80000003)

(Observe en la declaracin que Hkey es un Long. Cmo podemos poner la cadena


HKEY_LOCAL_MACHINE en vez de un Long? Es que esa cadena es el nombre de una constante que
habr que declarar. Lo que ocurre es que en Windows, esa constante siempre tiene el mismo valor
(Concretamente Hex 80000002). No declare una constante con ese mismo nombre con un valor distinto
a ese.)
LpSubKey es una variable que contiene el nombre de la subclave a abrir. Esta variable es una
cadena de caracteres, que indica la ruta total de la clave a abrir, desde la clave expresada en el
parmetro anterior. Si este parmetro es nulo o la cadena vaca, la funcin crear un nuevo
handle de la clave definida por el parmetro Hkey . En este caso, la funcin no cierra el handle
creado previamente.
UlOptions

Reservado. Debe ser 0.

samDesired Especifica la mscara de seguridad para el acceso a esa clave. Puede ser una
combinacin de los siguientes parmetros:
KEY_ALL_ACCESS,
que
es
una
combinacin
de
KEY_QUERY_VALUE,
KEY_ENUMERATE_SUB_KEYS,
KEY_NOTIFY,
KEY_CREATE_SUB_KEY,
KEY_CREATE_LINK, y KEY_SET_VALUE.
KEY_CREATE_LINK, permiso para crear un enlace simblico.
KEY_CREATE_SUB_KEY, permiso para crear subclaves
KEY_ENUMERATE_SUB_KEYS, permiso para enumerar subclaves
KEY_EXECUTE, permiso para acceso de lectura.
KEY_NOTIFY, permiso para cambiar la notificacin
KEY_QUERY_VALUE, permiso para obtener el valor de una subclave
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 511

KEY_READ, combinacin de KEY_QUERY_VALUE,


KEY_ENUMERATE_SUB_KEYS, y KEY_NOTIFY.
KEY_SET_VALUE, permiso para escribir el valor de una subclave.
KEY_WRITE, combinacin de KEY_SET_VALUE y KEY_CREATE_SUB_KEY
PhkResult, es una variable (Long) que va a recibir el Handle de la clave abierta.

Funcin RegCloseKey
Cierra el Handle de la clave que estamos utilizando. Es la operacin que finaliza
cualquier operacin de lectura o escritura en el registro. Si hacemos un smil con los
ficheros secuenciales, sera el Close #n
Declaracin
Declare Function RegCloseKey Lib "advapi32.dll" Alias "RegCloseKey" (ByVal hKey As Long) As Long
HKey es el Handle de la clave abierta. Es un Long. Este nmero es el que nos devuelve la
funcin RegOpenKeyEx (y la funcin RegCreateKeyEx) en el parmetro PhkResult. (cuando
abrimos o creamos una clave). Hkey acepta tambin cualquiera de los valores predefinidos

HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
(Estos valores son las constantes citadas en la funcin anterior.)

Funcin RegCreateKeyEx
Crea la clave especificada. Si existe ya esa clave, la abre.
Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long,
ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long,
ByVal samDesired As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, phkResult As Long,
lpdwDisposition As Long) As Long
hKey es el handle visto en las funciones anteriores.
LpSubKey es una variable tipo string que contiene el nombre de la subclave a crear. La
subclave no debe empezar por el carcter \. Este parmetro no puede ser nulo.
Reserved Reservado. Debe ser cero.
LpClass Variable tipo string que especifica el tipo de esta clave. Puede poner una cadena vaca
y el tipo de la clave se especificar cuando le introduzca el valor. Este parmetro se ignora si la
clave ya existe.
dwOptions Especifica las opciones especiales de la clave. Puede ser uno de los siguientes
valores:
REG_OPTION_NON_VOLATILE La clave es no voltil. Esta clave y su valor se guardarn en
el disco (al invocar la funcin RegSaveKey)
REG_OPTION_VOLATILE (Windows NT) Esta clave es voltil, es decir, no se guarda en el
disco. Solamente existe en la memoria RAM y una vez que se apaga el ordenador se extingue.
Este valor se ignora si ya existe la clave. (Windows 95) En W95 este parmetro se ignora.
REG_OPTION_BACKUP_RESTORE (Windows NT) Si se pone este valor, la funcin ignora
el
parmetro samDesired. Este valor se pone para imponer restricciones de
acceso a la clave, tanto para hacer
backup como para modificarla. (Windows 95)
EnW95 este valor se ignora, ya que el registro de W95 no
soporta esa seguridad.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 512

SamDesired Igual que en la funcin RegOpenKeyEx ya vista.


LpSecurityAttributes Es una variable del tipo SECURITY_ATTRIBUTES que determina si las
propiedades pueden ser heredadas por un proceso hijo. Si este valor es Null (0) las propiedades
no pueden ser heredadas. Este parmetro es tpico verlo a 0.
La variable SECURITY_ATTRIBUTES tienen esta forma:
Public Type SECURITY_ATTRIBUTES
Length As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
PhkResult Apunta a una variable que devuelve un Long con el Handle de la clave creada o
abierta, en caso de que ya existiera.
lpdwDisposition
valores:

Apunta a una variable que devuelve un Long con uno de los siguientes

REG_CREATED_NEW_KEY ( = 1) si la clave no exista y se ha creado


REG_OPENED_EXISTING_KEY ( = 2) La clave ya exista y ha sido abierta
(Si este valor es 0 es que la operacin no se ha completado con xito)

Funcin RegDeleteKey
Borra una clave del registro de Windows. Funciona de forma distinta en W95 que en
WNT. En W95 borra esa clave y todas sus subclaves. En WNT no permite borrar una
clave que tenga subclaves.
Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey
As Long, ByVal lpSubKey As String) As Long
HKey Es el Handle de una clave abierta. Puede ser tambin una de las siguientes constantes:
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
LpSubKey Es la subclave a borrar. Esta subclave debe estar dentro de la clave especificada en
el parmetro Hkey . Este parmetro no puede ser nulo. En WNT, la clave a borrar no puede
tener subclaves.

Aplicacin prctica de lo visto hasta aqu: Crear una clave y eliminarla


Para crear una clave, primero hay que abrir todas las claves jerrquicamente superiores a esa clave a
crear. En este ejemplo vamos a crear una clave de la siguiente forma:
HKEY_CURRENT_USER/Software/GuiadelEstudiante/Colores
La clave HKEY_CURRENT_USER existe, ya que es una de las de ms alto nivel. La clave Software
tambin existe, ya que vienen predeterminada. La que posiblemente no existe es la de
GuiadelEstudiante, y tampoco la de Colores dentro de ella. Estas claves no existirn en principio, pero
una vez que las hayamos creado, ya pueden existir. Por lo tanto deberemos comprobar si existen. Esta
clave va a tener varios valores. Se refiere a los valores del color de un programa, y tendr los colores de
Fondo, Etiquetas, Letras y Desplegables. Aunque el color se expresa con un nmero, aqu lo vamos a
introducir de momento como una cadena de caracteres.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 513

El cdigo para crear la clave lo introducimos en un botn de nombre cmdCrearClave


Private Sub cmdCrearClave_Click()
Dim LpClass As String
Dim Manejador1 As Long, Manejador2 As Long, Manejador3 As Long, Disposicion As Long
'Abre la clave HKEY_CURRENT_USER/Software y obtiene el handle (Manejador1)
RegOpenKeyEx HKEY_CURRENT_USER, "Software", 0, KEY_ALL_ACCESS, Manejador1 'Crea la
clave GuiadelEstudiante como subclave de HKEY_CURRENT_USER/Software. Si ya existe. la abre
RegCreateKeyEx Manejador1, "GuiadelEstudiante", 0, LpClass, _ REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, 0, Manejador2, Disposicion
'Si ha ocurrido algn error, Manejador2 sera 0
If Manejador2 = 0 Then
MsgBox "Error durante la creacin de la clave!"
Exit Sub
End If
'Si no ha fallado (Manejador2 <> 0) creamos la clave Colores dentro de la clave GuiadelEstudiante
RegCreateKeyEx Manejador2, "Colores", 0, LpClass, REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, 0, Manejador3, Disposicion
'Si ha ocurrido algn error, Manejador3 sera 0
If Manejador2 = 0 Then
MsgBox "Error durante la creacin de la clave!"
Exit Sub
End If
'Cierra la clave HKEY_CURRENT_USER/Software/GiadelEstudiante/Colores
RegCloseKey Manejador3
'Cierra la clave HKEY_CURRENT_USER/Software/GiadelEstudiante
RegCloseKey Manejador2
'Cierra la clave HKEY_CURRENT_USER/Software
RegCloseKey Manejador1
End Sub

Para eliminar una clave debemos utilizar la funcin RegDeleteKey. La clave


inmediatamente superior a la clave a borrar debe abrirse previamente con
RegOpenKey. Y para abrir una clave, debemos abrir previamente todas las claves
jerrquicamente superiores. Para borrar una clave con subclaves, borramos primero
las subclaves. Deberemos ir borrando en orden ascendente. Una vez borradas las
claves, cerramos las claves superiores a la borrada. En el siguiente ejemplo se borra
la clave GuiadelEstudiante y su subclave, Colores
Private Sub cmdEliminarClave_Click()
Dim Manejador1 As Long, Manejador2 As Long, Manejador3 As Long, Disposicion As Long
'Abre la clave HKEY_CURRENT_USER/Software y obtiene el handle (Manejador1)
RegOpenKeyEx HKEY_CURRENT_USER, "Software", 0, KEY_ALL_ACCESS, Manejador1
'comprueba que la funcin se ha ejecutado correctamente. Si no es as, sale del
procedimiento
If Manejador1 = 0 Then Exit Sub
'Abre la clave GuiadelEstudiante que es subclave de la anterior
RegOpenKeyEx Manejador1, "GuiadelEstudiante", 0, KEY_ALL_ACCESS, Manejador2
If Manejador2 = 0 Then Exit Sub
'Borra ya la clave Colores
RegDeleteKey Manejador2, "Colores"
'Cerramos la clave GuiadelEstudiante. Podramos no cerrarla
RegCloseKey Manejador2
'Borramos la clave GuiadelEstudiante
RegDeleteKey Manejador1, "GuiadelEstudiante"
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 514

'Cerramos la clave HKEY_CURRENT_USER


RegCloseKey Manejador1
End Sub
Para que todas estas funciones puedan trabajar es necesario haberlas declarado previamente. La
declaracin puede hacerse, o bien en la seccin de declaraciones de un mdulo, donde las
declararemos como Pblicas, o en la seccin de declaraciones de un formulario, donde deben
declararse como privadas. Las constantes tambin se declararn en el mismo sitio que las funciones.
En este caso, se declararon en el formulario:
Option Explicit
Const HKEY_CLASSES_ROOT = &H80000000
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_USERS = &H80000003
Const HKEY_CURRENT_CONFIG = &H80000005
Const ERROR_NO_MORE_ITEMS = 259&
Const REG_OPTION_NON_VOLATILE = 0
Const KEY_SET_VALUE = &H2
Const REG_OPTION_BACKUP_RESTORE = 4
Const REG_OPTION_VOLATILE = 1
Const STANDARD_RIGHTS_ALL = &H1F0000
Const SYNCHRONIZE = &H100000
Const READ_CONTROL = &H20000
Const STANDARD_RIGHTS_READ = (READ_CONTROL)
Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)
Const KEY_CREATE_LINK = &H20
Const KEY_CREATE_SUB_KEY = &H4
Const KEY_ENUMERATE_SUB_KEYS = &H8
Const KEY_NOTIFY = &H10
Const KEY_QUERY_VALUE = &H1
Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or
KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
Const
KEY_WRITE
=
((STANDARD_RIGHTS_WRITE
Or
KEY_SET_VALUE
Or
KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))
Const KEY_EXECUTE = (KEY_READ)
Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or
KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or
KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))

_
_

_
_

Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal _ hKey As
Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As _ Long, phkResult As
Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long _
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey _ As Long,
ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal _ hKey As
Long, ByVal dwIndex As Long, ByVal lpName As String, lpcbName As Long, ByVal _ lpReserved As
Long, ByVal LpClass As String, lpcbClass As Long, lpftLastWriteTime As Any) _ As Long
Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal _ hKey As
Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As _ Long, ByVal
lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" _ (ByVal hKey
As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal LpClass _ As String, ByVal
dwOptions As Long, ByVal samDesired As Long, lpSecurityAttributes As _ Long, phkResult As Long,
lpdwDisposition As Long) As Long
Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal _ hKey As
Long, ByVal lpSubKey As String) As Long
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 515

Vamos a ver ahora como se introducen los datos en las claves. Para introducir cada dato, debemos
introducir el nombre y el valor de cada uno de ellos.

Funcin RegSetValueEx
Guarda un dato en una clave previamente abierta. Con esta funcin, puede tambin modificar el valor y
el tipo de informacin que almacena ese dato.
Declaracin
Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal
lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData
As Long) As Long
(Si declara el parmetro lpData como String, debe pasarlo por valor - By Val lpData As String)
hKey

es el Handle de la clave. Ser el valor devuelto por la funcin RegOpenKeyEx en el


parmetro phkResult.

lpValueName es el nombre del dato que va a introducir o modificar


Reserved

debe ponerse a 0

dwType

Tipo de informacin almacenada. Acepta estos valores

REG_BINARY ( = 3) Cualquier tipo de datos binarios


REG_DWORD ( = 4) Un nmero de 32 Bits (Long)
REG_DWORD_LITTLE_ENDIAN (= 4) Un nmero de 32 bits, en formato Little-endian. (El byte ms significativo es
el byte de mayor orden) Este es el formato utilizado por los ordenadores que utilizan W 95 o W NT. Por eso el
valor es el mismo (4) que para un Long
REG_DWORD_BIG_ENDIAN ( = 5) Un nmero de 32 bits, ordenado segn el formato Bigendian. (El byte ms significativo es el byte de menor orden)
REG_EXPAND_SZ ( = 2) Una cadena de caracteres que representa variables de entorno (Por
ejemplo, %PATH%). Debe terminar con el carcter nulo.
REG_LINK ( = 6) Un link simblico Unicode.
REG_MULTI_SZ ( = 7) Un array de cadenas de caracteres. Debe terminar con el carcter nulo.
REG_NONE ( = 0) Valor sin definir
REG_SZ ( = 1) Una cadena de caracteres
lpData

Variable que contiene el valor del dato a almacenar

cbData

Especifica el nmero de caracteres que tiene el dato pasado en el parmetro lpData.


Cuando el dato termina en el carcter nulo, cbData debe incluir este carcter nulo.

Funcin RegQueryValueEx
Devuelve el tipo y el valor de un dato almacenado en una clave abierta.
Declaracin
Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long,
ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As
Long) As Long
(Si se declara el parmetro lpData como String, debe pasarse por Valor -By Val).
hKey

Es el handle de una clave abierta.

lpValueName
LSB

Variable que contienen el nombre del dato a obtener

Visual Basic Gua del Estudiante

Captulo 1

Pgina 516

lpReserved

Reservado. Debe ser Null

lpType Apunta a una variable que va a recibir el tipo de dato que contiene. Es un Long, y
devolver uno de los valores descritos para el valor dwType de la funcin RegQueryValueEx.
Este valor debe ponerse a Null si no se necesita conocer el tipo de dato.
lpData Apunta a una variable que recibir el valor del dato. Esta variable, cuando es tipo string,
hay que declararla con un tamao prefijado, siempre mayor que el tamao del dato que va a
recibir (Por ejemplo, Dim MiVariable as String * 100 Se entiende que el dato que se va a meter
en MiVariable nunca ser superior a 100 caracteres) Tambin puede declararse como String sin
tamao, y ponerle posteriormente el tamao igual a lpcbData. Vea la explicacin de esto en el
ejemplo. Si no se necesita conocer el valor del dato, debe ponerse Null
lpcbData
Apunta a una variable que guardar el tamao del copiado en lpData. Si la
variable lpData no tienen tamao suficiente para almacenar el valor del dato, lpcbData devolver
el valor ERROR_MORE_DATA ( = 234)
NOTA: Esta funcin tiene un comportamiento un poco irregular. Cuando se ejecuta la primera vez no
lee el valor de lpData. S lee los dems parmetros. Hay que ejecutarla 2 veces seguidas para que
pueda leer ese parmetro.

Sigamos con el ejemplo prctico. Vamos a introducir y leer valores en una clave.
Para poner el valor a un dato de una clave, esa clave debe estar abierta. Se irn abriendo las claves de
forma jerrquica hasta llegar a la clave deseada. Una vez abierta esa clave, se utilizar la funcin
RegSetValueEx. Luego se cierran todas las claves en orden inverso a la apertura.
Private Sub cmdPonerValor_Click()
Dim Manejador1 As Long, Manejador2 As Long, Manejador3 As Long
Dim Var_lpValueName As String, Var_lpData As String, Var_cbData As Long
Var_lpValueName = TbNombreDato
Var_lpData = TbValorClave
Var_cbData = Len(Var_lpData)

TbNombreDato y TbValorClave son dos TextBox


donde se introducen el nombre del dato y su
valor respectivamente.

RegOpenKeyEx HKEY_CURRENT_USER, "Software", 0, KEY_ALL_ACCESS, Manejador1


If Manejador1 = 0 Then Exit Sub Comprueba que se ha abierto correctamente
RegOpenKeyEx Manejador1, "GuiadelEstudiante", 0, KEY_ALL_ACCESS, Manejador2
If Manejador2 = 0 Then Exit Sub
RegOpenKeyEx Manejador2, "Colores", 0, KEY_ALL_ACCESS, Manejador3
RegSetValueEx Manejador3, Var_lpValueName, 0, REG_SZ, ByVal Var_lpData, ByVal _ Var_cbData
RegCloseKey Manejador3
RegCloseKey Manejador2
RegCloseKey Manejador1
End Sub
Para leer un dato hay que proceder de forma similar, abriendo jerrquicamente las claves hasta llegar a
la clave a leer, y una vez abierta, proceder con la funcin RegQueryValueEx. Recuerde que esta
funcin hay que ejecutarla 2 veces para conseguir el valor del dato.

Private Sub cmdLeerValor_Click()


Dim Manejador1 As Long, Manejador2 As Long, Manejador3 As Long
Dim Var_lpValueName As String, Var_lpType As Long, Var_lpData As String * 100, Var_lpcbData As
Long
Dim Resp As Long
Var_lpValueName = Trim(TbNombreDato)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 517

Var_lpType = 1
RegOpenKeyEx HKEY_CURRENT_USER, "Software", 0, KEY_ALL_ACCESS, Manejador1
If Manejador1 = 0 Then Exit Sub
RegOpenKeyEx Manejador1, "GuiadelEstudiante", 0, KEY_ALL_ACCESS, Manejador2
If Manejador2 = 0 Then Exit Sub
RegOpenKeyEx Manejador2, "Colores", 0, KEY_ALL_ACCESS, Manejador3
If Manejador3 = 0 Then Exit Sub
RegQueryValueEx Manejador3, Var_lpValueName, 0, Var_lpType, ByVal Var_lpData, _ Var_lpcbData
'Esto es la irregularidad de este API. La primera vez no lo lee. Hay que repetir la funcin
RegQueryValueEx Manejador3, Var_lpValueName, 0, Var_lpType, ByVal Var_lpData, _ Var_lpcbData
RegCloseKey Manejador3
RegCloseKey Manejador2
RegCloseKey Manejador1
LValorClaveRet = Trim(Var_lpData)
LTamanoValor = Var_lpcbData
End Sub
Podemos aprovechar la primera ejecucin de la funcin para leer el dato lpcbData que nos indica el
tamao de lpData. A continuacin hacemos que la variable Var_lpData tenga ese tamao, rellenando
tantos caracteres con espacios. Es otra forma de hacer lo mismo.
Private Sub cmdLeerValor2_Click()
Dim Manejador1 As Long, Manejador2 As Long, Manejador3 As Long
Dim Var_lpValueName As String, Var_lpType As Long, Var_lpData As String, Var_lpcbData As Long
Dim Resp As Long
Var_lpValueName = Trim(TbNombreDato)
Var_lpType = 1
RegOpenKeyEx HKEY_CURRENT_USER, "Software", 0, KEY_ALL_ACCESS, Manejador1
If Manejador1 = 0 Then Exit Sub
RegOpenKeyEx Manejador1, "GuiadelEstudiante", 0, KEY_ALL_ACCESS, Manejador2
If Manejador2 = 0 Then Exit Sub
RegOpenKeyEx Manejador2, "Colores", 0, KEY_ALL_ACCESS, Manejador3
If Manejador3 = 0 Then Exit Sub
'Leemos el valor de Var_lpcbData
RegQueryValueEx Manejador3, Var_lpValueName, 0, Var_lpType, ByVal Var_lpData, Var_lpcbData
'Hacemos que Var_lpData tenga el tamao obtenido en Var_lpcbData
Var_lpData = String(Var_lpcbData, " ")
RegQueryValueEx Manejador3, Var_lpValueName, 0, Var_lpType, ByVal Var_lpData, Var_lpcbData
RegCloseKey Manejador3
RegCloseKey Manejador2
RegCloseKey Manejador1
LValorClaveRet = Var_lpData
LTamanoValor = Var_lpcbData
End Sub
Vamos a ver ahora como podemos borrar un valor. Se usa para ello la funcin RegDeleteValue

Funcin Function RegDeleteValue


Elimina un valor dentro de una clave.
Declaracin
Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long,
ByVal lpValueName As String) As Long
HKey
LSB

Es el handle de una clave abierta. (Es el valor phkResult obtenido en la funcin


RegOpenKeyEx)

Visual Basic Gua del Estudiante

Captulo 1

Pgina 518

LpValueName Es una variable que contienen el nombre del valor a eliminar.


En este ejemplo, se elimina el valor cuyo nombre est escrito en TbNombreDato
Private Sub cmdEliminarValor_Click()
Dim Manejador1 As Long, Manejador2 As Long, Manejador3 As Long
Dim Var_lpValueName As String
Var_lpValueName = TbNombreDato
RegOpenKeyEx HKEY_CURRENT_USER, "Software", 0, KEY_ALL_ACCESS, Manejador1
RegOpenKeyEx Manejador1, "GuiadelEstudiante", 0, KEY_ALL_ACCESS, Manejador2
RegOpenKeyEx Manejador2, "Colores", 0, KEY_ALL_ACCESS, Manejador3
RegDeleteValue Manejador3, Var_lpValueName
RegCloseKey Manejador3
RegCloseKey Manejador2
RegCloseKey Manejador1
End Sub

RegEnumValue
Esta funcin devuelve el nombre y el valor de cada uno de los datos contenidos dentro de una clave
previamente abierta. Esta funcin devuelve el nombre y valor de uno solo de los datos, por lo que ser
necesario recurrir a una serie de llamadas en un bucle para obtenerlos todos.
Declaracin
Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal
dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, lpReserved As Long, lpType
As Long, lpData As Any, lpcbData As Long) As Long
hKey

Handle de la clave abierta.

DwIndex Es una variable donde le indicamos el Indice correspondiente al valor a devolver. El


primero debe ser el 0, y se ir incrementando en 1 en cada lectura. Dado que los datos no estn
ordenados, puede devolverlos en cualquier orden.
lpValueName
terminacin.

Apunta a una variable que recibe el nombre del dato, incluido el carcter nulo de

lpcbValueName
Apunta a una variable Long que va a recibir el dato con el tamao del
parmetro lpValueName. Este dato incluye el carcter nulo de terminacin.
lpReserved

Reservado. Debe ser Null

lpType

Apunta a una variable que va a contener el tipo de dato que se va a obtener. Los
valores que se pueden obtener son los mismos que los indicados para el
parmetro dwType de la funcin RegSetValueEx
lpData Apunta a una variable que va a recibir el valor del dato.
lpcbData

Apunta a una variable Long que va a recibir el tamao del dato a devolver en
lpData.

Esta funcin devuelve el valor 0 cuando se ha desarrollado correctamente, y el valor 259 cuando no hay
valores que mostrar en el ndice indicado. Aprovecharemos el valor devuelto para saber cundo
debemos dejar el bucle de lectura.
En el siguiente ejemplo, se muestran en un ListBox (List1) el ndice, el nombre del dato y el valor del
dato. Esta funcin tienen algunas particularidades (Hay muchas APIs con particularidades similares).
Las variables que van a contener datos tipo string hay que declararlas con un tamao superior al que van
a tener (P.e. Var_lpValueName As String * 255) o rellenarlas previamente con un nmero de caracteres
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 519

superior al tamao que van a tener. El carcter ideal son los espacios, ya que luego se pueden eliminar
con Trim [Se realiza en las lneas Var_lpValueName = Space(255) y Var_lpData = Space(255)] y las
variables Long que almacenan el tamao de las variables string hay que darles un valor superior al que
van a tener en la funcin (Var_lpcbValueName = 255 y Var_lpcbData = 255) Observe que se us la
sintaxis de VarLong = Funcin (Parmetros) para que pueda devolvernos el nmero 0 259,
dependiendo de si hay o no hay elementos con ese ndice.
Private Sub cmdVerValores_Click()
Dim Manejador1 As Long, Manejador2 As Long, Manejador3 As Long
Dim I As Long, Var_lpValueName As String, Var_lpcbValueName As Long
Dim Var_lpType As Long, Var_lpData As String, Var_lpcbData As Long
Dim Resp As Long
RegOpenKeyEx HKEY_CURRENT_USER, "Software", 0, KEY_ALL_ACCESS, Manejador1
RegOpenKeyEx Manejador1, "GuiadelEstudiante", 0, KEY_ALL_ACCESS, Manejador2
RegOpenKeyEx Manejador2, "Colores", 0, KEY_ALL_ACCESS, Manejador3
Do While Resp = 0
Var_lpValueName = Space(255)
Var_lpData = Space(255)
Var_lpcbValueName = 255
Var_lpcbData = 255
Resp = RegEnumValue(Manejador3, I, Var_lpValueName, Var_lpcbValueName, 0, Var_lpType, ByVal
Var_lpData, Var_lpcbData)
Var_lpValueName = Left(Var_lpValueName, Var_lpcbValueName)
Var_lpData = Left(Var_lpData, Var_lpcbData)
List1.AddItem I & " - " & Trim(Var_lpValueName) & " - " & Trim(Var_lpData)
I=I+1
Loop
RegCloseKey Manejador3
RegCloseKey Manejador2
RegCloseKey Manejador1
End Sub

Funcin RegEnumKeyEx
Devuelve los nombres de las subclaves de una clave del registro previamente abierta. Esta
funcin obtiene el nombre de una nica subclave cada vez que se le llama, por lo que para leerlos
todos, es necesario recurrir a llamadas en bucle.
Declaracin
Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal hKey As
Long, ByVal dwIndex As Long, ByVal lpName As String, lpcbName As Long, lpReserved As Long,
ByVal lpClass As String, lpcbClass As Long, lpftLastWriteTime As FILETIME) As Long

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 520

hKey Manejador de la clave bajo la cual estn las subclaves a enumerar


dwIndex Es el ndice de la subclave a investigar. Como esta funcin obtiene
solamente el valor de una de las subclaves, ser necesario recurrir a un bucle
para investigarlas todas. El ndice pasado para la primera llamada debe ser el 0,
ya que los ndices van de 0 a n-1. El orden de los ndices dentro de las
subclaves es arbitrario, por lo que tambin ser arbitrario el orden con el que
nos va a devolver esta funcin los valores de las subclaves.
lpName Es el buffer donde la funcin nos devolver el nombre de la subclave.
(Incluye un carcter nulo como terminacin) Este buffer va a contener
solamente el nombre de la clave, no su direccin jerrquica completa.
lpcbName Es el buffer donde se le indica a la funcin el tamao del buffer
lpName, y una vez que la funcin se ha ejecutado, contendr el nmero de
caracteres real (sin el carcter nulo de terminacin) del valor almacenado en
lpName.
LpReserved Reservado. Debe ser siempre Nulo.
LpClass Es el buffer que contiene la clase del subclave a devolver. Este es
el mismo valor introducido en el parmetro LpClass en la funcin
RegCreateKeyEx. Si no se necesita que el valor devuelto sea una clase, este
valor debe ponerse Null.
LpcbClass Es el buffer que contiene el tamao (en caracteres) previsto para
LpClas. Una vez ejecutada la funcin, contiene el tamao exacto de LpClas
sin contar el carcter nulo de terminacin. Este parmetro debe ser Null
solamente cuando LpClass sea Null
LpftLastWriteTime Es el buffer donde devolver la fecha y hora del ltimo
cambio de la subclave. Sale un nmero incomprensible. No es fcil ver que sea
la fecha del cambio de la clave
Esta funcin devuelve 0 si se ha ejecutado perfectamente, y 259 si la posicin correspondiente al ndice
no tienen clave alguna.

En el siguiente ejemplo se ve como obtener en nombre de las subclaves de una clave.


Private Sub cmdVerClaves_Click()
Dim Manejador1 As Long, Manejador2 As Long
Dim I As Long, Val_lpName As String, Val_lpcbName As Long
Dim Var_lpftLastTime As Long, Var_LpClass As String, Var_lpcbClass As Long
Dim Resp As Long
RegOpenKeyEx HKEY_CURRENT_USER, "Software", 0, KEY_ALL_ACCESS, Manejador1
RegOpenKeyEx Manejador1, "GuiadelEstudiante", 0, KEY_ALL_ACCESS, Manejador2
Do While Resp = 0
Val_lpName = Space(255)
Var_LpClass = Space(255)
Val_lpcbName = 255
Var_lpcbClass = 255
Resp = RegEnumKeyEx(Manejador2, I, Val_lpName, Val_lpcbName, 0, Var_LpClass, Var_lpcbClass,
Var_lpftLastTime)
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 521

Val_lpName = Left(Val_lpName, Val_lpcbName)


List1.AddItem I & " - " & Trim(Val_lpName)
I=I+1
Loop
RegCloseKey Manejador2
RegCloseKey Manejador1
End Sub

Hay ms APIS para el control del registro. En este curso creemos que ya hay materia suficiente para
tener una idea del manejo del registro (Creacin de claves, eliminacin, Lectura y escritura) Con los
ejemplos descritos en este captulo hay materia suficiente para poder realizar todas las funciones que
una aplicacin normal pueda hacer sobre el registro.

El uso de Apis en una aplicacin la hace generalmente ms rpida ya que aprovecha recursos ya
existentes en Windows y adems compilados. Tiene un pequeo inconveniente cuando se hace un
desarrollo que va a funcionar sobre distintas versiones de Windows. No es normal que ocurra, pero hay
que comprobar que un programa diseado en W95 corre perfectamente en W2000. Y es que algunas
Apis no son exactamente iguales.

APIS PARA EL CONTROL DE LA IMPRESORA. EnumPrinters


Por otra parte, programar con Apis, aunque es muy elegante y aporta mucho cach al programador,
tampoco hay que pasarse. En el ejemplo que sigue se utilizan Apis para el control de la impresora (Hay
varias) y una de ellas nos permite conocer las impresoras disponibles en el sistema: EnumPrinters
Funcin EnumPrinters
Declaracin
Declare Function EnumPrinters Lib "winspool.drv" Alias "EnumPrintersA" (ByVal flags As Long, ByVal
name As String, ByVal Level As Long, pPrinterEnum As Long, ByVal cdBuf As Long, pcbNeeded As
Long, pcReturned As Long) As Long
Vamos a necesitar definir un tipo de variable:
Private Type PRINTER_INFO_1
flags As Long
pDescription As String
pName As String
pComment As String
End Type
Y declarar una constante
Const PRINTER_ENUM_LOCAL = &H2
El procedimiento donde ensayamos esta funcin permite presentar en un ListBox (LbPrinters) todas las
impresoras disponibles:
Esta rutina ha sido copiada, traducida, y ligeramente modificada de:
KPD-Team 1999
URL: http://www.allapi.net/
E-Mail: KPDTeam@Allapi.net

Gracias
Private Sub cmbListarPrintersLocales_Click()
Dim LongBuffer() As Long
' Array que almacena los punteros del bffer donde se encuentra la informacin de la impresora
Dim PrintInfo() As PRINTER_INFO_1
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 522

'Array con estructura tipo PRINTER_INFO_1 donde se guardarn los valores de cada parmetro de las
impresoras
Dim NumBytes As Long
'Este es el tamao que le asignamos al buffer donde la API almacenar los datos. Debe ser mayor que
los bytes que vamos a obtener
Dim NumNecesario As Long
'Variable donde se introducir el nmero exacto de bytes necesario para el buffer
Dim NumPrinters As Long
'Variable donde se introducir el nmero de impresoras encontradas
Dim C As Integer, RetVal As Long
'C = Contador variable, RetVal = Valor de retorno de la funcin
'Obtiene la informacin de las impresoras locales (PRINTER_ENUM_LOCAL)
NumBytes = 3000
'Debe ser suficientemente largo para contener la informacin de todas las impresoras (Sin pasarse)
ReDim LongBuffer(0 To NumBytes / 4) As Long
'ReDimensiona el array. Observe que un Long son 4 bytes
RetVal = EnumPrinters(PRINTER_ENUM_LOCAL, "", 1, LongBuffer(0), NumBytes, NumNecesario,
NumPrinters)
If RetVal = 0 Then
'RetVal ser 0 si la funcin no se ha podido realizar correctamente. o ms probable es que hayamos
puesto un nmero muy pequeo para NumBytes. Ahora ya conocemos el nmero de Bytes necesario
para contener toda la informacin ese nmero es NumNecesario. Hacemos que NumBytes sea igual a
NumNecesario
NumBytes = NumNecesario
ReDim LongBuffer(0 To NumBytes / 4) As Long 'Ahora ya es suficientemente largo
RetVal = EnumPrinters(PRINTER_ENUM_LOCAL, "", 1, LongBuffer(0), NumBytes, NumNecesario,
NumPrinters)
If RetVal = 0 Then ' Si vuelve a fallar ya es por otro motivo!
MsgBox "No se pueden enumerar las impresoras"
Exit Sub ' Se sale de este procedimiento
End If
End If
' Ahora mete el contenido de LongBuffer() en PrintInfo()
If NumPrinters <> 0 Then ReDim PrintInfo(0 To NumPrinters - 1) As PRINTER_INFO_1
'PrintInfo contiene a su vez 4 variables que almacenan toda la informacin de la impresora
'Recordamos la definicin de PrintInfo
'Private Type PRINTER_INFO_1
' flags As Long
' pDescription As String
' pName As String
' pComment As String
'End Type
For C = 0 To NumPrinters - 1 'Bucle que coloca cada juego de informacin de LongBuffer() en cada
elemento de PrintInfo.Longbuffer(4 * c) = .flags, longbuffer(4 * c + 1) = .pDescription, etc.
'Para los valores tipo String, previamente se rellenan de espacios con la funcin Space y luego les
introduce el valor obtenido mediante la funcin lstrcpy.
PrintInfo(C).flags = LongBuffer(4 * C)
PrintInfo(C).pDescription = Space(lstrlen(LongBuffer(4 * C + 1)))
RetVal = lstrcpy(PrintInfo(C).pDescription, LongBuffer(4 * C + 1))
PrintInfo(C).pName = Space(lstrlen(LongBuffer(4 * C + 2)))
RetVal = lstrcpy(PrintInfo(C).pName, LongBuffer(4 * C + 2))
PrintInfo(C).pComment = Space(lstrlen(LongBuffer(4 * C + 3)))
RetVal = lstrcpy(PrintInfo(C).pComment, LongBuffer(4 * C + 3))
Next C
' Presenta el nombre de las impresoras
For C = 0 To NumPrinters - 1
LbPrinters.AddItem PrintInfo(C).pName
Next C
End Sub
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 523

El cdigo no est nada mal. Aunque lleva comentarios con el fin de entender el funcionamiento
de esta funcin, hay que reconocer que es largo. El resultado puede verse en la figura. Estn
todas las impresoras disponibles.

Pero vamos a ver otro cdigo que hace lo mismo sin usar Apis.
Private Sub cmdBuscarPrinters_Click()
Dim I As Integer
For I = 0 To Printers.Count - 1
LbBuscaPrinters.AddItem Printers(I).DeviceName
Next I
End Sub
El resultado es el de la figura de la izquierda. Seis lneas
frente a dos pginas. El buen programador usa la sencillez
de cdigo como su mejor arma. Y si se pueden usar 6 lneas
en vez de 30, hay que usar 6 lneas.
La razn de que la propiedad DeviceName del objeto Printer
nos d el nombre de las impresoras es que ese cdigo largo
de la pgina anterior ya est implementado en Visual Basic.
Solamente nos falta satisfacer la curiosidad de cmo se
selecciona una impresora (botn inferior) Con Apis? Se
puede. Desea escribir otras dos pginas de cdigo, o le es suficiente con este?
Private Sub cmdSeleccionarPrinter_Click()
If LbBuscaPrinters = "" Then
MsgBox "Debe elegir una impresora"
Exit Sub
End If
Dim sImpresora As String, pPrinter As Printer
sImpresora = LbBuscaPrinters.Text
' Buscamos la impresora selecionada en la lista entre todas las impresoras existentes
For Each pPrinter In Printers
If UCase(pPrinter.DeviceName) = UCase(sImpresora) Then
Set Printer = pPrinter
'A partir de ahora, pPrinter ser la impresora elegida a la que VB dirigir la
impresin cada vez que citemos Printer.Print.
Exit For
End If
Next
End Sub

De las APIs queda mucho por estudiar. Pero ya debe ser el alumno quien ahonde en ello segn
sus propias necesidades. Creo que con lo expuesto hay suficiente para empezar.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 524

Visual Basic - Gua del Estudiante Cap. 18


Visual Basic e Internet
Internet es la tentacin en la que actualmente todos los estudiantes quieren caer. Y tienen motivos para
ello. Internet ofrece unas posibilidades de comunicacin como nunca las ha habido, lo que brinda unas
oportunidades inmensas al programador si analiza de forma pausada lo que la red le puede ofrecer.
Y digo si las analiza de forma pausada porque esa tentacin en la que caen todos los estudiantes es
pretender crear un navegador similar al Internet Explorer o al Netescape, un correo que supere al
Eudora y un programa de FTP que sea capaz de bajarle la Enciclopedia Britnica en menos de media
hora. Pero hay que ponerse con los pies en la tierra y comprender que esos programas llevan mucho
trabajo de muchos programadores, mucho tiempo de prueba y unos medios econmicos y comerciales
tras ellos que hacen que esos productos tengan que ser necesariamente mejores que lo que puede
hacer un estudiante, por mucho inters e ilusin que ponga.
Sin embargo s puede ser muy ilustrativo que en este curso nos propongamos la meta de hacer un
programa que sea al tiempo el mejor navegador, el mejor correo (por dos procedimientos), y el mejor
FTP que se pueda concebir, y encima que pueda hacer chat, ping y Telnet. Ser el mejor, sin duda,
porque ser el nico que nos permita aprender a manejar los controles que Visual Basic nos tienen
reservados para los entornos IP.
Nota para alumnos expertos. Si de verdad es Ud. un experto y se lo sabe todo sobre IP puede saltar
directamente al tema Controles de Visual Basic para las redes IP. La coleccin Gua del Estudiante
est escrita pensando en quien no sabe y quiere saber. Por eso no puedo pasar pos alto conceptos de
nomenclatura de redes IP que se repetirn a lo largo del captulo, y que seguro que a ms de un alumno
le aportarn nuevos conocimientos. Si pese a ser un experto, su humildad le aconseja lerselo, ver que
a lo mejor se le aclara ms de un concepto.

Redes IP. Protocolos de comunicacin en redes IP


Una red IP es una red de comunicacin basada en la transmisin bidireccional de paquetes. Cuando
decimos esto queremos expresar que la comunicacin entre dos puntos de la red (entre dos
ordenadores conectados a la red) no es continua, sino que la informacin se parte en origen en
pequeos trozos que se envan por la red hasta el destino. Una vez all, se vuelven a poner cada uno de
los paquetes en su sitio para volver a formar el bloque de informacin que tenamos en origen. Esta
tcnica permite compartir al mismo tiempo los recursos de la red por muchos usuarios, sin que ninguno
de ellos pueda bloquear la red por el hecho de enviar una gran cantidad de informacin. Cada usuario
podr enviar el mismo nmero de paquetes por unidad de tiempo (ms o menos) por lo tanto quien deba
enviar ms informacin tardar ms tiempo que otro que tenga menos informacin. Y todo sin llegar a
bloquear la red. Eso s, cuantos ms usuarios estn presentes en un determinado momento, ms lenta
la veremos, ya que nos corresponder menos nmero de paquetes por unidad de tiempo.
El hecho de que la informacin original se trocee en paquetes que se envan a la red implica poner una
direccin de destino a cada uno de esos paquetes (para saber a quien van dirigidos) y la direccin del
origen, (para saber quien lo enva). De esta forma, la red sabe a quien debe entregar el paquete y el
destino sabe de quien procede. Todo esto lo hace el protocolo IP (Internet Protocol) Esto es como si IP
trabajase solamente de cartero. Coge paquetes en un buzn y los enva a su destinatario sin importarle
el contenido del paquete. Luego veremos lo de la direccin. Lo cierto es que el paquete llega al destino.
A este nivel de comunicacin le llamaremos Nivel de Red. Si lo prefiere, tambin le puede llamar Nivel
de Enlace. Es problema de terminologa. No se complique la vida. Al protocolo IP le podemos denominar
por tanto, Protocolo de Red.
Lo que no sabe el destino es el orden en el que tiene que colocar el paquete dentro del bloque total de
informacin. Debido a que el camino seguido por los paquetes no tiene porqu ser el mismo para todos,
es posible que se reciba primero un paquete que se ha transmitido con posterioridad. Por lo tanto ser
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 525

necesario poder establecer el nmero de orden de cada uno de los paquetes dentro del grupo total de
paquetes que se han generado para la transmisin. Tambin ser necesario en ciertos casos conocer si
el destino ha recibido correctamente el paquete. Estas cosas las hace el Protocolo de Transporte.
El protocolo IP tiene dos protocolos de transporte: el TCP y el UDP.
El TCP establece una comunicacin en la que el origen enva un paquete y espera la confirmacin del
receptor de que lo ha recibido. Si pasa un determinado tiempo sin recibir esa confirmacin vuelve a
enviar el mismo paquete. Pudo haberse perdido el paquete que haba enviado o tambin pudo perderse
la confirmacin. En cualquier caso el origen vuelve a enviar y el receptor puede saber perfectamente lo
que ha ocurrido y colocar el paquete en su sitio si se haba perdido inicialmente, o descartarlo si la
repeticin se ha debido a que se haba perdido la contestacin. Cada paquete lleva un nmero que
indica el nmero de orden de ese paquete dentro del bloque total. El protocolo TCP es muy seguro.
Porque adems de lo expuesto, tiene un procedimiento de clculo de una Checksum que permite saber
si un paquete ha llegado sin ningn tipo de error. Si detecta error en un paquete, pide repeticin.
Tambin lleva el nmero del puerto por el que debe entrar esa informacin. Ver mas adelante lo que es
un puerto. Mediante el protocolo TCP podemos transportar un fichero enorme sin ningn tipo de error. Es
el que se usa normalmente en las redes IP. Por cierto, Sabe que significa TCP? Transmision Control
Protocol , o como dira Cervantes, Protocolo de Control de Transmisin.
El protocolo UDP (que significa User Datagram Protocol) o Protocolo de Datagramas de Usuario es un
protocolo que enva paquetes sin esperar respuesta. No le preocupa que los paquetes se pierdan. UDP
usa menos recursos y por lo tanto es ms rpido. Dependiendo del tipo de informacin que se enve, a lo
mejor resulta ms prctico enviar paquetes UDP que paquetes TCP. Sobre todo cuando son
informaciones muy cortas, que no sobrepasan la capacidad de un paquete. Dicen que no es un sistema
seguro, pero eso depender en gran medida del programa que hagamos. Dado que no es un sistema
seguro, deberemos implementar en el programa la secuencia de envo - confirmacin de recibido que
tiene el TCP. Obviamente eso lo va a complicar un poco. Quizs por eso el protocolo usado
generalmente para transmisin de informacin es el TCP.
Le ser muy familiar el TCP/IP. Es la combinacin del protocolo TCP con IP. Y es momento ahora de
explicar con un ejemplo simulado como funciona TCP/IP. Imagnese que TCP coge el bloque de
informacin a transmitir y lo trocea en varios paquetes. A cada uno de ellos le aade el nmero de orden
que tiene ese paquete dentro del bloque total de informacin, calcula el Checksum que le corresponde y
se lo anexa. Con esos datos ya somos capaces de volver a restituir el bloque de informacin completo.
Pero hace falta todava enviarlo al destinatario. Para ello se lo entregamos al protocolo IP, que lo mete
en un "sobre" donde le apunta la direccin y el remitente. Y lo suelta a la red. La red solamente ve la
direccin y el remitente (Por favor que nadie se lo crea a pies juntillas, no es as exactamente, esto es
solamente un ejemplo) y reencamina el paquete a travs de los enrutadores (routers) para hacerlo llegar
a su destino. El destinatario abre el sobre, analiza el Checksum, mira el nmero de paquete que es,
comprueba que no lo tiene todava, y entonces crea un pequeo paquete en el que dice que ha recibido
correctamente el paquete con ese nmero. Lo mete en un sobre IP donde pone como direccin el
remitente del paquete recibido y como remite su propia direccin, y lo enva a la red. Ya se encargar la
red de hacerlo llegar a su destino. Al recibirlo (lo recibe el terminal que estamos llamando origen) ve que
le dan conformidad al paquete enviado, y se despreocupa ya de ese paquete. Otro tema sera que el
destino hubiera recibido el paquete y le saliera el Checksum errneo. Le mandara un paquete al origen
comunicndoselo. Entonces el origen se lo volvera a enviar. Lo mismo ocurrira si el origen, pasado
cierto tiempo, no ha recibido confirmacin de recibo de un paquete, sea afirmativa o negativa esta
confirmacin. El origen vuelve a enviar el paquete, hasta que reciba confirmacin de que fue bien
recibido. Se da cuenta ahora de porque, de vez en cuando, parece que se paraliza la red? El orden de
envo de paquetes no tiene porqu ser estricto. No es necesario haber recibido la conformidad del
paquete anterior para enviar el siguiente.
Veamos ahora lo de la direccin. Decamos que IP pone la direccin del destinatario y del remitente.
Esas direcciones son un conjunto de cuatro nmeros del 0 al 255, separados por un punto. Por ejemplo,
podra ser 195.236.12.56 As de fras son las direcciones de Internet. Como cada nmero puede tomar
los valores del 0 al 255, la numeracin total de Internet puede llegar a 4.228.250.625 No son mucho
esos cuatro mil doscientos millones. Piense que somos seis mil millones de personas en el mundo. Por
eso ha habido que buscar formas de aprovechar al mximo las direcciones IP. No es objeto de este
curso su estudio, pero digamos que se logra a base de que las redes de rea local conectadas a Internet
se conectan solamente con un nmero, e internamente tienen otro (el nmero interno no coincide con
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 526

ninguno de Internet, pero se repite en todas las redes de rea local). Otra forma de aprovechar la
numeracin es asignar nmeros dinmicamente. Eso ocurre cuando nos conectamos a Internet desde
nuestras casas. Mientras dura la conexin, nuestro ISP (Proveedor de Servicio de Internet) nos cede un
nmero IP de los que le han asignado a l. Cuando nos desconectamos, ese nmero se lo da al
siguiente que se conecte. Por eso, en nuestras casas, cuando nos conectamos a travs de la conexin
telefnica a redes, no tendremos siempre el mismo nmero IP.
Esta Direccin IP la usa el Protocolo de Red, es decir El Internet Protocol, que como decamos antes,
era como un cartero que recoge una carta del Origen y la pone en el Destino sin saber que es lo que
contiene. Ese origen y destino son mquinas, es decir, ordenadores que estn conectados a la red.
Nota acerca de las direcciones IP. Existe una serie de direcciones IP que no se pueden usar en
Internet debido a que estn reservadas para redes de rea local. Esto se hace as para que nunca pueda
haber error entre direcciones. Si asignamos a un equipo interior a una red un nmero posible en Internet,
un Router que est separando la red de rea local del mundo Internet podra equivocarse y enviar hacia
fuera un paquete interno a nuestra red. Por eso se han reservado esas direcciones. Son estas
De la 10.0.0.0 a la 10.255.255.255
De la 172.16.0.0 a la 172.31.255.255
De la 192.168.0.0 a la 192.168.255.255
Tampoco se pueden usar las direcciones:
0.0.0.0 a la 0.255.255.255 Se usan para llamar al ordenador local principal
255.0.0.0 a la 255.255.255.255 Son direcciones de difusin (transmisin hacia todos los equipos)
127.0.0.0 a la 127.255.255.255 que se usan para funciones internas a la mquina. Tcnicamente
hablando se dice que estas direcciones son para LoopBack

IP Versin 6
Como esto de Internet lo nico que puede hacer es subir, y los 4.200 millones de direcciones se van a
quedar cortas tarde o temprano, se est definiendo una nueva versin de direcciones IP, la esperada
versin 6, que consistir en direcciones de 128 bits, frente a los 32 actuales. Si pensamos que cada bit
que ampliemos doblamos la capacidad, vemos que la cifra de direcciones posibles sobrepasa las
necesidades actuales. (Por sobrepasar, sobrepasa la capacidad de mi calculadora y el resultado es
Overflow). Esta solucin de 128 bits permitir conectar cualquier ordenador de una RAL con un nmero
IP verdadero, es decir, un nmero de la red Internet. Pero eso ya lo veremos en la prxima Gua del
Estudiante.

Puertos de Comunicacin.
Vamos a ver un concepto nuevo: el Puerto de Comunicacin. Hasta ahora hemos hablado de
direcciones de mquina que son las que ve el protocolo IP. Dentro de una mquina podemos tener
varios servicios (Correo, Ftp, www, o cualquier otro programa que nosotros hagamos) Cuando llega uno
de esos paquetes que contienen informacin, la mquina debe saber reconocer a que servicio est
destinado. Eso lo sabe mediante el Puerto de Comunicacin al que va dirigido el paquete.
El puerto de Comunicacin no es un puerto fsico. Volvemos a lo de siempre: es una forma de hablar. Lo
mismo que la direccin IP nos conduce a una mquina, un puerto nos lleva a un servicio dentro de esa
mquina. Cuando enviamos una carta, el cartero (Protocolo IP) la lleva al domicilio indicado en el sobre.
Imagnese que ese domicilio es en edificio de oficinas. Debemos saber ahora el nmero de la oficina
donde la debemos entregar. Pero el trabajo del cartero ya finaliz cuando nos ha entregado la carta en
portera. Para saber el nmero de la oficina debemos abrir el sobre y ver a que oficina est dirigida. De
esto se encarga el Protocolo de Transporte (TCP o UDP) que analiza el contenido del paquete y mira el
valor de dos bytes que indican el nmero del puerto. Esos dos bytes son los que indicaran el nmero de
la oficina en ese edificio de nuestro smil postal. Pero tenga en cuenta siempre que el puerto no indica
por donde entra la informacin a la mquina (entra por la placa de red, que tiene asociado una direccin
IP) sino el servicio (un programa) al que va destinada la informacin. Dado que el nmero del puerto se
expresa con dos bytes, los nmeros de puerto posibles son del 1 al 65536.
Los 1024 primeros puertos estn reservados para distintos servicios de comunicacin dentro de la
mquina. No los use para sus aplicaciones. Los servicios ms conocidos utilizan los siguientes puertos:
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 527

1 - tcpmux
5 - rje
7 - echo
9 - discard
11 - systat
13 - daytime
15 - netstat
17 - qotd
18 - send/rwp 19 - chargen 20 - FTP (data) 21 - FTP (control)
22 - ssh, pcAnywhere
23 - Telnet
25 - SMTP
27 - ETRN
29 - msg-icp
31 - msg-auth
33 - dsp
37 - time
38 - RAP
39 - rlp
42 - nameserv/WINS
43 - whois, nickname
49 - TACACS/Login Host Protocol
50 - RMCP
53 - DNS
57 - MTP
59 - NFILE
63 - whois++
66 - sql*net
67 - bootps
68 - bootpd/dhcp
69 - Trivial File Transfer Protocol (tftp)
70 - Gopher
79 - finger
80 - www-http 88 - Kerberos, WWW
95 supdup
96 DIXIE
98 - linuxconf 101 - HOSTNAME
102 - ISO, X.400, ITOT
105 - cso
106 poppassd
109 - POP2
110 - POP3
111 - Sun RPC Portmapper
113 - identd/auth
115 - sftp
117 - uucp
119 - NNTP
120 - CFDP
123 NTP
124 - SecureID 129 - PWDGEN
133 - statsrv
135 loc-srv/epmap
137 - netbios-ns 138 - netbios-dgm (UDP)
139 - NetBIOS 143 IMAP
144 NewS
152 BFTP
153 - SGMP
161 - SNMP
175 vmnet
177 - XDMCP 178 -NextStep Window Server 179 - BGP
180 - SLmail admin
199 - smux
210 - Z39.50
218 MPP
220 - IMAP3
259 - ESRO
264 -FW1_topo
311 Apple WebAdmin
350 - MATIP type A
351 - MATIP type B
363 - RSVP tunnel
366 - ODMR (On-Demand Mail Relay)
387 - AURP (AppleTalk Update-Based Routing Protocol) 389 - LDAP
407 - Timbuktu
434 - Mobile IP 443 ssl
444 - snpp, Simple Network Paging Protocol
445 - SMB
458 - QuickTime TV/Conferencing
468 - Photuris 500 - ISAKMP, pluto
512 - biff, rexec
513 who, rlogin 514 - syslog, rsh
515 - lp, lpr, line printer
517 - talk
520 - RIP (Routing Information Protocol) 521 RIPng
522 - ULS
543 - KLogin, AppleShare over IP
545 QuickTime
548 AFP
554 - Real Time Streaming Protocol
555 - phAse Zero
563 NNTP over SSL
575 - VEMMI 581 Bundle Discovery Protocol 593 - MS-RPC 608 - SIFT/UFT
626 Apple ASIA
631 - IPP (Internet Printing Protocol)
635 - mountd (Linux)
636 sldap
642 - EMSD
648 - RRP (NSI Registry Registrar Protocol)
660 - Apple MacOS Server Admin
666 - Doom
674 - ACAP
687 - AppleShare IP Registry
705 - AgentX for SNMP
901 - ISS Real Secure Sensor Port
993 - s-imap
995 - s-pop
1080 - SOCKS 1085 - WebObjects
1243 - SubSeven
1338 - Millennium Worm
1352 - Lotus Notes
1381 - Apple Network License Manager
1417 - Timbuktu
1418 - Timbuktu
1419 - Timbuktu
1433 - Microsoft SQL Server
1434 - Microsoft SQL Monitor 1503 - T.120
1521 - Oracle SQL
1525 - prospero
1526 - prospero
1527 - tlisrv
1645 - RADIUS Authentication
1646 - RADIUS Accounting
1680 - Carbon Copy
1701 - L2TP/LSF
1717 - Convoy
1720 - H.323/Q.931
1723 - PPTP control port
1755 - Windows Media .asf
1758 - TFTP multicast
1812 - RADIUS server
1813 - RADIUS accounting
1818 - ETFTP
1973 - DLSw DCAP/DRAP
1985 - HSRP 1999 - Cisco AUTH
2001 - glimpse 2049 - NFS
2064 - distributed.net
2065 - DLSw 2066 DLSw 2106 - MZAP 2140 DeepThroat
2301 Compaq Insight Management Web Agents
2336 - Apple UG Control
2427 - MGCP gateway
2504 WLBS 2535 - MADCAP
2543 - sip
2727 - MGCP call agent 2592 netrek
2628 - DICT
2998 - ISS Real Secure Console Service Port
3000 - Firstclass
3031 - Apple AgentVU
3128 squid
3130 - ICP
3150 - DeepThroat
3283 - Apple NetAssitant
3288 COPS
3305 ODETTE
3306 - mySQL 3389 - NT Terminal Server
4321 rwhois
4333 - mSQL 4827 - HTCP 5004 - RTP
5005 RTP
5010 - Yahoo! Messenger
5060 - SIP
5190 AIM
5500 - securid 5501 - securidprop
5423 - Apple VirtualUser
5631 - PCAnywhere data
5632 - PCAnywhere
5800
VNC
5801 VNC
5900 - VNC
5901 - VNC
6000 - X Windows
6667 IRC
6670 - VocalTec Internet Phone, DeepThroat
6699 napster 6776 - Sub7
6970 - RTP
7007 - MSBD, Windows Media encoder
7070 RealServer/QuickTime
7648 - CU-SeeMe
7649 - CU-SeeMe
8010 - WinGate 2.1
8080 - HTTP 8181 HTTP
8383 - IMail WWW
13223 - PowWow
13224 PowWow
14237 Palm
14238 - Palm 18888 - LiquidAudio
23213 PowWow
23214 - PowWow
23456
EvilFTP
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 528

26000 Quake
27001 - QuakeWorld
27015 - Half-Life
27960 - QuakeIII
30029 - AOL Admin
31337 - Back Orifice
40193 Novell
45000 - Cisco NetRanger postofficed Multicast hidden ICMP Type hidden
32773 - rpc.ttdbserverd
32776 - rpc.spray
32777 - rpc.walld
32779 - rpc.cmsd
38036 - timestep
(Si quiere una informacin mayor acerca del nmero de los puertos, busque en su ordenador un fichero
llamado Services. Ese fichero es el que tiene los nmeros de los puertos correspondientes a cada
servicio instalado en su ordenador.

Dominios. Administracin de dominios. Servidores de DNS


Dado que el nmero 217.126.179.96 no nos dice nada, Internet ha previsto que podamos poner una
direccin ms amigable. Podra ser por ejemplo, laguiadelestudiante.es y seguro que todo el mundo
sabra a quien se refiere esa direccin. A esa direccin le denominamos DNS (Sistema de Nomenclatura
de Dominios) Y ahora le vendr la pregunta siguiente Qu es un dominio?. Un dominio es una palabra
que define una parte de Internet. En la direccin anterior, un dominio es es que significa Espaa. Dentro
de Espaa, hay una parte llamada laguiadelestudiante. El DNS se compone en este caso de dos
palabras. Si algn da la Gua del Estudiante llega al sitio que se merece, puede haber varias partes
dentro de su dominio (editorial, correo, ventas) y tendramos direcciones con tres palabras:
editorial.laguiadelestudiante.es correo.laguiadelestudiante.es

ventas.laguiadelestudiante.es

Observe que las palabras van separadas uno de otro mediante un punto. Existe un dominio para cada
pas. (es para Espaa, cu para Cuba, ar para Argentina, etc.) Pero aparte existe una serie de dominios
que no corresponden a ningn pas, que se refieren a organizaciones. Por ejemplo, com para
organizaciones comerciales, edu para organismos de educacin, gov para organizaciones
gubernamentales, mil para organizaciones militares, int para organismos internacionales, org para otras
organizaciones, net para organizaciones que manejan recursos de la red. Lo de que no pertenecen a
ningn pas concreto es solo terico. La mayora de ellas (edu, gov, mil) pertenecen a USA. Tampoco se
merecen ninguna crtica por ello. Han sido los artfices de Internet.
Buzones de correo. Un dominio identifica a una mquina. (Un ordenador conectado a la red)
Imagnese que ese ordenador es un servidor de correo. En el caso del ejemplo,
correo.laguiadelestudiante.es es el DNS del ordenador que gestiona el correo de empresa La Gua del
Estudiante. En ese ordenador hay varios buzones para varios usuarios. Uno de los usuarios es Luis
Surez. Parece lgico que su buzn se llame suarez. Para saber que pertenece a la mquina de correo
citada, el nombre de ese buzn deber llevar el DNS de esa mquina. No se podr poner como nombre
del buzn suarez.correo.laguiadelestiante.es ya que suarez no es un dominio, es un buzn. El nombre de
un buzn se separa del DNS mediante el carcter @. Suarez@correo.laguiadelestudiante.es es el nombre
de un buzn nico en el mundo. Vamos a avanzar un poco ms. Imagnese que ese servidor de correo
tiene varios clientes cuyo apellido es suarez. Deberemos distinguir uno de otro. Para ello basta con
seguir el mismo mtodo que con los dominios. Encadenar varios nombres separados con un punto. Por
ejemplo, podramos poner cono nombre de buzn luis.suarez@laguiadelestudiante.es Ya puede enviar
tranquilamente sus mensajes a ese buzn. Los enrutadores de internet no se preocuparn de lo que hay
a la izquierda de la @. Buscarn la mquina correo.laguiadelestudiante.es. Una vez que la encuentren,
depositarn el mensaje y ser esa mquina quien se encargue de meter ese mensaje en el buzn
luis.suarez de su propiedad.
Cmo se traduce el DNS correo.laguiadelestudiante.es al nmero 217.126.179.96? Mediante unos
aparatos conectados en la red que se denominan servidores de DNS o servidores de dominios. Cuando
una mquina quiere saber a que nmero corresponde ese DNS se dirige a su servidor de DNS (del que
necesariamente debe conocer su nmero IP). Le pregunta. Si lo conoce, se lo dice. Si no lo conoce, este
servidor de DNS lo buscar en otros servidores de DNS. Estos harn lo mismo. Hasta que uno de ellos
llegue al servidor de DNS que conoce todos los dominios de Espaa (Hay varios. Uno lo tiene
Telefnica, otro una institucin llamada RedIris, dependiente del Centro Superior de Investigaciones
Cientficas CSIC que es quien tiene las competencias sobre dominios). Ese servidor se lo dir. Y a partir
de ahora ya puede meter los paquetes TCP en el sobre IP y poner en este la direccin correcta de 4
nmeros que el servidor DNS le ha facilitado. Se da cuenta por segunda vez de lo que puede hacer
que veamos que la red se paraliza por momentos?
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 529

(No me voy a extender ms en esto. Ni le puedo remitir al libro Internet - Gua del estudiante, puesto
que ni existe ni existir. Hay mucha bibliografa sobre el tema que puede consultar
El protocolo TCP/IP no se utiliza solamente en Internet. Las redes de Area Local en su gran mayora lo
utilizan. Por lo tanto lo que se va a explicar en este captulo no solamente le va a servir para Internet.
Puede hacer programas que trabajen sobre una red de rea local que usa los mismos controles.

Forma de conectarse a Internet


Para conectarse a Internet se necesita que un suministrado de servicios de Internet (ISP) nos conecte.
Internet es una red muy grande, pero que se diferencia muy poco de una red de rea local. Solamente
en su extensin. Igual que una red de rea local tiene puntos de conexin, Internet tambin los tiene,
pero esos puntos no estn en cualquier esquina. Estn precisamente en las dependencias de los ISP,
conectados a la red a travs de lneas de comunicacin de datos suministradas por una empresa de
telecomunicaciones, que en Espaa es casi con carcter de monopolio, Telefnica. Esos ISP que tienen
la conexin real a Internet deben suministrar una parte de esa conexin a cada usuario que se quiera
conectar. Existen varias formas de hacerlo: ADSL, Conexin telefnica a redes, conexin a travs de
una red de rea local. Veamos como se conecta de cada una de estas formas, utilizando palabras
sencillas, aunque ello vaya en detrimento de la rigurosidad tcnica.
ADSL (Asimetric Data Suscriber Line). Aprovechando una lnea telefnica existente, se enva
superpuesto al servicio telefnico unas seales de datos, que no interfieren para nada el uso del telfono
conectado a esa lnea. Esta tcnica supone una modulacin de los datos sobre dos portadoras a varios
cientos de kilociclos (la frecuencia de la portadora depende del ancho de banda contratado) por lo que
las prdidas son elevadas. Esto implica que el mdem ADSL instalado junto al terminal telefnico deber
estar muy cerca de la central telefnica desde la que envan los datos (Creo que el mximo son unos 2
kilmetros) Por lo tanto, es difcil instalar esta opcin en abonados rurales, o en zonas urbanas con
instalacin de cables muy viejas. Pueden contratarse velocidades de 128 a 512 Kbytes en sentido
Usuario -> Internet, y de 256 a 2048 en sentido Internet -> Usuario. Esta asimetra se debe a que
normalmente son mas los datos que se bajan que los que se envan, y de esta forma se optimizan los
recursos del sistema. Mediante esta conexin, estamos conectados continuamente a Internet, y
generalmente se tiene un nmero IP real fijo, pero existen compaas que lo que estn enviando a travs
de esa conexin de alta velocidad es una toma de una red de rea local que a su vez est conectada a
Internet. El nmero IP, en el caso que le den una nmero real de Internet, ninguna empresa le garantiza
que se lo vayan a conservar para siempre. Creo que ADSL es hoy por hoy el mejor sistema de conexin
a Internet.

Conexin mediante la Conexin Telefnica a redes. Para esta forma de conexin, los ISP disponen
de varias direcciones IP. Es muy normal que cada ISP tenga uno o varios paquetes 256 direcciones,
pero eso depender del trafico real que tenga. Este ISP se va a reservar algunas de esas direcciones
para su uso particular (Una al menos para que se le pueda llamar y comunicarse con otros servidores
desde dentro de la red, otra para el servidor de pginas Web, servidor de correo, servidor DNS si lo
tiene, etc.) y el resto las va a asignar durante el tiempo que dure la conexin a sus clientes. Esta
asignacin de direcciones se le denomina asignacin dinmica. Cuando nos conectamos a Internet a
travs de la conexin telefnica a redes tendremos una direccin. La prxima vez tendremos otra. Por
eso, en el mbito particular no podemos dar una direccin IP para que nos llamen, ya que es variable.
Deberemos pedir la conexin a nuestro ISP que nos pedir el nombre de usuario y la contrasea. Esta
operacin la realiza el acceso telefnico a redes de Windows. Si coinciden nombre y contrasea con las
que tiene el ISP en su banco de datos, nos asigna un nmero IP de los que tenga disponible y ya
estamos conectados.
Conexin a travs de Red de Area Local. Este es el caso de conectarse mediante una RAL o
mediante la mayora de las conexiones rpidas que nos brindan las compaas de telecomunicacin por
cable. En este caso, la conexin a Internet se realiza en un punto de la red, mediante un ordenador o
hub denominado Gateway, Puerta de Enlace o servidor Proxy. La puerta de enlace este tiene dos
entradas de red, una conectada a Internet (A travs de un mdem o directamente mediante una lnea de
datos) y otra conectada a la RAL. En este caso, cada ordenador conectado a la RAL tiene un nmero IP,
pero no es un nmero IP de Internet, sino de la red interna. No podremos hacer ping a ese nmero
desde un puesto conectado directamente a Internet. La transferencia de los datos desde Internet a cada
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 530

uno de los ordenadores lo gestiona el software de la puerta de enlace, siendo completamente


transparente para el ordenador que se est conectando.
Una vez conectados, sea cual sea el medio utilizado para ello, ya estamos en la red. Ahora ya podemos
hacer Ping o Telnet a otro ordenador que tambin est conectado. No se preocupe por no saber que es
hacer ping o telnet. Eso es cosa de los gurs informticos. Algunos alumnos, afortunadamente los
menos, crean que estaban conectados a Internet solamente cuando se abra el navegador y les
mostraba la pgina Web de su ISP. Otros se crean plenamente conectados cuando eran capaces de
abrir su buzn de correo mediante el Outlook Express. Pero esos efectos no son por estar conectados,
sino por Abrir un Servicio.
Esto nos introduce en el concepto de servicio de Internet. La conexin TCP/IP que habamos establecido
slo es el soporte de comunicacin para que pase por l un servicio. Uno de ellos puede ser el de
pginas Web.(http), otro el de correo, (POP3 y SMTP), otro el de FTP (ftp) , otro el Chat (irc).
Veamos cada uno de ellos.
http (hiper text transfer protocol Protocolo de transferencia de hipertexto) es el servicio para recibir
pginas Web. Las pginas Web estn diseadas de tal forma que contengan muy poca informacin
(para que se puedan bajar rpidamente) Existen lenguajes que pueden hacer eso (HTML), que con muy
poca informacin generan pginas preciosas. Pero la poca informacin que tienen se tiene que cubrir
con algo: con un navegador, que es como un editor de texto pero un poco ms complicado, porque es
capaz de componer la pgina con toda su belleza a partir de esa informacin tan escasa.
ftp (File Transfer Protocol Protocolo de transferencia de ficheros) Se usa para enviar o recibir fichero
completos. Es el servicio que usa cuando se baja un programa de la red.
SMTP (Single Mail Tranfer Protocol Protocolo simple de transferencia de correo) Se utiliza para enviar
mensajes de correo desde el usuario al servidor de correo y para el trfico de estos mensajes entre
servidores de correo.
POP 3 (Post Office Protocol 3 Protocolo de la Oficina de Correo) Se utiliza para que el servidor de
correo enve los mensajes de correo al usuario.
Irc (Internet Relay Chat Reenvo de Chat por Internet) Mediante este protocolo una mquina a la que
han accedido varios usuarios recibe mensajes escritos de uno de ellos y lo retransmite a los dems.)
Cada uno de estos servicios tiene asignado un puerto. Esos puertos puede verlos en la lista que tiene
ms atrs. Hay mas servicios, pero con esto creo que tenemos suficiente para comenzar a hablar de lo
que puede hacer Visual Basic con todos estos servicios.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 531

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 532

Controles de Visual Basic para las redes IP


Hemos llegado por fin al Visual Basic puro. Vamos analizar los controles que nos tiene preparados para
explotar los recursos de la red. Para cada uno de los servicios anteriores existe un control. Podemos
resumirlos en la siguiente lista:
Para la conexin:
Para http
Para FTP
Para POP3, SMTP

Control Winsock (Puede implementar con l cualquier servicio)


Control WebBrowser, Control Internet Transfer Control
Control Internet Transfer Control
Controles auxiliares MapiSesion y MAPIMessages

Comencemos por el principio. Por el control que nos permite comunicarnos con otro ordenador mediante
TCP y UDP . El Control Winsock

Control Winsock
El control WinSock permite conectarse a un equipo remoto e intercambiar datos con los Protocolos UDP
y TCP. Ambos protocolos se pueden usar para crear la comunicacin con cualquier servicio de los
expresados anteriormente. Podemos crear tambin aplicaciones que residan en un servidor al que
accedemos desde varios clientes. Estamos en ese caso creando aplicaciones Cliente - Servidor
El control Winsock podramos decir que es el control ms elemental de los controles que VB dedica a las
redes IP, ya que lo nico que hace por s es conectarnos. No implementa ningn servicio. Eso se lo
tenderemos que hacer nosotros con nuestro programa. Hay controles que nos dan directamente la
conexin y el servicio para el que han sido diseados (WebBrowser, Internet Transfer Control) Con este
slo tenemos la conexin, pero con muchos datos y mucho control sobre ella. Quizs por eso este es el
ms bonito. Una vez con la conexin establecida, podemos establecer un servicio utilizando cdigo puro
y duro. Tiene esa opcin o usar los controles especficos que Microsoft y otras firmas le han preparado
para que Vd. trabaje menos.
El control Winsock hay que meterlo en la caja de herramientas. (Proyecto | Componentes) El nombre
del control es Microsoft Winsock Control 6.0 Solamente se ve en tiempo de diseo. Tiene esta forma:

Fig.1 Icono que representa el control winsock


La conexin con la red puede que est establecida de antemano (caso de una Red de Area Local o
conexin a Internet a travs de ADSL) o tenga que realizarla mediante la conexin telefnica a redes. En
cualquiera de los dos casos, el control Winsock comenzar a trabajar una vez que la conexin est
establecida. Pero para poder comunicarse con el otro equipo, deber conocer una serie de parmetros
de su PC, parmetros que posiblemente tenga que pasrselos al otro equipo para que le reconozca y le
permita establecer el dilogo. El control Winsock realiza esas tareas que le permiten conocer los
parmetros de su equipo. Se lo puede presentar simplemente leyendo algunas de sus propiedades.

Primera tarea Qu direccin IP tiene mi equipo?


Esa es la primera pregunta que se le puede ocurrir. Decamos ms atrs que cuando nos conectamos a
Internet a travs de conexin telefnica a redes no sabemos en principio que direccin IP tenemos.
Incluso cuando hacemos un programa para instalarlo en una Red de Area Local (RAL) que tiene un
nmero IP fijo, a lo mejor nos interesa obtener automticamente ese nmero para evitar tener que
personalizar el programa para cada uno de los ordenadores. El control WinSock nos permite conocer el
nmero IP de nuestra conexin. Esto se logra mediante la propiedad LocalIP

Propiedad LocalIP
Devuelve la direccin IP de la mquina local en el formato xxx.xxx.xxx.xxx Es de slo lectura y no est
disponible en tiempo de diseo.
Sintaxis
LSB

MiVariable = NombredelWinSock.LocalIP

Visual Basic Gua del Estudiante

Captulo 1

Pgina 533

MiVariable ser una variable de tipo String. Si la direccin de su equipo es la 127.0.0.1 significa que no
est conectado.

Segunda tarea Qu nombre tiene mi equipo?


Cuando nos conectamos a otro equipo, necesitaremos decirle quien somos. Esto se logra buscando el
nombre de nuestro equipo. Ese nombre se lo hemos introducido al instalar Windows. Vea un poco mas
adelante como se hace eso. Para leer el nombre de nuestro equipo utilizaremos la propiedad
LocalHostName del control Winsock.

Propiedad LocalHostName
Devuelve el nombre de la mquina local. Es de slo lectura y no est disponible en tiempo de diseo.
Sintaxis

MiVariable = NombredelWinsock.LocalHostName
(MiVariable ser una variable tipo String)

Determinar el nombre del equipo


Para averiguar y cambiar el nombre del equipo
1.En la Barra de tareas del equipo, haga click en Inicio.
2.En el elemento Configuracin, haga click en Panel de control.
3.Haga doble clic en el icono Red.
4.Haga clic en la pestaa Identificacin.
5.El nombre del equipo aparecer en el cuadro Nombre del equipo o Nombre del PC.
Si desea cambiarlo, teclee el nombre nuevo y haga click en Aceptar. Como es habitual en Windows,
deber reiniciar el equipo para que tenga efecto el cambio.

Tercera tarea: Establecer el protocolo


El protocolo es el tipo de comunicacin que se va a establecer, UDP o TCP. Esto se realiza mediante la
propiedad Protocol. Puede establecerse en tiempo de diseo, en la ventana de propiedades, o en tiempo
de ejecucin. Normalmente una aplicacin trabaja solamente en UDP o en TCP, por lo que esta
propiedad debe establecerse o bien en diseo, o inmediatamente despus de iniciarse.

Propiedad Protocol
Devuelve o establece el protocolo, TCP o UDP
Sintaxis

NombredelControlWinsock.Protocol = Valor

Donde

Valor = 0 (sckTCPProtocol) para establecer protocolo TCP


Valor = 1 (sckUDPProtocol) para establecer protocolo UDP

El control debe estar cerrado para poder establecer esta propiedad. Si lo tiene abierto, debe cerrarlo
previamente mediante el mtodo Close.

Cuarta tarea: Establecer los datos del equipo remoto


Aqu debemos distinguir si queremos enviar informacin o si deseamos recibirla. Ya tenemos que
comenzar a pensar en un concepto que seguro que le suena: cliente y servidor.
Cuando un equipo quiere enviar informacin debe conocer la direccin completa del equipo al que va a
llamar. La direccin completa es su direccin IP y el puerto al que va dirigida la informacin. Si el equipo
va a recibir, lo nico que debemos decirle es el puerto por el que debe estar escuchando. No necesita
conocer ms datos, ya que la direccin IP propia ya la conoce y no necesita conocer ningn dato del
equipo que le va enviar informacin.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 534

Una aplicacin es servidor cuando est escuchando. As de fcil. (Recuerde el captulo donde vimos el
DDE, pues el concepto cliente servidor en el tema del establecimiento de la comunicacin es el mismo).
Si una aplicacin escucha es que otra puede querer enviarle informacin. Esa aplicacin que quiere
enviar informacin ser la aplicacin cliente. A poco que nos esforcemos, con este concepto elemental
de aplicacin cliente servidor, una aplicacin puede ser cliente en un momento y servidor en otro.
Cuando se hable de aplicacin cliente, ya en trminos de la funcin que realiza esa aplicacin, se
denomina aplicacin servidor a aquella que est dispuesta para enviar informacin al cliente, o realizar
alguna operacin con los datos que el cliente le enva. Pero en este caso, estamos hablando de cliente
servidor visto desde el punto de vista de las comunicaciones. No se extrae por lo tanto, que esa
definicin tan simple de que una aplicacin ser servidor cuando est escuchando y cliente cuando est
enviando informacin.
Para el equipo cliente.
Si queremos enviar informacin, es decir, si queremos que nuestra aplicacin sea una aplicacin cliente,
debemos indicarle al Winsock el nmero IP o el DNS de la mquina con la que queremos conectar. Esto
lo establecemos con la propiedad RemoteHost. Tambin le debemos indicar el nmero del puerto en el
que nos est esperando esa mquina. Esta informacin se la introducimos con la propiedad
RemotePort. Nunca le debemos forzar el puerto propio.

Propiedad RemoteHost
Devuelve o establece el equipo remoto al que se van a enviar los datos, o el equipo del que los recibe. El
equipo remoto se le puede identificar por su nmero IP o por su DNS.
Sintaxis

NombredelControlWinsock.RemoteHost = 217.126.179.96
NombredelControlWinsock.RemoteHost = FTP://ftp.laguiadelestudiante.com
VariableTipoString = NombredelControlWinsock.RemoteHost

Esta propiedad puede cambiarse en tiempo de ejecucin cuantas veces sea necesario, para encaminar
los datos transmitidos a uno u otro equipo remoto.
Otro parmetro que es necesario introducir al Winsock cuando nuestra aplicacin es una aplicacin
cliente (enva informacin) es el puerto del equipo remoto al que vamos a enviar informacin. El puerto
destino depender del servicio que estamos implementando en nuestra aplicacin. Este parmetro se
introduce en la propiedad RemotePort.

Propiedad RemotePort
Devuelve o establece el nmero del puerto remoto con el que conectar. El valor pasado en esta
propiedad es un Long comprendido entre 1 y 65535. El numero predeterminado es el 80.
Sintaxis

NombredelControlWinsock.RemotePort = puerto

En una aplicacin cliente (recibe informacin) no se puede establecer esta propiedad.


Ya tenemos establecidas las propiedades que necesita un control Winsock para enviar datos a un
equipo remoto. Veamos ahora como se establece la comunicacin.

Para el equipo servidor


El equipo que va a recibir informacin solamente necesita conocer el puerto por el que debe escuchar.
Esto se lo decimos mediante la propiedad LocalPort.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 535

Propiedad LocalPort
Devuelve o establece el puerto local que desea usar. Es de lectura y escritura, y est disponible tanto en
tiempo de diseo como en tiempo de ejecucin.
Esta propiedad solamente debe utilizarse para poner Winsock a recibir. Cuando va a transmitir datos,
aunque puede asignar un puerto determinado para enviarlos es mucho mas prudente dejar al Winsock
que utilice el que quiera. De esta forma se asegura que siempre emitir a travs de un puerto libre.
(Experiencia propia: Si asigna un puerto determinado para transmitir lo mas probable que le va a pasar
es que se le cuelgue el ordenador) Para asegurarse de que no ha asignado ningn puerto, basta con
poner el valor 0 en esta propiedad.
El valor devuelto por esta propiedad es un Long.
Sintaxis

NombredelWinsock.LocalPort = Nmero

Quinta tarea: Establecer comunicacin con el equipo remoto


Para esta tarea tambin debemos distinguir si vamos a recibir informacin o a enviarla y el protocolo que
estemos usando (TCP o UDP)

Comunicacin por UDP


Vamos a comenzar a ver como nos podemos comunicar con el Winsock a travs de UDP. El protocolo
UDP permite enviar y recibir informacin sin establecer previamente una comunicacin. As de
simple. Una vez establecidos las propiedades descritas mas atrs, tanto el equipo transmisor como el
receptor estn ya preparados para trabajar. No hace falta ni poner a escuchar al receptor ni ordenar al
transmisor que contacte con el receptor, cosa que como veremos mas adelante, es necesario cuando se
trata de una comunicacin mediante el protocolo TCP.
Esta sencillez del protocolo UDP hace que sea muy vlido para una aplicacin en la que no sea
imprescindible la seguridad de la comunicacin. Un ejemplo de aplicacin con transmisin con protocolo
UDP podra ser el comprobar que ordenadores de estn encendidos en un determinado momento,
envo de mensajera interna a travs de Red de Area Local, etc. Pero eso s, UDP no sirve para
conectarse a travs de Internet, ya que los servidores de Internet cortan el paso a los paquetes UDP.
Pero el hecho de que no sirvan para Internet no debe hacernos olvidar este protocolo tan sencillo para
comunicaciones a travs de una RAL interna.
Por lo tanto, para paquetes UDP no hace falta hacer nada para establecer la comunicacin con el equipo
remoto, ni para transmitir ni para recibir.

Comunicacin por TCP


Aqu s debemos establecer previamente la conexin. De hecho, se dice de TCP que es un protocolo
orientado a conexin. Veamos que hay que hacer para transmitir y recibir con TCP
Para el equipo cliente (Transmisor)
El equipo que desea enviar datos debe solicitar la conexin. Si existe un equipo destino con direccin IP
y el puerto adecuado, este equipo le contestar. (Vea mas adelante el mtodo Accept) Tambin puede
ocurrir que el equipo destino o no existe, o reciba la solicitud de conexin y no la acepte. Veremos ms
adelante qu ocurre en el caso de que nadie atienda la solicitud.
La solicitud de conexin se realiza mediante el mtodo Connect

Mtodo Connect
Solicita una conexin con un equipo remoto.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 536

Sintaxis

NombredelcontrolWinsock.Connect hostRemoto, puertoRemoto

Donde hostRemoto es la direccin IP o DNS del equipo remoto, y puertoRemoto es el puerto por donde
esperamos nos est escuchando ese equipo remoto.
Este mtodo no devuelve ningn dato.

Comentarios
Debe invocar el mtodo Connect cuando intente establecer una conexin TCP.

Para el equipo servidor (Receptor)


Para recibir, primero hace falta poner el Winsock a escuchar, y una vez que reciba una comunicacin de
un equipo llamante aceptarla. Para poner a escuchar al Winsock basta con invocar el mtodo Listen.

Mtodo Listen
Crea un socket y lo establece a modo de escucha. (Slo para conexiones TCP).
Sintaxis

NombredelWinsock.Listen

No lleva ningn argumento ni devuelve ningn valor. Simplemente pone a la escucha al Winsock.
Ya con el Winsock a la escucha, ya est dispuesto para recibir una comunicacin. Y no le importar de
quien venga, basta con que lleve su direccin IP y el puerto en el escucha el Winsock.
Cuando el Winsock recibe un intento de conexin se produce el evento ConnectionRequest. Para
aceptarla hay que usar el mtodo Accept, pero aqu es donde se empiezan a complicar (solo un poquito)
las cosas.
Un Winsock solamente puede recibir una comunicacin. Por lo tanto, solamente podr atender a un
corresponsal. Esto no es lo que se busca en la mayor parte de los casos, sino que lo que se pretende es
estar a la escucha, y atender a todas las llamadas que entren, pudiendo atender a dos o ms
comunicaciones simultneamente.
Para lograr esto lo que hacemos es tener un Winsock permanentemente a la escucha para recibir los
sucesivos intentos de conexin de los corresponsales, y una vez que se recibe uno, se crea una
instancia del winsock, y es, con esta instancia, con la que le invocamos el mtodo Accept para
aceptarla. De esta forma tendremos tantas instancias (copias) del winsock como comunicaciones
activas, ms el winsock original que es el que se queda a la escucha de nuevos intentos de conexin. Ni
que decir tiene que, una vez terminada la conexin, debe cerrarse la instancia correspondiente a esa
conexin.
La instancia debe crearse en el procedimiento ConnectionRequest del winsock original. La forma de
crear esta instancia es mediante el procedimiento Load. Para ello, el winsock original debe tener la
propiedad Index para que de esta forma sea una matriz de controles, aunque originalmente solo exista
un elemento de esa matriz, con Index = 0. Las instancias van a tener un nombre (Propiedad Name)
igual a la del original, y un ndice (Propiedad Index) que tendremos que ponerle en el momento de crear
ese nuevo winsock. Esto implica que deberemos llevar una lista con los ndices de las instancias
creadas para no repetir ninguno. No sirve aumentar una unidad el nmero del ndice, ya que no podemos
dejar que el nmero del ndice crezca hasta el infinito.

Evento ConnectionRequest
Se produce en el equipo local cuando el equipo remoto solicita una conexin.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 537

Slo para aplicaciones de servidor TCP. El evento se activa cuando llega una solicitud de conexin. A
partir de la activacin de este evento, las propiedades RemoteHostIP y RemotePort almacenan la
informacin acerca del cliente.
Este evento pasa como parmetro un nmero Long con el identificador de la solicitud de conexin. Este
identificador (IdSolicitud) lo genera el servidor (el equipo que recibe) y lo necesitaremos para aceptar la
conexin mediante el mtodo Accept.
NombredelcontrolWinsock_ConnectionRequest (IdSolicitud As Long)
El parmetro idSolicitud va a identificar a esa conexin hasta que se cierre. La identificacin la
hace el winsock analizando en el datagrama entrante la direccin IP del origen, puerto origen y
puerto destino, parmetros que no pueden coincidir al mismo tiempo con los de otra
comunicacin. Este mecanismo va a permitir que el mismo winsock reciba varias
comunicaciones simultneas y sepa diferenciar una de otra

Metodo Accept
Este mtodo se utiliza para aceptar una conexin entrante cuando se est tratando un evento
ConnectionRequest.. Slo se usa con el protocolo TCP.
Sintaxis

NombredelWinsock.Accept IdSolicitud

Donde IdSolicitud es el nmero identificador de la solicitud de conexin que pasa el evento


ConnectionRequest como parmetro.
El mtodo Accept debe hacerse sobre una nueva instancia del control Winsock. No es estrictamente
necesario cuando se est utilizando una conexin en la que sabemos con certeza que no vamos a recibir
ms de una llamada. En el caso de que se produzca un nuevo intento de conexin mientras atiende a
una conexin aceptada, adems de no poder atenderlo, la experiencia nos dice que se producen
problemas, que terminan generalmente haciendo que el programa no responda e incluso colgando el
equipo, Recomiendo encarecidamente que la conexin se establezca con una nueva instancia del
winsock. Dicho en otras palabras, que el mtodo Accept se ejecute sobre una nueva instancia, aunque la
informacin de Microsoft est un poco indefinida en este aspecto.
Veamos como se crea una nueva instancia del control. Se usa el mtodo Load. Para ello, en el Winsock
que colocamos en el proyecto le ponemos, en su propiedad Index el valor 0. Con esto le estamos
indicando que es una matriz de controles, pero solamente existe uno, cuyo ndice es el 0. Cuando
utilizamos el mtodo Load lo que hacemos es aadir un elemento ms a esa matriz de controles.
Si el control que hemos introducido en el formulario se llamaba Wsk, y le hemos puesto su propiedad
Index = 0, para aadir el segundo elemento de esa matriz, que tendr la propiedad Index = 1,
ejecutaremos la siguiente lnea de cdigo:
Load Wsk (1)
Ahora ya tenemos una matriz con dos controles. (Indices 0 y 1) Dejaremos el winsock con ndice 0 para
seguir recibiendo peticiones de comunicacin y ejecutaremos el mtodo Accept sobre el segundo
winsock (el de Index = 1)
Wsk (1).Accept IdSolicitud
A partir de este momento, todo lo que tengamos que hacer para recoger la informacin recibida, enviar
respuestas al corresponsal, cerrar la comunicacin lo haremos con la instancia creada para esa
conexin. No se nos puede olvidar cerrar el winsock una vez terminada la conexin y descargarlo a
continuacin. Para descargarlo utilizamos la instruccin Unload
Unload Wsk(1)
El winsock original lo seguiremos dedicando a recibir nuevas solicitudes de conexin, que a su vez
crearn nuevas instancias del winsock.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 538

En principio no hay problema para que cada nueva instancia lleve un Index incrementado en 1 respecto
a la conexin anterior. Basta con declarar una variable tipo Long para introducir ese ndice, y
previsiblemente nunca llegaremos a superar los lmites del Long. Ahora bien, es mucho mas elegante
reutilizar los nmeros de las instancias que se van cerrando. Para esto es necesario utilizar una variable
o una matriz, donde llevemos la cuenta de las instancias todava abiertas del winsock original.
Cada una de las instrucciones anteriores se debern hacer en los eventos apropiados del winsock. As,
el crear un nuevo winsock lo haremos en el evento ConnectionRequest, y el descargarlo lo haremos en
el evento Close.
Ya tenemos la conexin establecida. Veamos ahora otras propiedades y mtodos que nos permitirn
conocer la identidad del corresponsal y lo que hay que hacer para enviar y recibir informacin.
Una vez establecida la conexin, mediante el mtodo Connect por parte del cliente, y el mtodo Accept
por parte del servidor, ya podemos conocer la identidad del corresponsal mediante la propiedad
RemoteHostIP

Evento Connect
Este evento ocurre en el Winsock que ha solicitado la conexin, cuando sta se ha completado. Ocurre
por lo tanto cuando el winsock remoto invoca el mtodo Accept. Puede usar este evento parta conformar
que se ha realizado la conexin.

Propiedad RemoteHostIP
Devuelve una cadena de caracteres con la direccin IP del equipo remoto.
NOTA. Esta propiedad es distinta de la de RemoteHost vista mas atrs. La propiedad RemoteHost
es la que se debe introducir antes de realizar la conexin, y puede ser, bien una direccin IP de
cuatro nmeros, o una DNS. RemoteHostIP devuelve el valor de la direccin IP de cuatro
nmeros, una vez que ya se ha establecido la comunicacin. Puede consultarse esta propiedad
para conocer el nmero IP real de un sitio, conociendo solamente su DNS.
En las aplicaciones de cliente, despus de establecer la conexin con el mtodo Connect, esta
propiedad contiene la cadena IP del equipo remoto.
En las aplicaciones de servidor, despus de la llegada de una solicitud de llamada (evento
ConnectionRequest), esta propiedad contiene la cadena IP del equipo remoto que inici la conexin.
Cuando utiliza el protocolo UDP, despus de producirse el evento DataArrival, esta propiedad contiene
la direccin IP del equipo que ha enviado los datos UDP.

Propiedad State
Permite conocer el estado del winsock y de la conexin que est realizando. Es slo de lectura y no est
disponible en tiempo de diseo. Devuelve un integer
Siantaxis

Variabletipointeger = NombredelWinsock.State

Nos puede devolver uno de los siguientes valores que corresponden a las siguientes constantes
Valor

Constante

Estado

0
1
2
3
4

sckClosed
sckOpen
sckListening
sckConnectionPending
sckResolvingHost

Cerrado
Abierto
Escuchando
Conexin pendiente
Resolviendo Host

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 539

5
6
7
8
9

sckHostResolved
sckConnecting
sckConnected
sckClosing
sckError

Host resuelto
Conectando
Conectado
Cerrando la conexin
Ha detectado un error

Propiedad SocketHandle
Esta propiedad se usa para utilizarla con las Apis de Windows. Devuelve el manipulador del Winsock. Es
de slo lectura y no est disponible en tiempo de diseo.
Sintaxis

VariableTipoLong = NombredelWinsock(I).SocketHandle

Donde I es el ndice del Winsock. Como se deca ms atrs, esta propiedad solamente se emplea
usando APIS

Propiedades, Mtodos y Eventos del control Winsock usados en la comunicacin


Hemos visto varias propiedades, mtodos y eventos del control Winsock. Hasta ahora hemos visto:
Propiedades:
State
Mtodos:
Eventos

LocalIP, LocalHostName, Protocol, RemoteHost, RemotePort, LocalPort,


Connect, Listen y Accept.
ConnectionRequest, Connect

Mediante estas propiedades y mtodos establecemos la conexin. Nos falta ahora por ver aquellos
mtodos usados durante la transmisin o recepcin de datos.

Mtodo SendData
Enva datos a un equipo remoto. Se emplea tanto en UDP como en TCP. No devuelve ningn valor.
Sintaxis

NombredelWinsock(I).SendData datos

Donde NombredelWinsock es el nombre del winsock que debe enviar los datos, I es el ndice de ese
control (en el caso de que el winsock sea una instancia de un winsock original, como se explic ms
atrs) y Datos son los datos a enviar, por ejemplo el nombre de una variable que los contiene o la
propiedad text de un textbox donde se han escrito los datos a enviar.
Si los datos a enviar son binarios, debern enviarse como una matriz de bytes.
Cuando pasa una cadena UNICODE, se convierte a cadena ANSI antes de enviarla a la red.

Mtodo GetData
Recupera los datos existentes en el bffer de recepcin del winsock, lo almacena en una variable y borra
el contenido del bffer.
Sintaxis

NombredelWinsock(I).GetData datos, [tipo,] [longMx]

Donde

datos es el nombre de la variable donde se almacenarn los datos recogidos


tipo
(Opcional) es el tipo de datos a recuperar (Vea tabla)
longMx
(Opcional) Tamao en bytes a recuperar. Si se omite este parmetro, se
recuperan todos los datos existentes en el bffer de recepcin. Si se
especifica un nmero inferior a los bytes existentes en el bffer, el resto
de los datos se perdern.

Los tipos de datos que se pueden usar en el parmetro tipo son:


Byte
Single
LSB

VbByte
vbSingle

Entero
Simple

Visual Basic Gua del Estudiante

Captulo 1

vbInteger
vbDouble

Long
Double

vbLong
vbDouble
Pgina 540

Moneda
Cadena

vbCurrency
vbString

Fecha
vbDate
Matriz de bytes vbArray + vbByte

Booleano

vbBoolean

El mtodo GetData se suele usar con el evento DataArrival, que incluye el argumento bytesTotales. Si
especifica una longMx menor que el argumento bytesTotales, obtendr el mensaje de advertencia
10040, que indica que se perdern los bytes restantes.

Evento DataArrival
Se produce cuando llegan nuevos datos. Pasa como parmetro un Long con el nmero de bytes
recibidos.
(NombredelWinsock_DataArrival (bytesTotales As Long)
Este evento no se producir si no recupera todos los datos con una llamada GetData. Slo se activa
cuando hay datos nuevos. Utilice la propiedad BytesReceived para comprobar la cantidad de datos
disponibles en cualquier momento.

Propiedad BytesReceived
Devuelve un Long la cantidad de datos recibidos (que estn actualmente en el bffer de recepcin).
Lgicamente es slo de lectura y no est disponible en tiempo de diseo.
Sintaxis

NombredeWinsock.BytesReceived

Mtodo PeekData
Este mtodo es similar a GetData, pero no elimina los datos extrados del bffer de recepcin. Exixte
otra diferencia, PeekData solamente funciona en las conexiones TCP.
La sintaxis es similar a la de GetData.
Sintaxis

NombredelWinsock.PeekData datos, [tipo,] [longMx]

Los parmetros de este mtodo son los mismos que para GetData.

Evento SendProgress
Se produce mientras se estn enviando datos. Pasa como parmetros los bytes enviados desde la
ltima vez que se activ el evento (bytesEnv) y los bytes que esperan a ser enviados en el bffer de
transmisin (bytesRest)
(NombredelWinsock_SendProgress (bytesEnv As Long, bytesRest As Long)

Evento SendComplete
Se produce cuando termina una operacin de envo. No pasa argumentos.
NombredelWinsock_SendComplete()

Evento Error
Se produce siempre que ocurre un error en los procesos de segundo plano (por ejemplo, un fallo al
conectar o un fallo al enviar o recibir en segundo plano). Pasa como parmetros el cdigo de error, la
descripcin del error, el scode del error, el origen del error, y un booleano para cancelar o aceptar el que
presente un cuadro de dialogo con el aviso de error. (Los parmetros de fichero de ayuda y contexto de
ayuda, personalmente no los he visto en ninguno de los ejemplos preparados.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 541

NombredelWinsock_Error(nmero As Integer, descripcin As String, scode As Long, origen As String,


archivoAyuda as String, contextoAyuda As Long, cancelarVista As Boolean)

El cdigo de error puede tomar estos valores:


Constante

Valor

SckOutOfMemory
SckInvalidPropertyValue
SckGetNotSupported
SckSetNotSupported
SckBadState

7
380
394
383
40006

SckInvalidArg
el

Sin memoria
El valor de la propiedad no es vlido
No se puede leer la propiedad
La propiedad es de slo lectura.
Protocolo o estado de conexin incorrecto para la
solicitud o la transaccin requerida.
40014 El argumento que se pas a una funcin no estaba en

SckSuccess
SckUnsupported
SckInvalidOp
SckOutOfRange
SckWrongProtocol

40017
40018
40020
40021
40026

SckOpCanceled
SckInvalidArgument

10004
10014

SckWouldBlock

10035

SckInProgress

10036

SckAlreadyComplete

10037

SckNotSocket
SckMsgTooBig

10038
10040

SckPortNotSupported
SckAddressInUse
SckAddressNotAvailable
SckNetworkSubsystemFailed
SckNetworkUnreachable
SckNetReset

10043
10048
10049
10050
10051
10052

SckConnectAborted

10053

SckConnectionReset
SckNoBufferSpace
SckAlreadyConnected
SckNotConnected
SckSocketShutdown
SckTimedout
SckConnectionRefused
SckNotInitialized
SckHostNotFound
SckHostNotFoundTryAgain
SckNonRecoverableError
SckNoData

10054
10055
10056
10057
10058
10060
10061
10093
11001
11002
11003
11004

LSB

Visual Basic Gua del Estudiante

Descripcin

Captulo 1

formato correcto o en el intervalo especificado.


Correcto
Tipo Variant no aceptado.
La operacin no es vlida en el estado actual.
El argumento est fuera del intervalo.
Protocolo errneo para la solicitud o la transaccin
requerida.
Se cancel la operacin.
La direccin solicitada es una direccin de multidifusin,
pero el indicador no est activado.
El socket es no bloqueante y la operacin especificada
se bloquear.
Se est efectuando una operacin de Winsock
bloqueante.
Se complet la operacin. No se estn efectuando
operaciones bloqueantes.
El descriptor no es un socket.
El datagrama es demasiado grande para el bfer y se
truncar.
El puerto especificado no es compatible.
Direccin en uso.
La direccin no est disponible en la mquina local.
Error en el subsistema de red.
El host no puede encontrar la red en este momento.
Expir el tiempo de espera de la conexin antes de
establecer SO_KEEPALIVE.
La conexin se ha cancelado al sobrepasar el tiempo de
espera o por otro error.
La conexin se ha restablecido desde el lado remoto.
No hay espacio disponible en el bfer.
El socket ya est conectado.
El socket no est conectado.
El socket se ha desactivado.
Se ha sobrepasado el tiempo de conexin.
Se ha forzado el rechazo de la conexin.
Es necesario llamar primero a WinsockInit.
Respuesta autorizada: host no encontrado.
Respuesta no autorizada: host no encontrado.
Errores no recuperables.
Nombre vlido; no hay registro de datos del tipo
solicitado.

Pgina 542

Evento Close
Se produce cuando el equipo remoto cierra la conexin. Las aplicaciones deben usar el mtodo Close
para cerrar correctamente una conexin TCP.

El Mtodo Bind
El mtodo Bind sirve para reservar un puerto local cuando estamos trabajando en una comunicacin
UDP. Esto puede ser muy til para evitar que haya otra aplicacin escuchando en ese mismo puerto.
Hay que darse cuenta que en UDP puede haber muchas aplicaciones escuchando el mismo puerto ya
que al no establecerse una comunicacin, la informacin que llega pueden tomarla mas de una
aplicacin. (Es idntico al caso en el que una persona hable y muchas escuchan) Si reserva un
determinado puerto a un Winsock, a ese puerto no se le puede conectar otro Winsock a escuchar a
partir de ese momento. Hay que invocar el mtodo Bind antes de invocar el mtodo Listen.
Tambin puede usar el mtodo Bind en una comunicacin TCP. Se emplea cuando hay ms de un
adaptador de red en el equipo (Un equipo con dos placas de red, y cada una de ellas con un nmero IP).
Si en ese equipo hay un Winsock, Qu nmero IP tiene?. Podra tomar uno de los dos indistintamente.
Mediante Bind podemos asignar uno de esos nmeros IP a un Winsock.

Mtodo Bind
Especifica el puerto local y la direccin IP local a usar en las conexiones TCP.
Sintaxis

NombreDelWinsock.Bind puertoLocal, IPLocal

Donde:
PuertoLocal:
IPLOcal:

Puerto utilizado para realizar una conexin.


Direccin IP local sobre la que se va a establecer la conexin.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 543

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 544

Programa servidor que recibe varias comunicaciones simultaneas.


Vamos a realizar un ejemplo consistente en un programa servidor cuya misin sea recibir ficheros desde
varios clientes, guardarlos en una base de datos donde apuntar tambin el origen del fichero y la fecha
de recepcin, y que enve al cliente la conformidad de recepcin de ese fichero. En sentido contrario,
una vez identificado al cliente, podr enviarle los ficheros pendientes que ese cliente tenga depositado en
el servidor. Esto es lo ms parecido a un servidor de correo, pero no lo es. Le falta cumplir las
especificaciones. Pero bien estar como ejercicio prctico del winsock.
El programa podr recibir simultneamente desde varios corresponsales. Para enviar, podr hacerlo de
uno en uno, es decir, en un determinado momento solamente podr estar enviando a otro corresponsal,
aunque podr enviar, en momentos sucesivos, a cuantos corresponsales estn activos. El envo de
informacin se podr hacer simultneamente a la recepcin.
Para lograr esto, es necesario disponer de dos winsock en la aplicacin. Uno, que estar recibiendo en
un puerto y atendiendo a todas las llamadas entrantes, (Wsk1) y otro, que se usar solamente para
enviar informacin a travs de las llamadas salientes (Wsk2). Cada vez que se reciba una llamada
entrante, se crear una instancia de Wsk1, que ser en realidad la que acepte la llamada usando su
mtodo Connect.
Debemos elegir un puerto para la escucha. A la hora de decidir el nmero del puerto debemos pensar
que no se pueden usar los 2024 primeros puertos, que el puerto elegido no est siendo usado de forma
internacional por otro servicio (que no est registrado a ninguna aplicacin a nivel mundial) y que no est
usado en nuestros PCs para otro servicio. En nuestro ejemplo, lo que vamos a hacer es leerlo de un
fichero de configuracin, y colocarlo en un TextBox llamado TbPuertoLocal. De esta forma, al winsock lo
programaremos con el puerto indicado en ese TextBox, y a ese TextBox le llevaremos el dato con la
lectura del fichero de configuracin, operacin que se realiza durante la carga del formulario. De esta
forma podremos poner en el fichero de configuracin el puerto deseado, sin necesidad de variar el
programa.
Ya vamos teniendo una idea de la interfase grfica necesaria para empezar. Dado el fin didctico de este
ejemplo, se van a mostrar todos los parmetros que entran a formar parte de la comunicacin.

Fig. 2 Aspecto de la parte de la Interfase grfica de comunicaciones


En esta figura se pueden ver dos partes bien diferenciadas, una en azul, (Mquina Local, Instancias
activas, Textos/Ficheros recibidos) con la parte de la aplicacin correspondiente a la recepcin, La parte
roja (Equipo remoto llamado) corresponde a la parte de transmisin.
En la parte azul tenemos el winsock de recepcin (Wsk1) y sus instancias. El contenido de cada cuadro
de texto y el origen del dato presentado es el siguiente:
Maquina local. Pone el nombre de la mquina local.
Sistema
Ip Local. Pone el nmero IP de la mquina local.
Sistema
Puerto Local. Pone el puerto de recepcin asignado a esta aplicacin.
Fichero
configuracin
Protocolo. UDP o TCP. Puede cambiarse haciendo doble clic en este texto
RequestID. Parmetro IdSolicitud
Proc. ConnectionRequest
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 545

de

Estado. Valor de la propiedad State del Wsk1


Se analiza cada 100 ms. Con Timer1
Ultima mquina remota conectada. Puerto e IP de la ltima mquina conectada. Se toman de las
propiedades RemotePort y RemoteHostIP de Wsk1, en el
procedimiento ConnectionRequest.
Instancias activas.
Se introduce el nmero de la instancia, requestID, IP remota y puerto remoto de
la conexin que ha forzado la creacin de una nueva instancia de Wsk1. Cada
vez que se cierra una instancia, se elimina de esta lista. El nmero de la ultima
instancia eliminada se presenta el la caja lateral a esta lista.
Texto recibido
Muestra el texto enviado desde el remoto. Se limpia con cada recepcin, y
tambin se puede limpiar con el botn Limpia Texto Rec. Los textos recibidos
se acumulan en un fichero (cuyo nombre y path se determinan en el fichero de
configuracin) con indicacin de la hora de recepcin y equipo remoto que lo
enva.
Fichero recibido
Presenta el nombre y Path del ultimo fichero recibido. El nombre del fichero es
una composicin del nmero de instancia del winsock que lo recibe (tres cifras) y
de la fecha y hora del sistema (iiiyyyymmddhhmmss.Dat). El path se introduce en
el fichero de configuracin. Paralelamente se crea otro fichero con nombre
idntico y extensin .Env con los datos relativos al equipo remoto que lo ha
enviado, hora de recepcin y localizador del acuse de recibo. Para limpiar esta
caja de texto, se hace clic en el botn Limpia Fichero Rec.

En la parte roja tenemos todo lo relativo a la transmisin, y las cajas de texto pare enviar mensajes de
texto y ficheros.
Direccin IP
Puerto
Protocolo
Conectar
Cerrar
Estado

Texto a enviar.
Fichero a enviar

Fig. 3
LSB

En esta caja se debe introducir el nmero IP del equipo al que se llama.


Se introducir el puerto en el que escucha el equipo remoto. El puerto por
defecto se introduce mediante el fichero de configuracin.
Protocolo utilizado. (UDP o TCP) se cambia haciendo doble clic en esa caja.
Debe usarse el mismo protocolo que el equipo remoto.
Haciendo clic en este botn se inicia el proceso de conexin con el equipo
remoto.
Haciendo clic en este botn se cierra la conexin existente.
Dos etiquetas con el estado del winsock de transmisin. Una, con el valor de la
propiedad State, y otra, con la condicin de conectado / no conectado. Se hace
cada 100 ms. Con el Timer1
Texto que se quiere enviar al equipo remoto. Para comenzar a enviarlo hay que
hacer clic sobre el botn
Nombre y path del fichero que se quiere enviar. Para buscarlo dentro del disco,
hay que hacer clic sobre el botn Para proceder a su envo, se hace clic
sobre el botn Si existe Texto a enviar y Fichero a enviar, al hacer clic sobre
el botn se enviarn ambos

La aplicacin puede conectarse consigo misma


Visual Basic Gua del Estudiante

Captulo 1

Pgina 546

Es muy sencillo comprobar el funcionamiento correcto de la aplicacin conectndose consigo misma. En


la Fig. 3 podemos ver el aspecto que toma la interfase grfica de comunicaciones una vez conectada.
Observe la coincidencia de las direcciones IP y los puertos utilizados tanto en la parte roja (equipo
remoto) como en la azul (equipo local). De esta forma se pueden probar las funciones del programa sin
necesidad de un interlocutor remoto.

Fig. 4 Este es el aspecto final del la aplicacin. Vea en el disco de ejemplos el cdigo completo.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 547

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 548

Visual Basic e Internet (2)


Control Microsoft Internet Transfer
El control Internet Transfer
Microsoft Internet Transfer (Control)
El control Internet Transfer ofrece una implementacin de dos de los protocolos ms ampliamente
utilizados en Internet: Protocolo de transferencia de hipertexto (HTTP) y Protocolo de transferencia de
archivos (FTP). Mediante el protocolo HTTP, puede conectarse con servidores de World Wide Web para
obtener documentos HTML. Con el protocolo FTP puede iniciar sesiones en servidores FTP para
descargar y cargar archivos. Las propiedades UserName y Password permiten iniciar sesiones en
servidores privados que requieran autentificacin. Por otra parte, puede conectar con servidores FTP
pblicos y descargar archivos. Los comandos ms comunes de FTP, como CD y GET, son compatibles
por medio del mtodo Execute.
Usar el control Internet Transfer
El control Internet Transfer implementa dos protocolos de Internet de gran difusin: Protocolo de
transferencia de hipertexto (HTTP) y Protocolo de transferencia de archivos (FTP). Con el control
Internet Transfer se puede conectar con cualquier sitio que utilice alguno de estos protocolos y obtener
archivos mediante los mtodos OpenURL o Execute.
Funcionamiento bsico
La funcionalidad del control Internet Transfer depende del protocolo que desee usar. Como los dos
protocolos contemplados funcionan de forma distinta, las operaciones que puede realizar dependen del
protocolo elegido. Por ejemplo, el mtodo GetHeader slo funciona con HTTP (documentos HTML).
Para poder empezar a usar el control Internet Transfer (Inet) debe estar conectado a una red que
disponga de algn servidor Http y Ftp. No tienen porqu ser directamente a Internet. Puede estar
conectado a una Intranet donde existan. Pero en este control no podemos hacer lo que hacamos con el
Winsock, conectarnos con nosotros mismos. Este control est para acceder a sitios con un servidor http
o ftp.
Vamos a ir introduciendo las propiedades del Inet al mismo tiempo que lo conectamos a Internet. Y lo
primero es saber si se va a conectar directamente o a travs de Proxi. Supongo que el alumno sabr que
es un Proxi, por lo que solamente vamos a explicar la propiedad que tiene el Inet para acceder desde
una Red de Area Local (RAL) con o sin Proxi y as zanjamos esa primera dificultad que puede tener para
conectarse a la Red:
Propiedad AccessType
Establece si el Inet se comunica directamente a Internet o a travs de Proxi.
Sintaxis

NombreDelInet.AccessType = tipo

Tipo acepta los valores:


Constante
Valor Descripcin
IcUseDefault
0
Predeterminada. Asume lo que su PC tenga programado en el navegador de
Internet que tenga por defecto.
IcDirect
1
Directo a Internet. Se usa este valor cuando el Inet se utiliza para comunicar con
servidores http o ftp que estn en la misma RAL. De esta forma no le afecta
cmo tenga programado el acceso de su navegador.
IcNamedProxy 2
Le est indicando al Inet que la salida hacia Internet (O la red donde se
encuentra el servidor http o ftp) debe hacerla a travs del equipo indicado en la
propiedad Proxi.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 549

Propiedad Proxy
Devuelve o establece el nombre del servidor proxy utilizado para comunicar con Internet. Esta propiedad
slo se utiliza cuando el valor de AccessType es icNamedProxy (3).
Sintaxis
NombredelInet.Proxy = proxy
Donde Proxi es el nombre del servidor que se desea usar.
Puede usar un proxi distinto para acceder con protocolo Http o Ftp, y determinar porque puerto accede a
cada uno de estos servicios. El proxi suele estar programado para que en la parte interior de la red se
acceda a los servicios externos a travs de un puerto distinto al real. Es tpico en la programacin de los
proxis acceder desde la red interior al sevicio http a travs del puerto 8080, en vez del puerto 80.
Puede hacer esto estableciendo la propiedad Proxi de la siguiente forma:
NombredelInet.Proxy = "ftp=CorpFTP:123 HTTP=CorpHTTP:131"
Esta forma de establecer la propiedad har que para ftp use el servidor Proxi CorpFTP, por el puerto
123, y que para http use el servidor CorpHTTP por el puerto 131.

Supongamos que ya estamos conectados a Internet. Que como lo sabemos? Utilizaremos un mtodo
del Inet: OpenURL para establecer una comunicacin con un servidor http conocido. Si se completa la
conexin es que ya estamos conectados.

Mtodo OpenURL
Abre y devuelve el documento ubicado en la direccin URL especificada. El documento se devuelve con
el tipo Variant. Cuando termina la ejecucin del mtodo, las propiedades URL (y las partes de la
direccin URL como el protocolo) se actualizan para reflejar la URL actual.
Sintaxis

Variable = NombredelInet.OpenUrl url [,tipoDatos]

Donde
Variable
url
TipoDatos

Variable tipo string donde se guardarn los datos obtenidos (Texto) o una variable
Variant donde se guardarn los datos obtenidos como matriz de bytes
Direccin URL que se desea abrir.
Entero que especifica el tipo de datos. Acepta los valores 0 (Predeteminado) para que
obtenga los datos como cadena de caracteres, o 1, para que los obtenga como matriz de
bytes. Si la URL es una pgina Web debe poner 0 en este valor.

Ejemplo: En un botn de comando ponemos este cdigo


Dim TextoPagina As String
TextoPagina = Inet1.OpenURL(TbURL.Text, 0)
TbTextoPagina = TextoPagina
TbTextoPagina es un TextBox donde vamos a presentar el valor devuelto. Para el valor www.mae.es
devolvi esto:
<html>
<head>
<title>Ministerio de Asuntos Exteriores. Espaa</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<frameset cols="1,*" frameborder="NO" border="0" framespacing="0">
<frame name="nulo" scrolling="NO" noresize >
<frame name="inicial" scrolling="auto" src="/mae/index.jsp" >
</frameset>
<noframes>
<body bgcolor="#FFFFFF">
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 550

</body>
</noframes>
</html>
El mtodo OpenURL trabaja de forma sncrona, es decir, espera a recibir el contenido del fichero para
ejecutar la lnea siguiente del cdigo. Cuando se ejecuta la lnea
TextoPagina = Inet1.OpenURL(TbURL.Text, 0)
La conexin tarda un tiempo en ejecutarse, y el servidor tarda cierto tiempo en buscar el fichero
correspondiente a la peticin y enviarlo. Y mientras tanto, el cdigo est parado en esa lnea, y es
solamente cuando se termina de recibir todo el contenido o cuando el Inet genera un error de
comunicacin cuando se ejecuta la siguiente lnea.
TbTextoPagina = TextoPagina
De no ser sncrona, y dado que la conexin tarda algo (por muy poco que fuese) al ejecutar esta
segunda lnea la variable TestoPagina estara vaca, por lo que TbTextoPagina siempre aparecera en
blanco.
El control Inet es un poco delicado. Como sabr, la propiedad por defecto de un TextBox es la propiedad
Text. Sera de suponer que la lnea:
TextoPagina = Inet1.OpenURL(TbURL, 0) =
Es igual a esta otra:
TextoPagina = Inet1.OpenURL(TbURL.Text, 0)
Pues el Inet, con la primera lnea, da error. Debe tomar TbURL como el objeto tipo control. Sale este
error:
Error 35752 en tiempo de ejecucin:
La direccin URL est mal generada
Es posible que desee saber si ha conectado con la URL solicitada. Eso puede saberlo analizando la el
estado de la conexin. Pero no existe ninguna propiedad que se lo indique. Tiene que ir a buscarlo al
nico procedimiento que tienen el control Internet Transfer: el evento StateChanged

Evento StateChanged
Se produce siempre que hay un cambio de estado en la conexin. Aporta el parmetro estado que es un
integer.
Inet1_StateChanged(ByVal estado As Integer)
estado puede tener uno de estos valores:
Constante
icNone
icHostResolvingHost
icHostResolved
icConnecting
icConnected
icRequesting
icRequestSent
icReceivingResponse
icResponseReceived
icDisconnecting
icDisconnected
icError
icResponseCompleted
LSB

Valor
0
1
2
3
4
5
6
7
8
9
10
11
12

Visual Basic Gua del Estudiante

Descripcin
No hay estado del que informar.
El control est buscando la direccin IP del host especificado.
El control encontr la direccin IP del host especificado.
El control est conectando con el equipo host.
El control conect correctamente con el equipo host.
El control est enviando una solicitud al equipo host.
El control envi correctamente la solicitud.
El control est recibiendo una respuesta del equipo host.
El control recibi correctamente una respuesta del equipo host.
El control se est desconectando del equipo host.
El control se desconect correctamente del equipo host.
Se produjo un error en la comunicacin con el equipo host.
La solicitud se complet y se recibieron todos los datos.
Captulo 1

Pgina 551

Puede analizar el estado del Inet introduciendo este cdigo en este procedimiento:
Private Sub Inet1_StateChanged(ByVal State As Integer)
Select Case State
Case 0
LState = "0 - Sin actividad"
Lstate es un Label donde presentamos el estado de la conexin
Case 1
LState = "1 - Buscando Host"
Case 2
LState = "2 - Host encontrado"
Case 3
LState = "3 - Conectando"
Case 4
LState = "4 - Conectado"
Case 5
LState = "5 - Enviando solicitud"
Case 6
LState = "6 - Solicitud enviada"
Case 7
LState = "7 - Recibiendo respuesta del Host"
Case 8
LState = "8 - Respuesta recibida"
Case 9
LState = "9 - Desconectando"
Case 10
LState = "10 - Desconectado"
Case 11
LState = "11 - Error de conexin"
Case 12
LState = "12 - Operacin completada"
End Select
End Sub

Este procedimiento no se comporta de igual forma cuando se conecta con una pgina Http que cuando
lo hace con un servidor Ftp. Nos centraremos primero en conexiones con servidores Http, y veremos
ms adelante como se comporta con servidores Ftp.
El procedimiento StateChanged se emplea tambin para ejecutar el mtodo GetChunk para recuperar
datos. Vea este mtodo ms adelante.
Otro mtodo muy importante para ver pginas en la Web el mtodo GetHeader, que permite recuperar
el encabezado o paerte de l de una pgina. Este mtodo puede ser muy til cuando tenemos que bajar
una pgina, pero previamente queremos comprobar que ya ha sido actualizada.

Mtodo GetHeader
Recupera el encabezado de un archivo HTTP. Devuelve un string.
Sintaxis

Inet1.GetHeader (nombreEnc)

Donde:
Inet1
NombreEnc

Nombre del control Inet


Opcional. Cadena que especifica el encabezado que desea recuperar. Si no indica
ninguno los recuperar todos. Los valores permitidos para nombreEnc son (Pueden
existir otros, dependiendo el servidor)
Date
Devuelve la hora y la fecha de la transmisin del documento. El formato de los datos
obtenidos es Fri, 01 Nov 2002 12:10:51 GMT. Este dato puede servir para sincronizar
los relojes de muchos ordenadores, sin necesidad de recurrir a complejos y costosos
sistemas basados en GPS, ya que todos los ordenadores pueden ponerse en hora
tomndola de una pgina Web de referencia.
MIME-version Devuelve la versin del protocolo MIME. Normalmente los servidores no contestan a este
parmetro.
Server
Devuelve el tipo del servidor. (Esta respuesta tienen mucho peligro, ya que los hackers
es lo primero que miran para realzar un ataque)
Content-length Devuelve la longitud en bytes de los datos que enviar cuando ejecutemos el mtodo
OpenURL.
Content-type Devuelve el tipo de contenido MIME de los datos.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 552

Last-modified

Devuelve la fecha y la hora de la ltima modificacin del documento. El formato de los


datos devueltos es Wed, 20 Feb 2002 15:26:44 GMT. Observe que la hora siempre se
suministra GMT (Grenwich Meridian Time, una hora menos que en el horario de invierno
de Espaa peninsular)

La pgina www.mae.es devuelve este texto:


HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Content-Location: http://www.mae.es/index.htm
Date: Fri, 01 Nov 2002 12:10:51 GMT
Content-Type: text/html
Accept-Ranges: bytes
Last-Modified: Wed, 20 Feb 2002 15:26:44 GMT
ETag: "0129d023bac11:991"
Content-Length: 420
Age: 0

Mtodo Cancel
Cancela la solicitud actual y cierra las conexiones establecidas actualmente. No devuelve ningn valor.
Sintaxis

Inet1.Cancel

Es posible que este mtodo genere un error, ya que en algunas ocasiones cierra la conexin sin poder
cancelar ya el proceso que est en curso. Tenga cuidado al usarlo.
Vamos a ver ahora el mtodo ms til de este control. Con l podemos hacer todas las funciones de
envo y recogida de ficheros.

Mtodo Execute
Ejecuta una solicitud a un servidor remoto. Slo puede enviar solicitudes vlidas para el protocolo que
est utilizando. Lgicamente este mtodo funcionar de forma distinta y necesitar parmetros distintos
dependiendo del protocolo que estemos usando. Para el protocolo Http la sintaxis es la siguiente:
Sintaxis (Http) Inet1.Execute url, operacin, datos, encabezadosSolicitud
Inet1
Nombre del control Inet
URL
(Opcional) Cadena que especifica la direccin URL con la que se debe conectar el control. Si no
se especifica ninguna, se usar la direccin contenida en la propiedad URL
operacin
Opcional. Cadena que especifica el tipo de operacin que desea ejecutar. Mas abajo encontrar
una lista con las operaciones admitidas.
datos
Opcional. Cadena que especifica los datos para las operaciones (vea ms abajo).
EncabezadosSolicitud
Opcional. Cadena que especifica los encabezados adicionales para enviarlos al servidor
remoto. El formato de los mismos es el siguiente:
nombre encabezado: valor encabezado vbCrLf

Comandos de HTTP admitidos


Los valores vlidos para operacin son:
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 553

Operacin
GET
HEAD

Descripcin
Recupera datos de la direccin URL especificada en la propiedad URL.
Enva los encabezados de la solicitud.
Enva datos al servidor. Los datos estn en el argumento datos. ste es
un mtodo alternativo a GET para el que se especifican las instrucciones
adicionales en el argumento datos.
Operacin de colocacin. El nombre de la pgina que se va a reemplazar
est ubicado en el argumento datos.

POST
PUT

Es difcil probar estos comandos. Normalmente las pginas comerciales no ofrecen los servicios que a
nosotros nos gustara probar. Vea en los ejemplos entregados una aplicacin del comando PUT (Que
no podr ensayar en su casa excepto que tenga acceso a un servidor con Password)
Vamos a mostrarle un ejemplo del comando GET. Pero previamente tenemos que hablar de un mtodo
que antes habamos citado de pasada:

Mtodo GetChunk
Obtiene datos cuando se produce el evento StateChanged al llegar al estado de respuesta completa
(icResponseCompleted = 12) Este mtodo se invoca despus de ejecutar el mtodo Execute como
una operacin GET.
Sintaxis

Inet1.GetChunk( tamao [,tipoDatos] )

Cuando se ejecuta la operacin GET los caracteres recibidos desde el servidor se almacenan enun
buffer. El mtodo GetChunk recupera los caracteres del buffer en bloques de un tamao que se debe
fijar en el parmetro tamao. Si la informacin recibida es mayor que tamao ser necesario hacer un
bucle hasta completar la recuperacin de todos los caracteres. El parmetro tipoDatos puede ser
icString (0) para recuperar una cadena de caracteres, icByteArray (1) para recuperar una matriz de
bytes.
Este es el cdigo que se ha metido en el SelectCase del evento StateChanged, para el caso que State
sea 12
Dim vtData As Variant ' Variable de datos.
Dim strData As String, bDone As Boolean, F As Integer
' Obtiene el primer bloque.
vtData = Inet1.GetChunk(1024, icString)
DoEvents
Do While Not bDone
strData = strData & vtData
DoEvents
' Obtiene el bloque siguiente. Est sacando bloques de 1024 caracteres
'hasta que no queda ninguno. En ese caso, GetChunk devuelve la cadena vaca
vtData = Inet1.GetChunk(1024, icString)
If Len(vtData) = 0 Then
bDone = True
End If
Loop
TbTextoExecute.Text = strData
If TbNombreFichero <> "" Then
F = FreeFile
Open "C:\_aaa\" & TbNombreFichero For Output As #F
Print #F, strData
Close #F
End If

Mtodo Execute (Continuacin)


Veamos ahora que puede hacer el mtodo Execute para el protocolo Ftp. Aunque la sintaxis es igual, en
Ftp no se usan los parmetros datos y encabezadosSoliicitud y queda como sigue:
Sintaxis (Ftp)
LSB

Inet1.Execute url, Instruccion

Visual Basic Gua del Estudiante

Captulo 1

Pgina 554

url es el nombre del servidor. Este parmetro puede darle algn problema si no conoce exactamente el
nombre del servidor, (Si lleva o no lleva el encabezado FTP:// , si es una DNS o un nmero IP, ..) Estas
direcciones son un ejemplo de ello:
FTP://ftp.microsoft.com

Ftp://10.3.22.119

Instruccin es una cadena que incluye el comando (GET, PUT, ..) y el nombre o nombres de los archivos
necesarios. Ejemplos:
Inet1.Execute "FTP://ftp.microsoft.com", "GET Disclaimer.txt C:\Temp\Disclaimer.txt"
Inet1.Execute "FTP://ftp.microsoft.com", "PWD"
Inet1.Execute Ftp://10.3.22.119, PUT C:\Prensa\PrensaDia.Tiff /Documentos/PrensaHoy.Tiff
Nota No se admiten nombres de archivos que incluyan espacios incrustados.
Los comandos vlidos para FTP son los siguientes:
Operacin
CD archivo1
CDUP
CLOSE
DELETE archivo1
DIR archivo1

GET archivo1 archivo2


LS archivo1
MKDIR archivo1
PUT archivo1 archivo2
PWD
QUIT
RECV archivo1
archivo2
RENAME archivo1
archivo2
RMDIR archivo1
SEND archivo1
archivo2
SIZE archivo1

Descripcin
Cambiar directorio. Cambia al directorio especificado en archivo1.
Cambiar al directorio superior. Equivale a "CD.."
Cierra la conexin FTP actual.
Elimina el archivo especificado en archivo1.
Directorio. Busca en el directorio especificado en archivo1. Se admiten
comodines, pero el host remoto determina la sintaxis. Si no especifica
archivo1, obtendr una lista completa del directorio de trabajo actual.
Puede usar el mtodo GetChunk para obtener los datos del directorio.
Recupera el archivo remoto especificado en archivo1 y crea el nuevo archivo
local especificado en archivo2.
Lista. Busca en el directorio especificado en archivo1. Se admiten comodines,
pero el host remoto determina la sintaxis. Puede usar el mtodo GetChunk
para obtener los datos de los archivos del directorio.
Crear directorio. Crea el directorio especificado en archivo1. El xito de la
operacin depende de los privilegios del usuario en el host remoto.
Copia el archivo local especificado en archivo1 en el archivo del host remoto
especificado en archivo2.
Mostrar directorio de trabajo. Devuelve el nombre del directorio actual. Puede
usar el mtodo GetChunk para obtener los datos.
Termina la sesin del usuario actual.
Recupera el archivo remoto especificado en archivo1 y crea un nuevo archivo
local especificado en archivo2. Equivale a GET.
Cambia el nombre del archivo indicado en archivo1 por el nombre
especificado en archivo2. El xito de la operacin depende de los privilegios
del usuario en el host remoto.
Eliminar directorio. Elimina el directorio remoto especificado en archivo1. El
xito de la operacin depende de los privilegios del usuario en el host remoto.
Copia el archivo local especificado en archivo1 en el archivo del host remoto
especificado en archivo2. Equivale a PUT.
Devuelve el tamao del directorio especificado en archivo1.

Siguiendo con el servidor Ftp de Microsoft podemos ensayar algunos de estos comandos:
Inet1.Execute "FTP://ftp.microsoft.com", "DIR"
Nos devuelve el directorio. Como no hemos realizado ninguna operacin sobre ese directorio, nos
devolver el directorio del raz.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 555

bussys/
deskapps/
developr/
KBHelp/
MISC/
MISC1/
peropsys/
Products/
ResKit/
Services/
Softlib/
No contiene ficheros sino ms directorios. Uno de ellos es el directorio MISC. Podemos cambiarnos a l
con la instruccin:
Inet1.Execute "FTP://ftp.microsoft.com", "CD MISC"
Y para comprobarlo vamos a pedir otra vez el directorio. Ahora ya vemos que ya contienen ficheros, y
ms directorios.
beckyk/
CBCP.TXT
csformat/
DAILYKB/
DISCLAIM.TXT
FDC/
friKB/
FULLKB/
Homenet/
INDEX.TXT
Jeffreyf/
KB/
KBSPV/
Markesh/
monKB/
NBFCP.TXT
NBFCP2.TXT
NBFCP3.TXT
NBFCP4.TXT
NBFCP5.TXT
Peach/
PRODUCT.TBL
ReadMe1.txt
satKB/
Store/
STORE1/
sunKB/
test/
thuKB/
TREE.COM
tueKB/
wedKB/
Para realizar este tipo de operaciones debe asegurarse que la operacin se ha terminado antes de iniciar
una nueva operacin. Esto puede verlo con el valor de State del procedimiento StateChanged. Ha de
esperar a que tenga el valor icResponseCompleted ( = 12). Es en ese momento cuando debe invocar
el mtodo GetChunk para sacar los datos del bffer. Es el mismo cdigo del Select Case que ha visto
antes, que le repito aqu por comodidad:
Case 12
LState = "12 - Operacin completada"
Dim vtData As Variant ' Variable de datos.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 556

Dim strData As String, bDone As Boolean, F As Integer


' Obtiene el primer bloque.
vtData = Inet1.GetChunk(1024, icString)
DoEvents
Do While Not bDone
strData = strData & vtData
DoEvents
' Obtiene el bloque siguiente. Est sacando bloques de 1024 caracteres
'hasta que no queda ninguno. En ese caso, GetChunk devuelve la cadena vaca
vtData = Inet1.GetChunk(1024, icString)
If Len(vtData) = 0 Then
bDone = True
End If
Loop
TbTextoExecute.Text = strData El texto devuelto se introduce en el TextBox TbTextoExecute
End Select
Una vez en el directorio adecuado, podemos bajarnos un fichero mediante este cdigo:
Inet1.Execute "FTP://ftp.microsoft.com", "GET ReadMe1.txt C:\PruebaVB\Leeme1.Txt"
Al ejecutarlo dej el fichero ReadMe1.txt en la carpeta C:\PruebaVB con le nombre Leeme1.Txt.
Contena esto:
The Microsoft Knowledge Base is currently published to this server in three formats. Two of the formats
are published for legacy reasons and are now obsolete. The KB will be posted to this server only in HTM
format as of August 1, 2002.
The Microsoft Knowledge base has been posted to this server in text format since 1993. With the growth of the world wide web
and the spread of browser technology, the HTML formats of the KB became the defining standard, and in many cases the text
rendering of the content lost important data only visible in the HTML view. We will be discontinuing text format output to ensure our
customers don't miss critical data in the articles they download from this server. One variant of text files we have been publishing
is SPV files. SPV files group articles by the product that they apply to. An article can only belong in one group, which avoids
duplicates if more than one collection is downloaded. Today, many articles apply equally to multiple products. As such, the binary
or arbitrary division of articles results in information being hidden from customers who needed it. Effective August 1, we will no
longer divide articles on this server by these arbitrary groupings and the published SPV files will be deleted.
The KB will continue to be available for download at ftp://ftp.microsoft.com/misc/kb as HTM files.
The files which were in this location will be available until July 31, 2002 at ftp://ftp.microsoft.com/misc1.

The zipped SPV files that were being stored here are now located at ftp://ftp.microsoft.com/misc1 until
07/31/02 at which time these files will no longer be available.
In summary:
The following folders and/or files at:
ftp://ftp.microsoft.com/bussys/...../kb
ftp://ftp.microsoft.com/deskapps/...../kb
ftp://ftp.microsoft.com/developr/...../kb
ftp://ftp.microsoft.com/MISC/
ftp://ftp.microsoft.com/peropsys/...../kb

are all located at:


ftp://ftp.microsoft.com/MISC1/

and only at:


ftp://ftp.microsoft.com/misc/kb

will there be HTM files after 7/31/02.


Thank you,
endspv@microsoft.com

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 557

Podra enviar un fichero para el servidor. Pero no se lo iba a aceptar. Muchos de los comandos
enumerados arriba slo pueden ejecutarse si el usuario tiene privilegios en el host servidor. Por
ejemplo, los sitios FTP anonymous no permiten enviar ficheros, ni eliminar archivos ni
directorios.

Transmisin asncrona del mtodo Execute


Al contrario que el mtodo OpenURL, el mtodo Execute produce una transmisin asncrona de los
datos. Cuando se invoca el mtodo Execute, la operacin de transferencia se produce
independientemente de otros procedimientos. Por tanto, despus de invocar el mtodo Execute es
posible ejecutar otro cdigo mientras se reciben datos en segundo plano. Pero cuidado con esto, que no
podr invocar otro mtodo que afecte a la conexin hasta que la transferencia haya terminado o haya
sido abortada, por ejemplo, por haber ocurrido un error de transmisin.
Este es el motivo por el que tras el mtodo Execute, haya que recurrir al mtodo GetChunk, aplicndolo
cuando el parmetro State del procedimiento StateChanged haya tomado el valor 12 (Respuesta
completa). No se puede saber cuando ha terminado la recepcin de los datos, por lo tanto es necesario
disponer de un recurso que nos lo indique.
Guardar en un archivo con el mtodo OpenURL
El mtodo GET sobre FTP guarda directamente un archivo en un fichero, haciendo una copia exacta del
fichero que estaba en el servidor. Recuerde el cdigo con el que nos habamos bajado el fichero desde
Microsoft.
Inet1.Execute "FTP://ftp.microsoft.com", "GET ReadMe1.txt C:\PruebaVB\Leeme1.Txt"
Es decir:
Inet1.Execute "DireccionFTP", "GET NombreFicheroenServidor NombreFicheroLocal"
Este mtodo no da ningn problema en cuanto a la exactitud de los datos. El fichero guardado en el
disco local es idntico al que estaba en el servidor.
Recuerde que anteriormente habamos explicado el mtodo OpenURL pero solamente lo habamos
aplicado al contenido de una pgina Web (Texto) y por lo tanto habamos puesto en el mtodo OpenURL
como tipo de datos strURL
Cuando el fichero a bajar mediante OpenURL es un fichero binario (Contiene todos los caracteres
posibles) el hecho de decirle que el tipo de datos va a ser texto implica que muchos de los caracteres se
perdern (El carcter cero sin ir ms lejos) En este caso debe decirle que los datos son una matriz de
Bytes. Para ello, debemos declarar como Byte la variable donde vamos a meter cada uno de los
caracteres.
Si desea guardar en un archivo los datos obtenidos con el mtodo OpenURL, puede usar las
instrucciones Open, Put y Close, como se muestra en el cdigo siguiente. En este ejemplo se transfiere
un archivo binario a una matriz de bytes antes de guardar los datos en disco:
Dim strURL As String
Dim bData() As Byte
' Variable de datos
Dim F As Integer ' Variable para conocer el primer archivo (canal) libre FreeFile
strURL = "ftp://ftp.microsoft.com/Softlib/Softlib.exe"
F = FreeFile()
' Establece F a un integer con el archivo ms bajo sin utilizar
' El resultado del mtodo OpenURL va a la matriz de bytes y sta se guarda entonces en disco.
bData() = Inet1.OpenURL(strURL, icByteArray)
Open "C:\Temp\Softlib.exe" For Binary Access Write As #F
Put #F, , bData()
Close #F
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 558

Se puede emplear un procedimiento similar para escribir un archivo de texto en disco, pero ahora no es
necesaria una matriz de bytes, pues los datos se guardan directamente en el archivo:
Dim strURL As String
' Cadena URL
Dim intFile As Integer ' Variable FreeFile
IntFile = FreeFile()
strURL = "http://www.microsoft.com/spanish"
Open "c:\temp\MSsource.txt" For Output _
As #IntFile
Write #IntFile, Inet1.OpenURL(strURL)
Close #IntFile
Sugerencia Cuando utilice el mtodo OpenURL o el mtodo Execute, no necesita establecer la
propiedad Protocol. El control Internet Transfer establecer automticamente el protocolo correcto,
segn determine la parte de protocolo de la direccin URL.
Iniciar sesin en los servidores FTP
Hay servidores FTP de dos tipos: pblicos y privados. Los servidores pblicos, como su nombre indica,
estn abiertos a todos. Los servidores privados, por otra parte, no le permitirn el acceso si no es un
usuario de confianza del servidor. En cualquier caso, el protocolo FTP solicita un nombre de usuario y
una contrasea. Estos dos elementos se utilizan para autentificar al usuario y permitir (o impedir) sus
acciones posteriores.
Para iniciar una sesin en los servidores pblicos, la prctica habitual es especificar como nombre de
usuario "anonymous", (UserName = "anonymous") y enviar su propia direccin de correo electrnico
como contrasea. Sin embargo, este proceso se simplifica an ms con el control Internet Transfer. De
forma predeterminada, no hay que indicar los valores de las propiedades UserName y Password, pues
el control enva "anonymous" en la primera y su direccin de correo electrnico en la segunda.
Si va a iniciar una sesin en un servidor privado, slo tiene que establecer las propiedades UserName,
Password y URL a los valores apropiados e invocar el mtodo Execute, como se muestra en el ejemplo
siguiente:
With Inet1
.URL = "ftp://ftp.iies.es"
.UserName = "NombreRegistrado"
.Password = "ClavedeAcceso"
.Execute , "DIR" ' Devuelve el directorio.
Do While Inet1.StillExecuting = True
DoEvents
Loop
.Execute , "CLOSE" ' Cierra la conexin.
End With
Una vez invocado el mtodo Execute, la conexin FTP permanecer abierta. Puede entonces continuar
utilizando el mtodo Execute para realizar otras operaciones de FTP, como CD y GET. Cuando haya
completado la sesin, cierre la conexin con el mtodo Execute y con la operacin CLOSE. Tambin
puede cerrar la conexin automticamente si modifica la propiedad URL e invoca el mtodo OpenURL o
Execute; esta accin cerrar la conexin FTP actual para abrir la nueva direccin URL.
Ya hemos visto un poco como funciona. No se preocupe si le empiezan fallando las primeras
aplicaciones que vaya haciendo. Con lo ledo hasta aqu no se conoce todava este control de forma
suficiente. Le llevar un buen tiempo (y muchos errores en sus aplicaciones) aumentar sus
conocimientos, pero con lo visto tiene para empezar a andar. No olvide que muchas veces la instruccin
que est empeado en hacer no se puede porque le faltan permisos de acceso a su servidor. Paciencia
y sobre todo, apunte sus experiencias.
Vamos a ver una a una las propiedades del Inet.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 559

Propiedades de Control Internet Transfer


Propiedad AccessType
La hemos visto ms atrs. Determina si se accede a Internet directamente (1), con Proxy (2) o las
preestablecidas en su PC
Propiedad Document
Devuelve o establece el archivo o documento que se usar con el mtodo Execute. Si no especifica esta
propiedad, se emplear el documento predeterminado del servidor. Si no especifica ningn documento,
se producir un error en las operaciones de escritura.
Sintaxis

Inet1.Document = cadena

hInternet (Propiedad)
Devuelve el controlador de Internet de la API de Wininet.dll subyacente. Por tanto, puede usar este
controlador en llamadas directas a la API. Esta propiedad no se utiliza cuando efecta el acceso al
control desde Visual Basic.
Sintaxis

VariableLong = Inet1.hInternet

Propiedad UserName
Devuelve o establece el nombre de usuario que se enviar con las solicitudes a los equipos remotos. Si
deja en blanco esta propiedad, el control enviar "anonymous" como nombre de usuario al realizar
solicitudes.
Sintaxis

Inet1.UserName = nombre

Propiedad Password
Devuelve o establece la contrasea que se enviar junto con la solicitud de inicio de sesin a los equipos
remotos. Si deja esta propiedad en blanco, el control enviar la contrasea predeterminada (Direccin de
Correo electrnico).
Sintaxis

Inet1.Password = cadena

Propiedad Protocol
Establece el protocolo que desea usar con el mtodo Execute.
Sintaxis

Inet1.Protocol = entero

Los valores vlidos para entero son:


Constante
Valor
0
icUnknown
1
icDefault
2
icFTP
3
icReserved
4
icHTTP
5
icHTTPS

Descripcin
Desconocido.
Protocolo predeterminado.
FTP. Protocolo de transferencia de archivos.
Reservado para uso futuro.
HTTP. Protocolo de transferencia de hipertexto.
HTTP seguro.

Comentarios
Cuando especifica esta propiedad, la propiedad URL se actualiza para mostrar el nuevo valor. Adems,
si la parte de protocolo de la direccin URL se actualiza, tambin se modifica la propiedad Protocol para
reflejar el cambio. Los mtodos OpenURL y Execute tambin pueden modificar el valor de esta
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 560

propiedad. El cambio de valor de esta propiedad no tiene ningn efecto hasta que se invoque el
siguiente mtodo Execute u OpenURL.
Propiedad Proxy
Vista ms atrs. Devuelve o establece el nombre del servidor proxy utilizado para comunicar con
Internet.
Propiedad RequestTimeout
Devuelve o establece la duracin, en segundos, de un intervalo de espera. Si no se responde a una
solicitud dentro del intervalo especificado y si la solicitud se efectu con el mtodo OpenURL (solicitud
sncrona), se produce un error. Si la solicitud se efectu con el mtodo Execute, se producir el mtodo
StateChanged junto con un cdigo de error. El valor 0 de esta propiedad significa espera indefinida.
Sintaxis

Inet1.RequestTimeout = tiempoensegundos

Propiedad ResponseCode
Devuelve el cdigo de error de la conexin cuando aparece el estado icError (11) en el evento
StateChanged. Si desea obtener una descripcin del error, vea la propiedad ResponseInfo.
Sintaxis

Inet1.ResponseCode= cdigo

Propiedad ResponseInfo
Devuelve la descripcin del ltimo error que se ha producido.
Sintaxis

Inet1.ResponseInfo

Puede usar el evento StateChanged para recibir la notificacin de un error. En el case = 11 podemosm
poner este cdigo y vemos las dos propiedades anteriores.
MsgBox Ha ocurrido el error & Inet1.ResponseCode & : & Inet1.ResponseInfo
Propiedad StillExecuting
Devuelve un valor True / False que especifica si el control Internet Transfer est ocupado. El control
devolver True cuando est realizando una operacin como obtener un archivo de Internet y no
responder a ninguna otra solicitud mientras est ocupado.
Sintaxis

VariableBooleana = Inet1.StillExecuting

Si VariableBooleana = True es que est ocupado


Propiedad URL
Devuelve o establece la direccin URL empleada por los mtodos Execute y OpenURL.
Sintaxis

Inet1.URL = Nombredela URL

Al invocar los mtodos OpenURL y Execute, cambia el valor de esta propiedad por el que se introduzca
al ejecutar esos mtodos. La modificacin de esta propiedad no tiene ningn efecto hasta que se llama
al siguiente mtodo OpenURL o Execute.
La propiedad URL debe contener al menos un protocolo y un nombre de host remoto.
La propiedad URL puede especificar un directorio o un archivo. Por ejemplo, son vlidas las dos
direcciones URL siguientes:
Inet1.URL = HTTP://www.microsoft.com ' Con esta URL slo obtendr el directorio del archivo
Inet1.URL = "HTTP://www.microsoft.com/disclaimer.txt" ' Con esta obtendr el texto del archivo:
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 561

La propiedad URL casi no es necesario usarla, ya que se puede introducir directamente en los mtodos
OpenURL y Execute. Esta propiedad cambia cada vez que se invocan esos mtodo con otro valor para
la URL, quedando el ltimo valor usado como valor actual de la propiedad.
Nota Cuando utilice el mtodo OpenURL, establezca la propiedad URL antes que las propiedades
Password y UserName. Si establece la propiedad URL en ltimo lugar, las propiedades UserName y
Password estarn establecidas a "".

Errores interceptables del control Internet Transfer


En las tablas siguientes se indican los errores interceptables correspondientes al control Internet
Transfer y las constantes asociadas.
Constante
Valor
Descripcin
7
"Memoria insuficiente"
IcOutOfMemory
10
El equipo ha sido desconectado de la red.
IcDisconnected
13
"El tipo no coincide"
IcTypeMismatch
380
El valor de la propiedad no es vlido
IcInvalidPropertyValue
35750
No se puede abrir el controlador de Internet
IcInetOpenFailed
35751
"No se puede abrir la direccin URL"
IcOpenFailed
35752
"La direccin URL est mal generada"
IcBadUrlL
35753
"Este mtodo no es compatible con el protocolo"
IcProtMismatch
35754
"No se puede conectar con el host remoto"
IcConnectFailed
35755
"No se ha especificado ningn equipo remoto"
IcNoRemoteHost
35756
"No se puede completar la peticin"
IcRequestFailed
35757
"Debe ejecutar una operacin antes de recuperar datos"
IcNoExecute
35758
"No se puede recuperar datos"
IcBlewChunk
35759
"Fall el comando FTP"
IcFtpCommandFailed
35760
"No se puede forzar el tipo"
IcUnsupportedType
35761
"Se excedi el tiempo de espera"
IcTimeOut
35762
"El comando no es vlido o no es compatible"
IcUnsupportedCommand
35763
"Argumento de operacin no vlido"
IcInvalidOperation
35764
"Todava se est ejecutando la ltima peticin"
IcExecuting
35765
"Esta llamada no es vlida para una conexin FTP"
IcInvalidForFtp
35767
"Sin controladores"
IcOutOfHandles
35768
"Se ha excedido el tiempo de espera"
IcinetTimeout
35768
Se ha excedido el tiempo de espera
IcInetTimeout
35769
Error extendido.
IcExtendedError
35770
Error interno.
IcIntervalError
35771
Direccin URL no vlida.
IcInvalidURL
35772
Patrn no reconocido
IcUnrecognizedScheme
35773
Nombre sin resolver.
IcNameNotResolved
35774
Protocolo no encontrado.
IcProtocolNotFound
35775
Opcin no vlida.
IcInvalidOption
35776
Longitud de opcin incorrecta.
IcBadOptionLength
35777
La opcin no se puede establecer
IcOptionNotSettable
35778
Apagar
IcShutDown
35779
Nombre de usuario incorrecto.
IcIncorrectUserName
35781
Error al iniciar la sesin.
IcLoginFailure
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 562

IcInetIvalidOperation
IcOperationCancelled
IcIncorrectHandleType
IcIncorrectHandleState
IcNotProxyRequest
IcRegistryValueNotFound
IcbadRegistryParameter
IcNoDirectAccess
IcIncorrectPassword
IcNoContext
IcNoCallback
IcRequestPending
IcIncorrectFormat
IcItemNotFound
icCannotConnect
icConnectionAborted
icConnectionReset
icForceEntry
icInvalidProxyRequest
icWouldBlock
icHandleExists
icSecCertDateInvalid
icSecCertCnInvalid
icHttpsToHttpOnRedir
icMixedSecurity
icChgPostIsNotSecure
icHttpToHttpsOnRedir
icPostIsNonSecure
icClientAuthCertNeeded
icInvalidCa
icClientAuthNotSetup
icAsyncThreadFailed
icRedirectSchemeChange

35782
35783
35784
35785
35786
35787
35788
35789
35780
35790
35791
35792
35793
35794
35795
35796
35797
35798
35799
35800
35802
35803
35804
35806
35807
35808
35808
35809
35810
35811
35812
35813
35814

icDialogPending

35815

icRetryDialog

35816

icHttpsHttpSubmitRedir

35818

icInsertCdrom

35819

icFtpTransferInProgress
icFtpDropped

35876
35877

icFtpNoPassiveMode

35878

icGopherProtocolError
icGopherNotFile
icGopherDataError
icGopherEndOfData

35896
35897
35898
35899

LSB

Visual Basic Gua del Estudiante

Operacin no vlida.
Operacin cancelada.
Tipo incorrecto de controlador.
Estado incorrecto del controlador.
No es un proxy.
Valor del Registro no vlido.
Parmetro del registro incorrecto.
Sin acceso directo.
Contrasea incorrecta.
Sin contexto.
Sin devolucin de llamada.
Peticin pendiente.
Formato incorrecto.
No se encuentra el elemento.
No se puede conectar.
Conexin anulada.
Conexin restablecida.
Forzar reintento.
Peticin del proxy no vlida
Con bloqueo.
El controlador ya existe.
Fecha de certificacin de seguridad no vlida.
Nmero de certificacin de seguridad no vlido.
HTTPS a HTTP al redirigir.
Seguridad mixta.
Cambiar la exposicin no es seguro.
HTTPS a HTTP al redirigir.
La exposicin no es segura.
Es necesaria la certificacin de autorizacin del cliente.
Autorizacin del cliente no vlida.
Autorizacin de cliente no establecida.
Error en el subproceso Async.
Cambio en el patrn de redireccin.
La operacin est suspendida hasta que cierre un cuadro de
dilogo abierto.
Intente la operacin de nuevo.
Debe volver a intentar la operacin porque fall la
comprobacin de seguridad de zona
La cach de CD instalable requiere un CD-ROM presente en
la unidad.
FTP: transferencia en curso.
FTP: conexin interrumpida.
Se intent una conexin en modo pasivo (es decir, la solicitud
de conexin original se especific como
INTERNET_FLAG_PASSIVE), pero el servidor no permite ese
modo.
Gopher: Error de protocolo.
Gopher: No es un archivo.
Gopher: Error de datos.
Gopher: Fin de los datos.

Captulo 1

Pgina 563

icGopherInvalidLocator
icGopherIncorrectLocatorT
ype
icGopherNotGopherPlus
icGopherAttributeNotFound
icGopherUnknownLocator
icHeaderNotFound
icHttpDownlevelServer
icHttpInvalidServerRespons
e
icHttpInvalidHeader
icHttpInvalidQueryRequest
icHttpHeaderAlreadyExists
icHttpRedirectFailed
icSecurityChannelError
icUnableToCacheFile
icHttpCookieNeedsConfirm
ation
icHttpCookieDeclined

35900

Gopher: Localizador no vlido.

35901

Gopher: Tipo de localizador incorrecto.

35902
35903
35904
35916
35917

Gopher: Sin Gopher Plus.


Gopher: No se encontr el atributo.
Gopher: Localizador desconocido.
HTTP: No se encontr el encabezado.
HTTP: Servidor de bajo nivel.

35918

HTTP: Respuesta del servidor no vlida.

35919
35920
35921
35922
35923
35924

icServerUnreachable

35930

icProxyServerUnreachable

35931

icBadAutoProxyScript

35932

icUnableToDownloadScript

35933

HTTP: Encabezado no vlido.


HTTP: Peticin de consulta no vlida.
HTTP: El encabezado ya existe.
HTTP: Fall la redireccin.
Error de seguridad de canal.
No se puede almacenar en cach el archivo.
Debe confirmar un cookie suministrado por el servidor antes
de que comience la transferencia.
No fue aceptado un cookie suministrado por el servidor.
No fue posible la conexin con el servidor solicitado. Esto se
produjo por el error WSAEHOSTUNREACH recibido desde
WinSock.
No se pudo alcanzar el servidor proxy solicitado.
Existe un error en el archivo de comandos de configuracin
automtica del proxy, de modo que el archivo de comandos
no pudo ejecutarse.
No se pudo recibir el archivo de configuracin automtica del
proxy solicitado.
Debe confirmar una redireccin del nivel de protocolo antes
de que pueda comenzar la transferencia.
El certificado no es vlido
El certificado ha sido revocado.
Fall la operacin que intent porque no pudo pasar la
comprobacin de seguridad.

icHttpRedirectNeedsConfir
mation
icSecInvalidCert
icSecCertRevoked
icFailedDueToSecurityChec
k

LSB

35927
35928

35934
35935
35936
35937

Visual Basic Gua del Estudiante

Captulo 1

Pgina 564

Visual Basic e Internet (3)


Control WebBrowser
El Control WebBrowser
El control WebBrowser es un control DLL-ActiveX (Concretamente el Shdocvw.dll) que se encuentra en
la lista de componentes (Proyecto |Componentes) como Microsoft Internet Controls. En la caja de
herramientas est representado como un icono que representa un globo del mundo.
Forma parte del Internet Explorer de Microsoft. Es decir, es una pieza de las usadas por
Microsoft para su navegador de Internet.
El WebBrowser puede buscar pginas en la red o en el disco local y presentarlas. Presenta un
documento Html y guarda el historial, de forma que siempre puede volver atrs en su navegacin. Puede
incluso presentar un documento Word Excel.
Parece en principio que no es prctico realizar un nuevo navegador, usando precisamente la misma
pieza que usa el Internet Explorer. Para eso ya tenemos el Internet Explorer. Y ciertamente es as. Pero
no voy a negar que tienen algo de sugestivo realizar un navegador propio para nuestras aplicaciones,
an a sabiendas que estamos usando una parte del IE. Analizaremos las propiedades, mtodos y
evento ms relevantes, presentaremos el Guia del Estudiante Internet Explorer, y luego ser el alumno
quien decida si merece la pena hacer algo con este control o no.

Propiedades del control WebBrowser


La informacin y ayuda del WebBrowser vienen en el disco 2 del MSDN. Dependiendo de cmo haya
instalado el MSDN le aparecer o no en la ayuda normal de VB que sale pulsando F1. Le recomiendo
que los dos discos del MSDN debe tenerlos continuamente en su puesto de trabajo.
Propiedad Busy
Devuelve un valor True / False indicando que el WebBrowser est ocupado en una operacin de
navegacin o bajando un archivo. Puede usar el mtodo Stop para detener la operacin en curso.
Propiedad Container
Devuelve una referencia al formulario u otro contenedor que contiene al WebBrowser. Como devuelve
una referencia al objeto, podremos ver cualquier propiedad de ese objeto, por ejemplo, su nombre:
Label1 = brwWebBrowser.Container.Name
Esta lnea devuelve el nombre del formulario que contioenen al WebBrwser
Propiedad Document
Devuelve una referencia al documento que est presentando el WebBrowser. Al devolver una referencia,
podemos ver cualquier propiedad de ese documento, por ejemplo, su ttulo.
Propiedad FullScreen
Devuelve un valor True / False indicando si el navegador est maximizado.
Propiedades Height / Width
Devuelven el alto y ancho de la ventana del WebBrowser medidos en la unidad de medida del formulario
o contenedor.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 565

Propiedades Left / Top


Devuelven la distancia desde la parte izquierda o desde la parte superior del formulario o contenedor, al
vrtice superior izquierdo del WebBrowser, medidos en la unidad de medida del formulario.
Propiedad LocationName
Devuelve una cadena con el nombre del documento que est presentando el WebBrowser. Si lo que
est presentando es una pgina Web del www, devuelve el ttulo de la pgina. Si lo que est
presentando es un fichero del disco, preseta el nombre (Sin el path) de ese fichero
Propiedad LocationURL
Devuelve una cadena con el nombre del documento que est presentando el WebBrowser. Si lo que
est presentando es una pgina Web del www, devuelve el ttulo de la pgina. Si lo que est
presentando es un fichero del disco, preseta el nombre con el Path completo de ese fichero
Propiedad Offline
Devuelve o establece un valor True / False que indica si el WebBrowser est actalmente operando en
modo OffLine. En este modo, el WebBrowser est obligado a leer las pginas de la cach del ordenador,
pero si no las tiene, accede al servidor a buscarlas.
Propiedad Parent
Devuelve una referencia al formulario o contenedor del WebBrowser. Funciona igual que la propiedad
Container.
Propiedad ReadyState
Devuelve un valor que indica el estado de la operacin actual del WebBrowser. Toma uno de los
siguientes valores:
Valor
0
1
2
3
4

Constante

Descripcin

READYSTATE_UNINITIALIZED Sin operacin. Estado por defecto


READYSTATE_LOADING = 1
Cargando sus propiedades
READYSTATE_LOADED
El WebBrowser ya est inicializado
READYSTATE_INTERACTIVE
Est descargando una pgina
READYSTATE_COMPLETE
Ya ha terminado de descargar la pgina

Propiedad Type
Devuelve un string con el tipo de documento que est presentando
Label1 = brwWebBrowser.Type
Propiedad Visible
Establece si el WebBrowser se ve o est oculto

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 566

Mtodos de WebBrowser
Mtodo ExecWB
Ejecuta un comando usando la interface IOLECommandTarget. La sintaxis es la siguiente:
NombreDelWebBrowser.ExecWB nCmdID, nCmdExecOpt, [pvaIn], [pvaOut]
NCmdID

(Requerido) Es un Long o una constante que identifica el comando a ejecutar.

NCmdExecOpt (Requerido) Es un Long o constante que indica las opciones de ese comando.
PvaIn

(Opcional) Un Variant que se emplea para introducir argumentos al comando.

PvaOut

(Opcional) Un Variant que se emplea para recoger los resultados

La primera cuestin que surge ahora es Dnde est la lista de los comandos que se pueden
ejecutar? Desconozco donde se puede encontrar la informacin de todos los comandos, pero
pueden verse uno a uno en el Examinador de Objetos en las clases OLECMDID para los los
identificadores de comandos, y OLECMDEXECOPT para las opciones. Asi, si quiere imprimir el
contenido del WebBrowser basta con poner la siguiente instruccin:
brwWebBrowser.ExecWB OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER
Esto es lo mismo que decir:
brwWebBrowser.ExecWB 6, 2
Y lo que hace es, imprimir (6) y presentar el cuadro de dilogo para seleccionar la impresora. (2)
Esto de no conocer la lista de comandos aunque parece dificil (y lo es) es superable. Cuando estamos
introduciendo el mtodo ExecWB aparece la lista con todos los comandos posibles. Y habr que echar
imaginacin y ver, dentro de la lista presentada, el comando que nos interesa. As sugi la lnea
siguiente para guardar la pgina:
brwWebBrowser.ExecWB OLECMDID_SAVEAS, OLECMDEXECOPT_PROMPTUSER
Puede ver la lista completa de los
comandos en el Explorador de
Objetos (Al que se accede
pulsando F2) y que presentamos
en esta pgina como recordatorio.
En la imagen est presentando la
Clase
OLECMDID.
Puede
presentar
la
clase
OLECMDEXECOPT haciendo clic
sobre su lnea en el cuadro de la
izquierda.
Dejo
al
alumno
interesado el trabajo de realizar
una
lista
con todos estos
comandos, sus constantes y
valores.
Nota. Para que aparezca en el
Explorador de Objetos la lista con
todos los comandos OLECMDID
debe estar introducido el control
WebBrowser en el proyecto.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 567

Mtodo GoBack
Navega hacia atrs dentro de la lista de las pginas visitadas.
Mtodo GoForward
Navega hacia delante dentro de la lista de pginas visitadas
Mtodo GoHome
Abre la pgina especificada como pgina inicial en las opciones del Internet Explorer.
Mtodo GoSearch
Abre la pgina especificada en el Internet Explorer como pgina de bsqueda ()
Mtodo Navigate
Abre la pgina especificada.
Sintaxis :
NombreWebBrowser.Navigate URL [Flags,] [TargetFrameName,] [PostData,] [Headers]
URL

Requerido. Una cadena con la direccin del documento a mostrar. Puede ser una URL de una
pgina en la Web, direccin completa de un fichero en el disco, una direccin IP.

Flags Opcional. Un valor o constante que determina varias cosas, segn se explica en la lista
siguiente.
Pueden sumarse dos o ms valores de estos.
Constante

Valor

NavOpenInNewWindow
NavNoHistory
NavNoReadFromCache 4
NavNoWriteToCache

1
Abre la pgina en una nueva ventana.
2
No aade la pgina a la lista del histrico de pginas.
No lee de la cah del disco para buscar la pgina.
8
No guarda la pgina abierta en la cach

TargetFrameName

Descripcin

Opcional. Indica la ventana sobre la que mostrar la nueva pgina. Los valores
posibles son:

_blank
Presenta el documento sobre una nueva ventana sin nombre
_parent
Presenta el documento en el contenedor inmediatamente superior al que tienen el link.
_self
Presenta el documento dentro de la misma ventana que tienen el link
<window_name> Presenta el documento en el frame especificado por el nombre. Si no existe un frame
con ese nombre, abre una nueva ventana.
PostData
Headers

Opcional. Este parmetro es el dato a enviar al servidor durante la transaccin HTTP


POST (POST es una forma de enviar datos desde un cliente al servidor HTTP)
Opcional. En este parmetro se especifican los Header que se envian al servidor para
especificar acciones que el cliente desea que haga el servidor.

Mtodo Navigate2
Extiende el mtodo Navigate para poder navegar por carpetas especiales tales como el escritorio o
Mi PC. La sintaxis es idntica a la del mtodo Navigate.

Mtodo Refresh
Vuelve a cargar el documento que est presentando.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 568

Sintaxis

NombredelWebBrowser.Refresh

Mtodo Refresh2
Vuelve a cargar el documento que est presentando. La diferencia con el Mtodo Refresh es que
este mtodo contienen un parmetro que especifica el nivel de actualizacin.
Sintaxis

NombredelWebBrowser.Refresh2 Nivel

Nivel puede tomar uno de los siguientes valores:


Constante

Valor

Descripcin

REFRESH_NORMAL

Realiza un refresco simple, en el que no incluye el envio del


header pragma:nocache al servidor

REFRESH_IFEXPIRED

Realiza un refresco simple si la pgina ha caducado

REFRESH_COMPLETELY
header

Realiza un refresco completo, enviando al servidor el


pragma:nocache

El header "pragma:nocache" obliga al servidor a no enviar una copia que tenga en su propia cache.
De esta forma sabemos que nos va a enviar la informacin ms reciente. Los navehadores suelen
enviar este header cuando el usuario selecciona Actualizar. Esto puede causar problemas en
algunos servidores.
Mtodo Stop
Cancela cualquier navegacin pendiente y la recepcin de cualquier elemento dinmico de la pgina,
como puede ser sonidos o animaciones..
Sintaxis

NombredelWebBrowser.Stop

Eventos del control WebBrowser

Evento BeforeNavigate2
Este evento ocurre cuando el control WebBrowser cambia la navegacin a otra URL diferente. Esto
puede ocurrir porque el usuario ha hecho click en un link o por cualquier otra razn. En este evento
se tiene la oportunidad de cancelar la nueva navegacin.
Private Sub object_BeforeNavigate2(ByVal pDisp As Object, ByVal URL As String,
ByVal Flags As Long, ByVal TargetFrameName As String, PostData As Variant,
ByVal Headers As String, Cancel As Boolean)
Para impedir la navegacin a una nueva URL basta con poner esta lnea de cdigo:
Cancel = True

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 569

DocumentComplete Event
Ocurre cuando el documento que est siendo bajado pasa al estado READYSTATE_COMPLETE. Este
evento tienen importancia cuando un documento tiene frames, pues se produce cada vez que se termina
de enviar el documento correspondiente a cada una de las frames.
Evento DownloadBegin
Ocurre cuando comienza una operacin de navegacin. Este evento ocurre inmediatamente despus del
BeforeNavigate2, excepto que la navegacin haya sido cancelada en aquel. A cada evento
DownloadBeguin le tiene que suceder un DownloadComplete, por lo que puede aprovechar ambos
eventos para sealar mediante un icono que se est bajando un nuevo documento. (El Internet Explorer
lo hace mediante un globo mundial girando)
Evento DownloadComplete
Ocurre cuando la navegacin termina, se detienen voluntariamente o ha fallado.
Evento NavigateComplete2
Ocurre cuando el WebBrowser ha alcanzado con xito la nueva URL. A partir de este momento es
cuando comienza a bajarse el documento. Este evento es el apropiado para poner el aviso: Sitio Web
encontrado.
Evento NewWindow2
Ocurre cuando se ha creado una nueva ventana para presentar un nuevo documento.
Evento OnFullScreen
Ocurre cuando ha cambiado la propiedad FullScreen
Evnto OnVisible
Ocurre cuando cambia la propiedad Visible
ProgressChange Event
Ocurre cuando se actualiza el avance de la operacin de bajar un documento.
Private Sub object_ProgressChange(ByVal Progress As Long, ByVal ProgressMax As Long)
Progress

Long conteniendo el nmero total de Bytes transferidos

ProgressMax

Long con el nmero total de bytes a tranferir.

Este evento se puede usar para colocar un aviso tranquilizante de la evolucin de la descarga del
documento.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 570

Visual Basic - Gua del Estudiante Cap. 19


REALIZACION DE CONTROLES OCX
A modo de comentario. Hemos llegado a un captulo que todos los alumnos desean conocer: el
captulo donde vamos a ver como se crea un control personalizado. A lo largo de mis aos de docencia
he observado que los alumnos mas aventajados tienden a realizar aplicaciones usando controles
realizados por ellos mismos, en la creencia que eso protege sus programas frente a posibles imitaciones,
ya que parece que poseen la llave que da acceso a sus secretos. Incluso hay quien piensa que el uso de
este tipo de controles da cierto prestigio como programador. Y hay tambin empresas especializadas en
software que comparten esas mismas ideas. En el mbito empresarial hay quien realiz uno de estos
controles con fecha de caducidad, de forma que pasada una fecha, el control deja de funcionar y con l
la aplicacin. Buena forma de asegurarse el contrato de mantenimiento, ya que el control haba que
reemplazarlo antes de llegar a esa fecha, pero una hermosa forma a la vez de perder al cliente y la
credibilidad como empresario y como programador. Es una cuestin de criterios personales o
comerciales, pero la creacin de controles personalizados es una prctica que solamente debe llevarse a
cabo cuando es estrictamente necesario por no existir ningn recurso en VB que realice lo deseado. Y
es decisin muy prudente no aceptar ninguna aplicacin que llevando un control personalizado, no se
entregue con la aplicacin, toda la informacin relativa al mismo, incluyendo su cdigo fuente.
Para crear un control, lo primero que hay que hacer es pensar, con papel y lpiz, las funciones que debe
realizar ese control, as como sus propiedades y mtodos. Hay que pensar durante este proceso, si el
control se va a encapsular dentro de un OCX solo o con otros controles, ya que un
mismo OCX puede contener ms de un control. Una vez realizado este estudio
previo, se procede a abrir un nuevo proyecto, eligiendo en este caso la creacin de
un Control ActiveX, sobre el icono mostrado en la figura. Aparecer algo distinto a lo
que nos encontramos cuando creamos un proyecto EXE Standard.
Lo primero que observamos es que no aparece un formulario, sino algo, que si bien se le parece,
sabemos que no lo es. Esa especie de formulario es el objeto UserControl.
El UserControl es el objeto base del control que estamos creando. Un control ActiveX se compone
siempre de un UserControl y sobre l podremos colocar otros controles. A los controles que colocamos
sobre el UserControl se les denomina Controles Constituyentes.
Un proyecto con un UserControl es similar a un proyecto con un formulario. El proyecto se guarda en un
fichero ASCII con extensin .vbp igual que cualquier proyecto Visual Basic. El nombre de ese fichero
ser el nombre con el que se ha guardado el proyecto.
El UserControl se guarda tambin en un fichero ASCII. De la misma forma que un formulario se guarda
con extensin .frm, un UserContol se guarda con extensin .ctl Y de la misma forma que un formulario,
cuando tena grficos stos se guardaban en un fichero aparte, con extensin .frx, cuando un
UserControl tiene grficos se guardan en un fichero con extensin .ctx El nombre de ambos ficheros es
el mismo con el que se haya guardado el UserControl.
Al compilar el proyecto, en vez de generar un fichero .EXE, generar un fichero .OCX Y este OCX es
idntico a los que vemos en Proyecto | Componentes cada vez que queremos introducir un componente
que no est en la barra de herramientas. (Falta registrarlo, pero veremos ms adelante como se registra)
Se pueden introducir varios UserControl en un mismo proyecto. Esto generar igual nmero de controles
dentro del mismo paquete .OCX. esta prctica es bastante normal. Por ejemplo, el MSCOMCTL.OCX
(Microsoft Windows Common Controls 6.0) contiene 9 controles. Pero tenga cuidado cuando meta
controles dentro del mismo paquete. Piense que cada control va a ocupar cierto sitio. Suponga que hace
un OCX con 9 controles. Ocupar ms espacio en disco que si hubiese metido 1. Cuando meta en un
proyecto uno solo de estos controles, deber meter en el proyecto la totalidad del espacio que ocupaban
los 9 controles. El caso del control de Microsoft citado tienen su razn de ser. El OCX contiene 9
controles, que se pueden usar todos dentro del mismo proyecto (Barra de herramientas, barra de estado,
TreeView, ListView, Barra de Progreso, Slider, TabStrip, Image Combo e ImageList)
Registrar un control. El registro de un control es una operacin que Windows debe hacer para meter
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 571

los datos de ese control (nombre y ubicacin dentro del disco) dentro del registro de Windows. Esto le
facilita la bsqueda del fichero.
Lo normal es colocar los controles OCX dentro de la carpeta C:\Windows\System. Puede ponerlo en
cualquier otra carpeta, pero esa es la usual. Eso s, una vez puesto en la carpeta deseada y registrado
no lo puede mover, ya que Windows no lo encontrara.
Hay un mtodo muy sencillo para registrar un control cuando tiene el Visual Basic instalado en su PC.
Guarde el fichero OCX en C:\Windows\System. Vaya a Proyecto | Componentes y le aparecer el cuadro
para elegir un nuevo control. No aparecer ese nuevo OCX dentro de la lista de este cuadro, ya que
todava no est registrado.

Fig. 19.1 Cuadro para elegir un nuevo control


Haga clic sobre el botn Examinar Le aparecer el cuadro para seleccionar un fichero. Seleccione el
fichero OCX que acaba de introducir y ese OCX ya est registrado.
Cuidado. Esta forma, sencilla y sin complicaciones, puede llevarle en ms de una ocasin a registrar
controles que no desea.
Cuando no tenga VB instalado tendr que recurrir a un programa que trae Windows: el Regsvr32.Exe
Para ello vaya a Inicio | Ejecutar y en el cuadro que le aparece introduzca el nombre del programa
seguido del nombre completo del OCX a registrar. (Fig. 19.2)
Cuando realizamos la instalacin de un programa realizado en Visual Basic, ocurre con mayor frecuencia
de la deseada que uno de los controles no se registra. El registro lo hace automticamente la instalacin,
pero a veces, falla. En algunos casos el programa funciona perfectamente, pero en otros no funciona. Y
en estos casos es normal que el OCX no haya llegado a guardarse en el disco. Solucin: copiar ese
OCX directamente sobre C:\Windows\System y realizar el registro de la forma descrita.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 572

Fig. 19.2 Forma de registrar un control OCX

Sigamos con el UserControl.


Propiedades, mtodos y eventos del nuevo control.
El nuevo control que va a crear va a tener propiedades. Unas las va a tener porque son inherentes a
cualquier control (Left, Top, Tag, y aquellas que sean necesarias para la ubicacin del control y sus
dimensiones) Otras, porque se han introducido durante la creacin del control. Los mtodos y eventos
deben introducirse todos durante la creacin.
El UserControl tiene sus Propiedades, Mtodos y Eventos. Tambin las tienen los controles
constituyentes. Pero las propiedades, mtodos y eventos de ninguno de ellos pasa a formar parte de las
propiedades, mtodos o eventos del control que estamos creando.
Vamos a ver como se introducen las propiedades del nuevo control. Para ello vamos a estudiar dos
instrucciones de Visual Basic: Property Get y Property Let
Estas instrucciones se introducen igual que cuando se introduce una funcin o procedimiento en un
formulario. Haciendo clic en Herramientas | Agregar Procedimiento. Nos aparece un cuadro donde
debemos elegir Propiedad Recuerde que el elemento del men de VB Agregar Procedimiento
solamente est activado cuando est abierta una ventana de cdigo. La ventana de cdigo abierta debe
ser del proyecto del control ActiveX (Del UserControl o de cualquiera de los controles constituyentes) Se
le pone el nombre que desea que tenga la propiedad. Por ejemplo, si queremos que esa propiedad sea
el color de fondo del nuevo control, pondremos ColorDeFondo (Porque habramos de poner Backcolor
si el control se ha desarrollado en Espaa?)

Fig. 19.3 Cuadro para introducir una propiedad en el nuevo control


Basta con hacer clic en Aceptar y ya nos ha introducido dos nuevas cosas en la ventana de cdigo, en el
desplegable de la derecha (Fig. 19.4)

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 573

Fig. 19.4 Ventana de cdigo mostrando PropertyGet y PropertyLet


Al introducir una nueva propiedad se generan estos dos
procedimientos (los denominaremos Procedimientos
Property) que tienen por nombre el de la propiedad que
acabamos de introducir, y llevan la coletilla de Property
Get y Property Let. Sin perder el tiempo guardamos el
proyecto y vamos a ver las propiedades del nuevo
control. (Veremos un poco ms adelante como se pone
el control sobre un formulario dentro del mismo grupo de
proyectos) Vemos que figura una propiedad llamada
ColorDeFondo, tal como habamos puesto en la Fig.
19.3
Puede ver que hay ms propiedades, que no han sido
introducidas. Todas esas propiedades son la que se
introducen automticamente como inherentes a
cualquier control.
La propiedad ya est en el cuadro de propiedades, pero
todava no hace nada. Lo que queramos que haga
debemos programarlo justamente en esos dos
procedimientos property que acaban de aparecer.
Aparecen dos procedimientos porque en principio es
una propiedad de lectura y escritura. Mediante el
Property Let escribiremos el valor y con el Property Get
leeremos el valor de la propiedad. (Let pone el valor,
Get lee el valor)
Fig. 19.5 Cuadro de propiedades del nuevo control

Veamos como son esos dos procedimientos antes de introducir cdigo:


Public Property Let ColorDeFondo(ByVal vNewValue As Variant)
End Property
Public Property Get ColorDeFondo() As Variant
End Property
Vea que empieza como todos los procedimientos, con Public (Podra ser Private) seguido de Property
Let (o Property Get) y termina con End Property
Como puede verse, el procedimiento Property Let necesita un valor, vNewValue que ha declarado como
Variant. A ese el procedimiento para poner el valor a la propiedad necesita que le pasemos el valor de
esa propiedad. Lo que no puede saber, es el tipo de dato que debe usar para ColorDeFondo. Por eso
pone As Variant y de esta forma podemos meter cualquier valor. Sin embargo, sabemos desde el
Captulo 1 que las variables declaradas como Variant ocupan mucho espacio en memoria, y debemos
optimizar el programa ajustando las variables. Como sabemos que el color es un nmero Long,
podemos sustituir el tipo Variant por un tipo Long:
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 574

Public Property Let ColorDeFondo(ByVal vNewValue As Long)


Public Property Get ColorDeFondo() As Long
Observe que lo hemos cambiado en los dos procedimientos. Si no se cambia en ambos dar
error.
Tambin podemos cambiar el nombre de la variable interna del procedimiento (vNewValue) y poner algo
que resulte ms comprensible:
Public Property Let ColorDeFondo(ByVal NuevoColor As Long)
En el caso del color tambin puede poner otro tipo de variable: OLE_COLOR, que es lo que hace VB con
el asistente.
Veamos ahora el cdigo a introducir en ese Procedimiento Property
Como lo que queremos hacer con la propiedad ColorDeFondo es poner de un determinado color el fondo
del control, y el fondo del control es precisamente el UserControl, bastar con poner que la propiedad
BackColor del UserControl es precisamente el nuevo control a poner. Observe que en el UserControl la
propiedad se sigue llamando Backcolor.
Public Property Let ColorDeFondo(ByVal NuevoColor As Long)
UserControl.BackColor = NuevoColor
End Property
Es muy til, no necesario, comunicar al control que ha cambiado una de sus propiedades. Esto sirve
para que pueda guardar el nuevo valor en su pgina de propiedades. Ya lo veremos. Para comunicarle
que ha cambiado una propiedad se le aade una lnea al cdigo anterior
Public Property Let ColorDeFondo(ByVal NuevoColor As Long)
UserControl.BackColor = NuevoColor
PropertyChanged "ColorDeFondo"
End Property
Ya veremos lo que ocurre con PropertyChanged
Este procedimiento es el que se ejecuta cuando ponemos un valor al color de fondo del nuevo control
cuando ponemos, por ejemplo
TBPV1.ColorDeFondo = 255

(TBPV1 es el nombre del control en el formulario de prueba)

Vamos a ver el cdigo del procedimiento que se ejecuta cuando queremos saber el valor que tienen esa
propiedad.
Public Property Get ColorDeFondo() As Long
ColorDeFondo = UserControl.BackColor
End Property
Observe que el valor devuelto es el nmero de color de la propiedad BackColor del UserControl.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 575

Vamos a ver con ms detalle los procedimientos Property Let y Property Get
Instruccin Property Let
Declara el nombre, los argumentos, y el cdigo que forman el cuerpo de un procedimiento Property Let,
y asigna un valor a una propiedad.
Sintaxis
[Public Private Friend Static] Property Let NombreDelProcedimiento (argumentos)
instrucciones
Exit Property
instrucciones
End Property
El mbito del procedimiento queda determinado por la primera expresin:
Public: El procedimiento Property es accesible desde cualquier parte del proyecto
Private: Es accesible solamente para los procedimientos del mismo mdulo
Friend (Solo para Clases)El procedimiento no es visible por el controlador de una instancia
Static Los valores de las variables locales declaradas en el procedimiento mantienen su valor entre
distintas llamadas.
NombreDelProcedimiento es el nombre por el que se va a llamar y es precisamente el nombre de la
propiedad que va a controlar. Aunque en VB no pueden existir dos procedimientos con el mismo nombre,
en este caso s, y el nombre del procedimiento Property Let puede ser igual (de hecho siempre es igual)
a otro procedimiento Property Get
Argumentos
Argumentos que deben pasarse al llamar a ese procedimiento. El tipo de datos de cada
argumento ser el mismo que en el procedimiento Property Get
Instrucciones Es el cdigo que hay que escribir en el procedimiento para que realice lo que desea el
programador. Estas instrucciones pueden generar una condicin en la que se debe abandonar el
procedimiento. En ese caso, puede salirse del procedimiento con Exit Prperty
Los argumentos pueden pasarse:
Por Valor (ByVal) El valor de la variable fuera del procedimiento mantienen el valor, aunque ese valor
cambie dentro del procedimiento.
Por Referencia (ByRef) El valor de la variable fuera del procedimiento cambia si suse modifica en el
procedimiento.
Opcional (Optional)
El parmetro es opcional. Si un parmetro es opcional, todos los que vengan
detrs tambin deben serlo, y hay que indicarlo as con la expresin Optional para cada uno de ellos. El
parmetro que da valor a la propiedad no puede ser opcional.
Array de parmetros (ParamArray) Indica que es una matriz de parmetros.
No se puede llamar a un procedimiento Property Let dentro de otro procedimiento Property, Sub o
Function.

Property Get (Instruccin)


Declara el nombre, los argumentos y el cdigo que componen el cuerpo de un procedimiento Property, y
obtiene el valor de una propiedad.

Sintaxis
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 576

[Public | Private | Friend] [Static] Property Get NombreDelProcedimiento (argumentos) As tipo


instrucciones
nombreDelProcedimiento = expresin
Exit Property
instrucciones
nombreDelProcedimiento = expresin
End Property
El mbito y la forma de pasar los parmetros son idnticas a las de Property Let

Comenzando el ejercicio prctico


En el ejercicio que ilustra este captulo vamos a hacer un control para una caja registradora (No olviden
que es un ejemplo) Ese control va a recibir el cdigo de barras de un producto (se podr teclear
directamente o leerlo mediante un escner) y analizar el nmero de control para comprobar que es
correcto. El control se encargar de buscar en una base de datos la descripcin del producto, el precio y
las unidades de oferta. Para ciertos productos aplicar un incremento de precio en horas nocturnas y
para otros un descuento en horas de maana. Por lo tanto, debe tomar la hora del sistema y fijar el
Incremento / Descuento en razn de la hora. La interfaz grfica pensada es la siguiente:

Fig. 19.6 Interfaz grfica del control a desarrollar


Veamos que propiedades debe tener este control. Aparte de la ya citada, ColorDelFondo, vamos a
ponerle:
In_Cod_Barras. De tipo texto, para poder pasarle por programa el cdigo de barras de un producto.
In_Unidades. Numrica double para que permita decimales, y permitir as vender productos al peso
In_DeshabilitaIncr_Desc, booleana, que si es true, deshabilitar la operacin de incrementar o rebajar
el precio en funcin de la hora.
Out_Descripcion, que ser una cadena de caracteres con el texto de la Descripcin.
Out_Precio_Total, numrico double con el precio total de las unidades vendidas de ese producto
(Hemos tenido el detalle de que las variables que contienen datos que entran en el control comienzan
por In_ y las que salen del control comienzan por Out_ Esto no significa que sean solo de escritura o de
lectura)
Se introducen estas propiedades tal como se explic ms atrs. En la Fig 19.7 puede verse el cuadro de
propiedades del control, con todas estas propiedades ya metidas. Ese cuadro, como sabemos, aparece
pulsando F4 estando seleccionado el control. Ese control est sobre un formulario de prueba que aun
no sabemos como ponerlo, pero se explicar en breve. Este cuadro es el tpico de todos los controles,
pero estamos acostumbrados a que, haciendo clic con el botn derecho del ratn, aparezca un cuadro
de dilogo donde podemos introducir las propiedades. Y eso, no sabemos todava como hacerlo.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 577

Eso se hace mediante una pgina de propiedades.


Reconozco que es complicado, y pese a mi costumbre de
no usar asistentes para ahorrar trabajo, en este caso no
me queda ms remedio que recurrir a ellos.
Vayamos al UserControl y seleccionndolo, pulsamos F4
para sacar sus propiedades. Vayamos a su propiedad
PropertyPages (recuerde que estamos en las propiedades
del UserControl) Sitese en esa propiedad y haga clic
sobre el botn que aparece a la derecha. Le aparecer
un cuadro como el de la Fig. 19.8. En ese cuadro se nos
pide que sealemos las pginas que deseamos que tenga
el cuadro de propiedades. En el caso del ejemplo se han
seleccionado una pgina de propiedades vaca
(PaginaPropiedades1, se le ha cambiado el nombre que
apareca por defecto), la pgina donde se elige la fuente
(StandardFont) y la pgina donde se elige el color
(StandarColor) Al pulsar Aceptar la propiedad
PropertyPages del serControl tiene 3 Pages
Vayamos ahora al men de Visual Basic, en Proyecto,
elegimos Agregar Pgina de Propiedades. Y es ah donde
nos invita a poner una pgina en blanco o a utilizar un
asistente. Posiblemente un programador con mucha
experiencia elegira hacerla a mano, pero los controles
ActiveX no se hacen todos los das y vamos a recurrir al
asistente para que nos evite tener que trabajar ms, y
sobre todo, tener que estudiar mucho ms.
Fig. 19.7 Propiedades del control

Fig. 19.8 Cuadro para


conectar pginas de
propiedades

Al elegir el asistente,
aparece un cuadro donde
nos muestra las
propiedades que hemos
metido en nuestro control.
En el caso del ejemplo,
esas propiedades son:
ColorDeFondo
In_Cod_Barras
In_Unidades
In_DeshabilitarIncr_Desc
Out_Descripcion
Out_Precio_Total

El asistente nos pide que elijamos las propiedades que queremos que aparezcan en el cuadro de dialogo
de propiedades. Se las ponemos todas. Vamos aceptando todos los pasos, hasta que hacemos clic en el
botn Finalizar. El cuadro de dialogo de propiedades ya est creado. Vamos al formulario de prueba y
hacemos clic con el botn derecho sobre el control. Aparece por fin el cuadro de dialogo de propiedades.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 578

Fig. 19.9 Cuadro de dialogo de propiedades.


Puede ahora incluir en ese cuadro cualquier control, como si se tratase de un formulario. Queda a
merced de su capacidad artstica rematarlo de forma adecuada

Fig. 19.10 Cuadro de propiedades rematado


Puede observar ahora que en la ventana de proyecto aparece ahora otro componente: la pgina de
propiedades.
La pgina de propiedades (Property Page) tiene las casi todas las propiedades, mtodos y eventos de un
formulario. No vamos a extendernos en su estudio exhaustivo, ya que sera salirse del objetivo del curso.
Solamente falta introducir el cdigo adecuado en los procedimientos del UserControl. Por ejemplo, para
comprobar que el cdigo de barras es correcto, creamos un procedimiento llamado CompruebaCodigo.
Llamaremos a este procedimiento cuando se introduzca el cdigo de barras completo. (Emplearemos
solamente EAN-13 para no complicar el ejemplo). El cdigo del procedimiento que comprueba el cdigo
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 579

de barras puede verlo en el ejemplo, y es solamente aplicar la definicin del dgito de control de EAN-13.
A ese procedimiento le hemos llamado CompruebaCodigo y es un procedimiento creado por nosotros
dentro del UserControl.

Prueba del nuevo control


Para comprobar el nuevo control es necesario ponerlo en un proyecto. Mejor dicho, en un formulario.
Basta con introducir un formulario de la forma habitual: Proyecto | Agregar Formulario. Ver que
aparece una nueva carpeta en el proyecto con un formulario. Para introducir el nuevo control en el
formulario basta con que lo coja de la caja de herramientas y lo lleve al formulario como lo hara con
cualquier otro control. Eso s, debe cerrar previamente el UserControl porque si no ese icono que
presenta el nuevo est deshabilitado.
Puede probar todas las caractersticas del nuevo control. De cualquier forma no se fe, y realice la
comprobacin final en un proyecto completamente independiente, una vez que ya haya compilado el
control.

Icono para presentar al nuevo control


Es posible que no quiera que su control se vea en la caja de herramientas con el icono de la figura
anterior. Este es el icono por defecto. Si desea cambiarlo debe introducir una imagen BitMap en la
propiedad del UserControl ToolBoxBitMap. La imagen deber estar en un formato bastante grande (sin
pasarse) para que se vea claro, ya que si se pone pequea, el icono que aparece en la caja de
herramientas queda bastante feo.
Enlazar el nuevo control a una base de datos mediante el control data.
Ya vamos avanzando en lo que podemos hacer sobre un nuevo control. Ahora vamos a enlazarlo a una
base de datos a travs del control Data.
Para ver como se hace esto vamos a hacer un ejemplo, siguindolo paso a paso.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 580

Propiedades del UserControl (Se enumeran solamente aquellas que sean especficas del UserControl o
que aconsejen una explicacin especial)
Propiedad AccessKeys
Devuelve o establece una cadena que contiene las teclas que funcionarn como teclas de acceso (o
teclas aceleradoras) del control. La propiedad AccessKeys es una cadena que contiene todas las teclas
de acceso del control. Por ejemplo, para establecer las letras S e Y como teclas de acceso, la propiedad
AccessKeys se establecera a "sy". Cuando un usuario presiona una de las teclas de acceso junto con
la tecla ALT, el control recibir el enfoque (segn el valor de la propiedad ForwardFocus). Las teclas de
acceso de los controles componentes se incluyen implcitamente como teclas de acceso, aunque no
aparezcan en la propiedad AccessKeys.
ActiveControl (Propiedad)
Devuelve el control que tiene el enfoque.
Propiedad AutoRedraw
El UserControl acepta mtodos grficos. La propiedad AutoRedraw (True/False) hace lo mismo que en
el Formulario.
Propiedad BackStyle
Establece el tipo de fondo del UserControl (Opaco / Invisible)
Los valores aceptados son:
Opaque 1
El fondo ser opaco
Invisible2
El fondo es transparente, pero solamente si la propiedad
Windowless esta a True
Propiedad ClipBehavior
Sirve para determinar la zona donde se vern los mtodos grficos, cuando est transparente. Vase en
la ayuda.
Propiedad ContainedControls
Devuelve la coleccin de controles constituyentes y los que se hayan podido aadir en tiempo de
ejecucin. Funciona de forma similar a la propiedad Controls de un formulario.
Propiedad ContainerHWnd
Devuelve el controlador de la ventana (hWnd) del contenedor de un UserControl. Se usa para programar
con APIS.
Propiedad DataMembers
Devuelve una referencia a la coleccin DataMembers.
Un proveedor de datos puede proporcionar mltiples conjuntos de datos a los que un receptor puede
enlazar. Cada conjunto de datos se llama "miembro de datos" y est identificado mediante una cadena
nica.
La coleccin DataMembers contiene los nombres de todos los miembros de datos disponibles para el
receptor de datos.
Propiedad EditAtDesignTime
Establece si un control puede activarse en el tiempo de diseo del programador. Si es True el control
puede activarse en tiempo de diseo y se comportar como lo hara en tiempo de ejecucin.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 581

EventsFrozen (Propiedad)
Devuelve un valor que indica si el contenedor est pasando por alto los eventos desencadenados por el
control. La propiedad EventsFrozen no est disponible en tiempo de diseo del control y es de slo
lectura en tiempo de ejecucin.
Cuando la propiedad EventsFrozen es True, el contenedor pasa por alto todos los eventos
desencadenados por el control. Si el control necesita producir un evento que no se puede perder, tiene
que dejarlo en la cola hasta que EventsFrozen sea False.
Extender (Propiedad)
Devuelve, para este control, el objeto Extender que almacena las propiedades del control mantenidas
por el contenedor. La propiedad Extender no est disponible en tiempo de diseo del control y es de
slo lectura en tiempo de ejecucin.
Propiedad MaskColor
Devuelve o establece el color que determina la regin transparente del mapa de bits asignado a la
propiedad MaskPicture de un objeto UserControl cuya propiedad BackStyle est establecida a 0
(Transparente).
Sintaxis

MiUserControl.MaskColor = color

Cuando se asigna a un mapa de bits la propiedad MaskPicture de un UserControl cuya propiedad


BackStyle est establecida a 0 (Transparente), el control se vuelve transparente en cualquier lugar en
que est cubierto por reas del mapa de bits que cumplan la propiedad MaskColor.
Los eventos del mouse que ocurren sobre reas transparentes las reciben el contenedor o los controles
que, de otro modo, estaran cubiertos por el UserControl.

MaskPicture (Propiedad, Objeto UserControl)


Devuelve o establece el mapa de bits que, combinado con la propiedad MaskColor, determina las
regiones transparentes y visibles de un objeto UserControl cuya propiedad BackStyle est establecida
a 0 (Transparente).
Sintaxis

MiUserControl.MaskPicture = imagen

Importante Esta caracterstica slo es soportada con mapas de bits de tipo imagen, como GIF, JPEG y
DIB. No es soportada con iconos, cursores o metaarchivos de Windows.

Propiedad ToolBoxBitMap
Establece la imagen con la que se va a representar el nuevo control en la caja de herramientas. Debe
ser una imagen BitMap que habremos guardado previamente en el disco.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 582

Visual Basic - Gua del Estudiante Cap. 20

APLICACIONES CLIENTE SERVIDOR


COMUNICACIN PUERTO SERIE: EL CONTROL MSCOMM
(Captulo inacabado. Algn estudiante quiere colaborar a su terminacin?)
Hasta ahora hemos visto aplicaciones que pueden utilizarse por s solas. Pueden acceder a bases de datos que estn
en el mismo ordenador que la aplicacin o en otro, unido mediante una red de rea local. La conexin a las bases
de datos a las que accede se realiza, bien indicndole la direccin y carpeta
(\\MiServidor\BasesdeDatos\MiBase.Mdb) o bien mapeando esa direccin (crear una unidad de disco que
contienen esa direccin). De esta forma podemos acceder a una base de datos instalada en un equipo remoto y la
aplicacin debe funcionar perfectamente, aunque al abrir o leer la base de datos origine un trfico elevado por la red
de rea local.
Con esta configuracin podemos tener problemas de lentitud, sobre todo si la red es lenta y si hay muchos usuarios
trabajando con esa aplicacin en distintos ordenadores, accediendo todos ellos a travs de la red a un servidor que
contienen la base de datos. Esta lentitud se incrementara en una gran escala si la red a utilizar fuese Internet
mediante una conexin lenta.
Pero lo que ms se notara sera la ocupacin de los recursos de la red durante las consultas a esa base de datos.
Dependiendo de cmo se crease el recordset, podra darse el caso de transmitir por la red todos los datos de la base
de datos para que nuestra aplicacin utilice nicamente los datos correspondientes a un registro. Pensando en una
aplicacin bancaria, por ejemplo la peticin de saldo de una cuenta desde un cajero automtico, los nicos datos
relevantes de esa operacin sern el nmero de cuenta corriente, un cdigo para indicar que lo que se desea es el
saldo, y como datos de retorno, el nmero de esa cuenta, el saldo actual disponible y quizs un nmero de
comprobacin (Checksum) para comprobar que no ha existido error en la comunicacin. De nada nos servira en el
cajero conocer el estado de cantidades retenidas, operaciones pendientes, etc.
Si en ese ejemplo del cajero cresemos un objeto Database, un recordset, leysemos todos los datos del recordset y
luego disemos la orden de cerrarlo, estaramos enviando informacin innecesaria a travs de la red, con el coste de
tiempo y ocupacin que ello representa.
Casi llegamos a demostrar con esta introduccin que sera ms conveniente hacer una aplicacin que tuviese dos
partes: una, residente en el puesto de operacin, (que llamaremos aplicacin cliente) que fuese capaz de enviar datos
solicitando informacin a otra aplicacin, instalada en el servidor donde est la base de datos. Esta segunda
aplicacin, que llamaremos aplicacin servidor, abrir la base, crear los recordsets necesarios, filtrar la
informacin, realizar con ella operaciones matemticas, y una vez concluido todo el proceso, enviar a la
aplicacin cliente los datos estrictamente necesarios. Obviamente se necesita que ambas aplicaciones sean capaces
de entenderse entre s, es decir, que tengan un protocolo de comunicacin entre ellas previamente definido. Esto es
lo que se denomina una aplicacin cliente servidor.
La aplicacin cliente servidor ms popular es el navegador de Internet. Esta aplicacin est formada por una
aplicacin cliente (Navegador IEXplore, NetScape, etc) y una aplicacin servidor (Internet Information Server IIS,
Apache, etc). El protocolo para que se comuniquen entre ellas es el protocolo Http o el Ftp. Estos protocolos al ser
pblicos, permiten a cualquier empresa hacer su propia aplicacin cliente o servidor.
No es nuestro deseo llegar a tanto. El navegador de Internet es una aplicacin clienteservidor que sobrepasa
cualquier proyecto que podamos imaginar para realizarlo por medio de programacin en VB. Cualquier navegador
de Internet comercial lleva asociadas una serie de funciones, muchas de ellas transparentes para el usuario, que sera
imposible crear una aplicacin de este calibre, sobre todo como ejemplo de un curso de VB. Pensemos en una
aplicacin ms sencilla, que nos permita conocer como funcionan las aplicaciones cliente servidor, y sirva adems
para algo til.
Esa aplicacin no puede ser otra que una gua telefnica, (versin novsima del Listatel) cuya base de datos est en
un servidor conectado a Internet, al que se podr acceder desde un nmero ilimitado de puestos cliente. En la base
de datos del servidor, en un conjunto de tablas, figurarn los nombres, nmeros de telfono, despacho, etc. de una
serie de personas, y el organigrama de esas personas dentro de la organizacin. Estas tablas sern estticas, es decir,
tendrn datos que solamente se actualizarn cuando exista un cambio en esas personas, pero no variarn durante la
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 583

ejecucin del programa. En otra tabla, esta dinmica, tendremos el registro de los usuarios que estn conectados en
ese momento al servicio. As podremos saber si un usuario est presente y de esta forma conocer un dato importante
para otro servicio que va a tener este programa: su direccin IP actual. Sabiendo que est conectado y con su
direccin IP podremos enviarle mensajes directamente. Creo que ya vemos que se trata de una agenda telefnica
que lleva incorporado un servicio de mensajera. El servicio de mensajera enviar mensajes con texto plano o RTF
y puede llevar ficheros anexados. A esta agenda, y a su protocolo de comunicacin le vamos a denominar SML. No
se preocupe de no conocer las siglas. Al protocolo SMTP tampoco lo conocan en el momento de su creacin.
Una aplicacin cliente puede comportarse como aplicacin servidor de otra aplicacin, incluso de s misma. Este es
el caso de la aplicacin cliente del SML. Cuando vamos a pedir la informacin de un abonado telefnico al
servidor, el cliente se comporta como tal. Sin embargo cuando otro usuario de SML nos enva un mensaje, es
nuestra aplicacin la que realiza las funciones de servidor. Ver esto con mucha ms claridad cuando comencemos
el ejemplo.
Toda aplicacin cliente - servidor debe tener un sistema de comunicacin entre la aplicacin cliente y la aplicacin
servidor. Parece que la comunicacin que ha de tener es a travs de una red IP (Red de Area Local, Red Privada
Virtual, Internet) pero puede ser cualquier otro sistema de comunicacin entre ordenadores. Sin ir ms lejos, a
travs del puerto de comunicacin serie COM-1 COM-2. A efectos de los programas de la aplicacin cliente o
servidor solamente variar en la forma en la que reciban y transmitan los datos. En nuestro ejemplo vamos a utilizar
la comunicacin a travs de una red IP, usando el control Winsock ya estudiado. Tanto la aplicacin cliente como la
aplicacin servidor debern tener un Winsock. Como en nuestro caso, segn explicamos ms atrs, la aplicacin
cliente se convierte en aplicacin servidor para recibir mensajes, sta deber tener dos Winsocks, uno para la
funcin cliente, y otro para la funcin servidor.
Cuando se disea una aplicacin cliente servidor hay que comenzar pensando en las funciones que va a realizar y
sobre esas funciones comenzar a escribir el protocolo de comunicacin. No es fcil tener terminado el protocolo de
comunicacin antes de escribir la primera lnea de cdigo del programa. Segn se van concretando cada una de las
acciones que debe realizar vemos que es necesario introducir nuevos cdigos de operacin en nuestro protocolo. No
se preocupe que eso no es improvisar. Pero s es muy importante tener las cosas claras desde el principio y saber
que es lo que va a hacer nuestra aplicacin para de esta forma poder saber dar respuesta correcta a cada uno de los
dos programas. Y para tener las cosas claras, el autor recomienda que el protocolo de comunicacin se establezca
antes de comenzar a escribir el cdigo en tanto se pueda. Y que se escriba en un documento en el propio ordenador
o mejor an, en una base de datos u hoja de clculo, que nos permita ordenar las rdenes y avisos de nuestra
aplicacin para evitar de esta forma cualquier repeticin involuntaria.
Es muy importante a la hora de pensar el protocolo de comunicacin que este no pueda inducir a error al programa.
Si el programa tiene como funcin la transmisin de mensajes (Tal como es nuestro caso) los mensajes no pueden
estar limitados ni en su longitud ni en su contenido por el formato del protocolo de comunicaciones. Se entiende
mejor esto analizando el protocolo del SML (fruto nicamente de la imaginacin del autor y no sujeto a normas ni
recomendaciones internacionales de ningn tipo)

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 584

Protocolo de comunicacin de la aplicacin SML.


(Vea el ANEXO 1 Protocolo de comunicacin SML)
La comunicacin entre ambas aplicaciones se establece mediante palabras en ASCI que indican una operacin. A
estas palabras las denominamos Acrnimos. Las operaciones pueden ser rdenes o avisos. Son rdenes aquellas
comunicaciones del cliente que desencadenan una operacin en el servidor. Son avisos aquellas respuestas del
servidor para enviarle datos o comunicar algo al cliente. Cada orden o aviso, puede llevar uno o varios parmetros.
Los parmetros contienen la informacin necesaria para que la operacin que se va a realizar por esa orden o aviso
pueda llevarse a cabo. En esta aplicacin SML los acrnimos todos son de 3 caracteres, utilizando los signos < >
como delimitadores del acrnimo. Si el acrnimo lleva parmetros, la separacin entre los tres caracteres y el
parmetro o parmetros es la barra /
Volvamos a lo comentado anteriormente respecto a la limitacin del contenido de un mensaje. Si el mensaje
contiene un carcter <, > / puede que el programa se confunda y piense que ese carcter forma parte de un
acrnimo. Para evitar cualquier confusin, si uno de estos caracteres forma parte de un texto, se le antepondr el
signo &. De esta forma la recepcin de la pareja de caracteres &<, &> &/ significa que no son parte de un
acrnimo sino texto. Observe ahora que ese mismo problema lo vamos a tener con el carcter &. Si queremos enviar
ese carcter, sin que haya posibilidad de error pensando que se trata del carcter & antepuesto a cualquiera de los
signos anteriores, deberemos poner delante de l tambin el signo &. As, && significa que se est transmitiendo el
signo &.
Es obvio pensar que esas tres combinaciones no pueden formar parte de ningn acrnimo. Pero como los acrnimos
los definimos nosotros, basta con hacer que ninguno contenga esas secuencias de caracteres.
Preocpese de estos detalles que son los realmente importantes. Ver cuando se ponga a escribir cdigo que
siempre ha de faltar algo en el protocolo de comunicacin. No se preocupe por tener que ir rectificndolo. Eso s,
mantenga siempre actualizado el documento o base de datos con el protocolo, explicando debidamente cada una de
sus partes, los parmetros que lleva y la funcin que realiza. Es documento indispensable a la hora de distribuir la
aplicacin.
A modo de recordatorio, los protocolos de comunicacin de las aplicaciones cliente servidor para
Internet se encuentran en las RFCs, (Request For Coments) son pblicas, y han tardado en
desarrollarse varios aos a base de continuas aportaciones y correcciones por parte de sus creadores
de todo el mundo mundial. Basta con que teclee RFC en un buen buscador y le llevar a muchas
pginas donde puede ver todas las recomendaciones para todos los servicios de Internet.
El protocolo de comunicacin debe hacerse preferentemente en ASCII puro y caracteres que tengan representacin
fsica. Esto nos permite depurar el programa analizando la comunicacin mediante un programa externo y
debidamente probado. Utilizar caracteres sin representacin ASCII lo nico que puede hacerle es complicarle la
vida a Ud. y a quien analice su aplicacin. Cuando se enve una cifra, hgalo en decimal o en hexadecimal. Evite en
lo posible enviar cifras sustituyendo su valor por su carcter equivalente. La mayora de los caracteres no los va a
poder representar y tendr serios problemas para depurar su programa. Esto es especialmente importante con el
cheksum de un mensaje, por ejemplo. Le recomiendo que use preferentemente numeracin Hexadecimal.
Un buen programador nunca oculta el protocolo de comunicacin. Esto permite que otros mejoren su
aplicacin. Slo los programadores mediocres temen que se les plagie. Y por supuesto, nadie debera
aceptar una aplicacin cliente servidor si el programador no suministra ese protocolo.

Aspectos que debe tener siempre en cuenta cuando disee una aplicacin cliente servidor.
Si como es normal, utiliza una red IP para la transmisin de informacin entre ambas aplicaciones, deber poner un
Winsock en la aplicacin cliente, que deber conocer la direccin IP o el DNS de la aplicacin servidor, y el puerto
en el que est escuchando. En el servidor deber poner un Winsock que estar siempre a la escucha en el puerto
determinado para la aplicacin, y atender a todas las llamadas que reciba creando una instancia de ese Winsock.
Crear una instancia para cada comunicacin entrante desde los clientes. La comunicacin en el servidor se
mantendr abierta hasta que el cliente la cierre. Solamente en circunstancias excepcionales, cerrar la comunicacin
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 585

el servidor. Por ejemplo, en aquellos casos en los que pase un tiempo predeterminado sin recibir ni enviar ningn
dato al cliente. Para eso se utilizar una tecnologa muy sencilla, denominada Watch Dog consistente en un contador
que se pone a cero cada vez que se recibe o se envan datos al cliente. Ese contador incrementa su cuenta en una
unidad cada cierto tiempo. Si llega a un nmero predeterminado, prueba evidente de que ha pasado un tiempo sin
que reciba ni enve informacin, cierra la conexin del Winsock asociado. De cualquier forma hay que tener
cuidado y pensar muy bien lo que se hace antes de cerrar la comunicacin desde el servidor.
El programa cliente debe conocer el nmero IP o direccin DNS del servidor. Pero el servidor no tiene porque
conocer la direccin ni DNS del cliente, ya que debe ser el cliente el que inicie siempre la comunicacin.
Al cliente nunca se le debe forzar el puerto en el que emite (Propiedad LocalPort del Winsock). El servidor
contestar siempre al cliente usando la conexin abierta por ste, es decir, usando la instancia de su Winsock
correspondiente a la conexin realizada para ese cliente)
Normalmente el servidor no podr comunicar directamente con el cliente, ya que el cliente no est a la escucha.
Solamente en algunas aplicaciones se le dota al cliente de otro Winsock para que sea este segundo Winsock quien
est a la escucha de una posible llamada del servidor. Esto se emplea para dar una batida por todos los clientes
(Hacer Pooling) y ver los clientes que estn conectados en este momento. Solamente lo he visto en algunas
aplicaciones de seguridad. Generalmente este pooling se sustituye por llamadas peridicas desde cada cliente para
indicarle al servidor que estn activos.
La comunicacin entre cliente y servidor debe ser siempre TCP. El uso de UDP simplifica mucho las
comunicaciones, pero no sirve para salir a Internet, donde las tramas UDP son generalmente eliminadas por los
servidores. Vale ms trabajar un poco ms el cdigo y trabajar con comunicaciones seguras aunque sea en una red
de rea local que garantice la llegada de UDP.
Los paquetes broadcast deben evitarse tambin. Solamente deben usarse en configuraciones donde no se conocen
las direcciones de los servidores. Esto ocurre cuando la red tiene asignacin dinmica de direcciones. (Puede
ocurrirle si usa una red VSAT) En cualquier caso, los paquetes broadcast deben evitarse en lo posible. Los
servidores de Internet los eliminan automticamente.
Posiblemente haya ms recomendaciones relativas a la comunicacin. Veamos ahora otras recomendaciones acerca
del cdigo y de la funcionalidad.
Dado que la aplicacin cliente y la aplicacin servidor son completamente independientes, es muy fcil realizar
modificaciones en una de ellas, sobre todo en el servidor, sin que el cliente se entere. Basta para ello mantener
invariable el protocolo de comunicacin.
Pero puede llegar el caso en el que al servidor se le hayan introducido mejoras que puede aportar al cliente si este es
capaz de reconocer un nuevo protocolo. Estamos en el caso de un servidor que debe atender a dos versiones
distintas de cliente. Si el cliente tiene la versin mejorada, usar con l un protocolo de comunicacin que permita
las nuevas prestaciones. Si el cliente tiene la versin ms antigua, deber seguir usando con l el protocolo anterior.
Esto nos lleva a que el cliente siempre debe indicar al servidor su versin. Esto no ocupa unos recursos excesivos y
puede ser muy til cuando prevemos introducir una modificacin. Esta prctica puede incluso servir para conocer
aquellos clientes a los que hay que realizar el cambio de versin y enviarles una nueva. En el ejemplo de este curso,
el cliente comunica al servidor su versin en el acto de conectarse mediante el acrnimo <VER>.
El servidor tambin debera enviar su versin al cliente. No est previsto en la aplicacin SML pero confieso que no
sobrara que al identificarse el cliente y devolverle el servidor la conformidad del registro, le devolviese tambin la
versin del servidor. Se da cuenta que segn se avanza en la definicin del protocolo aparecen nuevas
necesidades?
La aplicacin cliente debe mostrar de forma clara al usuario el estado de conexin o desconexin con el servidor. Y
a ser posible, que indique la causa de la no conexin (Fallo en la RAL, fallo en el servidor) Esta informacin se
obtienen de forma muy sencilla analizando los errores generados en el Winsock a la hora de realizar la conexin.
Cuando utilice el puerto COM para la comunicacin, bien sea directamente o a travs de mdem, debe indicar
claramente al usuario el estado de esa conexin, analizando la seal DSR (esta seal est activa cuando el mdem
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 586

est conectado, y en caso de comunicacin directa, cuando se use, el Host debe poner a 1 esta seal para poder
trabajar). Recuerde que la comunicacin por el puerto COM es asncrona respecto a la ejecucin del programa.
En el ejemplo de aplicacin cliente servidor se han ensayado tambin los controles avanzados de Visual Basic
(Capitulo 16). La aplicacin tal como se dijo es una gua telefnica, que presenta en un TreeView el organigrama
del Organismo o empresa a la que pertenece la gua. Esto facilita la bsqueda de una persona, hacindolo por
departamento. La gua permite tambin buscar por nombre, primer apellido, segundo apellido o combinacin de
ambos. Una vez encontrada la persona, se cubren todos los datos de la misma, para presentarlos en la solapa de la
gua propiamente dicha, y el dato de su alias (dato que define de forma nica a cada usuario) aparece en la
direccin de correo para poder enviarle un mensaje. Para hacer una prctica con el puerto de comunicaciones
COM-1 COM-2 utilizaremos un mdem, conectado al PC a travs de uno de estos puertos, para marcar el nmero
telefnico.
Todas las operaciones de bsqueda de datos las haremos mediante consultas a la base de datos que est en el
servidor. Las consultas se realizarn siguiendo el protocolo de comunicaciones. El organigrama se guardar en el
cliente, en una base de datos, para evitar en lo posible el envo desde el servidor. La razn para esto es que el
organigrama puede ser muy extenso, y no va a variar muy a menudo. Como esta informacin habra que enviarla
nada ms conectarse el cliente, y como puede ser bastante amplia, esto podra originar un trfico intenso por la red,
que es justamente lo que queramos evitar. Solamente se va a enviar cuando haya cambiado. Cmo sabe el cliente
que ha cambiado?. Cmo sabe el servidor que el cliente tiene ya la informacin actualizada? La idea ms sencilla
para conocerlo es que el cliente enve cada vez que se registra (al comienzo de la conexin) el nombre de la revisin
del organigrama que tienen. El nombre puede ser cualquiera. Lo que hace el servidor por defecto para poner el
nombre a la revisin es combinar una cadena de texto con el nombre de la organizacin seguido de la fecha
(da/mes/ao) en la que se realiza la revisin. De esta forma es imposible que haya dos fichero con el mismo
nombre. Al recibir ese nombre el servidor, si es igual al de la ltima revisin, le devuelve un OK. Si no es igual, le
devuelve una instruccin para que el cliente solicite al servidor que le enve la nueva revisin. El cliente la solicita
y el servidor se la enva. Y al recibirla, el cliente reemplaza el contenido de la base de datos por los nuevos valores
recibidos.
Y razonando los procedimientos de esta misma forma, vamos completando el mecanismo de comunicacin entre
cliente y servidor, y paralelamente creando el protocolo de comunicacin. Por eso es muy probable que el protocolo
de comunicacin no est acabado hasta que est acabada la aplicacin.
Al da de hoy (30 de Octubre de 2002) no est terminada la aplicacin. Posiblemente no lo est nunca porque sea
una aplicacin en continua ampliacin. Esto es lo bonito de los programas ejemplo de los cursos de visual basic.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 587

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 588

ANEXO 1
SERVIDOR DE BASES DE DATOS Y MENSAJERIA LISTATEL (SML)
PROTOCOLO DE COMUNICACIN CLIENTE SERVIDOR
La comunicacin entre cliente y servidor se realizar mediante el protocolo descrito ms adelante, a travs de
cualquier medio de comunicacin. Generalmente ser comunicacin a travs de red IP, pero esto no debe impedir
que los clientes se puedan conectar al servidor a travs de otros medios de comunicacin, como puede ser un
mdem telefnico o un enlace va satlite.
En cualquier caso, el contenido de las rdenes y comandos de este protocolo ser siempre en ASCII, con caracteres
alfanumricos que permitan ver perfectamente el trfico entre ambos interlocutores. El hecho de utilizar solamente
caracteres legibles asegura igualmente la comunicacin a travs de cualquier medio de telecomunicacin,
incluyendo dispositivos de cifrado on-line colocados entre cliente y servidor.
La comunicacin puede iniciarse tanto en el servidor como en cualquiera de los clientes. Una comunicacin puede
estar compuesta de:
Ordenes
Respuestas
Confirmaciones
Avisos
Ordenes: Son aquellas partes de la comunicacin que inician una operacin en el equipo colateral.
Respuestas. Son siempre respuesta a una orden, y contendrn el resultado de la operacin generada por la orden, o
en su defecto, la notificacin de que esa orden no ha sido ejecutada o que dio resultado nulo.
Confirmaciones: Son el reconocimiento de recepcin de una comunicacin. Pueden emplearse tanto para responder
a un aviso como para confirmar que una orden se ha recibido, y que est siendo tratada. Tambin pueden existir
confirmaciones para avisar que una orden o una respuesta no ha llegado en un tiempo determinado.
Avisos: Son aquellas comunicaciones que no ejecutan ninguna accin en el colateral, pero informan de algo. Por
ejemplo, servidor fuera de servicio temporalmente, servidor restablecido. Pueden ser individuales, en cuyo caso
generarn normalmente una confirmacin, o broadcast, en cuyo caso no generarn confirmacin.

Formato de las tramas de comunicaciones.


La trama de una comunicacin estar compuesta de unos acrnimos que indicarn la orden, respuesta, confirmacin
o aviso que envan, direccin IP, nombre de la mquina o nombre del servidor que enva, direccin IP, nombre de
la mquina o nombre del servidor destino, datos, cheksum de la trama y acrnimo de fin de trama. Cada uno de
estos componentes ir metido entra los smbolos < > y su longitud puede ser variable. Cuando se enve informacin,
esta se colocar detrs del acrnimo que la define, separada por la barra /.
Ejemplos:
<SAT> Servidor Atencin. Inicia una sesin de un cliente con el servidor.
<IPO/10.3.22.119>
Direccin IP del equipo origen
<IPD/217.126.179.96> Direccin IP del equipo destino
<QRY/Select * From Agenda_Personal Where Apellido1 Like FERN%>
Si hubiese que emplear los smbolos /, &, < o > como smbolos de la informacin, deber anteponerse a cada uno
de ellos el smbolo &.
Por ejemplo:
<QRY/Select * From Agenda_Personal Where Edad &> 25>

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 589

El cheksum ser el resultado de realizar la funcin XOR sobre todos los caracteres de los componentes de la trama,
exceptuando los correspondientes precisamente a este cheksum y al fin de trama. El cheksum se indicar en
decimal, con el acrnimo CHK. Por ejemplo, <CHK/235>
El acrnimo de fin de trama ser <EOT>
El orden de los componentes de una trama no debe ser estricto, si bien debe ir en primer lugar el acrnimo que
inicie la sesin de comunicaciones, en penltimo lugar el cheksum, y en ltimo lugar el <EOT>
Una trama puede contener varias ordenes siempre y cuando estas sean congruentes.

Cuadro con los acrnimos usados en las tramas de comunicacin.

<RHC>
<SAT>
<CAT>

Remote Host Conectado. Lo devuelve el servidor o un cliente cuando otro equipo se conecta a l.
Servidor ATencin. Inicia una sesin de comunicacin desde el cliente al servidor.
Cliente Atencin. Inicia una sesin de comunicacin desde una mquina (Servidor o cliente) a una
mquina cliente.
<LIC>
Login Cliente. Indica que el cliente desea hacer Login en ese servidor. Pasa como parmetros el
alias y el password (en claro o cifrado) del cliente.
<LOC>
LogOut de cliente. Ese cliente quiere hacer LogOut de ese servidor. Pasa como parmetros el
alias y el password (en claro o cifrado) del cliente.

<ALC>
<ALS>
<PWC>
<IPO>
<IPD>
<NMO>
<NMD>
<NSO>

<NSD>
<QRY>
<QPR>
<RQY>
<QIP>
<QIR>
<QIS>
<ECO>
<OCE>
<CRY>

LSB

Alias de cliente. Llevar como dato el alias de ese cliente.


Alias de servidor. Llevar como dato el alias de ese servidor.
Password del cliente. Lleva como parmetro el password (en claro o encriptado) del cliente
IP de la mquina origen. Llevar como dato el nmero IP de la mquina origen de la trama.
IP de la mquina destino. Llevar como dato el nmero IP de la mquina destino.
Nombre mquina origen. Llevar como dato el nombre de la mquina dentro de la red.
Nombre mquina destino. Llevar como dato el nombre de la mquina dentro de la red.
Nombre Servidor origen. Llevar como dato el nombre del servidor origen. Este nombre de
servidor ser el nombre de un programa servidor, no el nombre de la mquina donde se alberga el
programa servidor.
Nombre servidor destino. Igual que el anterior.
Consulta a una base de datos. Llevar como datos la consulta completa en SQL
Consulta ya preprogramada en el servidor. Lleva como parmetro el nombre de esa consulta, y los
datos que necesite esa consulta para su ejecucin.
Resultado de la consulta a la base de datos. Llevar como datos el resultado de esa consulta. Si el
resultado genera varios registros, cada uno de ellos ir entre brackets ( [ ] )
Consulta de los datos del correo de un usuario. Enva como parmetro el Alias del usuario del que
se quieren conocer los datos. Devuelve los datos con el acrnimo <QIP>
Consulta los datos del correo de un usuario pasndole en este caso como parmetro la direccin de
correo SML. Devuelve los datos con el acrnimo <QIP>
Consulta los datos del correo de un usuario pasndole la direccin de correo SMTP. Devuelve los
datos con el acrnimo <QIP>
Orden de envo del mismo dato en la respuesta a esa orden. Se enva, por ejemplo, en una consulta
a la base de datos, para que el cliente ubique la respuesta a esa consulta en un sitio determinado.
Se emplea para devolver el mismo dato recibido con <ECO>
Inicia o finaliza una operacin de cifrado de datos. Lleva como parmetro INI para iniciar y FIN
para terminar. En el caso de iniciar, lleva uno o dos parmetros ms, el nmero de clave o el
nombre de un usuario con clave asociada. Puede llevar dos nombres de usuario en caso que se
cifre doblemente con la clave privada del remitente y la clave publica del destino, en cuyo caso se
envan como dos parmetros
<CRY/INI/PUB_LUIS.RODRIGUEZ/PRI_JOSE.LOPEZ>
Si el inicio no llevase parmetros de clave, el servidor entender que se cifra con la clave asignada
en el servidor al usuario que enva
<CRY/FIN>

Visual Basic Gua del Estudiante

Captulo 1

Pgina 590

<DI0>
<DI1>
...
<DI9>

Datos iniciales. Son datos que se envan entre aplicaciones


para su inicializacin. Van del 0 al 9 . Pueden usarse en ambos
sentidos. Preferentemente, DI5 como contestacin a DI0,
DI6 como contestacin a DI1, etc.

<BRC>
<BRS>
<BRA>
<VER>
<VES>
<BIP>

Mensaje dirigido a todos los clientes


Mensaje dirigido a todos los servidores
Mensaje dirigido a todos los equipos (Clientes y servidores)
Versin del programa cliente. Se enva al registrarse.
Solicita la versin de software del servidor. Devuelve la versin del software del servidor.
Busca IP. Se usa para comprobar que un cliente est disponible actualmente en la red. No lleva
parmetros.
Es la respuesta del cliente a la llamada <BIP> Lleva como parmetro la direccin SML o el
nombre del usuario de ese cliente.
Usuario Cliente Conectado. Se devuelve cuando un cliente recibe una solicitud de conexin. Es
equivalente al RHC del servidor.
Informacin del mensaje. Nmero de mensaje. Es una cadena de caracteres generada por el
origen, para definir el mensaje enviado. Consiste en una cadena de 4 caracteres programable por el
usuario, seguida de un nmero que indica el ao, mes, da, hora, minuto y segundo del envo,
todos ellos de dos dgitos. (abcdyymmddhhnnss)
Origen del mensaje (From) Lleva como parmetro la direccin SML del origen.
Direccin IP desde la que se enva el mensaje. Es similar a <IPO> pero solamente se utiliza al
enviar un correo.
Informacin del mensaje. Indica direccin de correo a la que se est enviando el mensaje. Lleva
como parmetro la direccin SML o SMTP del destino.
Informacin del mensaje. Indica el Asunto (Subjet) del mensaje. Lleva como parmetro el
contenido del asunto.
Informacin del mensaje. Indica el nombre del fichero Anexado enviado en el mensaje. Puede
haber varios anexos dentro de un mismo mensaje, en este caso se enviarn varios grupos <NX_>.
Lleva como parmetro el nombre del fichero en el origen y el tamao (en bytes) del fichero.
Cheksum del fichero anexado. Lleva como parmetro 8 bytes con el cheksum en Hexadecimal. (El
cheksum son 32 bits 4 bytes- expresados en hexadecimal. Si no enva cheksum, estos 8 bytes se
sustituyen por la cadena YYYYZZZZ.
Comienza la transmisin del anexo. No lleva parmetros. El primer carcter del anexo debe
transmitirse inmediatamente despus de este acrnimo.
Termina la transmisin del anexo. Este acrnimo debe enviarse inmediatamente despus del
ultimo carcter del anexo.
Cuerpo del mensaje enviado como texto. Lleva como parmetro el texto del mensaje.
cheksum del mensaje. Se enva cuando se solicita acuse de recepcin o de lectura, para comprobar
la exactitud de la transmisin. Se usa tambin para devolver el cheksum del mensaje al origen en
la confirmacin de recibo o lectura. Lleva como parmetro los dos bytes del checsum codificados
en hexadecimal (4 caracteres).
Informacin del mensaje. Indica que el contenido del mensaje est en formato RTF. Puede no
llevar ningn parmetro, en cuyo caso indica que todo el cuerpo del mensaje est en formato RTF,
o llevar le parmetro INI para indicar que comienza el formato RTF y FIN para indicar que
termina. Afecta solamente al cuerpo del mensaje enviado con <MSG>
Solicitado acuse de recibo. Puede llevar como parmetro una direccin de correo SML o SMTP
que ser en este caso a quien enviar acuse de recibo del mensaje. Si no lleva ningn parmetro
enviar el acuse de recibo al origen del mensaje. El acuse de recibo implica solamente que se ha
recibido el mensaje correctamente en el destino, pero no indica que se haya ledo.
Solicitado Aviso de Lectura. Puede llevar como parmetro una direccin SML o SMTP que ser
en este caso a quien se enve el aviso de lectura del mensaje. Si no lleva parmetro se le enviar al
origen del mensaje. Este aviso de lectura indica solamente que se ha abierto el mensaje, pero no
puede asegurar que el usuario destino lo haya ledo.
Fin del mensaje. Indica que se ha transmitido todo el mensaje con todos los anexos. En caso de

<DIP>
<UCC>
<MN_>

<FR_>
<IP_>
<TO_>
<SJ_>
<NX_>

<CX_>

<BX_>
<EX_>
<MSG>
<CHM>

<RTF>

<SAR>

<SAL>

<FM_>

una transmisin de mensajes mltiples, lleva como parmetro el nmero del mensaje que termina. En caso de
mensaje nico no lleva ningn parmetro o puede llevar el nmero del mensaje.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 591

Una mquina puede identificarse bien por su direccin IP o por su nombre dentro de una red. Puede tambin
identificarse por ambos, en aquellas situaciones en las que la mquina receptora del mensaje deba retransmitirlo a
otra mquina. Este es el caso, por ejemplo, de una red conectada a travs de una conexin ADSL. El mdem ADSL
tiene asignado un nmero IP verdadero, y en esa red existen varias mquinas que cada una de ellas tendr un
nombre distinto, y un nmero IP distinto, (nmero IP que para estas mquinas ser ya de la numeracin interna) Al
poder identificar una mquina por su IP y nombre, basta con poner como IP de destino el numero IP real del mdem
ADSL, y como nombre, el nombre de la mquina dentro de la red privada.

Por ejemplo:
<CAT> <IPO/100.100.100.100><IPD/217.126.179.96><NMD/Administracion_1>
<OCE/123>
<RQY/[Antonio Fernandez_91 1234567][Antonio Fernangomez_91 7654321]>
Este mensaje devuelve el resultado de una consulta a la mquina Administracion_1 que est en la red de rea local
cuyo acceso desde Internet se realiza por un mdem ADSL cuyo nmero IP es el 217.126.179.96. Lgicamente, la
mquina real que recibe esta comunicacin no es la mquina Administracion_1, sino otra mquina colocada en la
misma red de rea local, sobre la cual se ha hecho NAT desde Internet para el puerto que use este sistema, y esta
mquina, una vez recibido el mensaje, lo reenva a la mquina Administracion_1 que ser quien lo trate. Si la
comunicacin no llevase ms que el nmero IP, se entiende que el destino es la mquina que tiene ese nmero IP.
ORDENES PREPROGRAMADAS
Las rdenes preprogramadas son aquellas que el servidor ya tienen programadas en su cdigo. Deben ir
necesariamente tras el acrnimo <QPR> ya que en caso contrario no sern tratadas.
<ORG>
Pide / devuelve el organigrama. No lleva ms parmetros
<ABN>
Pide devuelve el nombre t Telfono 1 de los abonados de un departamento. Se le pasa como
parmetro el ID de ese departamento (Campo Ag_Departamento_ID)
<ABD>
<ABL>
<ABC>
<ABB>

<ABA>

<ABE>

<ABF>

<ABG>

<ABH>

LSB

Pide / devuelve todos los datos de un abonado. Lleva como parmetro el ID de ese abonado.
Pide / devuelve todos los datos de los abonados de un departamento. Se le pasa como parmetro el
ID del departamento.
Pide todos los datos de los abonados de un despacho. Se le pasa como parmetro el nmero de
despacho. Los datos se devuelven con el acrnimo <ABL>
Pide todos los datos de los abonados que tienen un determinado nombre (Bsqueda aproximada
por ambos lados) Se pasa como parmetro el nombre por el que se quiere buscar, o las letras del
nombre por el que se va a realizar bsqueda aproximada. Devuelve los datos con el acrnimo
<ABL>
Pide todos datos de los abonados con un determinado primer apellido (Bsqueda aproximada por
la derecha) Se pasa como parmetro el apellido a buscar, o la cadena de caracteres por la que har
la bsqueda. Devuelve los datos con el acrnimo <ABL>
Pide todos los datos de los abonados con un determinado segundo apellido. (Bsqueda
aproximada por la derecha) Se pasa como parmetro el apellido a buscar, o la cadena de
caracteres por la que har la bsqueda. Devuelve los datos con el acrnimo <ABL>
Pide todos los datos de los abonados con el mismo primer apellido (Bsqueda aproximada por la
derecha) y segundo apellido (Bsqueda aproximada por la derecha). Se pasan como parmetros
los apellidos a buscar, o las cadenas de caracteres por las que har la bsqueda. Devuelve los
datos con el acrnimo <ABL>
Pide todos los datos de los abonados con el mismo nombre (Bsqueda aproximada por los dos
lados) y el mismo primer apellido (Bsqueda aproximada por la derecha) Se pasa como parmetro
el nombre y apellido a buscar, o las cadenas de caracteres por la que har la bsqueda. Devuelve
los datos con el acrnimo <ABL>
Igual que el anterior, con nombre y segundo apellido.

Visual Basic Gua del Estudiante

Captulo 1

Pgina 592

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 593

EL CONTROL PERSONALIZADO MICROSOFT COMM

Este control permite la comunicacin de una aplicacin VB con el puerto serie. Parece en principio que
los puertos serie del PC se usan para muy pocas cosas. Prcticamente para conectarnos a Internet a
travs de un mdem telefnico. Existen muchsimas aplicaciones industriales para las cuales son
fundamentales los puertos COM. Las redes de rea local parece que han dejado obsoletos a los puertos
COM1 y COM2. No es as. Deje volar su imaginacin. Vuelva a la pgina 4 del captulo 2, y observe el
panel de control de una radio realizado en Visual Basic. La unin entre el PC y la radio, separados
muchos kilmetros, se realiz mediante el puerto COM, conectado a una lnea telefnica mediante un
mdem. El puerto COM es el gran olvido de los informticos
El control MSComm no est normalmente en la caja de herramientas, por lo que ser necesario introducirlo
mediante Proyecto | Componentes.
En el formulario solamente se le ve en tiempo de diseo. El icono que lo representa en la caja de herramientas
coincide con el que presenta en el formulario:

Al tratarse de un control personalizado, presenta dos formas de ver las propiedades. Si hacemos click con el botn
derecho del ratn sobre el control y vamos a propiedades, nos presenta tres cuadros de configuracin de los tpicos
de los controles personalizados. Si seleccionamos el control MSComm y pulsamos F4 , aparecer la caja de
propiedades tpica de los controles VB.
PRPIEDADES
Existen propiedades que pueden establecerse en tiempo de diseo o en tiempo de ejecucin, y otras que solamente
se pueden ejecutar o consultar en solamente en tiempo de ejecucin. Se detallan a continuacin las primeras. Las
segundas se enumerarn tras estas, aunque se nombran algunas de estas ltimas al explicar cada una de las
propiedades del primer tipo.
CommPort
Indica el nmero del puerto serie usado. Admite los valores de 1 a 255. Cambiando esa propiedad podemos cambiar
el puerto de comunicacin que vamos a usar (Un PC tiene normalmente 2 puertos serie : El Com1 y el Com2. Puede
tener sin grandes problemas Hardware hasta 4 (Com3 y Com4) Si le damos a ese valor un nmero de puerto
inexistente, dar error.
Settings
Sintaxis Velocidad, Paridad, Bits de informacin, Bits parada
Indica la velocidad, paridad, nmero de bits y bits de stop (parada) que se van a usar en la comunicacin.
Los valores posibles para velocidad son : Indica la velocidad en baudios.
50

100

110

300 600

1200

2400

4800

9600

14400

19200 y 28800

Los valores posibles para paridad son :


N - No enva bit de paridad ni hace comprobacin de paridad en la recepcin.
O - Enva y comprueba paridad, con el criterio de paridad IMPAR
E - Enva y comprueba paridad, con criterio de paridad PAR
Los valores para el parmetro Bits de Informacin pueden ser :
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 594

7 - Se envan / reciben 7 bits por trama de informacin.


8 - Se envan / reciben 8 bits por trama de informacin
5 - Se envan / reciben 5 bits por trama de informacin. Este valor de 5 bits es el tpico del sistema Baudot
para transmisin telegrfica
(Teletipos) que se ha conservado en las comunicaciones informticas por
pura tradicin. Si se eligen 5 bits, los bits de parada se ponen automticamente a 1,5 (Tpico tambin del sistema
Baudot.)
Los valores para el parmetro Bits de parada pueden ser :
1 - Se enva un bit de parada
2 - Se envan 2 bits de parada
(No es posible programar 1,5 bits de parada. Slo lo hace cuando se
lo hace automticamente).

programan 5 bits de informacin y

Handshaking
Especifica el mtodo de control sobre el flujo de informacin. En una comunicacin serie se necesita conocer si el
puerto puede enviar informacin (necesita saber si el mdem est preparado para recibirla) y necesita indicarle al
mdem que l est preparado para recibir informacin. A este proceso se le denomina Handshaking.
(Handshaking = Control de Flujo)
(Como sabr por sus conocimientos de ingls, Handshaking significa apretn de manos, ponerse de acuerdo. Y
ponerse de acuerdo entre dos terminales que van a comunicarse es establecer las condiciones de control que uno va
a tener sobre otro.)
El Control de Flujo puede hacerse de dos formas : Una mediante las seales auxiliares del puerto (RTS, CTS, DSR,
DTR), que son cables adicionales que tendrn una tensin positiva respecto a los 0V del equipo si esa seal est
activada, o una tensin negativa si no lo est. Este tipo de control del flujo de informacin es el tpico para
comunicarse el ordenador con un mdem.
Existe otra forma de controlar el flujo de informacin : mediante seales especiales que se envan por los dos cables
que transportan la informacin. Mediante estas dos seales podemos controlar que el ordenador enve informacin o
deje de enviarla. De igual forma, podemos indicarle al mdem que enve o no enve. Estas seales especiales se
denominan X-ON y X-OFF.
La propiedad Handshaking controla la forma de realizar este proceso. Puede tomar los siguientes valores :
0 - No existe Control de Flujo
1 - Control de Flujo mediante XON - XOFF
2 - Control de Flujo mediante Request To Send (RTS) y Clear To Send (CTS)
3 - Control de Flujo mediante XON - XOFF y RTS - CTS
Los tres tipos de Control de Flujo tiene cada uno su aplicacin.
InBufferSize
Mediante esta propiedad establecemos el tamao del Buffer (almacn de datos) de entrada. Este Buffer sirve para
poder recibir datos sin que tenga que intervenir la aplicacin continuamente para controlar el puerto de entrada.
Puede conocerse el nmero de caracteres presentes en el Buffer de entrada consultando el valor de la propiedad
InBufferCount.
OutBufferSize
Mediante esta propiedad controlamos el tamao del Buffer de salida.
El tamao de los Buffers depender de la aplicacin y de la velocidad de comunicacin. Si la aplicacin tiene
muchas cosas que hacer, aparte de controlar el puerto de comunicaciones, se deber poner un Buffer grande. Tanto
mas grande cuanta mayor sea la velocidad de transferencia de datos.
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 595

Puede conocerse el nmero de caracteres presentes en el Buffer de salida (los que an estn por transmitir),
consultando el valor de la propiedad OutBufferCount.

RThreshold, SThreshold
Estas dos propiedades especifican el nmero de caracteres que deben estar presentes en los Buffers de Recepcin y
Transmisin respectivamente, para que se produzca el evento OnComm relativo a recepcin y transmisin de
caracteres. (Eventos EvReceive y EvSend) Si el valor de una de estas propiedades est a 0, no se produce el evento
OnComm correspondiente.
El valor que se debe dar a estas dos propiedades depende de la aplicacin y del tiempo que queramos que la
aplicacin est atendiendo al puerto de comunicaciones. Concretamente para la propiedad RThreshold debemos
pensar muy bien el valor que se le pone. Si ponemos un valor corto (1 es el mnimo), cada vez que reciba un
carcter se producir el evento OnComm. (Vea la descripcin de eventos mas adelante). Al producirse este evento,
ejecutar el procedimiento asociado a l, lo que har perder tiempo a la aplicacin, impidindole realizar otras
funciones. Si se pone un valor muy alto, el puerto no avisar que tiene caracteres recibidos hasta que reciba un
nmero igual al programado en esta propiedad, por lo que no podremos procesar los datos recibidos hasta que el
buffer tenga ese nmero de caracteres en su interior. En nmero adecuado depender del tipo de aplicacin que
vayamos a realizar. En cualquier caso, este nmero ser inferior al nmero programado para la longitud del buffer,
(InBufferSize)

InputLen
Por defecto, cuando se lee el Buffer de recepcin, se leen todos los caracteres, quedando el Buffer vaco. Si se le
asigna a esta propiedad un valor distinto de 0, cada vez que leamos el Buffer de recepcin leer un nmero de
caracteres igual a esa cantidad, permaneciendo los caracteres restantes en el Buffer a la espera de una nueva lectura.
Asignndole el valor 0 (Valor por defecto), el buffer se lee completo.
ParityReplace
Si la comunicacin se realiza con bit de paridad (Par o Impar), en recepcin se comprueba byte a byte la recepcin
de la paridad correcta. Si se recibe un Byte que no tiene paridad correcta, lo mas probable es que ese Byte (carcter)
se haya recibido defectuoso. Esta propiedad nos permite sustituir un carcter que ha llegado con bit de paridad
incorrecto por otro carcter. ( ? predeterminado). Se puede sustituir por una cadena de caracteres (Error, por
ejemplo).

NullDiscard
Cuando se recibe el carcter nulo (00000000) puede ser que no sirva para nada a efectos de nuestra aplicacin, o
que este carcter sea un dato mas. Esta propiedad acepta los valores True / False. Si es True se desprecia el carcter
Nulo. Si es False, se toma como un carcter mas.
CTSTimeout
Es el tiempo (en milisegundos) que permanece esperando la seal CTS (Seal CTS - Dispuesto para enviar), seal
de entrada al ordenador que debe estar presente antes de que el puerto comience a enviar informacin. El tiempo se
mide desde que se pone activa la seal de salida RTS (Peticin de envo). Si se supera este tiempo entre el instante
de activacin de la seal RTS y la recepcin de la seal CTS, se produce el evento CTSTO. Poniendo 0 en esta
propiedad, se deshabilita, y en estas condiciones no se producir nunca el evento CTSTO.

CDTimeout
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 596

Es el tiempo mximo de espera (en milisegundos) desde que se activa la seal DTR hasta que se recibe la seal CD
(Carrier Detect - Deteccin de portadora). Este tiempo solamente tendr importancia en ciertas aplicaciones donde
se espere recibir CD continuamente. No tendr sentido cuando la aplicacin se queda en espera a recibir una
comunicacin, pero sin saber cuando la tiene que recibir. Si transcurre el tiempo programado en esta propiedad,
ocurrir el evento CDTO. Poniendo el valor 0 se deshabilita esta propiedad y no se producir nunca el evento
CDTO.
DSRTimeout
Similar a la anterior, pero en vez de esperar la seal CD se espera la seal DSR. Esta propiedad s tiene sentido, ya
que si, por ejemplo, estamos conectados con un mdem, y nuestra aplicacin se pone a la espera de recibir alguna
llamada, activa la salida DTR, y espera recibir inmediatamente la respuesta de que el mdem est dispuesto,
mediante la lnea DSR. Si transcurre el tiempo programado sin recibir la seal DSR se producir el evento DSRTO
. Ponindola a 0, se deshabilita esta propiedad y nunca ocurrir el evento DSRTO.
RTSEnable
Activa (Pone a 1) la seal RTS (Request To Send - Peticin de envo) Esta seal debe ponerse a 1 para indicar al
mdem (o al equipo que va a recibir nuestra comunicacin) que deseamos enviar datos. Debe estar activada durante
toda la transmisin de datos.
Cuando se pone la propiedad Handshaking a 2 (control con RTS / CTS) 3 (Control con RTS / CTS y con X-ON /
X-OFF) no debemos preocuparnos de poner a 1 la seal RTS, pues lo hace automticamente el puerto de
comunicaciones. Esta propiedad est ah para aplicaciones donde no se emplee ese tipo de Handshaking y
necesitemos activar algo antes de transmitir. (Caso por ejemplo de transmisin de datos por radio, donde podemos
usar esta seal de salida para activar el PTT (Push To Talk - Pulse para hablar) y poner el transmisor en marcha)
DTREnable
Activa (Pone a 1) la salida DTR (Data Terminal Ready - Terminal de Datos Listo). Esta seal se emplea para
decirle al mdem que el terminal (Ordenador) est preparado para recibir datos.
Se hace la misma observacin que para la propiedad anterior respecto a los valores de la propiedad Handshaking
Interval
Indica el tiempo (en milisegundos) del intervalo entre una y otra comprobacin del estado de recepcin del puerto.
El valor mnimo es de 55 ms.
El anlisis del puerto de comunicacin no tiene nada que ver con la generacin del evento OnComm. Este evento se
producir cuando se cumplan las condiciones para ello, independientemente del tiempo programado en esta
propiedad. La comprobacin del puerto cada intervalo de tiempo marcado por esta propiedad solamente afecta a
averiguar el estado de las lneas auxiliares CD, DSR y CTS, y para saber el nmero de caracteres existentes en los
Buffers de transmisin y recepcin.
Las siguientes propiedades no difieren en nada respecto a otros controles :
Left, Name, Index, Top, Tag

Propiedades propias del tiempo de ejecucin


PortOpen
Abre el puerto de comunicacin. Puede tener los valores True (Para abrirlo) y False (Para cerrarlo) Si tenemos un
MSComm con Nombre (Name) MSComm1, para abrirlo ejecutaremos la siguiente sentencia :
MSComm1.PortOpen = True
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 597

Para cerrarlo, ejecutaremos :


MSComm1.PortOpen = False
InBufferCount.
Nos permite averiguar cuantos caracteres tenemos en el Buffer de entrada. Con el mismo MSComm anterior,
comprobaremos el nmero de caracteres sin leer con la sentencia :
caracteressinleer = MSComm1.InBufferCount

OutBufferCount
Nos permite conocer cuantos caracteres quedan por transmitir en el Buffer de salida. Emplearemos la sentencia :
caracteressinenviar = MSComm1.OutBufferCount

Output
Enva caracteres al Buffer de salida. Debe existir un signo igual ( = ) entre Output y lo que se enva al Buffer. Para
enviar la frase Curso de Visual Basic ejecutaremos la sentencia :
MSComm1.Output = Curso de Visual Basic
Si deseamos enviar el contenido de una variable
MSComm1.Output = variable
Input
Lee el Buffer de recepcin. El nmero de caracteres ledos depender del valor de la propiedad InputLen. Cuando
la propiedad InputLen tiene el valor 0, el Buffer se lee completo. Si InputLen tiene un valor distinto de 0, se leer
un nmero de caracteres igual al valor de esta propiedad.

CommEvent
Devuelve el evento mas reciente que ha ocurrido para generar el evento general OnComm (Vea mas adelante).
Esta propiedad no est disponible en tiempo de diseo y es de slo lectura en tiempo de ejecucin.
Sintaxis

NombredelMSComm.CommEvent

Break
Devuelve un valor (True / False) que indica que se ha recibido la seal Break.
variable = MSComm1.Break
CDHolding
Devuelve el estado de la lnea de control CD (Deteccin de Portadora) Si es True, esa entrada est activada, si es
False, la entrada est desactivada.
variable = MSComm1.CDHolding
CTSHolding
Devuelve el estado de la lnea de control CTS (Dispuesto para enviar) Si es True, esa entrada est activada, si es
LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 598

False, la entrada est desactivada.


variable = MSComm1.CTSHolding
DSRHolding
Devuelve el estado de la lnea de control DSR (Data Set Ready ) Si es True, esa entrada est activada, si es False,
la entrada est desactivada.
variable = MSComm1.DSRHolding

EVENTOS DEL MSComm


El MSComm tiene varios eventos, pero un solo Procedimiento : el Procedimiento OnComm. Este procedimiento se
ejecuta cada vez que se produce alguno de los eventos del MSComm.
Esto quiere decir que para escribir el cdigo apropiado en el procedimiento del MSComm ser necesario analizar
qu evento se ha producido y colocar, mediante una sentencia If .. Then el cdigo apropiado para cada uno de los
eventos que se produzcan.
Para averiguar qu evento se ha producido puede hacerse consultando el valor de la propiedad CommEvent. (Se
toma como nombre del MsComm el de MsComm1)

If

MsComm1.CommEvent = ComEvRing Then

'Se ha consultado si el evento particular que ha producido el evento general OnComm


'ha sido el ComEvRing (Se est recibiendo la llamada del telfono). En esta sentencia
If Then deberemos colocar el cdigo necesario para que la aplicacin se prepare para
recibir una comunicacin a travs del mdem.
End If
Los eventos del Comm pueden identificarse por una constante o un nmero. La constante, como todas las de Visual
Basic, tiene una expresin bastante difcil. Se pone entre parntesis el nmero que identifica a ese evento. Este
nmero debe declararse como Integer.
Se ejecutar el Procedimiento OnComm cuando ocurra alguno de los siguientes eventos :
ComEvCD

(5)

Cambio en la lnea CD. Para conocer el estado actual de esa lnea


(Activado/Desactivado) deberemos invocar la propiedad CDHolding

ComEvCTS

(3)

Cambio en la lnea CTS. Igual que la anterior, este evento solamente


nos indica que ha existido un cambio. Para averiguar el estado en que
se encuentra esta lnea, debemos invocar la propiedad CTSHolding

ComEvDSR

(4)

Cambio en la lnea DSR. Igual que las anteriores. Debemos invocar la


propiedad DSRHolding para averiguar su estado actual.

ComEvRing

(6)

Cambio en la lnea de deteccin de llamada (Ring). Este evento se


produce cuando hay un cambio en la lnea Ring (Deteccin de
llamada en el mdem)
No existe una propiedad para averiguar el estado de la lnea Ring
pues no es necesario. Lo importante de esta lnea es que est
cambiando, es decir, el telfono est sonando y poco importa que
analicemos si la lnea Ring est a 1 o a 0, pues toda llamada
telefnica es intermitente. Dependiendo de la UART de su PC, puede que este evento no
lo soporte.

ComEvReceive( 2 )
LSB

Cuando se recibe un nmero igual o mayor de caracteres que el

Visual Basic Gua del Estudiante

Captulo 1

Pgina 599

indicado en la Propiedad RThreshold


ComEvSend

(1)

Cuando quedan en el bfer de transmisin menos caracteres que los


indicados en la Propiedad SThreshold

ComEvEOF

(7)

Recibido un carcter de fin de archivo (carcter ASCII 26) .

comEventBreak (1001)

Se ha recibido una seal de interrupcin. (Break)

ComEventCDTO (1007) Tiempo de espera de Deteccin de portadora. La lnea


Deteccin de portadora (CD) estuvo baja durante el periodo de tiempo
especificado en la Propiedad CDTimeout, mientras se intentaba transmitir un carcter.
ComEventCTSTO

1002
Tiempo de espera de Preparado para enviar. La lnea
Preparado para enviar (CTS) estuvo baja durante el periodo de tiempo
especificado en la propiedad CTSTimeout mientras se intentaba
transmitir un carcter.

ComEventDSRTO

1003
Tiempo de espera de Equipo de datos preparado. La lnea
Equipo de datos preparado (DSR) estuvo baja durante el periodo de
tiempo especificado en la Propiedad DSRTimeout mientras se
intentaba transmitir un carcter.

ComEventOverrun

1006
Se sobrepas la capacidad del Buffer de entrada sin haber
ledo todos los caracteres. Los caracteres no ledos se han perdido.
Debemos aprovechar este evento para solicitar al colateral una
repeticin de los datos perdidos.

ComEventRxOver

1008
Desbordamiento del bfer de recepcin. No hay espacio para
ms datos en el bfer de recepcin.

ComEventRxParity

1009
Error de paridad. El hardware ha detectado un error de
paridad.

ComEventTxFull

1010
Bfer de transmisin lleno. El bfer de transmisin estaba
lleno cuando se ha intentado agregar un carcter a la cola de
transmisin. Este error es fcil de evitar, analizando el valor
de la propiedad OutBufferCount antes de enviar mas datos al buffer
de salida.

ComEventDCB

1011
Error inesperado al recuperar el Bloque de control de
dispositivos (DCB) para el puerto.

ComEventFrame

1004

LSB

Error de trama. El hardware ha detectado un error de trama.

Visual Basic Gua del Estudiante

Captulo 1

Pgina 600

NOTA ADICIONAL

El puerto de comunicaciones.

El puerto de comunicaciones de un PC est formado por varias entradas / salidas. El soporte fsico es un conector
tipo Sub-D de 9 25 contactos, macho en ambas versiones. Se necesita por tanto un cable con conector Sub-D
hembra de 9 o 25 pines para acceder a l.
La distribucin de las seales en cada uno de sus pines es la siguiente :
GND

(Potencial de 0 V.).

TxD

Transmisin de datos. Es una salida del ordenador. Por ella salen los datos en serie.

RxD

Recepcin de datos. Es una entrada del ordenador. Por ella entran los datos en serie.

RTS

Request To Send. Peticin de envo. Es una salida del ordenador. El ordenador pone a
1 esta seal cuando quiere enviar datos.

CTS

Clear To Send. Dispuesto para enviar. Es una entrada del ordenador. Si est a 1
significa que el ordenador puede enviar datos pues el mdem (o el dispositivo que
vaya a recibirlos) est preparado para hacerlo.

DSR

Data Set Ready. Dispositivo de datos preparado. Es una entrada del ordenador. Le
indica que el mdem est encendido y listo para funcionar.

DCD o CD
Carrier Detect. Deteccin de portadora. Es una entrada del ordenador. Le
indica al ordenador que el mdem est detectado seal de audio (tonos) vlida.
DTR

Data Terminal Ready. Terminal de datos listo. Es una salida del ordenador. Indica que
est listo para trabajar. Suele emplearse para indicar al mdem que el ordenador est
dispuesto para recibir informacin.

Otra seal (disponible slo en los ordenadores que tengan conector de 25 pines, y no en todos) es la seal RING
(timbre del telfono) Es una entrada del ordenador. Le indica que est sonando el timbre de la lnea telefnica del
mdem.
Disposicin de los pines en el ordenador
Dependiendo de si tiene conector de 9 pines o de 25, la distribucin de estas seales fsicamente en el conector es :
Conector de 9 pines
Pin
3
2
7
8
6
5
1
4

Conector de 25 pines
Seal

Pin

TxD
RxD
RTS
CTS
DSR
GND
CD
DTR
RING
Tierra de proteccin

2
3
4
5
6
7
8
20
22
1

(La seal RING no est disponible en el conector de 9 pines. La deteccin del Ring del telfono se realiza
directamente por la lnea RxD. El mdem enva la palabra RING cuando suena el timbre del telfono. La tierra de
proteccin tampoco se usa en este conector.

LSB

Visual Basic Gua del Estudiante

Captulo 1

Pgina 601

S-ar putea să vă placă și