You are on page 1of 209

iene en sus manos una introducción y una

T guía para aprender y utilizar el sistema de


programación Visual Basic para Windows.
Sin tener que conocer la confusa jerga de los expertos
ni contar con experiencia previa en programación.
El autor, Ross Nelson, es un conocido experto en
Visual Basic y le enseñará a programar desde cero
para que, paso a paso, vaya creando aplicaciones de
interés en el entorno Windows. Pero el libro no se
reduce sólo a explicar las características y elementos
de Visual Basic, sino que proporciona también
instrucciones claras y precisas para crear dispositivos
gráficos de usuario, generar código basado en eventos
y encontrar y corregir errores y bugs.
Y para ayudarles a desarrollar sus primeros
programas en Windows, el libro contiene ejemplos
prácticos, incluyendo utilidades para Windows y
programas de gestión.
Primera edición, abril 1994
Primera reimpresión, agosto 1994

Paradox es una marca registrada de Ansa Software, una empresa de


Borland. Apple y Macintosh son marcas registradas de Apple Computer,
Inc. Borland y dBASE son marcas registradas de Borland International, Inc.
Claris y FileMaker son marcas registradas de Claris Corporation. IBM es una
marca registrada de International Business Machines Corporation. FoxPro,
GW-BASIC, Microsoft, Microsoft Access, MS-DOS, PowerPoint, Microsoft
QuickBasic, Visual Basic y Windows son marcas registradas de Microsoft A Margaret Hannah Nelson
Corporation. Teletype es una marca registrada de Teletype Corporation.
Todas las marcas registradas son propiedad de sus respectivos propietarios.

Edición original en lengua inglesa


Copyright © 1993 by Ross P. Nelson

Edición publicada por acuerdo con el editor original,


Microsoft Press, Redmond, Washington
©EDICIONES ANAYA MULTIMEDIA, S. A., 1994
Juan Igancio Luca de Tena, 15, 28027 Madrid
Depósito legal: S. 684-1994
ISBN: 84-7614-610-8
Printed in Spain
Imprime: Josmar, S. A.
Polígono El Montalvo - Salamanca, 1994
Indice general

1 Comenzar rápidamente con Visual Basic 1

2 Datos e instrucciones 2 9

3 Variables y constantes 4 1

4 Declaraciones, expresiones y procedimientos 6 3

5 El uso de los formularios y herramientas de Visual Basic 8 7

ó Control del programa 1 5 9

7 El uso de procedimientos y funciones 1 8 9

8 Depuración y gestión de errores 2 2 1

9 Archivos 2 4 3

10 Programación gráfica 2 8 5

11 Bases de datos y cuadrículas 3 1 1

12 Enlace e incrustación de objetos 3 3 1

13 Una aplicación para Windows completa 3 4 9


Indice

Agradecimientos xiii

Introducción xv

1 Comenzar rápidamente con Visual Basic 1


Instalación y arranque de Visual Basic 1
Exploración de la pantalla 2
Crear un interface de usuario 9
Escribir el código 15
Ejecución del programa 22
Revisar el diseño 23
Guardar el programa 25

2 Datos e instrucciones 29
Ordenadores y datos 29
Instrucciones de ordenador 35

3 Variables y constantes 41
Especificación de los tipos de datos de Visual Basic 41
Creación de variables y constantes 45
Creación de tipos definidos por el usuario 49
Determinar el ámbito 52

4 Declaraciones, expresiones y procedimientos 63


Declaraciones de asignación 63
Expresiones y operadores 64
Procedimientos 81

ix
Indice

Objetos como parámetros 207


Procedimientos de evento avanzados 209
5 El uso de los formularios y herramientas de Visual Basic 87
Los objetos de Visual Basic 87
Formularios 89
8 Depuración y gestión de errores 221

Cuadros de dibujo e imágenes 98 Herramientas de depuración 222

Etiquetas 104 Estrategias de depuración 232

Cuadros de texto 106 Un grito de ayuda 234

Botones de comando, cuadros de control y botones de opciones 1 10 Gestión de errores 237

Marcos 114
Cuadros de lista 117 9 Archivos 243
Cuadros combinados 120 Visión general del sistema de archivos 243
Eventos 122 Operaciones con archivos 244
Barras de desplazamiento horizontales y verticales 124 Archivos secuenciales 252
Relojes 129 Archivos de acceso aleatorio 259
Líneas y formas 132 Configuración 279
Cuadros de lista de unidades de disco, de directorios y de archivos 136
Otras herramientas de Visual Basic 138 10 Programación gráfica 285
Cuadros de diálogo estándar 140
Formularios y cuadros de dibujo 285
Menús 149
El objeto Printer 307
Consideraciones sobre el hardware para los programas gráficos 309
6 Control del programa 1 5 9
Realizar elecciones 159
11 Bases de datos y cuadrículas 311
Hacer repeticiones 170
¿Qué es una base de datos? 311
El uso de matrices 179
Acceder y mostrar datos usando Visual Basic 315
El uso de matrices de controles 186
Control mediante el programa 319
Acceder dinámicamente a una base de datos 323
7 El uso de procedimientos y funciones 189
Procedimientos generales 189
12 Enlace e incrustación de objetos 331
Procedimientos de función 194
OLE en Visual Basic 331
Escribir procedimientos 195
Control directo del objeto 343
Cómo funcionan los parámetros 200
Una nota sobre el DDE 347
Asignación local 205

x xi
LIBRO DEL VISUAL BASIC

13 Una aplicación para Windows completa 349 Agradecimientos


Diseño general 349
Diseño del menú 351
Diseño del formulario 354
Declaraciones globales 357 En primer lugar, quiero agradecer a los equipos del proyecto Visual Basic —a los
Formularios auxiliares 358 dos equipos: los que originalmente los concibieron e implementaron y los que
El procedimiento Main 362 han continuado mejorándolo. Es obvio que este libro no podría haberse escrito
sin la inspiración proporcionada por este innovador producto y por sus desarro­
La estructura de eventos 363
lladores.
Un pequeño flash 372
Una mirada hacia delante 374 Quiero agradecer a Claudette Moore su empuje y apoyo. En Microsoft Press, el
entusiasmo de Eric Stroo y los comentarios de Mike Halvorson y Mary DeJong
sobre los borradores iniciales fueron de mucha ayuda. Mary Renau también se
Indice alfabético 375
merece un reconocimiento por modular mi, en ocasiones, salvaje prosa, y las cui­
dadosas correcciones técnicas de Dail Magee me salvaron de la catástrofe. Gracias
también a Nancy Siadek y a Maureen Zimmerman por su trabajo sobre la nueva
edición. Hay otro montón de gente en Microsoft Press que trabajan "en la som­
bra" mecanografiando, creando el diseño, verificando el texto, creando el índice,
etc. Nunca os he conocido, pero aceptad mi agradecimiento por el trabajo que
habéis hecho.

Finalmente, debo mencionar a Rufus y dar las gracias especialmente a mis ami­
gos, fundamentalmente a John y Elsa Nimmo, quienes aguantaron alegremente mi
parloteo sobre fechas límite y editoriales y que aceptaron que algunas veces "de­
sapareciera" en combate.

xii
xiii
Introducción

El sistema de programación Visual Basic para Windows supone un importante


avance para cualquiera que esté involucrado en la creación de aplicaciones para
Windows. Con su corazón de programación orientada a eventos y sus innovado­
ras (y fáciles de usar) herramientas de diseño visual, Visual Basic permite sacar el
máximo provecho del entorno gráfico Windows para crear potentes aplicaciones
con rapidez.

Pero, en el caso de que no seas un programador experto, puedes estar pregun­


tándote si Visual Basic será adecuado para ti. Puede ser que seas un maestro en
aplicaciones como Microsoft Excel o como Microsoft PowerPoint y quieras llegar
incluso más lejos con el ordenador. Quizás sólo estés buscando un nuevo reto, y
programar ordenadores suena interesante. O, mejor todavía, acabas de descubrir
que ninguna aplicación comercial hace exactamente lo que tú quieres y estás
pensando en escribir un programa por ti mismo que se adapte a tus propias ne­
cesidades especiales.

Si cualquiera de estas suposiciones es correcta, tienes en las manos el libro ade­


cuado. El libro del Visual Basic para Windows es una primicia sobre programa­
ción en Visual Basic. No te convertirá en un científico de ordenadores, en un
superespecialista o en un ingeniero de software. Pero te mostrará cómo usar Vi­
sual Basic para convertir tus ideas en programas funcionales para tu ordenador, y
poder así enfrentarte a los problemas que necesitas solucionar.

¿Por qué Visual Basic? Para comprender lo que Visual Basic representa y por qué
ha producido tanto revuelo en el mundo del software gráfico, veamos primero
algo de su historia.

Una mirada atrás


Los primeros lenguajes de programación fueron diseñados en los años 50 y se
crearon, fundamentalmente, para resolver complejos problemas matemáticos.
Eran bastante complejos para la gente normal, pero ello no representaba un grave
problema porque entonces los ordenadores sólo se encontraban en las principa­
les instituciones investigadoras. Sin embargo, la gente se dió cuenta de que la tec-

xv
Iintroducción

nología informática podía ser útil para muchas más cosas que las matemáticas, y programa más simple. Por ello, cuando se presentó Microsoft Windows, los pro­
los ordenadores empezaron a hacerse habituales en las empresas y en las univer­ gramadores se sintieron a la vez excitados y deprimidos —excitados porque Win­
sidades. A medida que más gente comenzaba a utilizar los ordenadores, los eso­ dows les proporcionaba una plataforma para escribir aplicaciones gráficas y
téricos y complicados lenguajes de programación llegaron a suponer algo más agradables para el usuario; deprimidos porque su trabajo se hacía mucho más
que un obstáculo. complicado.
Como solución, a principios de los años 60 se desarrolló un lenguaje denominado Un sencillo programa que mostrase un mensaje en la pantalla podía escribirlo en
BASIC en el Dartmouth College. La versión original del BASIC (acrónimo de Be- cuatro líneas un programador que trabajase con MSDOS. Un programa similar
ginner’s All-purpose Simbolic Instruction Code) era un lenguaje muy simple, di­ para Windows requería dos o tres páginas de código e implicaba aprender a con­
señado especialmente para hacer que resultase sencillo aprender a programar. trolar fuentes, mentís, ventanas, memoria y otros recursos del sistema. Pero las
Una generación entera de programadores dió sus primeros pasos con el BASIC y ventajas de Windows para el usuario final eran incuestionables, y la gente empe­
lo uso para escribir una impresionante variedad de programas. zó a comprar programas escritos para Windows en grandes cantidades. Así que a
los programadores profesionales no les quedó más remedio que empezar a escri­
La simplicidad del BASIC lo hizo pequeño, y el tamaño era importante cuando los
bir páginas y más páginas de códigos.
ordenadores también comenzaban a quedarse pequeños. El MITS Altair, en plena
revolución de los microordenadores, apareció en 1975. Bill Gates y Paul Alien, Muchos creyeron que Windows representaba el fin de la programación aficiona­
cofundadores de Microsoft, aceptaron el reto de desarrollar una versión del BA­ da. En el mundo de MSDOS, los profesionales de áreas no relacionadas con la in­
SIC para el Altair que funcionase en los 4 kilobytes de RAM de los que disponía formática podían (en líneas generales) aprender lo suficiente de programación
ese ordenador. Esa versión del BASIC ha llegado a convertirse en el producto como para escribir aplicaciones sencillas que les ayudasen en su trabajo, les aho­
más usado de la industria de los ordenadores personales. rrasen tediosos cálculos u organizasen los datos rápidamente. Pero, ¿podía al­
guien hacer eso mismo en Windows, donde los requerimientos de programación
Con el transcurso de los años, este lenguaje de programación se ha mejorado y eran tan complicados, incluso para las aplicaciones más sencillas?
desarrollado. Cuando los primeros micros le abrían el camino al PC de IBM, el
GWBASIC de Microsoft estableció el estándar. Más adelante, la demanda de un
software más rápido, pequeño y fácil de usar condujo al desarrollo del Microsoft Programar para Windows con Visual Basic
QuickBasic. QuickBasic llevó al BASIC a la primera línea de la tecnología de los
lenguajes de programación de los años 80, pero hubo un cambio aún más impor­ La respuesta surgió en 1991 cuando Microsoft presentó Visual Basic. El sistema de
tante en el horizonte: el interface gráfico de usuario (GUI). programación Visual Basic sortea la complejidad de Windows de una manera
realmente espectacular. Combinando las probadas posibilidades del lenguaje Ba­
Con el advenimiento de Microsoft Windows, los usuarios de PC pudieron trabajar sic con herramientas de diseño visual proporciona simplicidad y facilidad de uso,
en un entorno intuitivo y gráficamente rico. Un interface gráfico de usuario per­ sin sacrificar prestaciones o las características gráficas que hacen de Windows un
mite que las aplicaciones sean fáciles de aprender y de usar. En lugar de apren­ entorno tan apetecible en el que trabajar. Los menús, fuentes, cuadros de diálogo,
der a escribir largos comandos, el usuario, simplemente, selecciona una opción (o campos de texto con desplazamiento y todo lo demás se diseñan con facilidad, y
comando) de un menú con un "clic" de un botón del ratón. Diversas ventanas en esas características no requieren más que unas pocas líneas de programa para
la pantalla permiten que el usuario pueda ejecutar más de un programa a la vez. controlarlas.
Cuando un programa necesita información o que el usuario tome decisiones apa­
Visual Basic es también uno de los primeros lenguajes de programación que ad­
recen los cuadros de diálogo.
mite la programación llamada "orientada a eventos", un estilo de programación
Aunque este entorno es maravilloso para el usuario, la vida se volvió de repente especialmente adaptado a los interfaces gráficos de usuario. Tradicionalmente, la
muy complicada para los programadores. Ahora tenían que crear ventanas, me­ programación ha estado muy orientada al proceso, al paso a paso, de manera
nús, fuentes, cuadros de diálogo y una multitud de elementos, incluso para el muy similar al de una receta: batir los huevos, añadir la leche, mezclar con el

xvi xvii
LIBRO DEL VISUAL BASIC introducción

azúcar, hornear durante 20 minutos. Uno de los inconvenientes de este estilo tico para utilizar este libro, ni que tengas experiencia en programación. Sin em­
consiste en que la persona que escribió la receta (el programa) es la que determi­ bargo, debes tener instalada en el ordenador la versión 3 o una posterior del sis­
na qué hay que hacer en cada momento. Eso puede ser aceptable para cocinar tema operativo Windows y debes estar familiarizado tanto con él como con
galletas, pero en los modernos programas de ordenador el objetivo es que sea el algunos de los principales programas creados para Windows. Serviría de ayuda
usuario el que determine en cada momento qué es lo que quiere hacer. que hubieses creado macros para tu programa de hoja de cálculo o de proceso
de textos. Y, por último, no debes tenerle miedo al álgebra. Este libro no contie­
Y eso es exactamente lo que proporciona la programación orientada a eventos.
ne matemáticas complejas, pero debes recordar que los lenguajes de ordenador
En lugar de escribir un programa que determina cada uno de los pasos en un or­
se diseñaron, inicialmente, para ejecutar cálculos matemáticos; consecuentemente,
den determinado, el programador escribe un programa que responde a las accio­
hoy todavía queda algo de aquella herencia en los lenguajes de programación.
nes del usuario: elegir un comando, hacer clic en una ventana, mover el ratón. En
vez de escribir un gran programa, el programador crea una aplicación que es Aprender a programar —de hecho, aprender un nuevo lenguaje— requiere algo
realmente una colección de microprogramas que cooperan entre ellos y que se de esfuerzo y una buena cantidad de ensayo y error. Es algo así como aprender a
ejecutan a raíz de eventos iniciados por el usuario. Y, con Visual Basic, una apli­ tocar el piano: tienes que practicar las escalas y los arpegios antes de que puedas
cación así se puede escribir con una rapidez y facilidad sin precedentes. interpretar a Chopin o a Bach. Por supuesto, cuando acabes este libro no serás
capaz de alcanzar el equivalente en programación a un concierto de Chopin. Nos
El lanzamiento inicial de Visual Basic se convirtió en un éxito espectacular, ven­
centraremos en los fundamentos; no trataremos todo lo que hay que saber sobre
diéndose decenas de miles de copias y ganando premios en la mayoría de las programación, ni siquiera todo lo que hay que saber sobre Visual Basic. Pero se­
principales revistas de informática. A finales de 1992 se lanzó la versión 2 de Vi­ rás capaz de crear algunas aplicaciones útiles y derivadas del mundo real, y adap­
sual Basic, la cual ofrecía nuevas características y posibilidades. tarlas a tus necesidades. Lo que es más, podrás aprovecharte rápidamente de las
Con el lanzamiento de Visual Basic 3, el producto ha convertido en un sistema de posibilidades de algunas otras aplicaciones —Microsoft Word para Windows uti­
programación maduro, al que se le han añadido muchas herramientas de progra­ liza una versión del Basic como lenguaje de macros, por ejemplo, y Microsoft
mación de gran potencia. La versión 3 incluye las características nuevas que se Access (un nuevo gestor de bases de datos) se basa en la misma tecnología que
muestran a continuación: Visual Basic.

Las herramientas, potencia y posibilidades de Visual Basic acercan la programa­


■ Prestaciones mejoradas.
ción a un abanico de personas mucho más amplio, incluso dentro del complejo
■ Una herramienta de creación de bases de datos. mundo de los ordenadores gráficos. Ahora es el momento de que pongas tu or­
■ Acceso visual a datos mediante el control Data, de manera que se pueden denador a trabajar para ti.
crear aplicaciones que examinen los datos sin tener que escribir el código.
Se puede descargar Visual Basic 6 de aquí:
■ Un nuevo control OLE (enlace e incrustación de objetos) que permite la https://docs.google.com/file/d/0BzAA6hbbWbAeOUJkY2xnMlptRHc/edit?usp=sharing).
edición "in situ". Para instalar Visual Basic 6 sobre Windows 7, 8 o 10 de 64 bits o posterior,
sigue las instrucciones que se indican aquí:
■ Un conjunto de cuadros de diálogo estándar que se ocupa de las tareas
http://www.aprenderaprogramar.com/foros/index.php?topic=286.0
más habituales de inteface con el usuario.
https://mega.nz/#!i8UViCoT!hSWe1ynxh8c9y0gDpnqaSpb8D8u4YPuOsK7ng4276b8
■ La posibilidad de crear menús emergentes (popup) en cualquier posición
de la aplicación. http://turbobit.net/download/free/kndy2n1iwb32#
Pass:www.detodoprogramacion.com
El libro del Visual Basic para Windows te presentará la versión 3 de Visual Basic y
http://www.mediafire.com/file/247xm175cu19yy5/Visual+Basic+6.0+32+y+64+Bits+-
te ayudará a desarrollar los conocimientos necesarios para crear aplicaciones
+luqueenterprises.com.rar
reales. No es necesario que conozcas un amplio abanico de vocabulario informa-
https://mega.nz/#!sgkBVQLI!KNR3gC0bNdl7tDFd1Vy7XIyZ1hOrCNx8WJcJTW-TI2g
x v iii x ix
1

Comenzar rápidamente
con Visual Basic
Para demostrar lo fácil que es comenzar a trabajar con Visual Basic y lo rápida­
mente que se puede aprender a crear aplicaciones útiles, este capítulo te permiti­
rá introducirte inmediatamente en materia y escribir un programa sencillo. En
realidad, experimentar con Visual Basic es la mejor manera de tomar contacto
con las herramientas con las que trabajarás, además de obtener una idea del ex­
traordinario potencial de Visual Basic. Después de esta pequeña experiencia prác­
tica, los capítulos 2 y 3 te ofrecerán una visión más detallada de los cómos y los
por qués que subyacen bajo Visual Basic.

Instalación y arranque de Visual Basic


Como la mayoría de las aplicaciones creadas para el entorno Windows, Visual
Basic viene con un programa llamado SETUP.EXE (INSTALAR.EXE en otros pro­
gramas) que instala la aplicación en el disco duro de tu ordenador. El proceso de
instalación completo se describe con detalle en la documentación que viene con
Visual Basic; como no tiene ninguna complicación, puede llevarlo a cabo con es­
tos cuatro sencillos pasos:

1. Arranca Windows escribiendo win en el indicador del MS-DOS y pulsando


la tecla Intro. Visual Basic funciona con la versiones 3.0 y posteriores de
Microsoft Windows.

2. Inserta el disco etiquetado, Disco 1, en una unidad de disquete.

3. Selecciona el comando Ejecutar del menú Archivo en el Administrador de


Programas de Windows. Escribe a:setup y pulsa la tecla Intro si insertaste

1
EL LIBRO DEL VISUAL BASIC 1 Comenzar rápidamente con Visual Basic

el Disco 1 en la unidad A; si estás usando la unidad B, escribe b:setup y Barra de menus Barra de herramientas
pulsa la tecla Intro. Ventana
principal
4. Sigue las instrucciones de la pantalla y responde a las preguntas de Setup
sobre las diversas opciones de instalación.

Después de que hayas contestado a todas las preguntas y seguido las instruccio­
nes del programa, Setup instalará Visual Basic en tu disco duro y añadirá una Ventana

ventana de grupo y un icono de Visual Basic en la ventana del Administrador de Project


(proyecto)
programas.

La manera más fácil de arrancar Visual Basic consiste en hacer doble clic sobre su
icono en el Administrador de programas. Alternativamente, puedes comenzar ha­
ciendo doble clic sobre VB.EXE, el archivo de Visual Basic, en el Administrador
Ventana
de archivos de Windows. Además, puedes arrancar Visual Basic desde el indica­ Properties
dor del MS-DOS introduciendo el comando win vb, el cual arranca Windows y (propiedades)

Visual Basic a la misma vez. Todos estos métodos se ilustran en la figura 1.1.

Caja de herramientas Ventana Form (formulario)


C:\>win vb
Figura 1.2.
Desde el Administrador de programas Desde el indicador de comandos del MS-DOS
La ventana inicial de Visual Basic

la parte superior de la pantalla está la ventana principal. Contiene los menús File
(Archivo) y Edit (Edición) que son habituales y otros menús de Visual Basic, así
como una barra de herramientas. En el centro de la pantalla está la ventana del
Desde el Administrador de archivos formulario, una gran ventana en blanco con el título Form1. Directamente a la iz­
quierda, puedes ver una ventana en forma de paleta de opciones denominada
Figura 1.1. caja de herramientas. A la derecha de la ventana del formulario está la ventana
Arrancar Visual Basic
Properties (propiedades) y debajo de ésta aparece la ventana Project (proyecto).

Consejo: En la figura 1.2, todas las aplicaciones excepto Visual Basic es­

Exploración de la pantalla tán minimizadas (convertidas en iconos). Mantener las aplicaciones


minimizadas ayuda a evitar el desorden y la confusión en la pantalla.
Después de que arranques Visual Basic aparecerán cinco ventanas en la pantalla, Puedes encontrar de utilidad elegir la opción Minimizar del menú
como se ilustra en la figura 1.2. (En tu pantalla inicial de Visual Basic las ventanas Opciones del Administrador de programas. Cuando esta opción está se­
pueden solaparse; en la figura 1.2 se ha modificado el tamaño y la posición de leccionada. el Administrador de programas se minimiza a sí mismo au­
las ventanas en la pantalla, de manera que todas se puedan ver claramente.) En tomáticamente siempre que arranques un nuevo programa.

2 3
EL LIBRO DEL VISUAL BASIC 1 Comenzar rápidamente con Visual Basic

Casi puedo oírte murmurar "esto va a ser complicado". Indudablemente, lo va a hayas empezado todavía aparecen cuatro entradas en la ventana del proyecto,
ser. Pero la clave para gestionar la complejidad es la organización, y el entorno como viste en la figura 1.2. La primera es el nombre de archivo Form1.frm; su eti­
de Visual Basic está diseñado para conseguir que te mantengas organizado. Eche­ queta (Form1) indica que el archivo está asociado con la ventana de formulario
mos un vistazo a cada una de las ventanas. denominada Form1. Si guardas el formulario en un disco sin cambiarle el nom­
bre, Visual Basic usa el nombre de archivo por omisión Form1.frm. Una aplica­
La ventana principal ción puede estar compuesta de muchos formularios, cada uno de los cuales se
La ventana principal contiene la barra de menús con ocho menús desplegables. almacena en un archivo separado. (Como los archivos están separados, un formu­
Uno de los más importantes, sobre todo mientras estés aprendiendo Visual Basic, lario también puede ser compartido por otras aplicaciones.)
es el menú Help (ayuda). Desde este menú puedes acceder a un tutorial que te
presenta Visual Basic, puedes buscar la información necesaria para contactar con Las tres entradas adicionales que aparecen en la ventana del proyecto son los
nombres de los archivos CMDIALOG.VBX, GRID.VBX y MSOLE2.VBX. La exten­
los servicios Microsoft de apoyo a sus productos y puedes explorar todo el siste­
sión VBX indica que esos archivos son archivos de extensión de Visual Basic.
ma de Ayuda de Visual Basic.
Cuando se carga un archivo de extensión se añaden herramientas suplementarias
Por ejemplo, cuando selecciones Contents (contenidos) del menú Help verás una a la paleta de la caja de herramientas (que se trata en el siguiente apartado).
lista de todas las categorías de información contenidas en el sistema de Ayuda en
La ventana del proyecto también contiene dos botones, etiquetados View Form
línea. Haciendo clic sobre las frases subrayadas en las diversas pantallas de la
(ver formulario) y View Code (ver código). Por omisión, Visual Basic muestra el
Ayuda te puedes mover hacia las secciones y temas específicos que necesites ver.
formulario correspondiente cuando se selecciona un archivo en la ventana del
Cuando selecciones Search (buscar) del menú Help, la Ayuda mostrará un cuadro
proyecto. Esta vista te permite diseñar el interface de usuario para tu aplicación:
de diálogo que te permitirá especificar un tema y moverte inmediatamente hacia
la Ayuda sobre ese tema.

Además, la Ayuda proporciona información sensible al contexto. Si necesitas sa­


Botón New Form (nuevo formulario)
ber más sobre un botón, un cuadro de diálogo, una ventana, un mensaje de error
Botón New Module (nuevo módulo)
o sobre cualquier otro elemento con el que estés trabajando en Visual Basic, sim­
Botón Open Project (abrir proyecto)
plemente pulsa la tecla F1 cuando el elemento esté resaltado, y la Ayuda mostrará Botón Save Project (guardar proyecto)
inmediatamente la información apropiada. (Puedes encontrar una descripción Botón Menu Design Window (ventana diseñar menú)

más completa sobre el sistema de Ayuda de Visual Basic en el capítulo 8.) Botón Properties Window (ventana propiedades)
Botón Start Button (botón ejecutar)
La ventana principal también contiene la barra de herramientas. Los botones de la Botón Break (botón detener)

barra de herramientas —que se muestran en la figura 1.3— son atajos para los
comandos que se usan con más frecuencia. Por ejemplo, en lugar de abrir el
menú File (archivo) y seleccionar el comando Open Project (abrir proyecto) pue­
des, simplemente, hacer clic en el botón Open Project.
Botón Procedure Step (saltar procedimiento)

Finalmente, a la derecha de la barra de herramientas en la ventana principal verás Botón Single Step (un solo paso)
Botón Calls (llamar)
dos campos que sirven para indicar la posición y el tamaño del objeto que está
Botón Instant Watch (punto de vigía)
seleccionado actualmente en la ventana del formulario.
Botón Toggle Breakpoint (activar/desactivar punto
interrupción)
La ventana del proyecto Botón End (fin)

La ventana del proyecto (Project) contiene una lista de todos los archivos nece­
Figura 1.3.
sarios para ejecutar el programa de Visual Basic que estés creando. Aunque no
La barra de herramientas de Visual Basic

4 5
EL LIBRO DEL VISUAL BASIC 1 Comenzar rápidamente con Visual Basic

la parte de la aplicación que el usuario ve y con la que interactúa. Si haces clic en a crear objetos en pantalla y para escribir tu programa. Puedes interactuar con los
el botón View Code de la ventana del proyecto, el código del archivo selecciona­ objetos del formulario modificando su tamaño, posición y otros atributos. Pero ni
do aparecerá en una ventana diferente. El código se refiere a las instrucciones en los objetos estarán activos ni se ejecutará el código; por ejemplo, si colocas una
un lenguaje de programación; el proceso de programar se denomina crear código barra de desplazamiento en un formulario podrás cambiar el tamaño y la posición
o "codificar". Cuando se crea un programa con Visual Basic, el trabajo se divide del objeto, pero no podrás usarlo para desplazar nada.
entre el diseño del formulario, el cual ve el usuario, y la creación del código, que
controla el funcionamiento del programa. Para volver desde la ventana del código
a la del formulario, simplemente tienes que hacer clic sobre el formulario para ac­
Herramienta Pointer (puntero)
tivarlo o en el botón View Form en la ventana del proyecto. Herramienta Picture Box (cuadro de dibujo)

Herramienta Label (etiqueta) Herramienta Text Box (cuadro de texto)


La ventana del formulario y la caja de herramientas
Un formulario es una zona de visualización que corresponde a una ventana que Herramienta Frame (m arco )
Herramienta Com m and Button

verás cuando tu aplicación esté funcionando. Cuando se empieza un proyecto (botón de com ando)
Herramienta Check Box Herramienta Option Button
nuevo, Visual Basic crea un formulario vacío y le da el título Form1. A medida (cuadro de comprobación (botón de opción)
que diseñas tu aplicación, el formulario sirve como un lienzo en el que puedes Herramienta Combo Box - Herramienta List Box (cuadro de lista)
dibujar diversas partes de la aplicación. Los componentes de la aplicación que se (cuadro combinado)
Herramienta Horizontal Scroll Bar
colocan en el formulario se denominan objetos o controles —cuadros de dibujo, Herramienta Vertical Scroll Bar
(barra de desplazamiento horizontal) (barra de desplazamiento vertical)
botones de opciones y barras de desplazamiento, por ejemplo. (De hecho, Visual
Herramienta Timer (reloj) Herramienta Drive List Box
Basic considera al propio formulario como un objeto.)
(cuadro de lista de unidades)
Herramienta Directory List Box Herramienta File List Box
Los controles se crean mediante la paleta de la caja de herramientas, la cual se
(cuadro de lista de directorio) (cuadro de lista de archivos)
muestra en la figura 1.4. Cada control está representado por un icono o herra­ Herramienta Shape (forma) Herramienta Line (línea)
mienta de la caja de herramientas. La mayoría de las herramientas que puedes ver
en la figura 1.4 están construidas internamente en Visual Basic. (El capítulo 5 des­ Herramienta Image (imagen) Herramienta Pata (datos)

cribe las herramientas estándar con detalle.) Sin embargo, como ya se ha mencio­
Herramienta Common Dialog Herramienta Grid (cuadrícula)
nado, la caja de herramientas puede ampliarse para incluir nuevas herramientas (diálogo común)
adicionales. Cada archivo con la extensión VBX de la ventana del proyecto pro­ Herramienta OLE

porciona una o más herramientas nuevas para la caja de herramientas. La


herramienta Grid (cuadrícula), la herramienta OLE y la herramienta Common Dia- Figura 1.4.
log, por ejemplo, provienen de los archivos GRID.VBX, MSOLE2.VBX y CMDIA- La caja de herramientas de Visual Basic

LOG.VBX que se incluyen por omisión en tu archivo del proyecto. La Edición


Profesional de Microsoft Visual Basic ofrece archivos VBX adicionales y te pro­
porciona la posibilidad de crear nuevas extensiones (si eres un programador en C Sin embargo, cuando ejecutes las aplicaciones ya terminadas, Visual Basic retirará
o en Pascal). También hay disponibles varios paquetes de software de otros fabri­ las herramientas de diseño. Se fijará el diseño de la ventana; los objetos de la
cantes. pantalla pueden ser activados y el usuario puede interactuar con lo que aparezca
La apariencia de tu programa la diseñas eligiendo controles de la caja de herra­ en pantalla de la forma que hayas diseñado. La aplicación comienza a funcionar y
mientas y poniéndolos en el formulario. Cuando estás diseñando una aplicación, Visual Basic ejecuta las declaraciones de tu programa. (Visual Basic te permite sa­
Visual Basic funciona de manera muy diferente a cuando estás ejecutando la apli­ ber mediante la barra del título de la ventana principal si estás diseñando o ejecu­
cación. En la fase de diseño, Visual Basic proporciona herramientas para ayudarte tando una aplicación.)

6 7
LIBRO DEL VISUAL BASIC 1 Comenzar rápidamente con Visual Basic

La ventana de propiedades El cuadro de lista desplegable que hay en la parte superior de la ventana de pro­
Las propiedades de Visual Basic son mecanismos formales que sirven para descri­ piedades se denomina el cuadro Objeto. Muestra el nombre de todos los objetos
bir los atributos de un objeto. En el mundo real puedo preguntarte, "¿de qué co­ de la aplicación, así como sus tipos. Inicialmente, el cuadro Objeto solamente
lor es esa vaca?" En Visual Basic te preguntaría en lugar de eso, "cuál es el valor contiene información sobre el formulario; pero, a medida que se añaden contro­
les al formulario, Visual Basic agrega esos objetos a la lista desplegable del cua­
de la propiedad Color de esa vaca?" La respuesta en ambos casos sería, por su­
dro Objeto.
puesto, "púrpura". La raza es otra propiedad típica de las vacas. Los valores o
ajustes esperados de la propiedad Raza podrían ser Guernsey, Holstein y He- Debajo del cuadro Objeto se encuentra el cuadro Ajustes (Settings) y la lista de
reford. propiedades. Esta lista te permite desplazarte por todas las propiedades del objeto
que se muestra en el cuadro Objeto y ver el valor actual de cada propiedad.
Todo objeto de Visual Basic tiene propiedades específicas cuyos ajustes controlan
Cuando se selecciona una propiedad de esta lista, su valor actual aparece en el
la apariencia y comportamiento del objeto en una aplicación. Algunas propieda­
cuadro Ajustes que hay sobre la lista de propiedades. Si quieres cambiar el valor
des están restringidas a ciertos valores. Por ejemplo, la propiedad Visible de un
puedes escribir un dato nuevo en el cuadro Ajustes o elegir un nuevo valor pre­
objeto puede ser ajustada a True o False (verdadero o falso); es decir, el objeto es
definido de una lista desplegable, dependiendo de la propiedad en concreto.
visible o invisible. Otras propiedades, como el título de una ventana de formula­
rio puede ajustarse prácticamente a cualquier cosa. Date cuenta de que no tienes Para demostrarte cómo puedes usar las diversas ventanas de Visual Basic para
que establecer todas las propiedades de cada objeto; los valores por omisión de crear una aplicación, vamos a diseñar tu primer proyecto.
muchas propiedades son, a menudo, perfectamente aceptables.

Aunque muchas propiedades pueden alterarse tanto en la fase de diseño como Crear un interface de usuario
cuando la aplicación está funcionando, la ventana Properties, que se muestra en
Como primer proyecto vamos a crear un programa que mida el tiempo transcurri­
la figura 1.5, sólo está activa durante la fase de diseño. Puedes activar la ventana
do, de manera muy similar a lo que hace un cronómetro. Un cronómetro tiene un
Properties de varias maneras: haciendo clic simplemente sobre ella, seleccionan­
botón que se pulsa para que comience a contar el tiempo, otro que permite dete­
do el comando Properties del menú Window (ventana), pulsando F4 o haciendo
ner la cuenta y un lugar donde ver el tiempo transcurrido. Puedes usar este mo­
clic en el botón Properties Window (ventana propiedades) de la barra de herra­
delo como base para tu programa. En Visual Basic, un formulario servirá como
mientas.
lugar donde se vea el tiempo transcurrido y para situar los botones de inicio y pa­
rada. Para comenzar el diseño de la aplicación tendrás que examinar y modificar
algunas de las propiedades del formulario.

Cuadro Object (objetos)


Establecer las propiedades del formulario
Cuando se ejecute la aplicación, el formulario será presentado en una ventana de
Cuadro Setting (Ajustes)
aplicación estándar. Si quieres que esta ventana se parezca a las que muestran
otras aplicaciones escritas para Windows, debe tener ciertos atributos. Por ejem­
Lista de propiedades
plo, uno de los atributos compartidos con las aplicaciones escritas para Windows
consistirá en que el nombre de la aplicación aparezca en la barra del título. En
Visual Basic muchos atributos de ese tipo se controlan mediante las propiedades
de los objetos.

Para comenzar a establecer las propiedades del formulario, en primer lugar, selec­
Figura 1.5.
ciona el formulario como objeto actual haciendo clic en cualquier lugar de la ven-
La ventana Properties (propiedades)

8 9
EL LIBRO DEL VISUAL BASIC 1 Comenzar rápidamente con Visual Basic

tana etiquetada como Form1. Ahora mira a la ventana Properties de Visual Basic, na cuando la aplicación esté funcionando. Como la aplicación Cronómetro va a
en la que Form l aparece en el cuadro Objetos. Si quieres cambiar el título del tener una apariencia fija, el tamaño de su ventana no se podrá ajustar. Selecciona
formulario, haz clic en la propiedad Caption (título) en la lista de propiedades. El la propiedad BorderStyle de la lista Properties y luego ajusta la propiedad a 3 - Fi-
título actual (por omisión), Form1, aparecerá en el cuadro de Ajustes. Escribe xed Double (fijo y doble) seleccionando esta opción de la lista desplegable del
Cronómetro para reemplazar el título. A medida que lo escribes, este nuevo título cuadro Ajustes. (La opción Fixed Double determina que la ventana tendrá un bor­
aparece tanto en el cuadro Ajustes como en la barra del título de la ventana del de mediante el que no se podrá cambiar el tamaño de dicha ventana, y que no
formulario. tendrá botones Minimizar ni Maximizar.)

Observa los dos botones que hay a la izquierda del cuadro Ajustes que están
La propiedad Name (nombre)
marcados con una X y con una marca de confirmación (en forma de V). El botón
de confirmación sirve para introducir el valor que hayas establecido en el cuadro Todos los objetos en Visual Basic tienen una propiedad llamada Name (nombre).
Cuando se establece la propiedad Name se le está dando al objeto una identidad
Ajustes; hacer clic sobre este botón es equivalente a pulsar la tecla Intro. Si haces
que se puede usar dentro del programa para referirse a él. En una ventana del
clic en el botón X se cancela la entrada actual y se restaura el valor anterior en el
formulario puedes acceder a un objeto haciendo clic sobre él. En la parte del có­
cuadro Ajustes.
digo del programa debes referirte al objeto por el nombre que le hayas asignado
Cuando la propiedad seleccionada pueda tomar solamente un conjunto de valo­ con la propiedad Name. (Date cuenta de que las propiedades Name y Caption
res restringido y predefinido, el cuadro Ajustes actúa como un cuadro de lista son diferentes: el nombre de un objeto es su identidad en el código del progra­
desplegable en lugar de hacerlo como un campo para la entrada de texto. Des­ ma; el título de un objeto es lo que el usuario ve en la pantalla, el texto identifi-
plázate a través de la lista de propiedades y selecciona, por ejemplo, la propiedad cativo que se muestra en la ventana de la aplicación.)
Visible. E1 botón con una flecha apuntando hacia abajo que hay en el cuadro
Selecciona la propiedad Name en la lista Properties. Su valor por omisión, que
Ajustes se vuelve activo, lo que significa que los ajustes para la propiedad Visible
aparece en el cuadro Ajustes, es Form1. Edita la propiedad Name de tu formula­
están restringidos a los que estén disponibles en la lista desplegable. Si haces clic
rio escribiendo el texto MiForm en el cuadro Ajustes.
en el botón con la flecha apuntando hacia abajo, la lista se desplegará para mos­
trar los ajustes True (verdadero) y False (falso), como se muestra en la figura 1.6. Nota: Cuando se cambia el nombre de un formulario, Visual Basic re­
Asegúrate de que la propiedad Visible está establecida como True. fleja ese cambio en la lista de nombres de archivos que se muestran en la
ventana del proyecto. Recuerda que la definición de cada formulario se
Otra propiedad relacionada con la apariencia del formulario es BorderStyle (estilo almacena en un archivo separado. Cuando guardes tu aplicación po-
del borde), la cual controla si el usuario podrá o no cambiar de tamaño la venta- drás elegir el nombre de archivo que quieras para tu formulario, pero
Visual Basic te sugerirá, un nombre por omisión basándose en el nombre
del formulario.

Añadir objetos
Volvamos al diseño del formulario para crear los botones que inicien y detengan
la cuenta del tiempo:

1. Haz clic en la herramienta Command Button (botón de comando.) de la


caja de herramientas, y luego mueve el puntero del ratón a la zona blanca
de la ventana del formulario. El cursor se transforma en una cruz, lo que te
Figura 1.6 indica que estás en el modo de dibujo.
Establecer la propiedad Visible del formulario

11
10
EL LIBRO DEL VISUAL BASIC 1 Comenzar rápidamente con Visual Basic

2. Sitúa el cursor en la esquina superior izquierda del formulario. utilizaste al establecer las propiedades del formulario para ajustar las propiedades
3. Pulsa y mantén pulsado el botón del ratón y arrastra el cursor hacia abajo y de los botones:
hacia la derecha. 1. Haz clic en el botón de más arriba para seleccionarlo.
4. Suelta el botón del ratón. 2. Selecciona la propiedad Caption de la lista de propiedades en la ventana
Cuando sueltes el botón del ratón Visual Basic creará un objeto botón de coman­ Properties.
do en el área rectangular delimitada por la operación de arrastre. Tu botón de co­ 3. En el cuadro Ajustes cambia el título por el de Inicio.
mando debe parecerse al que se muestra en la figura 1.7.
4. Haz clic en el segundo botón y cambia el ajuste de su propiedad Caption
Después de que hayas creado el botón, la herramienta Pointer (puntero) vuelve a para que ahora sea Parada.
estar activa de nuevo en la caja de herramientas. Cuando está activa la herramien­
ta puntero puedes editar el formulario moviendo los objetos y cambiando sus ta­ Incluso aunque acabes de cambiar los títulos, también debes cambiar los nom­
bres de los botones de manera que puedas referirte a ellos fácilmente en el códi-
maños. Para mover un objeto simplemente tienes que arrastrarlo a su nueva
ubicación. Si quieres cambiar el tamaño de un objeto, arrastra uno de sus gesto­
res (que se muestran en la figura 1.7) para agrandarlo o reducirlo. Si los gestores
no están visibles, haz clic en el objeto para seleccionarlo.
Elegir nombres
Ahora crea un segundo botón de comando, usando esta vez un atajo: haz doble
No es absolutamente necesario cambiar los nombres de los botones de la
clic en la herramienta Command Button de la caja de herramientas. Visual Basic
aplicación Cronómetro que estás creando, pero te darás cuenta de que re­
crea un botón del tamaño por omisión y lo sitúa en el centro del formulario.
ferirte en tu programa a btnlnicio es mucho más claro que referirte a Com-
Cambia la posición y el tamaño del segundo botón de manera que los dos boto­
mandl. T.S. Eliot ya lo advirtió: "Ponerle nombre a los gatos es un asunto
nes aparezcan en el lado izquierdo de la pantalla y tengan el mismo tamaño.
difícil"; lo mismo se puede decir de los objetos en los programas. Podrías
Estos dos botones, ahora etiquetados Command1 y Command2 por omisión, ser­ pensar que los nombres cortos son más fáciles de escribir, o qué es más
virán como botones de inicio y parada para la aplicación Cronómetro. Para mayor cómodo que el sistema ofrezca un nombre por omisión. Pero cuando vuel­
claridad debes asignar sus títulos adecuadamente. Sigue el mismo proceso que vas a un programa seis meses después de que lo hayas escrito, puede serte
muy difícil determinar exactamente lo que el programa está haciendo si no
has elegido nombres significativos.

Debes tratar de usar una convención coherente para elegir los nombres
Gestores que proporcione tanto el contexto como la descripción. Los nombres btn­
lnicio y btnParada, por ejemplo, tienen un prefijo de tres letras que identifi­
ca el tipo de objeto en el código de tu programa. En español usamos a
menudo frases descriptivas para establecer el contexto —por ejemplo, en
vez de mencionar simplemente a Cardenal Silvestre es habitual referirnos a
"mi gato, Cardenal Silvestre", con el fin de evitar una posible confusión en­
tre el gato y un alto cargo eclesiástico. Sin embargo, en Visual Basic no
puedes hacer referencia "al botón llamado Inicio", así que resulta útil com­
primir el contexto (btn) y el nombre (Inicio) en un único identificador
Figura 1.7. (btnlnicio).
Un botón de comando recién creado

12 13
LIBRO DEL VISUAL BASIC
1 Comenzar rápidamente con Visual Basic

go de tu programa. (Recuerda que las propiedades Caption y Name no son lo


También necesitas eliminar el texto por omisión que aparece dentro de los cua­
mismo; cambiar una no afecta a la otra.) Haz clic en el botón de arriba y selec­
dros. Selecciona la propiedad Text (texto) de la lista de propiedades para cada
ciona su propiedad Name. En el cuadro Ajustes cambia el nombre por omisión
cuadro de texto y borra todos los caracteres del cuadro Ajustes. Esta acción esta­
Command1 por el de btnInicio. Luego haz clic en el botón inferior y cambia su
blece el valor de la propiedad Text a "nada" (una cadena de texto de longitud
propiedad Name estableciéndola como btnParada. (Consulta el cuadro titulado
cero).
"Elegir nombres".)
Todos los elementos necesarios para la parte de la aplicación relativa al interface
Completar la ventana con el usuario están ahora en su lugar. De hecho, puedes "ejecutar" la aplicación
tal y como está ahora. Selecciona el comando Start (iniciar) del menú Run (eje­
Ahora que ya has situado en la pantalla los controles del usuario de la aplicación
cutar), haz clic en el botón Start de la barra de herramientas o pulsa la tecla F5.
Cronómetro, necesitas un lugar para mostrar los resultados cuando el programa
La paleta de la caja de herramientas desaparece, al igual que la versión de diseño
se esté ejecutando. Para ello, vamos a añadir varios cuadros de texto al formu­
del formulario, y la ventana Cronómetro aparece en la pantalla, como se muestra
lario:
en la figura 1.8. Puedes mover la ventana por la pantalla y también puedes hacer
1. Haz doble clic en la herramienta Text Box para crear un cuadro de texto. clic en los botones Inicio y Parada (aunque no sucederá nada, ya que todavía no
El cuadro de texto aparecerá en el centro del formulario. has escrito las instrucciones en Visual Basic que calcularán el tiempo transcurri­
do). Selecciona el comando End (fin) del menú Run de Visual Basic o haz clic en
2. Mueve el cuadro de texto a la zona superior de la ventana del formulario,
el botón End de la barra de herramientas para finalizar la aplicación y volver al
a la derecha de los botones de comando.
entorno de diseño de Visual Basic.
3. Usando el mismo método, crea dos botones de texto más, y organízalos
como se muestra aquí:

Figura 1.8.
La ventana de la aplicación Cronómetro durante su ejecución

Escribir el código
Crear el código —escribir las instrucciones que controlan el funcionamiento del
4. Usa el ratón para "coger" la esquina inferior derecha de la ventana del for­
programa— es el corazón de la programación. Ahora que has terminado el inter­
mulario y cambiar su tamaño, de manera que se ajuste holgadamente alre­
face de tu aplicación tienes que hacer que el programa funcione. Como vas a es­
dedor de los botones y de los cuadros de texto.
cribir comandos en el lenguaje Visual Basic es razonable pensar que esos
Tienes que darles nombres a estos objetos nuevos. Haz clic en cada uno de los comandos controlan el ordenador, aunque lo hacen de manera indirecta. Para
cuadros de texto y cambia el ajuste de la propiedad Name, usando el nombre comprender esta idea piensa en un avión a reacción.
txtInicio para el cuadro superior, txtParada para el del medio y txtLapsus para el
Cuando el piloto quiere que el avión vuele más alto debe tirar de la palanca de
de abajo.
control, que está en la cabina del avión, hacia atrás. El efecto de esta acción es al-

14
15
EL LIBRO DEL VISUAL BASIC 1 Comenzar rápidamente con Visual Basic

terar la posición de los elevadores del avión, de manera que el avión comienza a
ascender. En un avión a reacción moderno no hay conexión física entre la palan­
ca y los elevadores. Cuando el piloto tira hacia atrás de la palanca un sensor
mide la distancia que ha movido la palanca y envía una señal a un dispositivo
hidráulico que mueve los elevadores. Sin embargo, desde el punto de vista del
piloto, la palanca controla el avión. No es de una importancia vital que el piloto
sepa si tirar de la palanca tres centímetros produce un desplazamiento de 5 gra­
dos de la posición de los elevadores o de 10 grados; es suficiente con que el pi­
loto conozca cómo responde el avión al cambio.

Al igual que el piloto del avión, tú estás en los controles del ordenador, y Visual
Basic es tu panel de instrumentos. El siguiente apartado se centrará en darte una
visión del sistema desde "la cabina" —es decir, el aspecto que tiene para un pro­
Figura 1.9.
gramador de Visual Basic. Hay muchas cosas ocurriendo bajo la superficie, desde Una ventana de código de Visual Basic para Cronómetro
luego, pero de momento nos centraremos simplemente en un repaso y dejaremos
el análisis de los detalles relevantes para los capítulos 2 y 3. El cuadro Object de la parte superior izquierda de la ventana de código muestra
el nombre del objeto que has seleccionado: btnInicio. El cuadro Procedure (pro­
Procedimientos para eventos cedimiento, que se abrevia como Proc) de la zona superior derecha te muestra
qué procedimiento de evento estás editando. Como todavía no has seleccionado
Ya has visto las propiedades de los objetos y cómo estas propiedades pueden
un procedimiento, Visual Basic ha elegido uno por omisión, el procedimiento de
modificarse para que afecten a un objeto. De una manera similar (en cierto
evento Click. El procedimiento que se muestra en la ventana de código es el que
modo), cada objeto puede asociarse con un conjunto de procedimientos que se
se ejecutará cuando el usuario haga clic sobre el botón Inicio mientras la aplica­
ejecutan en momentos específicos. Un procedimiento es un grupo de instruccio­
ción se esté ejecutando. Aunque todavía no has escrito el código, ya aparecen
nes en el lenguaje de programación Visual Basic. Las instrucciones del procedi­
dos declaraciones en la zona de texto de la ventana de código:
miento se llevan a cabo cuando se ejecuta el procedimiento. Todo el código
ejecutable que escribas se encapsulará en uno u otro tipo de procedimiento. Sub btnInicio_Click ()

Todo procedimiento asociado con un objeto está ligado a un evento particular o End Sub
acción y, por tanto, se le denomina procedimiento para evento. Los eventos inclu­
Cuando creaste este botón de comando, Visual Basic creó un conjunto de proce­
yen acciones como Click, un evento que se produce cuando el usuario hace clic
dimientos de eventos por omisión para el objeto. Como puedes adivinar, los pro­
con el botón del ratón, y como Resize, un evento que ocurre cuando el usuario
cedimientos por omisión no hacen nada; consisten simplemente en la declaración
cambia el tamaño de una ventana de formulario. Los eventos ocurren sólo duran­
del procedimiento (la primera línea) y la declaración que marca el final del pro­
te la ejecución del programa, y no durante el diseño. A cada objeto se le pueden
cedimiento (End Sub).
asociar varios eventos; estos se describen con más detalle en el capítulo 5.

Volvamos a nuestra aplicación Cronómetro. En la ventana del formulario haz do­ Declaraciones de procedimiento
ble clic en el botón Inicio. Visual Basic abrirá una ventana de código como la que En la declaración del procedimiento, la palabra clave Sub identifica el comienzo
se muestra en la figura 1.9. El título de la ventana de código es MiForm.frm, el de un procedimiento. A continuación va el nombre del procedimiento —en este
cual indica la relación entre el código y el formulario. El código que introduzcas caso, btnInicio_Click. Por último aparecen unos paréntesis, los cuales completan la
en esta ventana se almacenará en el mismo archivo que contiene los objetos del definición. (Los paréntesis no se usan en este procedimiento, pero a pesar de ello
formulario. deben incluirse; trataremos sobre su función en un capítulo posterior.)

16 17
EL LIBRO DEL VISUAL BASIC 1 Comenzar rápidamente con Visual Basic

El nombre de un procedimiento sirve para distinguirlo como un procedimiento de Consejo: Date cuenta de que las palabras clave como Sub, Debug, Print
evento. No todos los procedimientos son procedimientos de eventos. Puedes y End aparecen en pantalla en la ventana de código en un color dife­
crear un procedimiento en Visual Basic y darle cualquier nombre que desees (in­ rente que el resto del código. Visual Basic señaliza diferentes partes del
cluso Chaf o Puf si quieres). Pero el nombre de un procedimiento de evento código con varios colores para que los componentes individuales sean
debe cumplir las siguientes reglas: fáciles de encontrar. Puedes controlar los colores que se usan seleccio­
nando el comando Environment (entorno) del menú Options (opciones).
■ La primera parte del nombre debe coincidir con el nombre de un objeto
Ello hará que aparezca el cuadro de diálogo Environment Options (op­
que hayas creado en el formulario (o debe ser la palabra Form , cuando el
ciones del entorno), en el cual puedes determinar los colores del texto y
objeto relevante sea el propio formulario).
del fondo para las palabras clave, para los identificadores, comentarios
■ La última parte del nombre debe ser el nombre de un evento. y diversos elementos de código adicionales.

■ Las dos partes deben estar separadas por un guión de subrayado.


Declaraciones de variables
En el caso del procedimiento btnInicio_Click, el objeto asociado es el botón del Cuando el usuario hace clic sobre el botón Inicio de la aplicación Cronómetro, el
comando Inicio (btnInicio), y el evento es Click. Cuando el programa se está eje­ programa debe saber qué hora es (la hora de comienzo). Luego, cuando el usua­
cutando lo que ocurre es algo así: la aplicación está aburrida en un extremo de la rio haga clic en el botón Parada, el programa debe restar la hora de comienzo de
pantalla esperando que suceda algo. En ese momento se aproxima María con su la hora de finalización para calcular el tiempo total transcurrido. Evidentemente,
ratón. Ella mueve el puntero del ratón sobre la imagen de la pantalla y hace clic. necesitas escribir el código que le permita al programa llevar a cabo todas estas
Windows le da un puntapié a la aplicación en el trasero y le dice, "¡Eh, haz algo!" acciones.
Cuando Visual Basic piensa que el clic ha ocurrido sobre el botón llamado btn­
Visual Basic usa una función llamada Now para proporcionar la hora actual. Una
Inicio se va a buscar el procedimiento denominado btnInicio_Click y ejecuta las
función es un tipo especial de procedimiento que devuelve un valor. (Las funcio-
instrucciones de ese procedimiento. Como programador, tu trabajo consiste en
decidir qué instrucciones deben ser.

Para ver cómo funciona esto escribe la instrucción Debug.Print "¡Hola, marinero!"
Visual Basic te está mirando
en la línea en blanco que hay entre las declaraciones Sub y End. La ventana de
código debe parecerse ahora a esto: Si cometes un error mientras estés escribiendo en la ventana de código, Vi­
sual Basic puede avisarte resaltando el error y mostrando un cuadro de
Sub btnInicio_Click () diálogo informativo. Este sistema de vigilancia, denominado comprobación
Debug.Print "¡Hola, marinero!" automática de la sintaxis, se activa cada vez que se pulsa la tecla Intro. Por
End Sub
supuesto, Visual Basic no puede detectar todos los posibles errores a medi­
La instrucción Debug.Print le indica a Visual Basic que escriba texto en una ven­ da que vas escribiendo, pero sí puede darse cuenta de los errores de sinta­
tana especial denominada ventana Debug. Pulsa la tecla F5 para salir del modo xis; o sea, los errores referentes a la forma en que se ha usado el lenguaje
de diseño y comenzar a ejecutar la aplicación (tal y como está). Cuando hagas Visual Basic, como una palabra clave mal escrita, palabras con el orden al­
clic en el botón Inicio, las palabras Hola, marinero aparecerán escritas en la ven­ terado en una instrucción, puntuación incorrecta, etc. Si escribes txtPara-
tana Debug. da..Text en lugar de txtParada.Text, por ejemplo, Visual Basic te informará
de tu error. Puedes desactivar la comprobación automática de la sintaxis si
Ahora selecciona el comando End del menú Run de Visual Basic. Visual Basic de­ quieres: selecciona el comando Environment del menú Options y establece
tendrá la aplicación y volverá al modo de diseño, donde podrás continuar dise­ la opción Syntax Checking (comprobación de la sintaxis) como No en el
ñando tu aplicación. (Antes de continuar acuérdate de borrar la línea Debug.Print cuadro de diálogo Environment Options.
del procedimiento btnInicio_Click.)

18 19
EL LIBRO DEL VISUAL BASIC 1 Comenzar rápidamente con Visual Basic

nes de Visual Basic tienen un estrecho parecido con el concepto matemático de


funciones. Por ejemplo, las funciones de Visual Basic denominadas Sin, Cos y Terminología
Tan devuelven el seno, el coseno y la tangente de un ángulo.) Cuando el usuario
Si te parece que Dim es una palabra algo insulsa y piensas que otra pala­
haga clic en el botón Inicio, tu programa debe llamar a la función Now, la cual
bra como Declare sería más apropiada, estás en lo cierto. Sin embargo,
devolverá un valor: la hora actual (de comienzo). Entonces el programa debe "re­
Dim es una versión abreviada de Dimensión y es una reliquia de las pri­
cordar" este valor para que pueda sustraerlo de la hora de parada cuando el
meras versiones del lenguaje Basic, que data de los años 60. A medida que
usuario haga clic en el botón Parada. Para almacenar este valor en un programa
los lenguajes de programación evolucionan tienden a retener ciertas carac­
de ordenador debes reservar un lugar para él en la memoria del ordenador. Esto
terísticas de las versiones previas por el asunto de la compatibilidad. Todo
se hace con declaraciones de variables.
esto te resultará de interés, claro está, sólo si dominas el idioma inglés.
En la ventana de código, haz clic en el botón con la flecha apuntando hacia abajo
del cuadro Object para desplegar la lista de todos los objetos del formulario. En
esta lista selecciona la entrada que corresponde a la categoría de todo el código de Variant, por ejemplo, se indicaría a Visual Basic que reservase memoria sufi­
que no está asociado con ningún objeto en particular (general). Visual Basic cam­ ciente sólo para un número entero.)
biará entonces, automáticamente, el ajuste en el cuadro Procedures a (declara-
tions), o sea, declaraciones. (Nos referiremos a esto a lo largo del libro como la Instrucciones ejecutables
sección del código dedicada a las declaraciones generales.) Ahora introduce las Ahora que ya has reservado memoria para guardar los valores del tiempo puedes
siguientes líneas en la ventana de código: pasar a escribir el código ejecutable del programa. En contraste con una declara­
ción, que se utiliza para configurar el programa, una instrucción ejecutable provo­
Dim HoraInicio As Variant
Dim HoraParada As Variant ca que algo suceda cuando es ejecutada. Por ejemplo, la instrucción Debug.Print
Dim Lapsus As Variant que usaste antes es una instrucción ejecutable.

Estas declaraciones le dicen a Visual Basic que quieres reservar un lugar de alma­ Selecciona el objeto btnInicio en el cuadro Object de la ventana de código. Edita
el procedimiento btnInicio_Click introduciendo las siguientes instrucciones entre
cenamiento para los valores de la hora de inicio, de la de parada y del tiempo
la línea Sub btnInicio_Click( ) y la línea End Sub.
transcurrido en las variables denominadas HoraInicio, HoraParada y Laspsus. Las
variables son, esencialmente, nombres de zonas reservadas de la memoria del or­ HoraInicio = Now
denador. (En los capítulos 2 y 3 se trata más este tema.) La declaración Dim le txtInicio.Text = Format(HoraInicio, "hh:mm:ss")
dice a Visual Basic cuánta memoria tiene que reservar y cómo se va a llamar a txtParada.Text= ""
txtLapsus.Text= ""
esa porción de la memoria. Dim es una declaración porque le dice a Visual Basic
cómo debe configurarse el programa. Cuando tu programa esté funcionando y el usuario haga clic en el botón Inicio,
se ejecutarán estos comando. La primera línea de código usa la función Now para
Cada una de las tres líneas que hemos visto más arriba declara una sola variable,
obtener la hora actual, y luego la guarda en el lugar de almacenamiento denomi­
y las tres tienen esta forma:
nado HoraInicio. La siguiente línea muestra la hora en el cuadro de texto supe­
Dim nombre As Variant rior (txtInicio) estableciendo para ello la propiedad Text de este objeto; también
le da formato a la hora de comienzo para que aparezca como horas, minutos y
Dim y As son palabras clave, palabras reservadas que tienen un significado espe­
segundos, usando para ello una función de Visual Basic denominada Format. Las
cial para Visual Basic. Las declaraciones difieren sólo porque cada variable debe siguientes dos líneas borran cualquier cosa que hubiera en pantalla en los otros
tener un nombre distinto. La palabra clave Variant le dice a Visual Basic que re­ dos cuadros de texto (txtInicio y txtLapsus), estableciendo sus propiedades Text
serve suficiente memoria para cualquier tipo de valor. (Se pueden usar otras pala­ como cadenas vacías.
bras clave para hacer las declaraciones más específicas. Usando Integer en lugar

21
20
EL LIBRO DEL VISUAL BASIC 1 Comenzar rápidamente con Visual Basic

Ahora completa el programa seleccionando el objeto btnParada en el cuadro Ob-


ject de la ventana de código. Edita su procedimiento de evento Click como se Revisar el diseño
muestra a continuación: Resulta muy fácil pasar por alto detalles de programación por no pensar en el
Sub btnParada_Click () usuario del programa. Miremos de nuevo al diseño del interface de Cronómetro:
HoraParada = Now dos botones, tres cuadros de texto. Muy simple. Pero piensa en la persona que
Lapsus = HoraParada - HoraInicio no conozca el propósito del programa. Los términos inicio y parada se explican
txtParada.Text = Format(HoraParada, "hh:mm:ss") a sí mismos, pero ¿qué información puede desprenderse de los tres cuadros de
txtLapsus.Text = Format(Lapsus, "hh:mm:ss") texto en blanco? Una mejora obvia que puedes realizar al diseño del formulario
End Sub es añadir una etiqueta a esos cuadros, de manera que quede claro cuál es la in­
Este procedimiento se ejecuta cuando el usuario hace clic en el botón Parada. En formación que proporcionan.
primer lugar, la función Now devuelve la hora actual, la cual es guardada en la
El icono Label (etiqueta) de la caja de herramientas se parece a una A mayúscu­
variable HoraParada. La siguiente línea calcula el tiempo transcurrido restando a
las. Usando la herramienta Label, dibuja un objeto etiqueta al lado del cuadro de
HoraParada el valor de HoraInicio. Luego, la hora de parada y el tiempo trans­
texto superior en la ventana del formulario. Puede que sea necesario que le cam­
currido se escriben en la pantalla, estableciendo para ello la propiedad Text de bies el tamaño al formulario y que muevas los cuadros de texto para hacer sitio a
los objetos txtParada y txtLapsus. Como ocurría en el procedimiento btnIni- la etiqueta. Puedes seleccionar los tres cuadros a la vez de manera que puedas
cio_Click, la función Format convierte los valores del tiempo al formato que moverlos como un grupo: simplemente, haz clic en el cuadro de texto superior y
muestra horas, minutos y segundos. luego mantén pulsada la tecla Ctrl mientras haces clic en los otros dos cuadros de
texto.
Ejecución del programa A continuación, haz clic en el nuevo objeto etiqueta, selecciona la propiedad
Simplemente, pulsa F5 para arrancar la aplicación. Usa el "cronómetro" haciendo Caption de la etiqueta en la lista Properties y escribe Hora de inicio: en el cuadro
clic en el botón Inicio, espera unos segundos y luego haz clic en el botón Parada. Ajustes. Luego crea dos etiquetas similares junto a los otros dos cuadros de texto
Debes ver algo como el resultado que se muestra en la figura 1.10. y establece sus propiedades Caption a Hora de parada: y Tiempo transcurrido:
respectivamente, como muestra la figura 1.11.
Puedes hacer clic de nuevo en el botón Inicio para volver a poner en marcha el
cronómetro. Para cerrar la aplicación Cronómetro puedes hacer clic en el botón ¿Alguna otra mejora de diseño que considerar? Pulsa F5 para ejecutar la aplica­
End de la barra de herramientas, pulsar Alt+F4 o seleccionar el comando Cerrar ción otra vez, y luego trata de hacer clic en el botón Parada antes de hacer clic
del menú de control (el menú que aparece cuando se hace clic en el extremo su­ en el botón Inicio. La aplicación debería responder de una manera razonable a
perior izquierdo de una ventana, y al que algunas veces se denomina menú del este error del usuario, pero en lugar de ello obtienes un extraño resultado: la
sistema). hora de parada y el tiempo transcurrido aparecen en la pantalla sin la hora de ini-

Cronómetro

Hora de inicio:
Inicio

Hora de parada:
Parada

Tiempo transcurrido:

Figura 1.10. Figura 1.11.


Ejecución de la aplicación Cronómetro Añadir etiquetas a los cuadros de texto

22 23
EL LIBRO DEL VISUAL BASIC
1 Comenzar rápidamente con Visual Basic

cio. Tienes que cerrar la aplicación y volver al modo de diseño para solucionar el Los cambios que acabas de hacer son únicamente una muestra de los muchos po­
problema. sibles cambios que pueden mejorar el programa. Por ejemplo, como muchos cro­
Dado el diseño actual, la manera más simple de solucionar este problema consis­ nómetros tienen solamente un botón, podrías implementar el programa con un
te en impedir el uso del botón Parada hasta que el usuario haya hecho clic en el botón de comando, y cambiar el título del botón de Inicio a Parada (o viceversa)
botón Inicio. Para ello, haz clic sobre el botón Parada en la ventana del formula­ cada vez que se hiciera clic sobre él. Probablemente, a ti mismo se te ocurrirán
rio para seleccionarlo, y luego elige la propiedad Enabled (activado) de la lista muchas mejoras.
Properties. Establece la propiedad a False en el cuadro Ajustes. Ahora, el botón
Parada estará desactivado cuando la aplicación arranque por primer vez.
Cronómetro
00:18:39
Abre la ventana de código y edita el procedimiento btnInicio_Click para que apa­ Hora de inicio:
Inicio
rezca como se muestra aquí (añadiéndole las dos líneas que aparecen en un color
Hora de parada:
distinto). Puedes usar las teclas del cursor para mover el punto de inserción en la Patada
Tiempo transcurrido:
ventana del código, o simplemente, hacer clic con el ratón para situar el punto de
inserción.
Figura 1.12.
Sub btnInicio_Click () La versión final de la aplicación Cronómetro
HoraInicio = Now
txtInicio.Text = Format(HoraInicio, "hh:mm:ss")
txtParada.Text= ""
txtLapsus.Text= "" Guardar el programa
btnParada.Enabled = True
btnInicio.Enabled = False Aun te queda un asunto de interés: guardar el programa. En este caso tu primer
End Sub paso debe consistir en seleccionar el archivo CMDIALOG.VBX en la ventana Pro­
ject y elegir el comando Remove File (eliminar archivo) del menú File (archivo).
El nuevo código vuelve a activar el botón Parada después de que el usuario haga Repite el proceso para los archivos GRID.VBX y MSOLE2.VBX. Como no has uti­
clic en el botón Inicio. Entonces desactiva el botón Inicio, lo cual elimina otro lizado estas herramientas no necesitas guardar los archivos como parte de este
error posible: hacer clic en el botón Inicio dos veces consecutivas. proyecto.

Para completar los cambios, también necesitas editar el procedimiento btnPara- Ahora selecciona el comando Save Project (guardar proyecto) del menú File de
da_Click, añadiéndole dos líneas como se muestra aquí: Visual Basic o haz clic en el botón Save Project de la barra de herramientas. En el
cuadro de diálogo Save File As (guardar archivo como), que se muestra en la fi­
Sub btnParada_Click () gura 1.13, Visual Basic te pide el nombre del archivo y el directorio en el que
HoraParada = Now quieres guardar el código del formulario y su diseño de pantalla, sugiriéndote el
Lapsus = HoraParada - HoraInicio
nombre por omisión MIFORM.FRM (el nombre del formulario más la extensión
txtParada.Text = Format(HoraParada, "hh:mm:ss”)
FRM) para la aplicación Cronómetro. Después de que suministres la información
txtLapsus.Text = Format(Lapsus, "hh:mm:ss")
btnParada.Enabled = False necesaria haz clic en OK (aceptar).
btnInicio.Enabled = True A continuación Visual Basic muestra el cuadro de diálogo Save Project As (guar­
End Sub
dar proyecto como), que se plasma en la figura 1.14, lo cual te permitirá guardar
el archivo del proyecto. El archivo del proyecto contiene los nombres de todos
La figura 1.12 muestra la versión final del interface de la aplicación. En este caso,
los archivos de formularios y alguna información adicional sobre el proyecto. (La
el usuario ha hecho clic en el botón Inicio y el cronómetro está corriendo.

24 25
EL LIBRO DEL VISUAL BASIC 1 Comenzar rápidamente con Visual Basic

chivos de proyecto (todos los archivos que tengan la extensión MAK). Abre el ar­
chivo CRONO.MAK haciendo doble clic sobre su nombre en la lista o seleccio­
nando el nombre del archivo y haciendo clic en el botón OK. Pulsa F5 para
ejecutar la aplicación, o si deseas modificarla de nuevo, abre las ventanas del for­
mulario o del código, haciendo clic sobre los botones correspondientes en la ven­
tana Project.

Figura 1.13.
El cuadro de diálogo Guardar como

aplicación Cronómetro tiene sólo un archivo de formulario.) Visual Basic sugerirá


el nombre por omisión PROJECT1.MAK para el archivo del proyecto de esta apli­
cación. Puedes utilizar un nombre de archivo diferente, pero en los archivos de
proyecto debes incluir la extensión MAK. De momento, guarda la aplicación Cro­
nómetro con el nombre CRONO.MAK. (Volveremos a este proyecto en un capítu­
lo posterior.)

Figura 1.14.
El cuadro de diálogo Save Project As

Para cargar y ejecutar tu aplicación más tarde, primero debes ejecutar Visual Ba­
sic. (Si quieres crear una versión de la aplicación que se ejecute como cualquier
otro programa de Windows, sin Visual Basic, debes compilar el programa, como
verás en el capítulo 2.) Luego elige el comando Open Project (abrir proyecto) del
menú File de Visual Basic o haz clic en el botón Open Project de la barra de he­
rramientas. El cuadro de diálogo Open Project mostrará una lista con todos los ar-

26 27
2
Datos e instrucciones
Seguro que estarás familiarizado con gran parte de la terminología que se usa en
la industria del ordenador: bits, bytes, RAM, ROM, CPU, etc. Pero si sólo tienes
una idea general de lo que estos términos significan, los apartados siguientes es­
tán pensados para ti. Comprender qué es lo que sucede dentro del ordenador es
una parte muy importante del proceso de aprender a programar. Desde luego
puedes limitarte, simplemente, a "aprender las reglas" y realizar el trabajo de for­
ma más o menos adecuada, pero un poco de conocimiento adicional puede ha­
certe avanzar un gran trecho en el proceso que debes seguir para sentirte a gusto
con los ordenadores y para ser productivo.

Ordenadores y datos
Los ordenadores son herramientas que sirven para manipular información, de la
misma manera que las sierras y los cepillos son herramientas que sirven para ma­
nipular la madera. La madera se mide en centímetros; la información se mide en
bits. Un bit es la unidad fundamental que mide cuánta información se puede
transferir de un lugar a otro. Es el bloque de información más pequeño del uni­
verso de la información. La respuesta a una cuestión, por ejemplo, requiere, al
menos, un bit de información —si no hay bits no hay respuesta. Sobre el papel
un bit se representa, por convenio, con el número 0, o con el número 1. En un
ordenador digital, un bit es representado por la existencia o inexistencia de co­
rriente eléctrica.

Si tienes 10 centímetros de madera sabes que estás trabajando con una cantidad
fija de material tangible. ¿Pero qué significa que tienes tres bits de información?
Significa, como Humpty Dumpty le dijo a Alicia, "sólo lo que yo quiera que signi­
fique". Como se ilustra en la figura 2.1, 3 bits pueden representar respuestas a las
tres cuestiones "¿Es más grande que una panera? ¿Tiene colores brillantes? ¿Sabe

29
EL LIBRO DEL VISUAL BASIC 2 Datos e instrucciones

Figura 2.1. Figura 2.2.


Bits representando información Los valores posicionales en el sistema numérico decimal

cantar? (no, sí, no); una serie de giros a la izquierda o a la derecha (izquierda, de­ de varias potencias de 10: el número 10, por ejemplo, representa a la suma de 1
recha, izquierda); o cualquier otro ejemplo. diez (101) y de 0 unos (100); el número 423 representa a la suma de 4 cientos
(102), 2 dieces (101) y 3 unos (100); y así sucesivamente.
El significado de la información representada por bits depende del contexto. Para
entender esto imagina que un amigo camina hacia ti por la calle y dice, "Cuarenta Este método general de representación de números se puede usar con otras bases
y dos". Tu primera reacción será, probablemente, de extrañeza. Pero si previa­ que no sean la base 10. Por ejemplo, el sistema numérico en base 7 utiliza los
siete dígitos 0, 1, 2, 3, 4, 5 y 6, y el valor de cada posición se incrementa en fun­
mente has saludado a tu amigo con una cuestión como "¿qué edad tienes?" ó
ción de las potencias de 7, como se muestra en la figura 2.3. (Un subíndice que
"¿cuál es la frecuencia, Francisco?" su respuesta tendrá un significado evidente. Tu
siga a un número denota la base; los números sin subíndice se presume que es­
pregunta ha creado un contexto para dicha respuesta.
tán en base 10, a no ser que se indique otra cosa.)
En un ordenador, algunos contextos son más adecuados que otros. Un contexto
Seguro que ya has captado la idea. El sistema binario usa dos dígitos (0 y 1), y
muy común es el numérico. Como los bits se escriben como ceros y unos, un
cada posición representa un incremento en valor correspondiente a una potencia
grupo de ellos puede representar un número binario (un valor en el sistema nu­
de 2. (Mira la figura 2.4.) El sistema binario es la solución ideal para que los orde­
mérico en base dos).
nadores representen números. Por supuesto, tú puedes realizar operaciones arit­
méticas en cualquier sistema numérico tan fácilmente como lo harías en base 10;
Representación de valores numéricos los ordenadores deben sumar, restar, multiplicar y dividir usando solamente nú­
meros binarios.
El sistema numérico decimal (base 10) utiliza diez símbolos para representar los
valores numéricos: 0, 1 , 2 , 3, 4, 5, 6, 7, 8 y 9. (Recuerda siempre que estos dígitos
son meramente símbolos: los romanos, por ejemplo, usaban el símbolo V para Representación de caracteres
representar el valor numérico 5, y la X para representar el valor 10.) Para repre­
En la mayoría de los casos, representar solamente información numérica resulta
sentar un valor mayor que 9 en el sistema numérico decimal —el 10, por ejem­ insuficiente. ¿Cómo se puede ir más allá del contexto de los meros números? Un
plo— se combinan dos de los símbolos, y las posiciones de los símbolos posible camino es utilizar un código estándar. En el código Morse, de carácter in­
adquieren un significado especial. La progresión de los valores representados por ternacional y que se usa para enviar señales telegráficas, ciertos patrones de soni­
las posiciones, como se muestra en la figura 2.2, corresponden a las sucesivas po­ dos representan letras del alfabeto: tres "puntos" en rápida sucesión representan a
tencias de 10. Un número decimal que conste de más de una posición es la suma

31
30
EL LIBRO DEL VISUAL BASIC
2 Datos e instrucciones

UNICODE, un estándar que admite los caracteres de los alfabetos no románicos,


como el árabe y el cirílico.) La versión extendida del código ASCII que se usa en
la mayoría de los ordenadores modernos utiliza 8 bits para representar cada letra,
número, signos de puntuación y otros códigos usados en datos de texto. En la fi­
gura 2.5 se muestran algunos ejemplos del código ASCII.

Carácter Valor ASCII (binario) Valor ASCII (decimal)

A 01000001 65
B 01000010 66
Figura 2.3. 01100001 97
a
Los valores posicionales en el sistema numérico en base 7
b 01100010 98
$ 00100100 36
3 00110011 51
+ 00101011 43
Z 01011010 90

Figura 2.5.
La codificación en ASCII de un grupo de caracteres

Sin embargo, recuerda que el mero examen de un grupo de bits no indica el con­
texto. Por ejemplo, el patrón de dígitos 01000001 representa a la letra A en el
código ASCII, pero también es la representación binaria del número 65. La inter­
pretación depende del contexto. Algunas veces se puede aprovechar esta circuns­
tancia, usando el valor a la vez como un carácter y como un número entero. Por
ejemplo, el hecho de que cada carácter tenga un valor numérico significa que
puedes comprobar si un carácter en particular es una mayúscula viendo si su va­
Figura 2.4.
lor numérico es mayor o igual que 65 ("A" en ASCII) y menor o igual que 90 ("Z"
Los valores posicionales en el sistema numérico binano
en ASCII).

El uso de bits, bytes y palabras


la letra S; tres "puntos" seguidos por una "raya" representan a la letra V; y así su­
Mediante el uso de bits para representar información, un ordenador puede alma­
cesivamente.
cenar o "recordar" esa información. Sin embargo, organizar la memoria sobre una
El estándar ASCII (American Standard Code for Information Interchange, o sea, base de bits es un inconveniente, debido a que un bit realmente no representa
código estándar americano para el intercambio de información) especifica un có­ mucha información. Con el código ASCII extendido, por ejemplo, como mínimo
digo de ese tipo. Los códigos ASCII usan valores numéricos para definir el con­ se necesitan 8 bits para representar un solo carácter.
junto de caracteres estándar del idioma inglés, incluyendo las letras mayúsculas y
De hecho, lo que ocupa un carácter de información sirve como unidad estándar
minúsculas, los números, los signos de puntuación y símbolos. (Como comenta­
de medida. La unidad estándar de 8 bits se denomina byte. Para referirse a canti-
rio, el anglocéntrico código ASCII será reemplazado en la próxima década por el

32 33
EL LIBRO DEL VISUAL BASIC
2 Datos e instrucciones

dades grandes de datos se añaden al término byte los prefijos numéricos kilo,
Puedes pensar en la RAM como en una larga fila de cajas, siendo cada caja lo su­
mega y giga. Debido a la afición de los informáticos por las potencias de 2, un
ficientemente grande como para contener un byte de datos, y estando cada caja
kilobyte representa 1024 (210) bytes, y un megabyte representa 1048576 (220)
identificada por un número. Por ejemplo, uno podría decir, "pásame el byte de
bytes. Detrás del gigabyte (230) viene el terabyte (240) y luego el petabyte (250)
datos de la caja 27441", o "pon la letra g en la caja 13". Al número identificativo
No tienes que preocuparte de lo que viene después.
de una posición de memoria se denomina su dirección.
Pero un byte no es apropiado para representar la mayoría de los valores numéri­
Como viste en el capítulo 1, Visual Basic te permite usar nombres en vez de nú­
cos. El estándar de 8 bits solamente puede representar los números decimales
meros para referirte a posiciones de memoria. (Al ordenador le basta con usar di­
desde el 0 al 255. Por ello, la mayoría de los ordenadores trabajan con los datos
recciones numéricas, pero los humanos se sienten más a gusto con nombres de
en unidades que son mayores que un byte, con el objeto de permitir unas opera­ variables simbólicos.) Cada variable, en Visual Basic, se corresponde con una po-
ciones aritméticas eficientes. El número de bits que un ordenador "prefiere" se sición de memoria, aunque en Visual Basic se le puede dar un nombre a un con­
denomina el tamaño de palabra del ordenador, y no es estándar. Muchos orde­ junto secuencial de bytes, en vez de usar cada byte independientemente. En el
nadores mainframe (de gran tamaño) y los modernos microordenadores tienen capítulo 3 aprenderás más sobre la manera en que Visual Basic almacena y repre­
un tamaño de palabra de 32 bits, lo cual permite números binarios del orden de senta los diferentes tipos de datos.
miles de millones. (Aunque el hardware se optimiza para usar este tamaño de pa­
labra, estos ordenadores no están limitados a los valores de 32 bits.)
Instrucciones de ordenador
Veamos ahora qué hace el ordenador con los datos que contiene. Dentro del or­
Almacenamiento de la información en el ordenador
denador hay uno o dos chips que actúan como la unidad central de proceso
La figura 2.6 muestra un diagrama simple de un ordenador. En los términos del (CPU). La CPU manipula los datos de la memoria de acuerdo con una colección
diagrama, se puede pensar en la memoria como en la caja en la que se almace­ de instrucciones denominadas un programa. Para que la CPU pueda ejecutar las
nan los bits cuando el ordenador está funcionando. Por el momento, restringi­ instrucciones el programa debe residir en la RAM. Por tanto, las instrucciones, al
remos nuestro estudio a la memoria electrónica denominada RAM (random access igual que los datos, deben estar representadas por secuencias de bits.
memory, es decir, memoria de acceso aleatorio).
Las instrucciones le dicen al ordenador que lleve a cabo operaciones simples y
específicas, como sumar, restar, comparar o copiar bits de una posición de me­
moria a otra. Otras instrucciones envían información a dispositivos externos de
entrada/salida (input/output, I/O) como un disco duro o un monitor. Por ejem­
plo, un patrón particular de bits podría representar la instrucción "añade 1 al nú­
mero que hay en la posición de memoria 732", o "escribe la letra M en el
dispositivo de salida número 3". Estos patrones de bits que controlan el procesa­
dor difieren de una CPU a otra. (Esta es la razón de que un programa escrito para
un IBM PC no funcione en un Apple Macintosh, y viceversa.) A la lista completa
de todas las instrucciones que controlan un procesador en particular se le deno­
mina el conjunto de instrucciones del procesador.

Es posible escribir programas introduciendo directamente los patrones de bits que


constituyen cada instrucción. Este método, al que se le llama programar en len­
guaje máquina, se utiliza muy raramente. Algo más habitual resulta que la gente
programe en lenguaje ensamblador; en el cual ciertas cadenas especiales de ca­
Figura 2.6.
Un diagrama de un ordenador
racteres, como ADD o TEST, corresponden a cada instrucción del lenguaje máqui-

34 35
EL LIBRO DEL VISUAL BASIC 2 Datos e instrucciones

na. Un programa denominado ensamblador traduce las cadenas de caracteres es­


critas por el programador en lenguaje máquina, como se ilustra en la figura 2.7.
Aunque programar en lenguaje ensamblador es, significativamente, menos trau­
mático (y menos proclive a que se cometan errores) que programar en lenguaje
máquina, el programador todavía necesita especificar cada una de las instruccio­
nes que el procesador debe realizar. La simple acción de recibir una pulsación de
tecla procedente del teclado conlleva decenas de instrucciones máquina. Conse­
cuentemente, el programa más sencillo requiere la ejecución de miles de instruc­
ciones, y los programas complejos constan de millones de ellas.

Compiladores e intérpretes
Unos programas especiales denominados compiladores pueden ayudarte a evitar
los gravosos detalles de la programación en lenguaje ensamblador. Un compila­
dor permite al programador escribir comandos que son muchísimo más producti­
vos que las instrucciones en lenguaje máquina o ensamblador; un comando
Basic, por ejemplo, se traduce, normalmente, en muchas instrucciones de len­
guaje máquina. El programador escribe comandos en el lenguaje fuente del com­
pilador, el cual traduce entonces el lenguaje fuente en lenguaje máquina. Los
lenguajes fuente en uso más comunes hoy día son el C, el Pascal y el Basic. La fi­
gura 2.8 ilustra la manera en que trabaja un compilador.

Figura 2.8.
Compilación desde lenguaje fuente a lenguaje máquina

Para simplificar, un compilador o un ensamblador lee un archivo de instrucciones


escritas por el programador y produce un archivo de código máquina como sali­
da. El programa en código máquina se ejecutará, entonces, para obtener el resul­
tado deseado. En los sistemas operativos MS-DOS y Windows, un archivo con las
extensiones EXE o COM contiene código máquina y puede ser cargado directa­
mente en memoria y ejecutado.

Los intérpretes, que también traducen las instrucciones en código fuente, son si­
milares a los compiladores. Sin embargo, un intérprete traduce una sola línea de
código y entonces ejecuta, inmediatamente, el código máquina resultante. El in­
térprete vuelve luego al código fuente y traduce la siguiente línea. En la figura 2.9
puedes ver una comparación de los intérpretes y de los compiladores. Otra ma­
nera de comprender la diferencia consiste en imaginar la diferencia que hay entre
Figura 2.7.
Un ensamblador funcionando la traducción de un libro a un idioma extranjero y la traducción en "tiempo real"

36 37
EL LIBRO DEL VISUAL BASIC
2 Datos e instrucciones

comienza a ejecutarlo. El capítulo 8 explica cómo suspender el programa mien­


tras se está ejecutando y enviar comandos directamente al intérprete para en­
contrar y solucionar errores que haya en el código del programa. Cuando el
intérprete está funcionando, tanto el programa Visual Basic como tu aplicación
deben estar en memoria a la misma vez.

También puedes compilar tu aplicación. Una aplicación compilada puede ejecu­


tarse en cualquier ordenador en el que esté funcionando Windows; no requiere
el programa Visual Basic para poder funcionar.

Compilación del programa Cronómetro


Tratemos ahora de compilar el programa que escribiste en el capítulo 1. Si no es­
tás ejecutando Visual Basic, arráncalo ahora. Carga el programa Cronómetro se­
leccionando el comando Open Project del menú Archivo. Abre CRONO.MAK,
que es el archivo de proyecto del programa Cronómetro. Para compilar la aplica­
ción, selecciona el comando Make EXE File (crear archivo EXE) del menú File. En
el cuadro de diálogo Make EXE File, que se muestra en la figura 2.10, cambia el
título de la aplicación por el de Cronómetro (en el cuadro Application Title). Esta­
blece el directorio que desees, introduce el nombre de archivo CRONO.EXE y
haz clic en el botón OK para cerrar el cuadro de diálogo. Visual Basic compilará
entonces tu programa en código máquina y lo escribirá en el archivo CRO­
NO.EXE.
Figura 2.9. Ahora prueba a ejecutar la versión compilada del programa Cronómetro sin Vi­
Compilación e interpretación sual Basic. Sal de Visual Basic seleccionando el comando Exit (salir) del menú
File. En el Administrador de programas de Windows selecciona el comando Eje­
cutar del menú Archivo. En el cuadro de texto Línea de comando del cuadro de
proporcionada por los intérpretes de las Naciones Unidas. El proceso de traducir
un libro es similar al trabajo que realiza un compilador: un traductor recibe la edi­
ción rusa de Guerra y paz y, tras muchos años de trabajo, produce un libro nue­
vo con el mismo texto en urdú. Sin embargo, los intérpretes de la ONU trabajan
con cada frase dicha inmediatamente, como hace un intérprete de ordenador.

Los compiladores y los intérpretes tienen cada cual sus ventajas. Los compilado­
res hacen su trabajo de traducción una sola vez y luego te dan un archivo ejecu­
table que puede ser ejecutado en cualquier momento. Los intérpretes te dan una
respuesta rápida y pueden ayudarte a detectar errores. Visual Basic contiene am­
bos, un intérprete y un compilador.

Ya has conocido la versión intérprete de Visual Basic. Cuando se selecciona el Figura 2.10.
comando Start del menú Run, Visual Basic traduce el código que tú has escrito y El cuadro de diálogo Make EXE File, el cual se usa para compilar programas

38 39
EL LIBRO DEL VISUAL BASIC

diálogo Ejecutar, escribe la ruta de acceso al programa; por ejemplo, \vb\cro-


no.exe y haz clic en Aceptar. La aplicación se carga y se ejecuta.

Puedes dar copias de tu programa a tus amigos y compañeros de trabajo, los cua­
3
les podrán ejecutarlas, aunque Visual Basic no esté instalado en sus ordenadores.
Sin embargo, necesitarán un archivo adicional denominado VBRUN300.DLL (el
cual fue añadido a tu directorio de Windows cuando instalaste Visual Basic).
Todo aquel que ejecute una aplicación compilada por Visual Basic necesita una
copia de este archivo. (Como Microsoft permite explícitamente distribuir este ar­
chivo, si entregas una copia de VBRUN300.DLL junto con un programa compila­
Variables y constantes
do no estarás violando el acuerdo de licencia de Visual Basic.)

Nota: Las versiones anteriores de Visual Basic tienen archivos con nom­
bres similares, en los que sólo varía la extensión: VBRUN100.DLL en la El capítulo 2 puso en evidencia el problema de discernir si un determinado dato
versión 1 y VBRUN200.DLL en la versión 2. es numérico, un carácter o algo completamente diferente. Visual Basic te ayuda a
solucionar el problema permitiéndote especificar distintos tipos de información.
VBRUN300.DLL contiene un conjunto de rutinas que tu programa necesita. Visual
Basic no compila todas las instrucciones directamente en código máquina. Algu­
nas instrucciones —por ejemplo las que calculan la hora actual— se necesitan tan
a menudo, que Visual Basic mantiene disponible una copia del código necesario Especificación de los tipos de datos de Visual Basic
en VBRUN300.DLL. Cuando tu programa solicita la hora actual se ejecuta el códi­
Como viste en el capítulo 2, los bits 01000001 representan a la letra A si el dato
go que hay en VBRUN300.DLL. Como el archivo también contiene las rutinas que
es un carácter ASCII, o al valor 65 si el dato es un entero binario de 8 bits. Po­
gestionan elementos básicos como las ventanas y los menús, incluso un programa
drías resolver esa ambigüedad mediante el desarrollo de códigos especiales de
muy simple, necesitará los recursos que VBRUN300.DLL proporciona.
bits para todos los tipos de información, pero, afortunadamente, es posible aho­
A medida que desarrolles aplicaciones más sofisticadas, es posible que necesites rrarse esa tarea gracias a que Visual Basic tiene definido un conjunto de repre­
añadir archivos DLL adicionales que también forman parte de Visual Basic. Visual sentaciones de datos estándar, denominadas tipos de datos. La figura 3.1 muestra
Basic puede ayudarte a crear un disco de instalación (como los que vienen en los los nombres y las características de todos los tipos de datos de Visual Basic.
programas profesionales) que incluya todos los componentes necesarios. Consul­
ta la sección "Application Setup Wizard" (asistente para la instalación de la aplica­
Nombre del tipo Descripción Rango Espacio
ción) del manual del programador cuando alcances este nivel. de valores
de datos del dato requerido

Integer (entero) Numérico, de -32768 a 32767 16 bits (2 bytes)


entero
Long (largo) Numérico, de -2147483648 a 32 bits (4 bytes)
entero 2147483647
String (cadena) Texto de 0 a 65500 caracteres 8 bits (1 byte)
aproximadamente por carácter

Figura 3.1. (continúa)


Los tipos de datos de Visual Basic

41
40
EL LIBRO DEL VISUAL BASIC
3 Variables y constantes

Figura 3.1. continuación pos que acabamos de ver; y un código que indica el tipo de valor (currency o
string, por ejemplo).
Nombre del tipo Descripción Rango Espacio
de datos del dato de valores requerido
Rango
Currency Numérico, de -922337203685477,5807 64 bits (8 bytes) La característica más importante de los tipos de datos numéricos es su rango, el
(moneda) decimal fijo a 922337203685477,5807 cual limita los valores que un tipo de datos puede tomar. Estos límites se basan
Single (simple) Numérico, real de ±1,40x1045 a ±3,40x1038 32 bits (4 bytes) en el número de bits que se usan para codificar el valor. Por ejemplo, piensa en
Double (doble) Numérico, real de ±4,94x10324 a ±l,79xl0308 64 bits (8 bytes) la figura 3.2, la cual ilustra qué sucede cuando se intenta contar de 0 a 9 usando
Variant Adaptable Cualquiera de los anteriores Depende del un número binario de 3 bits. Con tres bits sólo se pueden definir ocho valores.
(variable) valor almace- Consiguientemente, alguna información se pierde, circunstancia a la que se deno­
nado mina overflow (desbordamiento) debido a que el número de bits requeridos para
almacenar la información sobrepasa al número de bits disponibles.

Los tipos integer y long son simplemente enteros de 16 y 32 bits respectivamente, Como programador tú debes decidir el tipo de datos que se debe utilizar para un
representados por valores binarios como los que se vieron en el capítulo 2. Estos valor dado. Si estás escribiendo programas muy sencillos puedes ignorar, razo­
dos tipos representan solamente números que no tienen parte fraccional. Los en­ nablemente, la cuestión usando siempre el tipo de datos variant, el cual puede
teros requieren sólo 16 bits de memoria pero tienen un rango más restringido que representar cualquier valor. Sin embargo, cuando tus programas se hagan más
los largos. (Hablaremos enseguida con más profundidad sobre los rangos) complejos tendrás que elegir más cuidadosamente, para poder gestionar con éxi­
to los problemas de espacio y de eficiencia. (El tipo variant es, en cierto modo,
Una string es una secuencia de caracteres, cada uno de los cuales está repre­ poco eficiente, ya que Visual Basic tiene que estar continuamente comprobando
sentado mediante el sistema de codificación ASCII. Una secuencia que no contie­ todos los valores para determinar de qué tipo son.)
ne ningún carácter se denomina cadena vacía.

El tipo de datos currency está especialmente diseñado para representar valores


monetarios. Un valor monetario tiene siempre una precisión de cuatro decimales;
o sea, puedes representar el valor 11,1625 pero no el valor 21,00003. (Este último
valor se redondearía a 21,0000.)

Los tipos single y double permiten expresar números en coma flotante. Los núme­
ros en coma flotante (también denominados números reales, o simplemente rea­
les para acortar) representan valores que tienen partes fraccionales. El nombre
coma flotante proviene de la coma decimal "flotante", la cual puede aparecer en
cualquier lugar del número, como en ,000001, 356,876, y 100000,0. Esto contrasta
con el tipo monetario, que es un ejemplo de un tipo de datos de coma fija. Vi­
sual Basic también hace un uso especial del tipo doble para codificar las fechas y
las horas; puedes encontrar más información sobre esta técnica de codificación
en el manual de referencia de Visual Basic.

Finalmente, Visual Basic incluye el tipo variant, una especie de camaleón que
puede tomar cualquier valor. Los datos del tipo variant realmente contienen dos
figura 3.2.
elementos de información: un valor que puede pertenecer a cualquiera de los ti­
Pérdida de información como consecuencia de un desbordamiento

42 43
EL LIBRO DEL VISUAL BASIC
3 Variables y constantes

Un primer contacto con la coma flotante esté en ese rango, pero sólo puede tener un máximo de 6 dígitos significativos; o
sea, podría representar solamente el valor 1,217342x1011 o 121,734,200000. ¡Tu
Cuando trabajes con números en coma flotante te darás cuenta de que su preci­ primer día de trabajo y ya has perdido 40722 pesetas!
sión es casi tan importante como su rango. Los números en coma flotante tienen
Nota: El tipo de datos currency de Visual Basic es perfecto para trabajar
tanto un rango, que define los valores más grandes y más pequeños que pueden
con cantidades monetarias. Proporciona 8 dígitos de precisión y siempre
representar, como una precisión, que es el número de dígitos significativos que
mantiene cuatro de esos dígitos a la derecha de la coma decimal. Una
contiene el valor.
variable del tipo double proporciona el mismo rango y precisión, pero el
Visual Basic almacena los números en coma flotante mediante una versión binaria tipo currency, que es de coma fija y no está sujeto a redondeo, es preferi­
de la notación científica. En la notación científica los valores se expresan como el ble cuando trabajes con monedas.
producto de dos números: una fracción y un exponente. En la notación científica
Evidentemente, no tienes que despreciar el tipo single si es apropiado. Por ejem­
decimal, por ejemplo, se puede representar la distancia entre la tierra y el sol
plo, si estás trabajando con ecuaciones físicas y midiendo el número de átomos
como 2,29x1012 centímetros.
que hay en una onza de silicio (aproximadamente 6,02x1023), un número real de
La paite fraccional de un dato single es un valor binario que expresa apenas 6 dí­ precisión simple servirá para este propósito admirablemente —¡a no ser que pre­
gitos decimales de precisión. El exponente permite al valor variar en un rango tendas contar los átomos muy, muy cuidadosamente!
que va desde números muy pequeños (10-45) a muy grandes (1038). El tipo dou­
ble representa valores en un rango incluso aún mayor (de 10-324 a 10308 ) con, Creación de variables y constantes
aproximadamente, 13 dígitos de precisión decimal. Independientemente de su tipo, el mero hecho de almacenar datos en memoria
Si piensas que es algo extraño que un número de 300 dígitos tenga solamente 13 no tiene ninguna utilidad a no ser que te puedas referir a ellos de alguna manera.
dígitos de precisión, considera esto: el número 0,00000000017 parece muy preci­ Visual Basic te permite dar nombres a posiciones de memoria de manera que
so. En realidad, ese número tiene sólo dos dígitos de precisión. Esto es más fácil puedas acceder a los datos que están almacenados allí. A una posición de memo-
de observar cuando se escribe el número en notación científica: 1,7x10-10. La frac­ ria a la que se le ha dado un nombre se le llama variable. La declaración Dim, la
ción es sólo 1,7; el resto de la información (el exponente) te dice dónde situar la cual informa a Visual Basic de tu intención de reservar espacio, tiene la siguiente
coma decimal. Veamos otro ejemplo. Piensa en el valor 2,29xl012 centímetros. sintaxis o formato:
Aunque representa a un número de 13 dígitos sólo los tres primeros dígitos repre­ Dim variable [As tipo]
sentan la precisión. La medida puede estar equivocada en miles de centímetros,
pero el error no se considera importante. Cuando uses esta declaración debes escribir la palabra clave Dim (que aparece
en tipo roman en la línea donde se muestra la sintaxis) seguida del nombre espe­
La distinción entre precisión y rango es sutil pero importante. Supon que te con­ cífico de la variable que quieres usar (que aparece en cursiva en la línea donde
trata la Inmensamente Buena Megaempresa, S.A. para que escribas un programa se muestra la sintaxis). La parte que aparece entre corchetes es opcional; si la uti­
que controle las cuentas de la sociedad. Esta compañía tiene ingresos de miles de lizas, escribe la palabra clave As y luego especifica el tipo, sin incluir los corche­
millones de pesetas anualmente. Podrías pensar que el tipo single es adecuado tes. (En el capítulo 5 se tratará más en profundidad la notación de la sintaxis.) Por
para tu programa ya que su rango se extiende hasta 1038, lo que es conside­ ejemplo, la siguiente línea de código le dice a Visual Basic que reserve suficiente
rablemente más de cien mil millones (1011). Por desgracia, debes ser extremada­ memoria para un dato del tipo currency (8 bytes) y que se refiera a esa posición
mente preciso cuando lleves las cuentas y saber que el tipo single no tiene la de memoria con el nombre Ahorros-.
precisión que te permite ese nivel de exactitud. Si empezaste con un saldo de
Dim Ahorros As Currency
121734 240722 pesetas, por ejemplo, necesitarás 12 dígitos de precisión para rep­
resentar el saldo debido a que cada uno de los 12 dígitos del valor es significati­ Utilizando el nombre de la variable puedes ordenar más tarde a Visual Basic que
vo. Un número real de precisión simple (single) puede representar un valor que almacene un dato nuevo en esa posición, que lo recupere, que lo modifique, et-

44 45
EL LIBRO DEL VISUAL BASIC
3 Variables y constantes

cétera. Si omites la cláusula As, Visual Basic asume por omisión que la variable es
Para esos valores fijos, Visual Basic te permite declarar constantes, que son posi­
del tipo variant
ciones de memoria cuyo contenido no cambia (al contrario que el contenido de
Puedes pensar en las variables como si estuvieran contenidas en cajas. La declara­ las variables). Si tratas de modificar una constante, Visual Basic generará un men­
ción Dim crea una caja nueva de un cierto tamaño y le da un nombre, como se saje de error. La declaración Const sirve para crear una constante, y presenta la si­
ilustra en la figura 3.3. Cuando uses el nombre de una variable en un programa, guiente sintaxis:
Visual Basic te proporcionará el contenido actual de la caja (el valor que está
Const nombre = expresión
almacenado allí en ese momento). El programa que escribiste en el capítulo 1
usaba tres variables: HoraInicio, HoraParada y Lapsus. Cuando el programa se No tienes que declarar el tipo de constante, ya que Visual Basic determina el tipo
ejecuta almacena valores que representan la hora actual y el tiempo transcurrido a partir del valor de expresión. Si escribes Const RESPUESTA = 42, Visual Basic
en esas variables. usa un entero; si introduces Const NOMBRE = "Rosa", crea una constante de cade­
na de caracteres. (Los nombres de las constantes, normalmente, se escriben en
Cuando se reserva memoria para una variable numérica, Visual Basic le da a la mayúsculas.)
variable un valor inicial de 0. Pero no suele ser una buena idea confiar sim­
plemente en esa inicialización automática. En lugar de esto, si quieres que una Con frecuencia se produce cierta ambigüedad sobre el tipo de constante que Vi­
variable tome un valor, debes asignarle ese valor en el programa. Asignar explí­ sual Basic debe crear. Por ejemplo, el valor 3,01 puede ser single, double o cu-
citamente un valor a una variable hace que el programa sea más fácil de leer y rrency. Por omisión, Visual Basic elige la representación que requiere una menor
evita las presunciones ocultas. Además, debes recordar que la inicialización auto­ cantidad de memoria. Sin embargo, se puede forzar la elección poniendo detrás
mática es una característica específica de Visual Basic. Si conviertes tu programa a del nombre un carácter especial. Utiliza este carácter solamente en la declaración,
algún otro entorno de programación, el nuevo sistema puede no contemplar la y no en el propio programa. Los caracteres que determinan el tipo de dato en Vi­
sual Basic aparecen en la figura 3.4.
inicialización y, por tanto, tu programa no funcionará.

De vez en cuando también querrás usar valores que no cambian —por ejemplo,
el valor de pi, el número de Avogadro o el número de gramos de una onza. Aun­ Carácter Tipo de dato especificado
que puedes usar directamente en un programa estos valores numéricos, es más
% Integer (entero)
fácil usar un nombre como PI que poner en su lugar el número 3,1415926 cada
& Long (largo)
vez que sea necesario.
! Single (real simple)
# Doble (real doble)
@ Currency (coma fija)
$ String (cadena de caracteres)

Figura 3.4.
Los caracteres que determinan el tipo de dato en Visual Basic

De esta manera, la declaración Const UNO& = 1 reserva 4 bytes de memoria para


una constante long, y la declaración Const UNO# = 1 reserva 8 bytes y almacena
el valor mediante una representación en coma flotante. En ambos casos, en tu
programa debes usar el nombre UNO (sin el carácter especial) para referirte al
valor. Debes adquirir la costumbre de definir constantes para los valores estándar;
Figura 3.3.
esta práctica hará tus programas mucho más fáciles de leer.
Reserva de espacio con las declaraciones de variables

46 47
EL LIBRO DEL VISUAL BASIC 3 Variables y constantes

Consejo: En ocasiones puedes necesitar definir una constante grande,


un valor como el número de Avogadro, por ejemplo. El número de Avo-
gadro, el cual estoy seguro que recuerdas, vale 6,02x1023. Afortuna­
Comentarios
damente, no tienes que escribirlo como 602000000000000000000000. Un carácter apostrofe precede a un comentario del programador en el có­
Visual Basic te permite introducir constantes del tipo single especifican­ digo de Visual Basic. El apostrofe, o carácter del comentario, te permite in­
do la parte fraccional del número (la mantisa) seguida por la letra E y sertar comentarios sobre tu programa en cualquier lugar del código. Como
del exponente (6,02E23 en este caso). Para constantes dobles usa la letra Visual Basic ignora todos los caracteres que hay a la derecha del apostrofe,
D en lugar de la E (6,02D23). ese texto sólo debe contener información o descripciones que sean útiles a
aquellos que lean el programa. Cuando un apostrofe es el primer carácter
de una línea, toda la línea es un comentario. Date cuenta de que si un co­
Reglas para los nombres mentario excede de una línea, debes poner un apostrofe delante de cada
Cuando le des nombres en Visual Basic a variables y constantes, debes seguir es­ una de las líneas.
tas reglas:
Aquí tienes el aspecto que podría presentar el procedimiento del evento
■ El primer carácter del nombre debe ser una letra. btnInicio_Click de la aplicación Cronómetro del capítulo 1 si añadieses co­
mentarios:
■ Los caracteres siguientes sólo pueden ser letras, números o el carácter de
subrayado. Sub btnInicio_Click ( )
’Este procedimiento captura la hora a la que el usuario hizo
■ El nombre no puede tener más de 40 caracteres. ’clic en el botón Inicio
HoraInicio = Now ’Almacena la hora de inicio
■ Las palabras clave que tienen un significado especial en Visual Basic, como
txtInicio.Text = Format (Hora Inicio, "hh:mm:ss")
Sub, Now y End no se pueden utilizar como nombres. (Si no estás seguro
’Muestra en pantalla la hora de inicio
de si una palabra es una palabra clave de Visual Basic, pulsa El para que txtParada.Text= ’Borra la hora de parada
aparezca el sistema de Ayuda y busca el tema Reserved words palabras re­ txtLapsus.Text= ’Borra el tiempo transcurrido
servadas.) btnParada.Enabled = True ’Activa el botón Parada
btnInicio.Enabled = False ’Desactiva el botón Inicio
Estas declaraciones utilizan nombres ilegales:
End Sub
Dim 1ceEraseUnaVez 'Comienza con un número
Const PRINT = 2 ’Print es una palabra reservada
Dim Esto*lo*es As Currency ’Los asteriscos no están permitidos las: el uso de ambas clarifica, por ejemplo, comenzar por mayúsculas cada pala­
bra de los nombres de variables que contienen varias palabras, y poner todas las
Las siguientes declaraciones son válidas en Visual Basic:
letras de las constantes en mayúsculas.
Dim EsteEsUnNombreDeVariableLargo As Integer
Dim RX7 As String
Const CMS_P0R_PULGADA = 2,54 Creación de tipos definidos por el usuario
Visual Basic no le presta atención al hecho de que las letras que se usan en los Los tipos de datos que están creados en Visual Basic normalmente son todos los
nombres de las variables estén en mayúsculas o en minúsculas; HOLA, HoLa y que necesitas para la información que se divide con facilidad en componentes in­
bola son el mismo nombre de variable. Después de que definas un nombre de dividuales de texto o números, como nombres, tamaños, temperaturas, etc. Pero
variable, Visual Basic se asegura de que cada referencia a esa variable se adapte a estos tipos de datos pueden ser inadecuados cuando se trabaja con componentes
las mayúsculas y minúsculas que utilizaste al introducida por última vez. Los pro­ de la información que deban estar unidos o agrupados juntos. Veamos un ejem­
gramas son más legibles cuando se usan tanto letras mayúsculas como minúscu- plo específico.

48 49
EL LIBRO DEL VISUAL BASIC
3 Variables y constantes

Supon que tu hobby es criar animales exóticos y que has adquirido dos comadre­
la posición de almacenamiento. Después de que hayas definido el nuevo tipo
jas copetudas alemanas llamadas Siegmund y Sieglinde. Ansioso por poner a
puedes crear variables de la manera habitual:
prueba tus nuevas habilidades como programador decides mantener unos datos
descriptivos de tus mascotas en el ordenador, incluyendo datos sobre el color, el Dim Siegmund As ComadrejaCopetudaAlemana
Dim Sieglinde As ComadrejaCopetudaAlemana
peso, la longitud y la fecha de nacimiento, así como el tamaño y el color de sus
copetes. (Los copetes largos y sedosos representan la característica más apreciada Estas dos declaraciones crean las variables Siegmund y Sieglinde —o sea, reser­
de las comadrejas copetudas alemanas.) Podrías empezar escribiendo declaracio­ van espacio y le dan el nombre apropiado. Cada variable contiene todos los com­
nes como estas: ponentes del tipo de dato que has definido. En la mayoría de los lenguajes de
programación, las variables que contienen varios componentes se denominan re­
Dim Siegmund_Color As String
Dim Siegmund_Peso As Integer cords (registros), y cada componente individual es un elemento del registro.
Dim Siegmund_Longitud As Integer Cuando uses la variable Siegmund te estarás refiriendo a todos los datos (color,
Dim Siegmund_FechaNacimiento As Double peso, fecha de nacimiento, etc.) simultáneamente. Cuando quieras referirte sola­
Dim Siegmund_ColorCopete As String mente a un componente individual deberás usar el nombre de la variable seguida
Dim Siegmund_LongitudCopete As Integer por un punto (.) y por el nombre del componente. Así, Siegmung.Peso es el com­
Y luego tendrías que volver a hacerlo todo para Sieglinde: ponente de tipo entero que contiene el valor del peso del macho, y Sieglinde .Co­
lor es la cadena de texto que describe el color del pelo de la hembra.
Dim Sieglinde_Color As String
Dim Sieglinde_Peso As Integer
Dim Sieglinde_Longitud As Integer Ventajas prácticas
Dim Sieglinde_FechaNacimiento As Double
Debes considerar el empleo de tipos definidos por el usuario en tus programas
Dim Sieglinde_ColorCopete As String
siempre que sea posible. No sólo son adecuados sino que hacen que los progra­
Dim Sieglinde_LongitudCopete As Integer
mas sean más fáciles de leer y de actualizar. Piensa en el ejemplo de los datos de
Sería mucho más fácil declarar, simplemente, la información relevante una vez. las comadrejas. Tu primer intento de crear las variables conllevó 12 declaraciones
Visual Basic ofrece la solución perfecta: crear tus propios tipos de datos. Dim, cada una de las cuales definía un atributo de una de las comadrejas. Si
quieres saber qué está ocurriendo debes leer las 12 declaraciones para determinar
Un tipo definido por el usuario se crea a partir de los tipos existentes en Visual
qué atributos de Siegmund y de Sieglinde se están declarando. Incluso, entonces,
Basic: integers, strings, doubles, etc. La palabra clave Type señala en Visual Basic
no está claro si se han definido otros atributos en cualquier otro lugar, ni puedes
el comienzo de una declaración de tipo definido por el usuario, como se muestra
afirmar con certeza que Siegmund y Sieglinde sean datos relacionados.
a continuación:
Type ComadrejaCopetudaAlemana
Esta confusión contrasta con la claridad de la declaración del tipo definido por el
Peso As Integer usuario. Los atributos de la declaración Type pertenecen claramente a Comadreja-
Longitud As Integer CopetudaAlemana. Con una mirada a las variables Siegmund y Sieglinde podrás
FechaNacimiento As Double decir que ambas son del mismo tipo, y podrás averiguar fácilmente la informa­
ColorCopete As String ción que contienen. Todavía más, si actualizas el programa en el futuro —si deci­
LongitudCopete As Integer des, por ejemplo, añadir el color de los ojos al grupo de datos que mantienes
End Type sobre los animalitos— simplemente tendrás que cambiar la declaración Type para
La declaración Type consolida toda la información que consideres importante so­ actualizar la definición de todas las variables. De la misma manera, si las dos co­
bre tus pequeños amigos peludos. Observa que todavía no has reservado ningún madrejas empiezan a comportarse amorosamente y se presentan con un bebe
espacio para los datos; simplemente, le has descrito a Visual Basic la estructura o comadreja, podrás añadir al programa una variable para el pequeño Siegfried con
diseño de los datos. Puedes pensar en esta declaración como en un esquema de la simple declaración Dim Siegfried As ComadrejaCopetudaAlemana.

50 51
EL LIBRO DEL VISUAL BASIC 3 Variables y constantes

Déjà Vu
La manera en que se accede a los campos en los tipos definidos por el usuario
recuerda a la manera en que estableciste las propiedades en la aplicación Cro­
nómetro (capítulo 1). En el programa Cronómetro utilizaste la instrucción txtLap-
sus.Text = Format(Lapsus, "hh.mm.ss") para establecer la propiedad Text del
objeto txtLapsus.
Sub Command1_Click ()
Observa la similitud entre la referencia a txtLapsus. Text (que aparece en la forma
Dim TuNombre As String
objeto.propiedad) de esa declaración y las referencias a los componentes de las TuNombre = InputBox("¿Cuál es tu nombre?")
variables como Siegfried.Color (que aparece con la forma variable.elemento). MsgBox "Tu nombre es " + TuNombre
Cada objeto está representado en la memoria; cuando modificas una propiedad End Sub
alteras un componente de ese objeto. En algunos lenguajes de programación,
Examinemos este conjunto de instrucciones. La primera línea es la declaración del
Siegmund y Sieglinde también serían considerados objetos y habría que referirse
procedimiento. La segunda línea reserva espacio para una variable de cadena de
a sus elementos como propiedades. Otra terminología también habitual denomina
caracteres llamada TuNombre. La tercera línea llama a la función InputBox(recua­
record (registro) a una variable con muchos componentes, y field (campo) a cada
dro de introducción de datos), una función interna que muestra un cuadro de
elemento individual del registro. Este libro usa los términos campo y elemento de
diálogo en la pantalla. El usuario escribe texto en el cuadro de diálogo y la fun­
manera intercambiable, pero reserva la palabra propiedad para describir los com­
ción devuelve el texto como su valor. El resultado se almacena en la variable Tu­
ponentes de los elementos que están diseñados específicamente como objetos en
Nombre. La cuarta línea de código utiliza el procedimiento interno MsgBox
Visual Basic.
(recuadro de mensajes) para mostrar en pantalla un cuadro de diálogo que con­
tiene el texto Tu nombre es, seguido del valor almacenado en TuNombre. El ope­
Determinar el ámbito rador más ( + ) concatena o "pega juntas" dos cadenas; por ejemplo, la expresión
"Hol" + "a, marinero" es equivalente a la cadena "Hola, marinero". Finalmente, la
Probemos un experimento: última línea marca el final del procedimiento.
1. Arranca Visual Basic o selecciona el comando New Project del menú File 5. Ahora selecciona el botón Command2 del cuadro Object de la ventana de
para crear un proyecto nuevo. código e introduce el siguiente código como su procedimiento Click.
2. Crea dos botones de comando en el formulario, uno debajo del otro. Pue­ Sub Command2_Click ()
des hacer doble clic en la herramienta Command Button de la caja de Dim TuNombre As String
herramientas o seleccionar la herramienta y dibujar los botones en el for­ MsgBox "Hola " + TuNombre
mulario. End Sub

3. Selecciona el primer botón (Command1) y luego selecciona la propiedad Este procedimiento, simplemente, mostrará en pantalla la palabra Hola y el valor
Caption de la lista de propiedades de la ventana Properties. Establece el tí­ de TuNombre. Puedes usar el procedimiento MsgBox y el operador de concatena­
tulo de este botón como EstablecerYMostrar escribiendo este nuevo valor ción (+), igual que hiciste en el procedimiento anterior.
en el cuadro Ajustes. Luego selecciona el segundo botón y establece su tí­
6. Cierra la ventana de código y pulsa F5 para arrancar esta aplicación.
tulo como Mostrar, produciendo el resultado que se muestra al comienzo
de la página siguiente. 7. Haz clic en el botón EstablecerYMostrar. Escribe un nombre en el cuadro
de diálogo y pulsa Intro o haz clic en el botón Aceptar. Si escribiste San­
4. Haz doble clic en el botón EstablecerYMostrar para que aparezca la venta­
dra, por ejemplo, el resultado debe parecerse a la figura siguiente.
na de código. Luego define en ella el siguiente procedimiento.

53
52
EL LIBRO DEL VISUAL BASIC
3 Variables y constantes

bles locales. La segunda vez declaraste una sola variable en la sección de declara­
ciones generales del formulario, haciéndola, por tanto, una variable de nivel de
módulo. Las variables declaradas de esta manera son accesibles desde cualquier
procedimiento del formulario. (La palabra módulo en este contexto se refiere
esencialmente a un archivo; recuerda que todo el código de un formulario se al­
macena en un solo archivo.) La diferencia entre las dos versiones del programa se
ilustra en la figura 3.5.

Limitar el ámbito de una variable es útil ya que permite utilizar varias veces el
8. Haz clic en el botón Aceptar para cerrar el cuadro de diálogo. Ahora haz mismo nombre de variable. Por ejemplo, si sumas ciertos números en un procedi­
clic en el botón Mostrar. El cuadro de diálogo muestra la palabra Hola, miento puedes almacenar el resultado en una variable local llamada Suma. Si más
pero nada más. adelante escribes otro procedimiento que lleve a cabo una tarea similar pero sin

¿Por qué no ha preservado Visual Basic el valor de la variable TuNombre? ¿Por­


qué se comporta esta aplicación de manera distinta que la aplicación Cronómetro
del capítulo 1? Hay una explicación muy sencilla: el programa Cronómetro con­
tiene sólo una declaración Dim, y no está situada dentro de un procedimiento.
Vamos a intentarlo otra vez, usando ahora el formato que tuvo éxito en la aplica­
ción Cronómetro:

1. Selecciona el comando End del menú Run para terminar la aplicación.

2. Haz doble clic en el botón EstablecerYMostrar de la ventana del formulario


para ir a la ventana de código, y una vez allí borra la declaración Dim del
procedimiento Click.

3. Selecciona el botón Command2 (Mostrar) del cuadro Object y borra tam­


bién su declaración Dim.

4. Selecciona (general) del cuadro Object. En esta sección de declaraciones


generales escribe la declaración Dim TuNombre As String.

5. Cierra la ventana de código y ejecuta la aplicación otra vez.

Esta vez el botón Mostrar es coherente con el botón EstablecerYMostrar. Acabas


de ver los efectos del ámbito de una variable.

Variables locales y de nivel de módulo


El ámbito de una variable determina qué procedimientos tienen acceso a esa va­
riable. La primera vez que ejecutaste el ejemplo anterior creaste dos copias de la
variable TuNombre, cada una de las cuales era accesible solamente desde dentro Figura 3.5.
de su procedimiento específico. A este tipo de variables se les denomina varia­ Variables locales frente a variables de nivel de módulo

54 55
EL LIBRO DEL VISUAL BASIC
3 Variables y constantes

relación, puedes volver a usar el nombre de variable Suma sin que ello afecte al Usa la palabra clave Global en lugar de Dim para crear variables locales. El resto
resultado del otro cálculo. El ámbito local permite que cada procedimiento sea de la sintaxis es idéntica a la de la declaración Dim:
una unidad autocontenida —o sea, que cambios en otras partes del programa no
interfieren con el funcionamiento de un procedimiento determinado. Global variable [As tipo)

Las reglas del ámbito también se aplican a las constantes. Las constantes declara­
Variables globales das con la palabra clave Const serán de ámbito local o de nivel de módulo, de­
Las variables de nivel de módulo son visibles únicamente desde dentro de un for­ pendiendo de si las has definido en un procedimiento o en un módulo. Para
mulario. Si escribes un programa con varios formularios necesitarás alguna forma crear constantes globales sitúa la declaración en la sección de declaraciones gene­
de compartir información entre los formularios. Por tanto, Visual Basic propor­ rales de un módulo y usa la palabra clave Global para comenzar la declaración
ciona un tercer nivel de ámbito, las variables globales. Las variables globales se Const, como se muestra a continuación:
declaran en módulos de código y son accesibles desde cualquier parte del pro­ Global Const VELOCIDADLUZ! = 186000
grama. (Trataremos los módulos de código, en el siguiente apartado.) Puedes ver Global Const CAPITAL_DE_GALICIA = "La Coruña"
en la figura 3.6 un ejemplo de los tres niveles del ámbito de las variables.
El signo de exclamación de la constante VELOCIDADLUZ le dice a Visual Basic
que la almacene como un número real de precisión simple. Recuerda, sin embar­
go, que las variables y constantes globales no se pueden definir en un formulario.

Módulos de código
Como has visto, la definición de un formulario y todo su código asociado se al­
macena en un solo archivo con la extensión FRM. Es posible crear aplicaciones
que tengan varios formularios y, por tanto, varios archivos de código. También
puedes tener archivos de aplicación que no contengan nada más que código. Es­
tos módulos de código, cuyos archivos tienen la extensión BAS, se crean cuando
se elige el comando New Module (nuevo módulo) del menú File de Visual Basic
o se hace clic en el botón New Module de la barra de herramientas.

Los módulos de código separados son útiles, principalmente, para compartir códi­
go y para organizar los programas. Las declaraciones globales de un módulo de
código pueden ser compartidas por todo el programa. (Las declaraciones de va­
riables de un formulario sólo son accesibles desde el módulo del formulario.)
Cuando estés creando programas grandes y complejos, es posible que también
encuentres de utilidad poner todo el código relacionado con una faceta particular
del programa en un módulo separado.

Procedimiento Puede acceder a las variables


A L, Y y X
Declaraciones por omisión
B M, Y y X Puedes declarar una variable local sin necesidad de utilizar una declaración Dim:
C N, Z y X simplemente, comienza a utilizar el nombre de la variable cuando lo necesites.
Figuro 3.6. Puedes utilizar uno de los caracteres especiales (%, &, !, # ó $) para especificar el
Variables globales, de nivel de módulo y locales tipo de datos de la variable; si no lo haces así, Visual Basic asignará el tipo va-

56 57
EL LIBRO DEL VISUAL BASIC 3 Variables y constantes

Define el procedimiento de evento Click para el botón de comando como se


El archivo CONSTANT.TXT muestra aquí:

Visual Basic proporciona un archivo de texto extremadamente práctico lla­ Sub Command1_Click
mado CONSTANT.TXT. El archivo contiene decenas de constantes globales Respuesta$ = InputBox("¿Me quieres?")
que te pueden resultar útiles. Puedes incluir todas estas constantes en tu If Respuestas = "si" Then
programa de manera automática, si sigues estos pasos: MsgBox "Me quiere"
El se
1. Selecciona el comando New Module (nuevo módulo) del menú File. MsgBox "No me quiere"
En la ventana de código del módulo selecciona la sección de decla­ End If
raciones generales. End Sub

En este fragmento de código, la variable Respuesta$ no está declarada formalmen­


2. Elige el comando Load Text (cargar texto) del menú File.
te. Sin embargo, el signo de dólar indica que es una variable de cadena de carac­
3. Selecciona el archivo CONSTANT.TXT del cuadro de diálogo Load teres. Por omisión, Visual Basic crea una variable de ámbito local.
Text y haz clic en el botón Merge (combinar).
Aunque las declaraciones por omisión son prácticas, es de sabios (y prudentes)
evitarlas y declarar en su lugar todas las variables que use tu programa. El uso de
declaraciones por omisión puede conducir a que se produzcan errores en tus
programas. En el caso anterior, por ejemplo, podrías declarar una variable de ni­
vel de módulo llamada Respuesta como parte de una modificación posterior del
programa. Cuando ejecutases el procedimiento, Visual Basic asumiría que la va­
riable Respuesta del procedimiento Command1_Click. se refiere a la variable de
nivel de módulo porque se ha omitido tina declaración local explícita. Consi­
guientemente, después de que se ejecute este procedimiento, se habrá sobreescri­
to cualquier dato que hubiera almacenado en la variable Respuesta de nivel de
módulo.

Las declaraciones por omisión siempre generan variables locales. Las variables de
Precaución: Si haces clic en el botón Replace (reemplazar) del nivel de módulo y globales deben declararse usando las palabras clave Dim o
cuadro de diálogo Load Text sustituirás todas las declaraciones que Global en la parte de declaraciones generales de una ventana de código. Una de­
haya en ese momento en la sección de declaraciones generales. claración Dim dentro de un procedimiento declara una variable local.

Para hacer que el tamaño del programa se mantenga pequeño puedes bo­ Visual Basic puede ayudarte a evitar las declaraciones por omisión. Selecciona el
rrar todas las constantes que no necesites. Si sólo necesitas algunas cons­ comando Environment (entorno) del menú Options. En el cuadro de diálogo En-
tantes puede que te resulte más fácil usar el programa Bloc de notas de vironment Options (opciones del entorno), establece la opción Require Variable
Windows para abrir CONSTANT.TXT y, simplemente, copiar y pegar las Declarations (requerir declaraciones de variables) como Yes (sí), como se muestra
constantes que quieras desde el archivo a su aplicación. en la figura 3.7.

Ahora, cada vez que crees un archivo nuevo, Visual Basic añadirá la declaración
Option Explicit a la sección de declaraciones generales del código. (También pue­
des introducir esta declaración directamente en la sección de declaraciones gene­
riant por omisión. A modo de ejemplo, abre un nuevo proyecto y pon un solo
rales si quieres.) Si luego tratas de ejecutar un programa que contenga una
botón de comando en el formulario.

59
58
EL LIBRO DEL VISUAL BASIC
3 Variables y constantes

variable no declarada, Visual Basic resaltará la variable y mostrará el mensaje Va­


máticamente la versión actual de tus archivos de formulario y de proyecto antes
riable not defined (variable no definida).
de ejecutar la aplicación. Ello te asegurará que no pierdes nada de tu trabajo en
el caso de que se produzca un bloqueo del sistema. Es posible que quieras man­
tener desactivada esta opción si tiendes a realizar cambios temporales y experi­
mentales a tus programas y no quieres guardarlos.

Las otras opciones del cuadro de diálogo te permiten establecer los colores del
texto en la ventana de código. Modificando estos colores te será más fácil reco­
nocer comentarios, variables, palabras clave, etc., y distinguir los distintos com­
ponentes de tu programa.

Figura 3.7.
El cuadro de diálogo Environment Options

Otras opciones del entorno


El cuadro de diálogo Environment Options te permite especificar, además, otras
opciones. La opción Tab Stop Width (anchura de las tabulaciones), normalmente
establecida como 4, puede alterarse para cambiar la posición del tabulador en tus
ventanas de código. Sin embargo, ten en cuenta que Visual Basic no inserta ca­
racteres ASCII reales en el código, sino que inserta espacios hasta la siguiente po­
sición del tabulador.

La opción Syntax Checking (comprobación de la sintaxis), cuando está estableci­


da como Yes, activa la comprobación de cada línea de código a medida que las
introduces.

Puedes establecer la opción Default Save As Format (formato por omisión de


guardar como) como Binary (binario) o Text (texto). El ajuste por omisión es Bi-
nary, y es el más eficaz. De este modo, tus formularios y archivos de proyecto se
guardan con un formato que sólo Visual Basic puede entender. Selecciona la
opción Text si quieres que tu aplicación sea compatible con Visual Basic para
MS-DOS o con el Application Setup Wizard.

El ajuste por omisión de la opción Save Project Before Run (guardar el proyecto
antes de ejecutarlo) es No. Si la estableces como Yes, Visual Basic guardará auto­

60 61
4
Declaraciones, expresiones
y procedimientos
Este capítulo centra tu atención en declaraciones (o instrucciones) sencillas de Vi­
sual Basic. Una declaración en el lenguaje Visual Basic es la exposición completa
de un comando al ordenador, el equivalente de una frase en español. Dentro de
las declaraciones se pueden crear expresiones combinando valores y operadores.
Este capítulo describe las diferentes clases de operadores y cómo usarlos. Tam­
bién proporciona una explicación más detallada de los procedimientos, con los
cuales ya trataste cuando construiste tu primera aplicación.

Declaraciones de asignación
La declaración más simple y probablemente la más común que se puede encon­
trar en un programa es la declaración de asignación. Consta del nombre de una
variable, seguido del operador de asignación (=) y de algún tipo de expresión. En
su forma más básica una expresión consta, simplemente, de un valor constante;
sin embargo, también puede consistir en una referencia a otra variable o en la
mezcla de variables y constantes en la cual se ejecutan ciertas operaciones. Todas
las declaraciones que vienen a continuación son declaraciones de asignaciones
legales:

HoraInicio = Now
Explorador.Nombre = "Capitán Spaulding"
NumeroDeBits = NumeroDeBytes * 8
NombreDeMono = "Chita"
Energia = Masa * VELOCIDADLUZ ^ 2
NetoPatrimonial = TotalActivo - TotalPasivo

63
EL LIBRO DEL VISUAL BASIC
4 Declaraciones, expresiones y procedimientos

Las declaraciones de asignación almacenan información. Se calcula el valor de


operandos de la operación de suma. Además de los operadores aritméticos, Vi­
una expresión, el cual aparece a la derecha del operador de asignación, y el re­
sual Basic también dispone de un operador de concatenación de cadenas de ca­
sultado se almacena en la variable que hay a la izquierda del operador. El tipo de
racteres, de operadores de comparación y de operadores lógicos (todos los cuales
datos de la variable debe ser apropiado al valor de la expresión calculada. Por
se tratarán más adelante en este capítulo).
ejemplo, una constante o una expresión de tipo cadena de caracteres no puede
almacenarse en una variable de tipo entero o de tipo doble (coma flotante). Si los Las expresiones no son declaraciones válidas por ellas mismas, ya que no están
tipos de datos están relacionados pero no son exactamente el mismo —por ejem­ completas. Introducir simplemente la línea 2+7 en tu programa de Visual Basic,
plo, si quisieras almacenar un valor entero en una variable de coma flotante—, por ejemplo, producirá un error. Si en Visual Basic una declaración es como una
Visual Basic convertirá el resultado de la expresión al tipo de datos de la variable. oración, una expresión es como una frase. Las expresiones están permitidas, nor­
Sin embargo, si almacenas el resultado de una expresión en una variable de tipo malmente, en cualquier sitio donde puedas utilizar un valor constante.
variant, el tipo de datos de la expresión se preserva. Las variables variant mantie­ Dar una definición de expresión es complicado. La mejor definición es realmente
nen tanto el tipo de datos como el valor. autoreferente. Una definición parcial puede incluir estas reglas:

Por desgracia, el operador de asignación es el mismo símbolo que se utiliza en ■ Un valor constante es una expresión.
matemáticas para representar la igualdad (el signo igual, como en la ecuación
■ La combinación de una expresión seguida por un operador y seguida por
2+1=1+2). La igualdad en el contexto matemático expresa una condición que es
otra expresión también es una expresión.
cierta. En la declaración de asignación de Visual Basic, el símbolo = es un coman­
do que pone el resultado de la expresión que le sigue en la variable que le ante­ De acuerdo con estas reglas, 3 es una expresión, de la misma manera que 7; por
cede. Representa una acción que el ordenador debe llevar a cabo en lugar de una tanto, 3+7 también es una expresión. Y ello nos lleva a que 3*3+1 también sea
declaración de hecho. La ecuación 2+1=1+2 no es una declaración válida en Vi­ una expresión, al igual que 3+3+1+1. Puedes ver lo que está ocurriendo: las ex­
sual Basic porque carece de una variable a la izquierda del signo igual. Si tratas presiones pueden ser arbitrariamente complejas.
de introducir esta línea como si fuera una declaración completa, Visual Basic de­
volverá un error.
El tipo de una expresión
Todas las declaraciones que hay en el programa Cronómetro que creaste en el ca­
El tipo de una expresión se determina por el tipo de los operandos. En el caso de
pítulo 1 son declaraciones de asignación. En algunas declaraciones, como en
un valor constante, el tipo de la expresión es el mismo que el tipo de la constan­
btnParada.Enabled = True, asignaste un simple valor constante. En otras, como
te. En el caso de una expresión que contenga una operación, Visual Basic usa el
en la declaración Lapsus = HoraParada - Hora Inicio, utilizaste una expresión. En
tipo de los dos operandos para determinar el tipo del resultado. Naturalmente, si
declaraciones como txtInicio.Text = Forma(HoraInicio, "hh:mm:ss"), llamaste a
sumas dos enteros el resultado será un entero; si sumas dos valores de doble pre­
una función interna. El resto de este capítulo explora las posibilidades de Visual
cisión, el resultado será del tipo doble (real). Si mezclas tipos diferentes —por
Basic en esas facetas. ejemplo, multiplicando un integer por un single, como en la expresión 2 * 7 , 5—
Visual Basic, generalmente, hará que el tipo del resultado tenga el rango más am­
Expresiones y operadores plio; en este caso sería un single (real). Sin embargo, para prevenir una posible
ambigüedad no se deben mezclar diferentes tipos en una expresión.
Como se ha mencionado, una expresión puede ser tan sencilla como una simple
Para evitar que se mezclen tipos en una expresión puedes usar los caracteres de
constante. Sin embargo, lo más habitual es que las expresiones representen cálcu­
declaración de tipo con las constantes numéricas. Estos caracteres fuerzan a una
los que se deben ejecutar. Normalmente, hay un operador que determina el tipo
constante a ser de un tipo determinado. Por ejemplo, 100 sería, normalmente, un
de cálculo. Sin duda estarás familiarizado con los operadores aritméticos, como el
integer, pero 100! es un single y 100@ es un valor monetario. (Los caracteres de
signo más (+) y el signo menos (-), que indican suma y resta respectivamente. La
declaración de tipo de Visual Basic aparecerán en la figura 3.4 del capítulo 3.)
expresión 2+1 le dice a Visual Basic que sume los valores 2 y 1. El 2 y el 1 son

65
64
EL LIBRO DEL VISUAL BASIC
4 Declaraciones, expresiones y procedimientos

Nota: Visual Basic no permite usar caracteres de declaración de tipos


rápido que el uso de números en coma flotante, pero a no ser que realices opera­
para truncar constantes reales en enteros. De este modo, no es posible
ciones muy complejas lo más probable es que no notes la diferencia.
utilizar el nombre 3,14% para el entero 3■ Pero si quieres convertir una
variable de coma flotante en un entero, Visual Basic dispone de funcio­
nes especiales de conversión, las cuales están documentadas en el ma­ Operador Operación

nual de referencia de Visual Basic. + Suma


Las expresiones no tienen que estar limitadas a operadores y constantes. Así, la - Resta
expresión 1773397 + (IngresosAjustados - 32450) * 23 / 100 podría calcular una * Multiplicación
cuota de la renta (al 23 por 100). Esta expresión incluye una variable y dos pa­ ^ Exponenciación
réntesis, así como operadores y constantes. / División en coma flotante
\ División entera
Cuando las expresiones son más complejas que dos operandos y un simple ope­
rador, algunas veces es posible evaluar la expresión de más de una forma. Por Mod Módulo
ejemplo, en la expresión 2+6/2 podrías sumar primero el 2 y el 6 para obtener 8
Figura 4.1.
y luego dividir el 8 por 2 y obtener 4. O podrías sumar 2 al resultado de dividir 6
Operadores aritméticos
entre 2 (que es 3), obteniendo un resultado final de 5. Los paréntesis se utilizan
para eliminar este tipo de ambigüedades. La subexpresión contenida dentro de los La suma, la resta y la multiplicación se comportan como sería de esperar. Debes
paréntesis siempre se evalúa primero. Escribir una expresión como 2+(6/2) indica usar el operador de exponenciación porque no se pueden utilizar números supe-
claramente que la operación de división debe ejecutarse primero. Las expresiones ríndices en Visual Basic. Y los tres operadores relacionados con la división son un
muy complejas pueden contener múltiples grupos de paréntesis. Se evalúan pri­ poco más complicados.
mero las xpresiones más internas, o las más profundamente anidadas.
Exponenciación
Ante la ausencia de los paréntesis, Visual Basic usa un conjunto de reglas deno­ El operador de exponenciación permite calcular potencias y raíces. En matemáti­
minadas precedencia de operadores para determinar qué operadores deben eje­ cas, la exponenciación se indica con superíndices. Por ejemplo, el valor 28 es 2
cutarse primero. For ejemplo, como la multiplicación y la división tienen un nivel elevado a la octava potencia y es calculado por Visual Basic cuando se encuentra
de precedencia más alto que la suma y la resta, Visual Basic siempre evalúa la ex­ con la expresión 2^8. La raíz cuadrada de 2, que es 2 elevado a la 1/2 potencia,
presión 2+6/2 como si se hubiera escrito 2+(6/2). Los apartados siguientes de puede calcularse usando tanto la expresión 2 ^ (1/2) como la expresión 2 ^ 0,5.
este capítulo describen los operadores disponibles en Visual Basic, agrupados de La figura 4.2 presenta algunos ejemplos de exponenciación.
acuerdo con su función y seguidos por una tabla de precedencia que ilustra
cómo se relaciona cada operador con cualquier otro.
Expresión Resultado Valor calculado

10 ^ 2 100 10 al cuadrado, ó 10 * 10
Operadores aritméticos 10 ^ 3 1000 10 al cubo, ó 10 * 10 * 10
Los operadores más familiares son los que llevan a cabo operaciones aritméticas 10 ^ -2 0,01 El inverso de 102 , ó 1/100
simples. La figura 4.1 muestra una lista de los operadores aritméticos de los que 25 ^ 0 ,5 5 La raíz cuadrada de 25, ó 25 1/2
dispone Visual Basic. 8 ^ (1 / 3) 2 La raíz cúbica de 8, u 81/3
En las operaciones de suma, resta y multiplicación, los resultados son números
del mismo tipo que los operandos. (Los tipos mezclados se han tratado en el Figura 4.2.
Ejemplos de exponenciación
apartado anterior.) En general, el uso de números enteros o de coma fija es más

66 67
EL LIBRO DEL VISUAL BASIC
4 Declaraciones, expresiones y procedimientos

División entera o en coma flotante


do de una división en coma flotante a una variable entera, como se muestra en
El operador de división en coma flotante (/) ejecuta una división normal, pero
este trozo de código:
devuelve un número en coma flotante. Así, la expresión 3/2 produce el resulta­
do 1,5 como sería de esperar. Esto contrasta con el operador de división entera Dim BoteDePinta As Integer
BoteDePinta = 150 / 8
(\), el cual devuelve un valor entero. Cuando se utiliza este operador, la expre­
sión 3 \ 2 da como resultado 1. Justo lo que necesitábamos, me ha parecido oirte En realidad, después de que se ejecuta la declaración de asignación el valor de
decir, una operación aritmética que devuelve una solución equivocada. BoteDePinta será 19, en lugar de 18. Visual Basic primero calcula la expresión
150 / 8, la cual da 18,75. Como tú quieres que el valor se almacene en una varia­
Supongo que depende del punto de vista. Imagina que eres un empaquetador de
ble entera, Visual Basic redondea el número en coma flotante al entero más pró­
pimientos en vinagre que necesita saber cuántos pimientos en vinagre puede me­ ximo, que en este caso es 19. Cuando se usa el operador de división entera,
ter en un bote de una pinta de capacidad. Como experto en el tema sabes que cualquier parte fraccional del resultado es truncada, o eliminada, en lugar de re­
puedes meter 150 pimientos en vinagre en un bote de un galón de capacidad y dondeada. La figura 4.4 compara el truncado con el redondeo.
que nunca se mete un pimiento que no esté completo. Un bote de un galón es 8
veces más grande que un bote de una pinta, así que puedes meter 150 \ 8 —o
sea, 18— pimientos en vinagre en cada bote de una pinta de capacidad. Debes Valor inicial Se trunca a Se redondea a
usar el operador de división entera para este cálculo, como se muestra en la figu­
24,1 24 24
ra 4.3, porque sólo quieres meter pimientos completos; ejecutar esta operación
24,5 24 24
con el operador de división en coma flotante (150 / 8) daría como resultado
18,75, lo cual no es un valor razonable en estas circunstancias. 24,50001 24 25
24,9999 24 25
Como Visual Basic puede convertir números de unos tipo de datos a otros, po­
drías pensar que obtendrías el mismo resultado asignando simplemente el resulta-
Figura 4.4.
Trancado y redondeo

Aviso: Visual Basic es un lenguaje de programación. En la mayoría de


los lenguajes de programación, no se puede usar la coma decimal en los
cálculos; en su lugar, se utiliza el punto decimal. Visual Basic no es una
excepción. Por tanto, aunque aquí estemos hablando de cifras como 1,2,
a la hora de asignar dicho valor a una variable—por ejemplo — habrá
que usar 1.2.

El módulo
El operador módulo, que está relacionado estrechamente con el de división ente­
ra, devuelve el resto que queda al dividir el primer operando entre el segundo.
Por ejemplo, si se divide 7 entre 4, el resultado es 1 con un resto de 3. Así, 7 Mod
4 da como resultado 3. De la misma manera, 21 Mod 4 da como resultado 1 (21
dividido entre 4 es igual a 5, con un resto de 1).
Figura 4.3. Veamos esto en el ejemplo de los pimientos en vinagre otra vez. Sabes que pue­
El uso del operador de división entera des empaquetar 18 pimientos en vinagre en una bote de pinta. Si tienes 75 pi-

68 69
EL LIBRO DEL VISUAL BASIC
4 Declaraciones, expresiones y procedimientos

mientos para empaquetar, la expresión 75 \ 18 te da el número de jarras de pinta


La figura 4.7 contiene algunas expresiones de Visual Basic de ejemplo y los valo­
que puedes llenar (4), y la expresión 75 Mod 18 calcula el número de pimientos
res que resultan cuando se calculan esas expresiones. Puedes consultar la jerar­
en vinagre que sobrarán (3), como se ilustra en la figura 4.5.
quía de precedencia que aparece en la figura 4.6 para saber cómo Visual Basic
llega al resultado.

Expresión Resultado Explicación

3+2*7 17 La multiplicación tiene la precedencia


más alta.
(3 + 2) * 7 35 Los paréntesis anulan la precedencia.
1 + ((2 + 3) * 2) * 2 21 Los paréntesis anidados se evalúan
primero.
14 / 5 * 2 5,6 La división en coma flotante y la mul­
tiplicación tienen igual precedencia; las
operaciones van de izquierda a derecha.
14 \ 5 * 2 1 La multiplicación tiene una mayor
precedencia, y la división entera trunca.
27 ^ 1 / 3 9 La exponenciación tiene una mayor
Figura 4.5.
precedencia.
El uso de la división entera y del operador Mod
27 ^ (1 / 3) 3 Los paréntesis anulan la precedencia.

Figura 4.7.
Precedencia de los operadores aritméticos
El uso de las reglas de precedencia para calcular valores
La figura 4.6 indica la precedencia en la jerarquía de los operadores aritméticos.
La exponenciación tiene la precedencia más alta; las operaciones de suma y resta
son las más bajas en la jerarquía. Los operadores que aparecen en la misma línea El operador de concatenación de cadenas
tienen la misma jerarquía. Cuando los operandos de una expresión son cadenas de caracteres, el operador
signo más (+) concatena, o combina, las cadenas. Puedes usar la concatenación
para "pegar" dos o más cadenas juntas con el fin de formar una más grande. El
Operador Operación
resultado de la concatenación es una cadena enteramente nueva; ninguno de los
A Exponenciación operandos originales se modificaría de ninguna manera. Este fragmento de pro­
*/ Multiplicación, división en coma flotante grama emplea la concatenación para generar algunas línea de Lewis Carroll:
\ División entera x$ = "murciélagos"
Mod Módulo (resto) y$ = "gatos"
+- Suma, resta Debug.Print "¿Comen " + y$ + " los " + x$ + "?"
’¿Comen gatos los murciélagos?
Debug.Print "¿Comen " + x$ + ” los ” + y$ + "?"
Figura 4.6.
’¿Comen murciélagos los gatos?
los operadores aritméticos en orden de precedencia

71
70
EL LIBRO DEL VISUAL BASIC 4 Declaraciones, expresiones y procedimientos

Interactuar directamente con Visual Basic Interactuar directamente con Visual Basic (continuación)
Ya en el capítulo 1 utilizaste la instrucción Debug.Print para escribir en la Se pueden evaluar (calcular) expresiones y llamar a funciones en la venta­
ventana Debug (debug quiere decir depurar), que aparece cuando el pro­ na Debug. También se puede llamar a un procedimiento y, en general, eje­
grama está funcionando. La ventana Debug es más que un sitio útil donde cutar casi cualquier instrucción que pudieses poner en un programa. Pasar
poner mensajes; en esta ventana se puede interactuar directamente con el a la ventana Debug es una manera muy fácil y rápida de comprobar una lí­
intérprete. nea de código. Cuando lo hayas hecho, pulsa F5 para continuar con la eje­
cución normal del programa, o elige End en el comando Run para terminar
Crea un proyecto nuevo seleccionando el comando New Project del menú
la aplicación.
File. Pulsa F5 para ejecutar la "aplicación". Aunque no has escrito código ni
puesto ningún objeto en el formulario, Visual Basic "ejecutará" el formula­
rio en blanco. Ahora selecciona Break (interrumpir) del menú Run o haz
clic en el botón Break de la barra de herramientas. Este comando suspende Observa que los operandos deben ser cadenas de caracteres. Si necesitas concate­
la aplicación, independientemente de lo que estuviera haciendo (no mu­ nar un número con una cadena para mostrarlo en pantalla, debes utilizar una de
cho en este caso), y hace que la ventana Debug pase a ser la ventana acti­ las funciones internas de Visual Basic para convertir el número en una cadena. La
va. Escribe la instrucción Debug.Print "Hola" en la ventana Debug y pulsa función de este tipo que resulta más simple es la denominada Str$. En la expre­
la tecla Intro. Visual Basic procesa y ejecuta inmediatamente el comando: sión "La raíz cuadrada de 2 es "+Str$(2 ^ 0,5), por ejemplo, convierte el número
que está entre paréntesis en una cadena.

Debes acordarte de incluir espacios en blanco en las cadenas de caracteres cuan­


do sea necesario, o Visual Basic combinará las dos cadenas sin espacios.

Operadores de comparación
Los seis operadores de comparación aparecen en la figura 4.8. Cuando se compa­
ran dos valores, el resultado de la operación en un valor booleano o lo que es lo
mismo, True (verdadero) o False (falso). (La palabra booleano proviene del nom­
Como la ventana Debug es el formulario activo en el momento en el que
bre del matemático inglés George Boole.) Visual Basic dispone de las constantes
el intérprete ejecuta tu comando, no es necesario que incluyas el nombre
internas llamadas True y False que representan los valores enteros -1 y 0 respecti­
del objeto Debug cuando llames al método Print; es suficiente con usar
vamente. La representación binaria de 0 es un número con todos sus bits puestos
simplemente Print. Además, Visual Basic te permite abreviar Print como ?
a 0, y la representación de -1 es un número binario cuyos bits están todos pues­
de manera que puedas obtener los resultados rápidamente, como se mues­
tos a 1, lo que hace que True sea lo opuesto a False.
tra aquí:

Operador Comparación

> Mayor que


< Menor que

Figura 4.8.
Operadores de comparación

73
72
EL LIBRO DEL VISUAL BASIC
4 Declaraciones, expresiones y procedimientos

Figura 4.8. continuación


Operadores lógicos
Operador Comparación Los operadores lógicos son denominados, a veces, operadores booleanos porque
se derivan del álgebra de la lógica matemática, la cual fue desarrollada por Geor-
>= Mayor o igual que
ge Boole. Estos operadores tienen valores booleanos como operandos, y de­
<= Menor o igual que
vuelven valores booleanos. La figura 4.10 muestra una lista con los operadores
= Igual que lógicos en su orden de precedencia. (Todos los operadores lógicos tienen menor
<> Distinto que precedencia que los operadores de comparación.)

La figura 4.9 da el resultado de algunas operaciones de comparación típicas, a la Operación


Operador
vez que las explica. Los operadores de comparación se conocen también como
operadores relacionales porque evalúan la relación entre los dos operandos. Aun­ Not No lógico
que los operadores de comparación tienen igual precedencia entre ellos, la prece­ And Y lógico
dencia de cualquier operador de comparación es menor que la de cualquier Or O lógico
operador aritmético. Xor O exclusivo

Probablemente te habrás dado cuenta de que el operador "igual que" usa el mis­ Eqv Equivalencia lógica
mo símbolo (=) que el operador de asignación. Esto no debe producir confusión, Imp Implicación lógica
ya que el operador de asignación es válido sólo en una posición: inmediatamente
detrás de una variable en una declaración de asignación. En todos los demás ca­ Figura 4.10.
Los operadores lógicos, o booleanos, en orden de precedencia
sos, el signo igual es un operador relacional o de comparación. Por ejemplo, en
la declaración Test = a = b de Visual Basic, la expresión a = b da como resultado El operador lógico más simple se denomina Not. Precede a un solo operando y
o True o False. Así pues, el valor resultante es asignado a la variable Test. devuelve su opuesto lógico —o sea, niega el operando. Por ejemplo, la expresión
Not False da como resultado True (lo opuesto de False); y la expresión Not (4<3)
da como resultado True, ya que la expresión 4<3 es False. El operador Not tiene,
Expresión Resultado Explicación
además, la más alta precedencia de todos los operadores booleanos.
3 +1 > 3 True 4 es mayor que 3.
El siguiente operador en el orden de precedencia es And (Y). Devuelve el resulta­
"abc" < > "a" + "b" + "c" False Después de la concatena­ do True si (y sólo si) ambos operandos son True. En caso de que alguno de los
ción ambas cadenas son operadores sea False, el operador And devuelve el resultado False. Este operador
iguales ("abc"). corresponde al uso de la palabra and del idioma inglés (que quiere decir y en es­
"quid" <= "pro quo" False Las cadenas se comparan pañol), como se expresa en la declaración "quedaré impresionada sólo si tiene un
en orden alfabético, no por doctorado en filosofía y mide más de un metro ochenta".
su longitud.
2,3 >= 1,1 * 2 True 2,3 es mayor que 2,2. Expresión Resultado
0 = (2 < 1) True 2 < 1 es falso, lo cual es
False And False False
igual que 0.
False And True False
Figura 4.9. True And False False
El uso de los operadores de comparación True And True True

74 75
EL LIBRO DEL VISUAL BASIC
4 Declaraciones, expresiones y procedimientos

El operador Or (o) devuelve el resultado True si cualquiera de los dos operandos


moso silogismo "Sócrates es un hombre y todos los hombres son mortales implica
es True, o si los dos son True. De nuevo, su significado booleano es similar al
que Sócrates es mortal".
uso de la palabra or en inglés (que es o en español) —por ejemplo, "compraré el
gato si cuesta menos de 5000 pesetas o si es siamés". Expresión Resultado

Expresión Resultado
False Imp False True
False Imp True True
False Or False False True Imp False False
False Or True True True Imp True True
True Or False True
Se puede usar más de un operador lógico en una expresión. La figura 4.11 pro­
True Or True True
porciona algunos ejemplos; prueba a evaluar cada una de las expresiones, y lue­
Aunque los operadores Not, And y Or son, con mucho, los más utilizados, Visual go comprueba el resultado teniendo en cuenta el orden de precedencia que se
Basic también dispone de otros tres operadores: Xor, Eqv e Imp. El operador Xor muestra en la figura 4.10.
(o exclusivo) devuelve el resultado True si cualquiera de los dos operandos es
True, pero no si ambos lo son. En otras palabras, funciona como el operador Or,
Expresión Resultado Explicación
excepto en el caso de que ambos operadores sean True.
Not False And True True Equivale a la expresión (Not False)
Expresión Resultado And True, según la precedencia.
True And False Xor False False Equivale a la expresión (True And
False Xor False False False) Xor False, según la prece­
False Xor True True dencia.
True Xor False True True Eqv True Xor True False Equivale a True Eqv (True Xor
True Xor True False True) según la precedencia.

El operador Eqv (equivalencia) devuelve el resultado True cuando sus dos ope­
Figura 4.11.
randos tienen el mismo valor. El uso de varios operadores lógicos en una expresión

Expresión Resultado
Precedencia
False Eqv False True La figura 4.12 muestra la lista completa de los operadores de Visual Basic (excep­
False Eqv True False to el operador de concatenación de cadenas), en orden de precedencia del mayor
True Eqv False False al menor. Cuando te encuentres con una expresión compleja debes determinar
True Eqv True True qué operador tiene el orden de precedencia más alto y evaluar esa subexpresión
primero. Luego determina qué operador está el segundo en el orden de prece­
Cuando utilices el operador Imp (implicación), el resultado será False, únicamen­ dencia, evalúa esa subexpresión, y así sucesivamente hasta qué llegues al cálculo
te cuando el primer operando sea True y el segundo False. En todos los demás del resultado final.
casos el resultado será True. El operador Imp es el único operador booleano para
Algunos operadores, como el de suma y el de resta o el conjunto completo de
el cual el orden de los operadores hace que el resultado sea distinto. La Implica­
operadores de comparación, tienen igual precedencia. Cuando te encuentres con
ción se utiliza algunas veces junto con el operador And, como se ilustra en el fa­

76 77
EL LIBRO DEL VISUAL BASIC
4 Declaraciones, expresiones y procedimientos

operadores que tengan la misma precedencia, debes evaluar las expresiones de


buena idea que añadas paréntesis para asegurarte de que Visual Basic y tú estáis
izquierda a derecha.
de acuerdo en el orden de las operaciones. Copiando la manera en que Visual
Por ejemplo, considera la siguiente expresión: Basic ve el ejemplo anterior se obtendría algo como esto:
Temperatura >= 120 And Inflamable = True ((Cuenta * 2) < 15) Or ((Color = "Azul") And ((Cuenta * 2) < 21))

Como los dos operadores de comparación (>= e =) comparten el mismo nivel de


precedencia, Visual Basic los evalúa de izquierda a derecha. Luego, Visual Basic
ejecuta la operación And. En este caso, si Temperatura es menor que 120 o Infla­
Errores habituales
mable es False, Visual Basic determinará que el valor de la expresión es False. Prácticamente todos los programadores que están empezando cometen ciertos
errores relacionados con las expresiones. Veamos algunos de los problemas que
se presentan con más frecuencia, de manera que seas capaz de evitarlos o, al me­
Operador Operación nos, de identificarlos.

^ Exponenciación Un error de ese tipo consiste en dejar de poner un operador relacional cuando se
comprueba si una variable está en un rango. Por ejemplo, si estás trabando con la
*/ Multiplicación, división en coma flotante
variable Temperatura, puede que se dé el caso de que necesites saber si su valor
\ División entera
es mayor de 10 grados pero menor que 100. Esto se consigue con la expresión
Mod Módulo Temperatura > 10 And Temperatura < 100. Es posible que hayas tratado de utili­
+- Suma, resta zar la expresión 10 < Temperatura < 100, la cual tiene un aspecto fantástico des­
><>=<= = <> Comparación de el punto de vista matemático, pero no funciona correctamente en Visual Basic.
Not No lógico Esta expresión más corta es sintácticamente correcta, pero da la solución equivo­
And Y lógico cada. ¿Por qué?
Or O lógico Comienza por evaluar las dos subexpresiones de izquierda a derecha. (Los dos
Xor O exclusivo operadores tienen igual precedencia.) Debido a que los operadores relacionales
Eqv Equivalencia lógica siempre devuelven True o False, lo cual equivale a los enteros -1 y 0 respectiva­
Imp Implicación lógica mente, el resultado de la subexpresión 10 < Temperatura será -1 ó 0. Por tanto, la
segunda subexpresión será -1 < 100 ó 0 < 100, las cuales son True. En conclu­
Figura 4.12. sión, la expresión 10 < Temperatura < 100 siempre devolverá el resultado True,
Los operadores de Visual Basic en orden de precedencia independientemente del valor que tenga la variable. Este proceso se muestra grá­
ficamente en la figura 4.13.
Aquí tienes un ejemplo más complejo: Otro error típico consiste en escribir las expresiones lógicas con la misma impre-
C u e n t a * 2 < 1 5 O r C o l o r = " A z u l " A n d C u e n t a * ^ 2) < 2 1 cisión que a menudo se encuentra cuando se habla en español. La expresión del
ejemplo anterior se formuló cuidadosamente para encontrar un valor que "fuese
Recorriendo de arriba a abajo la tabla de precedencia, Visual Basic primero ejecu­
mayor de 10 grados pero menor que 100 grados". Sin embargo, si le estuvieras
tará las dos operaciones de multiplicación; luego evaluará las tres comparaciones
hablando a un colega podrías haber planteado el problema de esta manera:
de izquierda a derecha. A continuación, llevará a cabo la operación And y, final­ "quiero saber si la temperatura es mayor de 10 grados o menor de 100 grados".
mente, la operación Or.
Esta formulación es menos precisa (de hecho, inexacta), pero la gente consigue
Si piensas que ésta es una buena manera de perderte, estás en lo cierto. Incluso sortear la ambigüedad bastante bien y tu colega, probablemente, entendería lo
aunque no quieras anular la precedencia por omisión de Visual Basic, es una que querías decirle. Sin embargo, articular la declaración de esa manera podría

78 79
EL LIBRO DEL VISUAL BASIC
4 Declaraciones, expresiones y procedimientos

Figura 4.13.
Una manera incorrecta de comprobar un rango de valores Figura 4.14.
Otra manera incorrecta de comprobar un rango de valores

llevarte a escribir la expresión Temperatura > 10 Or Temperatura < 100, la cual


es incorrecta. donábamos. La segunda declaración no expresa una condición que sea cierta
para todo momento; en lugar de ello, es una expresión que sólo se evalúa una
Al examinar de nuevo la expresión a medida que Visual Basic gestiona, podrás vez, con un valor específico de la variable. En este ejemplo, la declaración se
ver el problema. Las dos expresiones relacionales se evalúan primero, y luego se evalúa cuando A tiene el valor 10. Las declaraciones posteriores pueden alterar el
lleva a cabo la operación booleana Or. La subexpresión Temperatura > 10 es valor de A, pero B quedará sin cambiar a no ser que se ejecute una declaración
True para todos los números mayores de 10; la otra subexpresión relacional, de asignación diferente.
Temperatura < 100, es True para todos los números menores de 100. Ahora mira
Veamos otro error común. Hasta este momento sólo hemos usado los valores
lo que sucede cuando unes estas dos subexpresiones con el operador Or. Si la
True y False en las operaciones booleanas porque es lo que te encontrarás más
variable tiene un valor de 5 grados, la primera expresión será False (5 > 10) y la
frecuentemente. Sin embargo ten siempre en mente que como True y False son
segunda True (5 < 100). El operador Or devolverá un resultado de True porque
equivalentes a los enteros -1 y 0, Visual Basic no generará un mensaje de error si
uno de los operandos es True. De la misma manera, con un valor de 900 la pri­
tratas de usar And, Or, Imp o cualquier otro operador lógico con operandos ente­
mera subexpresión dará True y la segunda False, haciendo que la operación Or
ros, como 6 ó 237. Visual Basic, realmente, ejecutará las operaciones booleanas
dé un resultado de True. Cuando Temperatura tenga un valor de 70 ambas sub­
especificadas en cada bit de los operandos.
expresiones serán True y el resultado será de nuevo True. Al usar el operador Or
en lugar del operador And has creado otra expresión que siempre devuelve True. Esto puede conducir a que se produzcan extraños errores. Por ejemplo, digamos
La figura 4.14 ilustra el problema. que quieres saber si la variable x es igual a 5 ó a 6. Podrías tratar de codificar la
declaración como Debug.Print x = 5 Or 6. Visual Basic ejecutaría la operación Or
Un tercer error que se comete con frecuencia consiste en pensar en una declara­ sobre los enteros 5 y 6 de bit en bit, lo cual daría un resultado de 7. Entonces
ción de asignación como en una condición matemática, en lugar de pensar que compararía el valor de x con 7, que no es exactamente lo mismo que tú habías
implica la manipulación de los datos que ocurre en un momento determinado. El pensado. En lugar de esto deberías codificar la declaración del siguiente modo:
problema se ilustra en el siguiente fragmento de código: Debug.Print (x = 5) Or (x = 6).

A = 10
B=A/2
A = 20
Procedimientos
Aunque ya has escritos algunos procedimientos y probablemente tienes cierto co­
Después de ejecutar estas tres declaraciones, A tiene el valor 20 y B el valor 5. Si
nocimiento de los que son y cómo funcionan, no estará de más que formalicemos
habías pensado que B debería tener el valor 10 has caído en la trampa que men-

81
80
EL LIBRO DEL VISUAL BASIC
4 Declaraciones, expresiones y procedimientos

ese conocimiento un poco. Este apartado se concentra, fundamentalmente, en los exposición sobre la sintaxis usaremos el término procedimiento para referirnos a
procedimientos internos de Visual Basic; más adelante, el capítulo 7 se centrará los servicios que no devuelven un valor, y el término función para referirnos a los
en el diseño y escritura de procedimientos nuevos, en lugar de utilizar simple­ servicios que sí lo devuelven.)
mente los existentes.

Un procedimiento es un conjunto de instrucciones que ejecutan un servicio con­


Función Valor devuelto
creto. El servicio se solicita usando el nombre del procedimiento. Por ejemplo, en
el capítulo 3 escribiste un pequeño programa que utilizaba el procedimiento Abs El valor absoluto de un número.
MsgBox. Cuando se ejecuta esa porción de tu programa, Visual Basic muestra un El código ASCII ó ANSI de un carácter.
Asc
cuadro de diálogo con el texto que tú le has proporcionado. Cuando se cierra el
Chr$ El carácter correspondiente a un código ASCII ó ANSI dado.
cuadro de diálogo, el programa continúa. Visual Basic proporciona el servicio de
cos El coseno de un ángulo.
dibujar un cuadro de diálogo alrededor de tu mensaje, de crear un botón Aceptar,
CurDir$ El nombre del directorio de trabajo actual.
de vigilar al ratón hasta que se hace clic y de borrar el cuadro de diálogo de la
Date$ La fecha actual como una cadena de texto.
pantalla; todo lo que tú tienes que hacer es suministrar el mensaje.
Format Una fecha o un número convertida en una cadena de texto.
Los servicios que proporciona Visual Basic pueden compararse con los que se InputBox El texto introducido en un cuadro de diálogo por un usuario.
prestan en la vida diaria. Por ejemplo, si acabas de comprar un cuadro de Van El número de caracteres de una cadena de texto.
Len
Gogh y estás preocupado porque el cheque que enviaste a Sotheby’s pueda ser
Mid$ Una porción seleccionada de una cadena de texto.
rechazado, podrías llamar al banco y solicitar una transferencia. Le proporcionas
Now La fecha y hora actuales.
al banco el número de las cuentas y la cantidad que quieres transferir, y el banco
Rnd Un número aleatorio.
proporciona el servicio, sin más intervención por tu parte.
Sin El seno de un ángulo.
En otros casos, el que proporciona el servicio devuelve un objeto tangible. Por Sqr La raíz cuadrada de un número.
ejemplo, podrías visitar al vendedor local de pollos asados, hacerle un pedido, Un número convertido en una cadena de texto.
Str$
darle dinero y obtener un pollo asado a cambio. Como podrás recordar, los pro­
Time$ La hora actual como una cadena de texto.
cedimientos de Visual Basic que devuelven valores se denominan funciones. En
Val El valor numérico de una cadena de texto dada.
el programa de ejemplo del capítulo 3, llamaste a la función InputBox. Le sumi­
nistraste el texto que debía mostrar y ella mostró en pantalla un cuadro de diálo­
Figura 4.15.
go y te devolvió el texto introducido en el cuadro de diálogo. Algunas funciones internas de Visual Basic
Visual Basic dispone de muchas funciones internas que pueden usarse sin necesi­
dad de definirlas. Algunas de estas funciones se describen en la figura 4.15. Pue­ Para llamar o hacer uso de un procedimiento debes escribir una declaración en
des utilizar la Ayuda de Visual Basic y el manual de referencia para explorar estas Visual Basic, en la cual el nombre del procedimiento sea lo primero que aparez­
funciones internas con más profundidad. ca. Una llamada a un procedimiento es una declaración completa en Visual Basic,
y el procedimiento puede no requerir ninguna otra información por tu parte. En
el caso de que necesites más información debes introducir los valores que quieras
La sintaxis para los procedimientos y funciones enviar al procedimiento, separados por comas. Los valores que se le pasan a un
procedimiento (o a una función) se denominan argumentos. En el caso del pro­
Para llamar a un procedimiento o función debes utilizar su nombre. Además de
cedimiento MsgBox, utilizaste un solo argumento: la cadena de texto que había
eso, Visual Basic tiene reglas adicionales específicas para la sintaxis de una decla­
que mostrar en pantalla. Las siguientes declaraciones son ejemplos de llamadas a
ración —es decir, cómo debe escribirse la declaración y organizaría dentro del
procedimientos de Visual Basic:
código. (Aunque las funciones también son procedimientos, para simplificar esta

83
82
EL LIBRO DEL VISUAL BASIC
4 Declaraciones, expresiones y procedimientos

MsgBox "Hola marinero"


Esto es un poco más complejo que utilizar simplemente el nombre de un proce­
ChDir ”\test\datos"
dimiento, pero tiene la ventaja de permitir que más de un método tengan el mis­
Beep
SavePicture NocheEstrellada, "vicente.bmp"
mo nombre. En versiones anteriores de Basic, el procedimiento PRINT escribía
una cadena de texto en el terminal del usuario. Para escribir en la impresora, el
La sintaxis de llamada a una función es diferente. Como una función devuelve un usuario tenía que llamar a un procedimiento distinto: LPRINT. Ambos procedi­
valor puede usarse en cualquier lugar donde sería válida una expresión. Pero las mientos funcionan de manea similar, pero debido a pequeñas diferencias reque­
expresiones aisladas no son declaraciones válidas en Visual Basic. Consiguiente­ rían dos comandos separados.
mente, una llamada a una función siempre se encuentra en el contexto de otra
Visual Basic no tiene el procedimiento Print. En su lugar, todos los objetos en los
declaración, la mayoría de las veces una declaración de asignación.
cuales se pueden escribir disponen de un procedimiento llamado Print. Para es­
Cuando una función no requiere argumentos, simplemente se usa el nombre de cribir la cadena "Hola” en un formulario llamado MiForm escribirías el siguiente
la función como si fuera el nombre de una variable, como en la declaración Ho­ código:
raInicio = Now. La función Now no requiere argumentos y devuelve un valor hora
MiForm.Print "Hola”
rio. Visual Basic llama a la función y asigna el valor devuelto a la variable Hora-
Inicio. Para escribir en la impresora, que está representada en Visual Basic por un objeto
especial denominado Printer, usarías este código:
Cuando una función requiere uno o más argumentos, se debe poner un parénte­
sis de apertura detrás del nombre de la función, introducir los argumentos separa­ Printer.Print "Hola”

dos por comas, y marcar el final de la función con un paréntesis de cierre. Las La ventana Debug (depurar), que está representada por un objeto llamado De-
siguientes expresiones contienen llamadas a funciones válidas (aunque no sean bug, también tiene un método Print. Como Visual Basic proporciona un método
declaraciones completas de Visual Basic): Print para cada uno de estos objetos no son necesarios distintos comandos de im­
Sin(x) ^ 2 ’Obtiene el seno de x y eleva al cuadrado el resultado presión con nombres diferentes. Si tienes menos comandos que aprender tu tra­
Chr$(65) ’Devuelve el carácter ASCII representado por el número 65 bajo será un poco más fácil.
Format(Now, "hh:mm") ’Da formato a la hora actual
A menudo, Visual Basic permite omitir el nombre del objeto cuando se usa un
Observa que en el tercer ejemplo la expresión contiene una llamada a una fun­ método. Si haces esto, Visual Basic dirigirá el método al objeto al que cree que te
ción dentro de otra. En este caso, el valor de la función Now se pasa como argu­ estás refiriendo —normalmente, el formulario actual. Si hubieses escrito Print
mento a la función Format. "Hola” en los ejemplos anteriores, la salida hubiera ido al formulario que estuvie­
se activo cuando el programa estuviera funcionando. Para evitar la ambigüedad
debes usar siempre la convención objeto.método completa.
Métodos
Los procedimientos y las funciones han formado parte de los lenguajes de progra- Los métodos pueden actuar como procedimientos o como funciones —es decir,
mación durante muchos años. Más recientemente, los diseñadores de lenguajes pueden limitarse a prestar un servicio, como hace el método Print, o pueden de­
de programación orientados a objetos han introducido tipos especiales de proce­ volver un valor. Algunos métodos —como Move, que cambia la ubicación de un
dimientos y funciones denominados métodos. Aunque Visual Basic no está real­ objeto— están implementados, prácticamente, para todos los tipos de objetos.
mente orientado a objetos, incluye métodos para cada uno de sus objetos, como Otros son más especializados. El método Print, por ejemplo, está implementado
los formularios y los botones de comandos. Los métodos funcionan de la misma sólo para unos pocos objetos como los formularios y la impresora. El siguiente
manera que los procedimientos y las funciones, pero son componentes de obje­ capítulo explorará los objetos de Visual Basic y sus propiedades y métodos.
tos específicos, de la misma manera que lo son las propiedades y los nombres de
los campos. Para llamar a un método se utiliza el nombre del objeto y el nombre
del método, separados por un punto —por ejemplo, Debug.Print.

84 85
5
El uso de formularios y
herramientas de Visual
Basic
Los objetos de Visual Basic
Una de las grandes ventajas de un interface gráfico de usuario estriba en que el
usuario puede interactuar con un conjunto estándar de objetos, como ventanas,
botones y barras de desplazamiento. Las aplicaciones que utilizan estos objetos
estándar se comportan de una manera estándar, haciendo que las aplicaciones
sean fáciles de aprender. Parte de tu trabajo como programador consiste en selec­
cionar el estilo de interacción que sea más apropiado para la situación y en escri­
bir tus programas de una manera intuitiva para el usuario.

En un entorno GUI (grapbical user interface, interface gráfico de usuario), el


usuario interactúa con los objetos que hay en pantalla para iniciar los eventos
(abrir una ventana, hacer clic en un icono, seleccionar un elemento de un menú),
y haciendo eso controla la aplicación. Visual Basic traduce un evento iniciado por
el usuario en una actividad programada, llamando a un procedimiento que está
asociado con ese evento. El código que tú proporcionas para ese evento imple-
menta la respuesta adecuada a la interacción del usuario con el objeto.

Una nota sobre este capítulo


Este capítulo describe la mayoría de los objetos que tendrás disponibles cuando
construyas aplicaciones en Visual Basic, incluyendo los formularios y los objetos

87
EL LIBRO DEL VISUAL BASIC
5 El uso de formularios y herramientas de Visual Basic

creados con las diversas herramientas de la caja de herramientas. Ya te has en­


contrado con alguno de esos objetos en capítulos anteriores; sin embargo, aquí los elementos en cursiva indican el tipo de información que debes proporcionar
—por ejemplo, cuando veas la palabra variable debes introducir un nombre de
echaremos una mirada más profunda a algunas de las propiedades que se pue­
variable en esa posición de la declaración. Los elementos que se muestren en el
den establecer y a cómo afectan a esos objetos, a los eventos que se generan
tipo de letra roman (texto) indican palabras clave o caracteres que debes introdu­
cuando un usuario manipula esos objetos en una aplicación, y a algunos de los
cir tal y como aparecen. Los elementos que se muestran entre corchetes ([ ]) son
procedimientos y métodos que se pueden utilizar con cada objeto. También ex­
opcionales —es decir, la declaración será válida incluso si se omiten esos elemen­
ploraremos el proceso de diseño y creación de menús para tus aplicaciones.
tos. Los elementos que se muestran entre llaves ({ }) que están separados por una
Al final de la mayoría de los apartados de este capítulo hay un proyecto de ejem­ barra vertical (|) indican una elección; debes seleccionar uno de los elementos
plo que muestra cómo puedes usar el objeto de Visual Basic que se acaba de que hay dentro de los corchetes. Si unos corchetes o llaves aparecen seguidos
describir. Las instrucciones de los dos primeros proyectos son detalladas y explíci­ por unos puntos suspensivos, la secuencia que hay dentro de los corchetes o de
tas; sin embargo, las instrucciones para los proyectos siguientes son más genera­ las llaves puede repetirse. Aquí tienes un ejemplo:
les —simplemente te dicen "crea un nuevo proyecto—, por ejemplo, en lugar de
El nombre es [muy] {grande | pequeño} [y {audaz | tímido | verde }]...
explicar los comandos que hay que seleccionar ya que presumimos que, a esta
altura, conocerás la manera de realizar las cosas. A partir de la notación sintáctica que acabamos de describir, puedes usar este
ejemplo para construir cualquiera de las siguientes frases:
La decisión de guardar o no las aplicaciones de ejemplo es, en general, tuya. En
la mayoría de los casos, probablemente no sea necesario. Pero si sabes que vas a La factoría es muy grande.
utilizar un objeto o una herramienta específica en un futuro cercano, puede que El submarino es pequeño y verde.
te sea útil guardar el proyecto asociado de manera que puedas volver atrás y exa­
La ventana es muy pequeña y audaz y tímida y verde.
minarlo más adelante.
Como puedes ver, la sintaxis correcta no produce, necesariamente, una decla­
Debes estar prevenido para que la lista de propiedades, eventos, procedimientos
ración con sentido; ya verás que es muy fácil escribir programas que son sintác­
y métodos de este capítulo no sea exhaustiva; en lugar de ello, el objetivo, sim­
ticamente correctos pero que no funcionan adecuadamente. Trataremos este
plemente, es proporcionarte las herramientas suficientes para escribir programas
problema en el capítulo 8.
útiles. Puedes comprobar que las listas completas son un poco excesivas en este
momento, pero las tienes disponibles en el sistema de Ayuda y en el manual de
referencia de Visual Basic, por si necesitaras fuentes de información adicionales. Formularios
Además, algunos capítulos posteriores de este libro introducirán algunas propie­
dades y procedimientos adicionales. Como viste en el capítulo 1, los formularios son los lienzos en los que puedes
crear tu aplicación visualmente. Cada formulario se corresponde con una ventana
Observa que muchos de los objetos descritos aquí tienen idénticas propiedades o cuando se ejecuta la aplicación.
gestionan eventos similares. En tales casos, las descripciones completas de las
propiedades, eventos, procedimientos, etc., no se repiten para cada objeto. Empe­ Propiedades
zaremos por describir los formularios; te encontrarás con las descripciones más Hay muchas propiedades que pueden afectar a la apariencia y comportamiento
extensas en este apartado. de un formulario cuando éste aparece en pantalla; aquí sólo vamos a tratar las
propiedades que se usan con más frecuencia. Excepto cuando se diga lo contra­
rio, las propiedades pueden establecerse usando tanto la ventana Properties a
Una nota sobre la sintaxis medida que realizas el diseño de una aplicación, como escribiendo el código del
Muchas de las descripciones de procedimientos y métodos incluyen la sintaxis de programa, para que establezca las propiedades cuando el programa se esté eje­
las declaraciones apropiadas en Visual Basic. En estas declaraciones de sintaxis, cutando.

88 89
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

AutoRedraw ("redibujarse" automáticamente). La propiedad AutoRedraw (que se 0 - None (ninguno) La ventana no tiene borde.
trata con detalle en el capítulo 10) gestiona la manera en que se redibujan las 1 - Fixed Single (fijo sencillo) La ventana tiene un tamaño fijo (que se
imágenes en pantalla. Cuando se vuelve a un formulario de Visual Basic des­ especifica durante el diseño) y un borde de
pués de trabajar en otra ventana que haya tapado el formulario, Visual Basic línea sencilla.
refrescará o redibujará automáticamente cualquier gráfico que haya en el for­
2 - Sizable (ajustable en La ventana es ajustable en tamaño y tiene
mulario, si la propiedad AutoRedraw está establecida como True. Cuando esta
tamaño) un borde estándar de línea doble.
propiedad está establecida como False, Visual Basic deberá llamar a un proce­
3 - Fixed Double (fijo doble) La ventana tiene un tamaño fijo (que se
dimiento de evento para llevar a cabo esta tarea.
especifica durante el diseño) y un borde de
BackColor ( color del fondo). Esta propiedad determina el color del fondo. Cuando línea doble.
se selecciona BackColor en la lista de propiedades de la ventana Properties, se
Caption(título). Esta propiedad contiene el texto de la barra del título de la venta­
ve el ajuste por omisión &H80000005&, una constante hexadecimal (base 16)
na del formulario.
que define un color en Visual Basic. (Estas constantes están contenidas en el
archivo CONSTANT.TXT.) El capítulo 10 proporciona más detalles sobre los ControlBox(cuadro del menú de control). Esta propiedad booleana debe estable­
ajustes de los colores, aunque no es necesario saber mucho sobre ellos para cerse como True, si quieres que se muestre un cuadro para el menú de con­
establecer la propiedad BackColor: simplemente, hay que hacer clic en el bo­ trol en el extremo superior izquierdo de la ventana. Puedes modificar esta
tón con puntos suspensivos que hay al lado del cuadro Ajustes en la ventana propiedad sólo durante el diseño. Establecer la propiedad ControlBox como
Properties, y Visual Basic mostrará una paleta de colores como ésta: True no produce ningún efecto, si has ajustado BorderStyle a 0 - None.

Enabled (activado). Todos los objetos de Visual Basic tienen una propiedad Ena-
bled que puede establecerse como True o como False para activar o desacti­
var el objeto. En el caso de un formulario, esta propiedad, normalmente, se
establece como True, pero puedes ajustarla a False para evitar que se envíe al
formulario ningún evento del ratón o del teclado.

FontBoId,Fontltalic, FontStrikethru, FontUnderline (fuente en negrita, en cursiva, tachada,


subrayada). Puedes establecer estas propiedades booleanas como True si de­
seas que el texto que se imprima en el formulario aparezca en negrita, cursiva,
tachado o subrayado (o con cualquier combinación de estos atributos). Sólo
se verán afectados por el nuevo ajuste los caracteres que se impriman después
de modificar algunas de estas propiedades.

FontName (nombre de la fuente). Esta propiedad se ajusta al nombre de la fuente


Se puede seleccionar un color de la paleta haciendo clic sobre el cuadro apropia­ que se utilizará para imprimir un formulario. Si cambias la fuente, el texto ya
do, o se puede hacer clic en el botón X que hay al lado del cuadro Ajustes para escrito en el formulario no se verá modificado, pero sí toda impresión poste­
cerrar la paleta. rior. Por ejemplo, si ejecutas el siguiente código, la letra C se imprimirá en la
BorderStyle (estilo
del borde). Puedes establecer esta propiedad a uno de los cua­ fuente Courier New, y todas las demás en Times New Roman:
tro ajustes predefinidos. La propiedad BorderStyle sólo se puede establecer en FontName = "Times New Roman"
la fase de diseño. El ajuste no afecta a la forma en que el formulario aparece Print "AB”
en la pantalla durante la fase de diseño, pero modifica la apariencia de la ven­ FontName = "Courier New"
tana en el momento de la ejecución de la siguiente manera: Print "C"

90 91
EL LIBRO DEL VISUAL BASIC
5 El uso de formularios y herramientas de Visual Basic

FontName = "Times New Roman"


botón con los puntos suspensivos que aparece al lado del cuadro Ajustes en la
Print "DE"
ventana Properties. En el cuadro de diálogo que aparece, selecciona un archi­
FontSize (tamaño de la fuente). Esta propiedad te permite especificar un tamaño vo que contenga el dibujo que quieres mostrar. Para cambiar esta propiedad
(en puntos) para el texto que se imprima en el formulario. (Un punto es una durante la ejecución debes utilizar la función LoadPicture.
unidad estándar tipográfica que sirve para medir el tamaño del tipo; 1 punto
Top, Left(arriba, izquierda). Estas propiedades controlan la posición del formulario
equivale, aproximadamente, a 1/72pulgadas.) Este ajuste no afecta al tamaño
en la pantalla, definiendo la ubicación de la parte superior de la ventana y de
de cualquier texto impreso.
su extremo izquierdo, medidos por omisión en twips.
ForeColor (color del primer plano). Esta propiedad define el color del primer plano
Visible (visible). El ajuste de esta propiedad booleana indica si la ventana del for­
del texto o de los gráficos. La propiedad se establece eligiendo un color de
mulario será visible o no. Si se establece esta propiedad como False se oculta­
una paleta, de la misma manera que la propiedad BackColor (veremos más
rá el formulario de la vista.
detalles en el capítulo 10). Todas las declaraciones Print escriben el texto
usando el color del primer plano. WindowState (estado de la ventana). Esta propiedad determina si la ventana apare­
cerá en su estado normal (el valor 0), en un estado minimizado como un ico­
Height, Width (altura, anchura). Estas propiedades determinan la altura y la anchura
no (el valor 1) o en un estado maximizado (el valor 2).
del formulario, medidas en unidades llamadas twips, o veinteavas partes de
punto. (Un twip equivale a 1 / 1440 pulgadas.)
Eventos
Icon (icono). Puedes asignarle como valor a esta propiedad el nombre de un archi­
Click, DblClick y Load son los eventos más comunes que procesa un formulario.
vo que contenga un icono. El icono representará al formulario cuando esté
(Los eventos KeyPress y el proceso de arrastrar-y-soltar se introducen en los capí­
minimizado. Si quieres establecer esta propiedad durante el diseño, selecció­
tulos 6 y 7.)
nala de la lista de propiedades de la ventana Properties y luego haz clic en el
botón con los puntos suspensivos que aparece al lado del cuadro Ajustes. Se­ Click (clic). Cuando el usuario hace clic en el formulario, Visual Basic llama al pro­
lecciona un archivo de icono en el cuadro de diálogo que aparece. Si quieres cedimiento Form_Click. Si el usuario hace clic sobre un objeto contenido en el
establecer la propiedad durante la ejecución, debes utilizar la función LoadPic- formulario, el evento Click no se pasa al formulario, incluso aunque el otro
ture o asignar el valor de la propiedad Icon de algún otro formulario. objeto no procese el evento.

MaxButton, MinButton
(botón maximizar, botón minimizar). Debes establecer estas DblClick(doble clic). Este evento se recibe si el usuario hace clic dos veces en rápi­
propiedades booleanas como True, si quieres que aparezcan botones Maximi­ da sucesión. El proceso, realmente, envía dos eventos: un evento Click para el
zar y Minimizar en la esquina superior derecha de la ventana. Estas dos pro­ primer clic del ratón, y un evento DblClick para el segundo.
piedades se ignoran si has establecido la propiedad BorderStyle a 0 - None.
Load (cargar). Este evento ocurre automáticamente cuando se carga un formulario,
Observa (que los botones Maximizar y Minimizar no desaparecen del formula­
por ejemplo, cuando se arranca una aplicación. Un procedimiento de evento
rio durante el diseño, incluso aunque establezcas las propiedades MaxButton Load es muy útil para dar un valor inicial a las propiedades y variables al co­
y MinButton a False; el efecto de estos ajustes no es visible en la ventana has­ mienzo de un programa (proceso que recibe el nombre de "inicializar'').
ta el momento de la ejecución.

Name (nombre). Esta propiedad define el nombre del formulario en el código del Procedimientos y métodos
programa. No puede cambiarse durante la ejecución.
Los métodos más interesantes de un formulario son los métodos gráficos. Como
Picture (dibujo). Puedes establecer esta propiedad para indicar que se muestre son bastante complejos les hemos dedicado un capítulo entero del libro (el capí­
siempre en el formulario un dibujo bitmap. Si quieres establecer esta propie­ tulo 10). Por ahora echaremos una rápida mirada a un par de métodos (y a una
dad durante el diseño, selecciónala de la lista de propiedades y haz clic en el función) para ir abriendo boca.

92 93
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

C/s(borrar). Este método borra del formulario todos los gráficos y el texto. La sin­ 1. Arranca la aplicación Paintbrush en Windows, dibuja una gráfico sencillo y
taxis completa del método Cls es la siguiente: guárdalo en un archivo en el disco duro. Aquí tienes un ejemplo usando
[nombreDelFormulario].Cls un famoso icono cultural de los años 70:

LoadPicture (cargar dibujo). Esta función se puede utilizar para establecer la propie­
dad Picture de un formulario. Aquí está la sintaxis de la función:

LoadPicture[( nombreDelArchivo])

El nombre del archivo debe ser una expresión de cadena que identifique a un
archivo que contenga un icono, un bitmap (un gráfico de mapa de bits) de
Windows o un metaarchivo (metafile) de Windows. (Estos archivos tienen,
normalmente, las extensiones ICO, BMP y WMF.) Si no especificas un nombre
de archivo, LoadPicture devuelve un dibujo blanco.

Prínt (imprimir). Este método escribe texto en el formulario. Utiliza esta sintaxis:

nombreDelFormulario].Print [[expresión][{ ; | , }]...

Cada expresión va seguida de un punto y coma o de una coma. Si se usa un


punto y coma, la siguiente expresión irá inmediatamente a continuación del últi­
mo carácter escrito. Si se utiliza una coma, la posición de salida en el formulario 2. Vuelve a Visual Basic y crea un proyecto nuevo seleccionando el comando
será la siguiente columna. (Las columnas están definidas cada 14 caracteres.) Si la New Project del menú File.
expresión final en la declaración Print termina en un punto y coma o en una
3. Selecciona la propiedad Picture en la ventana Properties, y luego haz clic
coma, no se escribirá un retorno de carro en el formulario; en caso contrario, la
en el botón con los puntos suspensivos que hay a la derecha del cuadro
posición de salida se establecerá en la siguiente línea. Aquí tienes algunos ejem­
Ajustes. Aparecerá el cuadro Load Picture (cargar dibujo):
plos del uso del método Print en la ventana Debug:

A pesar de lo extraño que pueda sonar, el método Print es, realmente, un méto­
do gráfico; puedes encontrar más información sobre él en el capítulo 10.

4. Especifica en el cuadro de diálogo el nombre del archivo gráfico que creas­


La aplicación Sonrisa te con Paintbrush, y luego haz. clic en el botón OK. Mi versión del formula­
Ahora trata de construir el proyecto de ejemplo, que muestra algunos de los ajus­ rio tiene ahora el aspecto que puedes ver en la parte superior de la página
tes de las propiedades, métodos y procedimientos asociados con los formularios. siguiente:

94 95
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

5. Selecciona la propiedad FontBold de la lista de propiedades y establécela 10. Mientras que la aplicación esté funcionando todavía, prueba a hacer doble
como False en el cuadro Ajustes. clic sobre el formulario. Esta acción hace que el programa ejecute el proce­
6. Abre la ventana de código para Form1 haciendo clic en el botón View dimiento Form_DblClick. Si miras atentamente verás que el programa eje­
Code de la ventana del proyecto o haciendo doble clic en el formulario. cuta el procedimiento Form_Click antes de que Form_DblClick borre el
formulario. Observa también que el método Cls borra sólo la información
7. Selecciona Form en el cuadro Object que hay en la parte superior de la que se ha añadido al formulario, y no el dibujo del fondo.
ventana de código y luego selecciona Click en el cuadro Procedure. Intro­
duce el código necesario para crear el procedimiento Form_Click, como se El código escrito para este ejemplo es bastante preciso: especifica el uso del mé­
muestra aquí en gris: todo Print para Form1, y modifica, explícitamente, la propiedad FontBold de
Form1. Por desgracia, esta precisión puede ocasionarte problemas algunas veces.
Sub Form_Click ()
Para verlo, termina la aplicación (pulsando Alt+F4 o haciendo clic en el botón
Form1.Print "Tenga un
End de la barra de herramientas), y vuelve al modo de diseño. Ahora cambia la
Form1.FontBold = True
propiedad Name del formulario a Sonrisa. Cuando trates de ejecutar el programa
Form1.Print "buen";
Form1.FontBold = False otra vez, Visual Basic mostrará el mensaje de error que aparece en la figura 5.1
Form1.Print " día" (en la página siguiente).
End Sub
Visual Basic se queja de que no tiene conocimiento de que haya algún objeto lla­
8 . Selecciona DblClick en el cuadro Procedure. Introduce la línea de código mado Forml. Realmente, el programa no contiene tal objeto; el único formulario
que se muestra en gris para crear el procedimiento Form_DblClick: de tu programa se llama ahora Sonrisa.

Sub Form_DblClick () Aunque no es probable que quieras perder mucho tiempo cambiando el nombre
Form1.Cls de los formularios de tus programas, sí que puedes desear incorporar parte de un
End Sub programa a otro en algún momento posterior. En tal caso, podrías encontrarte
con este problema. Visual Basic ofrece una solución sencilla. Los métodos y las
9. Ahora ejecuta la aplicación seleccionando el comando Start del menú Run,
propiedades tienen un ámbito, de la misma manera que las variables. Si utilizas el
haciendo clic en el botón Start de la barra de herramientas o pulsando F5.
nombre de un método o de un procedimiento sin definir explícitamente el objeto
Haz clic en varios puntos del formulario. La aplicación debe comportarse
al que pertenece, Visual Basic usará el contexto de ejecución actual para determi-
como se muestra aquí:

97
96
EL LIBRO DEL VISUAL BASIC
5 El uso de formularios y herramientas de Visual Basic

mente requiere más memoria y tiempo cuando se utiliza. Los cuadros de dibujo
son los más adecuados para entornos dinámicos —por ejemplo, cuando se dibu­
jan gráficos directamente en la pantalla mientras el programa está funcionando o
cuando se anima un icono moviéndolo por la pantalla. (Los métodos gráficos,
que te permiten dibujar líneas y pintar texto, se describen en el capítulo 10.) Los
objetos imagen son mejores para situaciones estáticas —o sea, cuando el bitmap
o el icono que has creado y situado en la pantalla no se va a modificar.

Figura 5.1.
Un mensaje de error sobre un objeto no identificado
Figura 5.2.
nar el objeto afectado. Si borras todas las referencias a Form1, el código de la La herramienta Picture Box (cuadro de dibujo)
aplicación Sonrisa se parecerá a esto:

Sub Form_Click ()
Print "Tenga un ";
FontBold = True
Print "buen";
FontBold = False Figura 5.3.
Print " día" La herramienta Image (imagen)
End Sub

Sub Form_DblClick () Propiedades


Cls
Los controles cuadro de dibujo e imagen tienen las propiedades Enabled, Height,
End Sub
Left, Name, Picture, Top, Visible y Width. La mayoría de estas propiedades se
Como los procedimientos Form_Click y Form_DblClick siempre se ejecutan en el comportan exactamente como se ha descrito en el apartado anterior sobre los for­
contexto del formulario (independientemente del nombre del formulario), los mé­ mularios, excepto que las coordenadas Height, Left, Top y Width se miden con
todos Print y Cls y la propiedad FontBold deben estar dentro del ámbito del for­ respecto a la localización del objeto en el formulario, no en coordenadas absolu­
mulario actual. De esta manera puedes usar fácilmente código más general (y tas de pantalla. (Esto es así para todos los controles creados con la caja de herra­
tendrás que escribir menos). mientas.) La propiedad Picture puede establecerse para que muestre un bitmap o
un icono: durante el diseño utiliza la ventana de propiedades y el cuadro de diá­
logo Load Picture (como lo haremos en el proyecto de ejemplo que viene a con­
Cuadros de dibujo e imágenes tinuación); durante la ejecución tendrás que utilizar la función LoaclPicture.
Los controles Picture Box (cuadro de dibujo) e Image (imagen) permiten situar Los cuadros de dibujo, que se comportan casi como pequeños formularios dentro
información gráfica en una posición específica del formulario. Puedes ver en las del formulario principal, tienen las siguientes propiedades (de las cuales carece el
figuras 5.2 y 5.3 las herramientas cuadro de dibujo e imagen de la caja de herra­ control imagen): AutoRedraw, FontBold, FontItalic, FontName, FontSize y FontUn-
mientas. El control cuadro de dibujo es el más flexible de los dos y, consecuente­ derline. Estas propiedades se comportan igual que en los formularios. Los contro-

98 99
EL LIBRO DEL VISUAL BASIC
5 El uso de formularios y herramientas de Visual Basic

les imagen poseen sólo una propiedad que los cuadros de control no tienen: la
miten los métodos Cls y Print, así como los otros métodos gráficos descritos en el
propiedad Stretch (extender). Por omisión, Stretch está establecida como False, lo
capítulo 10.
que produce que el control imagen ajuste su propio tamaño para que coincida
con el del gráfico que contiene. Si estableces Stretch como True, el gráfico ajusta­
Lo paleta de direcciones
rá su tamaño al del control.
Este proyecto de ejemplo te permite usar una serie de imágenes para crear una
Los controles imagen y cuadro de dibujo también difieren en otro aspecto. La paleta de iconos similar a la caja de herramientas de Visual Basic. El programa
zona de visualización de un formulario está compuesta por tres rejillas, como se debe funcionar exactamente de la misma manera, tanto si usas controles del tipo
ilustra en la figura 5.4. Toda la información mostrada directamente en el formula­ cuadro de dibujo como controles imagen; sin embargo, recuerda que los cuadros
rio (por ejemplo, imprimiendo o dibujando con los métodos gráficos) aparece en de dibujo son menos eficientes cuando lo que se muestra en pantalla es algo es­
la rejilla inferior. La información de tres controles gráficos (los controles imagen, tático.
forma —Shape— y línea —Line) aparecen en la rejilla intermedia, y todos los de­
1. Crea un proyecto nuevo en Visual Basic seleccionando el comando New
más objetos se muestran en la rejilla superior. Consiguientemente, el texto impre­
Project del menú File.
so en un formulario puede ser ocultado por una imagen, que a su vez puede ser
ocultada por un cuadro de dibujo. 2. Establece las propiedades del formulario como se muestra aquí. (La nota­
ción [ninguna] indica que el ajuste debe ser una cadena vacía.)

Propiedad Ajuste

BorderStyle 1-Fixed Single


Rejilla inferior:
formulario
Caption [ninguno]
MaxButton False
Rejilla interm edia:
MinButton False
imagen, form a, línea
Name Direcciones
Rejilla superior:
3. Haz clic en la herramienta Image de la caja de herramientas y arrastra el
otros controles
puntero del ratón sobre el formulario para crear un pequeño control ima­
gen en la esquina superior izquierda del formulario:
Figura 5.4.
Las rejillas de la zona de visualización de un formulario

Eventos
Al igual que los formularios, tanto el control cuadro de dibujo como el control
imagen pueden recibir los eventos Click y DblClick, los cuales están entre los más
simples y los que se encuentran con más frecuencia.

Procedimientos y métodos
Puede llamarse a la función LoadPicture para establecer la propiedad Picture de 4. Crea tres controles Image más del mismo tamaño, y organízalos en un cua­
un control cuadro de dibujo o de una imagen. Los cuadros de dibujo también ad­ drado de 2 por 2. Utiliza el ratón para modificar los límites de la ventana

100 101
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

del formulario para que se ajusten a los cuatros controles imagen. Tu for­ Sub Image4_Click ()
mulario debe parecerse ahora al que se muestra aquí: Debug.Print "Has seleccionado derecha"
End Sub

8 . Para separar visualmente los iconos puedes poner bordes a su alrededor.


Haz clic en la imagen del extremo superior izquierdo para seleccionarla, y
luego mantén pulsada la tecla Ctrl mientras haces clic en las otras tres imá­
genes para seleccionarlas todas a la vez. En la ventana Properties seleccio­
na la propiedad BorderStyle de la lista de propiedades, y establécela como
5. Haz clic en el control Image del extremo superior izquierdo del formulario
1 - Fixed Single.
(Image1) para seleccionarlo. En la ventana Properties, selecciona de la lista
de propiedades la propiedad Picture para Image1. Luego haz clic en el bo­ Cuando ejecutes esta aplicación (pulsando F5), tu formulario será una paleta de
tón con los puntos suspensivos que hay al lado del cuadro Ajuste para "Direcciones". Cuando hagas clic en algunos iconos debes ver un resultado como
abrir el cuadro de diálogo Load Picture (que viste en la página 95). Estable­ el que se muestra en la figura 5.5.
ce el tipo de archivo en el cuadro de diálogo para que se vean archivos de
icono (con la extensión ICO). En el subdirectorio ARROWS situado dentro
del directorio ICONS que viene con Visual Basic encontrarás el archivo
ARW02UP.ICO. Cuando selecciones ese archivo, aparecerá el icono que
contiene en el control Image seleccionado:

6. Haz doble clic en la imagen y define el siguiente procedimiento en la ven­


tana de código:
Figura 5.5.
Sub Image1_Click () liso de la paleta de direcciones
Debug.Print "Has seleccionado arriba"
End Sub

7. Repite el mismo proceso para los otros tres controles Image, cargando los S i incluyes un código similar en una aplicación más grande, podrás crear una pa­
archivos ARW02DN.ICO, ARW02LT.ICO y ARW02RT.ICO, e introduciendo leta de iconos que sean apropiados al programa que estés creando. La caja de he­
los tres procedimientos del evento Click como sigue: rramientas de Visual Basic, que se usa en el modo de diseño, es un ejemplo de
este tipo de paletas.
Sub Image2_Click ()
Debug.Print "Has seleccionado abajo" Consejo: Visual Basic viene con cientos de iconos, así como con un pro­
End Sub grama editor de iconos que te permite crear los tuyos propios. El propio
editor de iconos se escribió en Visual Basic. Puedes atrancar el editor de
Sub Image3_Click ()
iconos cargando el proyecto ICONWRKS.MAK (del directorio SAMPLES) y
Debug.Print "Has seleccionado izquierda"
End Sub
ejecutando la aplicación. El editor de iconos tiene su propia Ayuda.

102 103
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

Etiquetas Eventos
Los objetos Label reciben los eventos Click y DblClick, al igual que los cuadros
Una etiqueta proporciona un área donde se puede presentar texto que no pueda
de dibujo, los controles imagen, los formularios, etcétera.
ser editado por el usuario. El contenido se establece modificando la propiedad
Caption de la etiqueta. No se puede imprimir ni dibujar en una etiqueta. Las eti­
quetas se crean con la herramienta Label de la caja de herramientas de Visual Ba­ Procedimientos y métodos
sic, que se muestra en la figura 5.6. Los objetos Label sólo tienen la misión de mostrar pequeños bloques de texto.
Como el texto se define estableciendo la propiedad Caption, ninguno de los mé­
todos asociados con etiquetas son particularmente útiles o necesarios para el
principiante.

Figura 5.6. Modificar la aplicación Cronómetro


La herramienta Label (etiqueta) Hagamos un cambio más al programa Cronómetro que creaste en el capítulo 1.
En este programa usamos cuadros de texto para mostrar la salida de la aplicación.
Como recordarás, los cuadros de texto puede modificarlos el usuario. Para ilustrar
Propiedades
esto, carga y ejecuta la aplicación Cronómetro. Después de detener el tiempo, se­
Las etiquetas tienen las propiedades FontBold, FontItalic, FontName, FontSize, lecciona el texto del cuadro Hora de inicio y escribe xyz —se embarulla la panta­
FontUnderline, Height, Left, Name, Top, Visible y Width, que funcionan de mane­ lla, ¿no? Desde luego, es difícil imaginarse la razón por la cual un usuario quisiera
ra estándar. A continuación se describen algunas propiedades adicionales: hacer una cosa así, pero muchos programadores se han pasado largas y solitarias
Alignment (alineación). Esta propiedad determina cómo se sitúa el título de la eti­ noches preguntándose por qué los usuarios hacen lo que hacen. En cualquier
queta. Por omisión, la propiedad Alignment se establece en 0, lo cual justifica caso, puedes simplemente estructurar la aplicación para que evite este problema
el título a la izquierda. También puedes establecer la alineación en 1 - Right usando etiquetas en lugar de cuadros de texto.
Justify (justificación a la derecha) o en 2 - Center (centro). 1. Detén el programa y vuelve al modo de diseño. Borra los tres cuadros de
AutoSize (autotamaño). Si esta propiedad se establece como True, el tamaño de la texto haciendo clic en cada uno para seleccionarlos y pulsando luego la te­
etiqueta se ajusta automáticamente al texto que se especifique con la propie­ cla Supr, o eligiendo el comando Delete (borrar) del menú Edit. En lugar
dad Caption. Si AutoSize se establece como False, el tamaño de la etiqueta de los tres cuadros de texto dibuja tres etiquetas.
quedará como se definió durante el diseño; en ese caso, si el título es dema­ 2. Establece la propiedad BorderStyle de cada etiqueta a 1 - Fixed Single para
siado largo sólo se verá lo que quepa. crear un borde de una sola línea. Borra cualquier texto que aparezca en el
BorderStyle (estilo del borde). Esta propiedad puede establecerse en 0 (que es cuadro Ajustes de la propiedad Caption, dejando esta propiedad vacía para
como aparece por omisión) para que no haya borde, ó en 1 para que aparez­ todas las etiquetas.
ca un borde de una línea. 3. Establece la propiedad Name de la etiqueta superior a lblInicio. Luego es­
Caption (título). La propiedad Caption contiene el texto que aparecerá en el campo tablece la propiedad Name de la etiqueta intermedia a lblParada y la pro­
de la etiqueta, o área de pantalla. piedad Name de la etiqueta inferior a lblLapsus.

Enabled (activada). Esta propiedad normalmente está establecida como True, pero 4. También debes modificar el código para los botones Inicio y Parada. La
se puede establecer como False para que el texto aparezca atenuado en la versión previa del programa mostraba sus resultados estableciendo la pro­
pantalla (en color gris) y para desactivar cualquier evento del ratón. piedad Text de los cuadros de texto. Sin embargo, las etiquetas tienen una

105
104
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

propiedad Caption en lugar de una propiedad Text. Y, por supuesto, has


sustituido los propios cuadros de texto por etiquetas. Tienes que editar los
procedimientos del evento Click de los dos botones, de manera que pue­
das modificar cualquier referencia a los cuadros de texto y a la propiedad
Text. El nuevo código debe ser como éste: Figura 5.7.
La herramienta Text Box (cuadro de texto)
Sub btnInicio_Click ()
HoraInicio = Now
lblInicio.Caption = Format(HoraInicio, "hh:mm:ss")
como el usuario teclee. Pero, si estableces MaxLength en un valor que no sea
lblParada.Caption = " " cero, Visual Basic restringirá la entrada al número de caracteres especificados.
lblLapsus.Caption = " "
MultíLine
(líneas múltiples). Lo más frecuente será que quieras establecer esta pro­
btnParada.Enabled = True
piedad como False, lo que evitará que el usuario pueda introducir más que
btnInicio.Enabled = False
End Sub
una línea de texto. Cuando la propiedad MultiLine se establece a True, el
usuario podrá pulsar la tecla Intro para insertar un retorno de carro en el texto
Sub btnParada_Click () y continuar la introducción de texto en la siguiente línea.
HoraParada = Now
PasswordChar (carácter de contraseña). Esta propiedad indica si un cuadro de texto
Lapsus = HoraParada - HoraInicio
es un campo de contraseña o no. Cuando el usuario escribe en un campo de
lblParada.Caption = Format(HoraParada, "hh:mm:ss")
lblLapsus.Caption = Format(Lapsus, "hh:mm:ss”) contraseña, los caracteres que aparecen en la pantalla son diferentes de los
btnParada.Enabled = False que se escriben. Por omisión, esta propiedad está establecida como una cade­
btnInicio.Enabled = True na vacía, lo que significa que el usuario verá los caracteres que está introdu­
End Sub ciendo. Si la propiedad PasswordChar se establece en un carácter como un
asterisco (*), ése será el carácter que aparezca en pantalla cada vez que el
Ejecuta la aplicación otra vez para comprobar los cambios. La pantalla debe tener
usuario pulse una tecla. No lo entiendas mal: el contenido real del cuadro de
exactamente el mismo aspecto que tenía cuando ejecutaste la aplicación en el ca­
texto es lo que escriba el usuario; sólo se modifica lo que aparece en pantalla.
pítulo 1, pero ya no podrás seleccionar ni modificar ninguno de los textos que
aparecen en la pantalla. ScroIlBars(barras de desplazamiento). Puedes establecer esta propiedad en 0 (el
cuadro de texto no tendrá barras de desplazamiento), 2 (sólo una barra de

Cuadros de texto desplazamiento vertical), ó 3 (las dos barras de desplazamiento: vertical y ho­
rizontal).
Ya has trabajado con cuadros de texto en capítulos anteriores, usando la herra­
SelLenght (longitud de la selección). Esta propiedad contiene el número de caracte­
mienta Text Box que se muestra en la figura 5.7. Dicho con sencillez, los cuadros
res seleccionados actualmente. Su valor cambia cuando el usuario selecciona
de texto crean un área de pantalla en la cual el usuario puede introducir texto.
texto en el cuadro de texto. También puedes alterar la selección desde el pro­
grama estableciendo esta propiedad en un valor entero en el código. Si Sel­
Propiedades Lenght es 0 no habrá ningún carácter seleccionado. Esta propiedad, al igual
Los cuadros de texto tienen las propiedades estándar BorderStyle, Enabled, Font- que las propiedades SetStart y SelText son accesibles solamente durante la eje­
Bold, FontItalic, FontName, FontSize, FontUnderline, Height, Left, Name, Top, Vi­ cución.
sible y Width, además de las siguientes:
SelStart (comienzo de la selección). El valor de esta propiedad indica dónde co­
MaxLength (longitudmáxima). Esta propiedad, normalmente, se establece en 0 mienza la selección actual. Un valor de 0 indica que la selección (o el punto
(por omisión), indicando que el cuadro de texto aceptará tantos caracteres de inserción) comienza delante del primer carácter; un valor de 1 indica que

106 107
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

comienza delante del segundo carácter; y así sucesivamente. Esta propiedad La aplicación EditNota
también se puede modificar desde el programa.
Ya has utilizado cuadros de texto para textos simples de una sola línea; veamos
SelText (texto seleccionado). Esta propiedad contiene la cadena de texto que está ahora el comportamiento del texto en el modo de líneas múltiples, implementan­
seleccionada actualmente. Si estableces SelText en el código del programa, do un pequeño bloc de notas que permita cortar, pegar y una edición simple.
sustituirás el texto seleccionado en el cuadro de texto por el que hayas deter­
Comienza abriendo un proyecto nuevo. Establece las propiedades Caption y
minado con el ajuste de SelText. Por ejemplo, si un cuadro de texto llamado
Name del formulario como EditNota. Añade un nuevo cuadro de texto al formula­
Text1 contiene la línea "Juan, vébete la leche" y está seleccionada la palabra
rio, y establece sus propiedades como sigue:
vébete, puedes corregir la frase ejecutando la instrucción Text1.SelText = "bebe".
Observa que esto también modifica el valor de SelLenght. Sin embargo, como Propiedad Ajuste
la selección comienza en la misma posición, SelStart no varía.
MultiLine True
Text (texto). El programa lee esta propiedad para ver qué ha introducido el usua­
Name txtCuadro
rio. El programa también puede modificar la propiedad Text para cambiar el
texto que aparece en pantalla. ScrollBars 3 - Both
Text [ninguno]

Eventos Tu formulario EditNota debe parecerse ahora a éste:


Los cuadros de texto no procesan eventos producidos con el ratón, pero pueden
controlar todas y cada una de las pulsaciones de teclas producidas por el usuario.
Esto es muy importante, pero aplazaremos el estudio de algunos de los eventos
de teclado para el capítulo 7.

Change (cambio). Este evento se produce cuando se modifica la propiedad Text


del cuadro de texto, ya sea porque el usuario introduzca nueva información, o
porque el programa establezca un valor nuevo para la propiedad. Ten en
cuenta que si el usuario escribe la palabra Hola, se produce cuatro veces el
evento Change, una por cada letra tecleada.

LostFocus (foco perdido). Este evento se produce cuando el usuario usa la tecla
Tab para salir del cuadro de texto o utiliza el ratón para seleccionar algún otro
objeto en el formulario. Si quieres examinar el contenido de la propiedad El cuadro de texto gestionará la introducción y la edición del texto sin que tú ten­
Text, normalmente, es más eficiente hacerlo como parte del procedimiento del gas que escribir nada de código. Cuando ejecutes la aplicación podrás introducir
evento LostFocus, que usando el procedimiento del evento Change. texto, editarlo y cortar, copiar y pegar con los atajos de teclado estándar de Win­
dows Ctrl+X, Ctrl+C y Ctrl+V.

Procedimientos y métodos Para conseguir que la aplicación tenga una apariencia más profesional, puedes
El método más útil asociado con los cuadros de texto es SetFocus, el cual sitúa el hacer que el cuadro se ajuste perfectamente a la ventana del formulario. Para
cursor en un cuadro de texto específico. Cuando se crea un formulario con varios ello, edita el procedimiento Resize (cambiar el tamaño) del formulario como se
cuadros de texto, se puede utilizar este método para dirigir la atención del usua­ muestra aquí:
rio al cuadro de texto más importante. La sintaxis es simple: Sub Form_Resize
[objeto]. SetFocus txtCuadro.Top = 0

109
108
EL LIBRO DEL VISUAL BASIC
5 El uso de formularios y herramientas de Visual Basic

txtCuadro.Left = 0
txtCuadro.Width = ScaleWidth hace clic sobre ellos, mientras que los cuadros de control y los botones de opcio­
txtCuadro.Height = ScaleHeight nes indican un estado y permiten que el usuario cambie dicho estado. El usuario
End Sub hace clic en un cuadro de control para seleccionar o "deseleccionar" una cierta
característica u opción; cuando aparece una X en el cuadro de control, la caracte­
Este procedimiento se ejecuta cada vez que se cambia de tamaño al formulario,
rística está seleccionada o activada. Cada cuadro de control opera independien­
incluyendo la primera vez que el formulario se muestra en pantalla. Estableciendo
temente. Por el contrario, los botones de opciones aparecen en conjuntos y
las propiedades Top (arriba) y Left (izquierda) del cuadro de texto en 0, te ase­
permiten al usuario elegir una opción de un conjunto de ellas. Cuando se activa
gurarás de que su esquina superior izquierda se ajusta perfectamente a la paite
un botón de opción, los demás se desactivan. (A los botones de opciones algunas
superior del formulario, como se muestra en la figura 5.8. Las propiedades Width
veces se les denomina botones de radio.)
(anchura) y Height (altura) del cuadro de texto se establecen para que coincidan
con las propiedades ScaleWidth y ScaleHeight del formulario (las dimensiones Las herramientas de la caja de herramientas que se utilizan para crear estas tres
completas del área de visualización del formulario). Observa que podrías haber clases de botones se muestran en las figuras 5.9, 5.10 y 5.11.
escrito esas dos líneas como txtCuadro. Width = EditNota.ScaleWidth y txtCua­
dro.Height = EditNota.ScaleHeight. Sin embargo, como el código siempre se eje­
cutará en el contexto del formulario, no es necesario que utilices el nombre del
mismo. Además, si cambias el nombre del formulario no tendrás que volver y
editar el código.
Figura 5.9.
La herramienta Command Button (Botón de comando)

Figura 5.10.
La herramienta Check Box (Cuadro de control)

Figura 5.8.
Ejecución de la aplicación EditNota tras cambiarle el tamaño
Figura 5.11.
La herramienta Opcion Button (Botón de opción)

Botones de comando, cuadros de control y botones de opciones


Estos tres objetos de Visual Basic son muy similares desde el punto de vista de un Propiedades
programador. Sin embargo, desde el punto de vista del usuario, difieren visual­ Los botones de comando, los cuadros de control y los botones de opciones tie­
mente y tienen propósitos diferentes. Los botones de comando, normalmente, nen las siguientes propiedades entre otras: Caption, Enabled, FontBold, EontItalic,
producen que ocurra una acción (o sea, que se ejecute un comando) cuando se FontName, FontSize, FontUnderline, Height, Left, Name, Top, Visible y Width.

110 111
EL LIBRO DEL VISUAL BASIC
5 El uso de formularios y herramientas de Visual Basic

Además, destacan debido a la cantidad de veces que se utilizan estas otras pro­
piedades:

Cancel (cancelar). Esta propiedad sólo la tienen los botones de comando. Cuando
la propiedad Cancel de un botón se establece como True, pulsar la tecla Esc
produce el mismo efecto que hacer clic en dicho botón (como el botón Can­
celar de un cuadro de diálogo, por ejemplo). En un formulario, sólo un botón
de comando puede tener su propiedad Cancel establecida en True.

Default (por omisión). Esta propiedad sólo la tienen los botones de comando.
Cuando esta propiedad se establece como True, pulsar la tecla Intro produce
el mismo efecto que hacer clic en el botón (como el botón Aceptar de un cua­
dro de diálogo). En un formulario, sólo un botón de comando puede tener su
propiedad Default establecida en True. Establece las propiedades de los objetos como se muestra en la figura 5.12. Des­
pués de que hayas establecido las propiedades, el formulario debe parecerse al
Value (valor). Esta propiedad indica el estado de un cuadro de control o de un bo­ que se muestra en la figura 5.13.
tón de opción. La propiedad Value de un botón de opción puede establecerse
como False o como True; cuando se establece como True, el botón está "acti­
vado" —es decir, el centro del botón se resalta. La propiedad Value de un bo­ Objeto Propiedad Ajuste
tón de control puede establecerse en 0, 1 ó 2: un ajuste de 0 indica que el
Option1 Caption 1 Jugador
cuadro de control no está activado; un ajuste de 1 indica que está activado; y
Value True
un ajuste de 2 indica que el cuadro aparece en gris.
Option2 Caption 2 Jugadores
Option3 Caption 3 Jugadores
Eventos Option4 Caption 4 Jugadores
Los tres objetos reciben el evento Click, aunque, normalmente, usarás un procedi­ Check1 Caption Sonido
miento para el evento Click sólo en el caso de los botones de comando. Los bo­ Check2 Caption Puntos de bonos
tones de opciones y los cuadros de control muestran automáticamente su estado Caption Devolución de moneda
Command1
cuando se hace clic sobre ellos; generalmente, no hace falta programar nada.
Command2 Caption Comenzar
Default True
Procedimientos y métodos Command3 Cancel True
No se puede imprimir ni dibujar en los botones de comando, los cuadros de con­ Caption Salir
trol o los botones de opciones. Ninguno de los métodos tratados hasta ahora se
aplican a esta clase de objetos. Figura 5.12.
El ajuste de las propiedades para la aplicación Juego
La aplicación Juego
Finalmente, edita los procedimientos Click de los botones Command2 y Com-
Este proyecto representa el tipo de aspecto que podrías encontrar en un vídeo mand3 para incluir este código:
juego. Comienza por abrir un proyecto nuevo. Crea tres botones de comando,
Sub Command2_Click ( )
cuatro botones de opciones y dos cuadros de control, y organízalos como se
MsgBox "Game over"
muestra a continuación:
End Sub

112 113
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

Sub Command3_Click ( ) herramienta Erame de la caja de herramientas de Visual Basic, la cual se muestra
End en la figura 5.14.
End Sub

Ejecuta el programa varias veces para ver cómo se comporta. Prueba a pulsar las
teclas Intro y Esc para ver qué comandos ejecutan.

Si quieres que en la ventana Debug aparezca el estado de los botones de opcio­


nes y de los cuadros de control, puedes modificar el procedimiento clic de Com- Figura 5.14.
mand2 como se muestra aquí: La herramienta Frame (Marco)

Sub Command2_Click ( )
Debug.Print Option1.Value
Debug.Print Option2. Value
Debug.Print Option3.Value Propiedades
Debug.Print Option4.Value La propiedad Name del marco se utiliza para identificarlo en el código del pro­
Debug.Print Check1.Value grama, y la propiedad Caption define el texto que se verá como parte del marco.
Debug.Print Check2.Value
Los marcos también tienen las propiedades Enabled, FontBold, FontItalic, FontNa-
End Sub
me, FontSize, FontUnderline, Height, Left, Name, Top, Visible y Width.

La ya familiar propiedad Enabled de comporta de una manera ligeramente distin­


ta en los marcos. Esta propiedad, normalmente, se establece como True; cuando
se establece como False, el texto del título del marco se atenúa (se pone en gris),
y todos los objetos que contiene el marco se desactivan, incluyendo los cuadros
de texto, los botones y los demás objetos.

Eventos
Los marcos no responden con eventos de ratón ni con entradas del usuario.

Procedimientos y Métodos
No se puede imprimir texto ni dibujar en los marcos, ni se pueden asociar con
Figura 5.13.
gráficos.
HI interface de Juego

Modificación de la aplicación Juego

Marcos Como los marcos no son terriblemente interesantes por sí mismos, vamos simple­
mente a modificar el proyecto Juego del apartado anterior en lugar de crear una
Los marcos existen para separar grupos de otros objetos en la pantalla. En el caso aplicación nueva.
de los botones de opciones, los marcos también afectan al comportamiento de
1. En la ventana del formulario de la aplicación Juego, borra los botones de
los botones, como demostrará el proyecto de ejemplo. Para los otros objetos, los
opciones etiquetados como 3 Jugadores y 4 Jugadores. En su lugar dibuja
marcos proporcionan una separación visual así como la posibilidad de activarlos
un marco como el que se muestra aquí:
y desactivarlos en grupo. Si quieres poner un marco en un formulario utiliza la

115
114
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

Cuadros de lista
Los cuadros de lista permiten ofrecer al usuario una serie de opciones para que
elija. El cuadro de lista muestra las opciones que están disponibles, y el usuario
selecciona un elemento, o entrada de la lista, haciendo clic sobre él. Visual Basic
añadirá barras de desplazamiento al cuadro de lista si la lista completa es dema­
siado larga para ser vista toda a la vez. Para funcionar correctamente, un cuadro
de lista debe tener al menos tres líneas de altura. Si quieres añadir un cuadro de
lista a un formulario, utiliza la herramienta List Box de la caja de herramientas, la
cual se muestra en la figura 5.16. (Los cuadros de lista desplegable, como el cua­
dro Ajuste que aparece en la ventana Properties de Visual Basic, son una variante
de los cuadros combinados, los cuales se tratan en el siguiente apartado.)

2. Pon dos nuevos botones de opciones dentro del marco. Observa que de­
bes dibujarlos dentro del marco; en este caso no puedes hacer doble clic
sobre la herramienta Botón de opción para crear los botones y luego arras­
trarlos dentro del marco.

3. Establece la propiedad Caption del marco como Modo. Figura 5.16.


La herramienta List Box (Cuadro de lista)
4. Establece la propiedad Value del botón Option3 como True.

5. Establece la propiedad Caption del botón Option3 como Principiante y la El contenido de un cuadro de lista no se puede definir durante el diseño. En su
propiedad Caption del botón Option4 como Avanzado. lugar, el programa debe utilizar el método AddItem (añadir elemento) para intro­
El resultado debe parecerse al interface que se muestra en la figura 5.15. Cuando ducir elementos en la lista. Lo mejor suele ser inicializar un cuadro de lista en el
ejecutes el programa, observa que los botones de opciones que hay dentro del procedimiento del evento Load del formulario que contiene el cuadro de lista.
marco operan de manera independiente de los que están fuera de él.

Propiedades
Los cuadros de lista aceptan las propiedades habituales: Enabled, FontBold, Fon-
tItalic, FontName, FontSize, FontUnderline, Height, Left, Name, Top, Visible y
Width. Las propiedades especiales de los cuadros de lista son las siguientes:

Columns (columnas). Cuando esta propiedad se establece en 0 (que es el valor por


omisión), todos los elementos de la lista se muestran en una sola columna. Si
la propiedad se establece en 1 o) más, los elementos de la lista se organizan
con un diseño de varias columnas; el valor que se le haya dado a la propie­
dad indica cuántas columnas se verán en un momento dado. Se añadirán ba­
rras de desplazamiento horizontal a la lista cuando sea necesario.

List (lista). Esta propiedad, que no se puede modificar durante la etapa de diseño,
Figura 5.15. contiene la matriz de todos los valores almacenados en el cuadro de lista. (Las
El interface de Juego rediseñado

117
116
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

matrices se tratan en el capítulo 6.) Se puede acceder a los elementos indivi­ Text (texto). Esta propiedad, la cual no se puede modificar directamente, contiene
duales del cuadro de lista usando esta sintaxis: el texto del elemento más recientemente seleccionado.

objeto.List(índice)
Eventos
ListCount (contar lista). La propiedad ListCount, que no puede modificarse directa­ Los cuadros de lista reciben los dos eventos Click y DblClick. Normalmente, no
mente, contiene el número de elementos del cuadro de lista. escribirás código para un procedimiento Click, ya que el usuario podría seleccio­
nar un elemento y luego decidir seleccionar otro distinto. En lugar de esto, el
Listlndex (índice de la lista). El ajuste de esta propiedad indica el número del ele­
programa debe leer la propiedad Text cuando el usuario haga clic en un botón
mento de la lista más recientemente seleccionado. El valor índice del primer
de comando o cuando ocurra un evento DblClick.
elemento es el 0, el del siguiente el 1, y así sucesivamente. Si no hay seleccio­
nado ningún elemento, ListIndex se establece en -1. Si estableces la propiedad
ListIndex desde el programa, el resultado en la lista cambiará para reflejar el Procedimientos y métodos
ajuste. Se puede determinar el texto del elemento seleccionado leyendo la Los métodos utilizados con una mayor frecuencia en los cuadros de lista son Ad-
propiedad Text. dItem, Clear y RemoveItem. Estos tres métodos, que analizamos a continuación,
permiten modificar el contenido del cuadro de lista durante la ejecución del pro­
MultiSelect (selección múltiple). Esta propiedad controla cuántos elementos de la
grama.
lista se pueden seleccionar. Si la propiedad se establece en 0 - None, el usua­
rio sólo podrá seleccionar un elemento cada vez. Si el ajuste es 1 - Simple, el AddItem (añadir elemento). Este método permite insertar una línea de texto en un
usuario podrá seleccionar más de un elemento. Cuando MultiSelect se ajustan cuadro de lista. Se debe especificar el texto que se va a insertar y, opcional­
en el capíded, el usuario puede seleccionar un rango de elementos haciendo mente, el índice del elemento insertado. Si no especificas un índice, Visual Ba­
clic en el primero de ellos, manteniendo pulsada la tecla Mayús y haciendo sic insertará el elemento detrás de los ya existentes. Si la propiedad Sorted
clic en el último elemento del rango. El usuario también podrá mantener pul­ está establecida como True, no especifiques un valor de índice; Visual Basic
sada la tecla Ctrl y hacer clic en los elementos para seleccionarlos o "dese­ insertará el elemento en orden alfabético. Aquí puedes ver la sintaxis del mé­
leccionarlos" uno a uno. Ten en cuenta que, incluso cuando se seleccionan todo AddItem:
varios elementos, las propiedades ListIndex y Text indican sólo la selección objeto.AddItem texto[, índice]
más reciente. Deberás examinar cada elemento de la propiedad Selected para
determinar qué elementos están seleccionados. Clear (borrar). Este método elimina todos los elementos del cuadro de lista. La sin­
taxis para el método Clear es sencilla:
Selected (seleccionado). La propiedad Selected es una matriz que contiene un ele­
mento establecido como True o como False por cada uno de los elementos objeto.Clear
del cuadro de lista. Un ajuste de True indica que el elemento está selecciona­ RemoveItem (eliminar elemento). El método RemoveItem te permite eliminar una lí­
do; un ajuste de False indica que el elemento no está seleccionado. Para com­ nea de texto del cuadro de lista. Debes especificar el índice del elemento que
probar el estado de un elemento dado, especifica el índice del elemento quieras eliminar, usando la siguiente sintaxis:
usando la siguiente sintaxis:
objeto.RemoveItem índice
objeto. Selected(índice)
La aplicación Queso
Sorted (ordenada). Si quieres que Visual Basic mantenga la lista de elementos or­
denada alfabéticamente, debes establecer esta propiedad en True. Cuando se Este proyecto de ejemplo transfiere elementos entre dos cuadros de lista. Los ele­
establece como False (lo que ocurre por omisión), los elementos de la lista mentos de un cuadro estarán ordenados alfabéticamente; los del otro cuadro apa­
aparecen en el orden en el que se añadieron. recerán en el orden en el que se añadan.

118 119
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

Comienza creando un proyecto nuevo. En el formulario dibuja dos cuadros de lis­


ta, como se muestra en la figura 5.17, y establece la propiedad Sorted del cuadro Sub Form_Load ( )
de lista de la derecha (List2) a True. El resto de la aplicación se crea con el códi­ List1.AddItem "Gouda"
go mostrado en la figura 5.18. El procedimiento Form_Load inicializa el cuadro List1.AddItem "Camembert”
de lista. Los procedimientos List1_DblClick y List1_DblClick son prácticamente List1.AddItem "Cheddar"
idénticos, excepto porque transfieren los elementos de la lista en direcciones Listl.Addltem "Roquefort"
opuestas. List1.AddItem "Gruyere"
List1.AddItem "Edam"
Cuando hagas doble clic sobre un elemento de uno de los cuadros de lista, el List1.AddItem "Brie"
elemento será eliminado de ese cuadro y añadido al otro. El cuadro de lista List2 End Sub
continuará ordenando sus entradas en orden alfabético, mientras que List1 man­
Sub List1_DblClick ( )
tendrá las suyas en el orden en que sean añadidas.
List2.AddItem List1.Text
List1.RemoveItem List1.ListIndex
End Sub

Sub List2_DblClick ( )
List1.Addltem List2.Text
List2.RemoveItem List2.ListIndex
End Sub

Figura 5.17. Figura 5.18.

El diseño del formulario para la aplicación Queso El código del programa de la aplicación Queso

Cuadros combinados
Los cuadros combinados se crean mediante la herramienta Combo Box de la caja
de herramientas, que se muestra en la figura 5.19. El cuadro combinado se llama
así porque puede combinar un cuadro de texto y un cuadro de lista en un solo Figura 5.19.

control. Sin embargo, al contrario que un cuadro de lista, no permite varias co­ La herramienta Cuadro combinado
lumnas. Se pueden especificar tres tipos de comportamiento para un cuadro com­
binado estableciendo la propiedad Style.
Cuando Style se establece en 2, el cuadro combinado se convierte en un cuadro
Propiedades de lista desplegable. Inicialmente, sólo un elemento de la lista es visible; pero
cuando el usuario hace clic en el botón en el que aparece una flecha apuntan­
Además de las propiedades habituales, los cuadros combinados tienen dos pro­
do hacia abajo (que hay al lado del cuadro), la lista completa se despliega,
piedades de interés: Style y Text.
mostrando todos los elementos y permitiendo al usuario seleccionar uno, de la
Style (estilo).
La propiedad estilo, la cual determina el tipo de cuadro combinado misma manera que en un cuadro de lista. El cuadro Object de la ventana Pro-
y cómo se comporta, se puede establecer en 0, 1 ó 2. perties de Visual Basic es un ejemplo familiar.

120 121
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

Si se ajusta la propiedad Style a 1 se crea lo que se denomina un cuadro com­


binado sencillo: un área de edición en la que el usuario puede introducir tex­
to, con un cuadro de lista estándar directamente debajo de ella. El usuario
podrá, de este modo, seleccionar un elemento de la lista o introducir texto en
el área de edición.

Si se establece la propiedad Style en 0 se crea un cuadro combinado desplega­


ble, que tiene el aspecto de un cuadro de lista desplegable, pero también per­
mite que el usuario introduzca texto o seleccione en la lista. El cuadro Ajuste
de la ventana Properties de Visual Basic, a menudo funciona como un cuadro
2. Establece la propiedad Default del botón Aceptar a True y la propiedad
combinado desplegable.
Cancel del botón Cancelar a True.
Text (texto). Esta propiedad puede contener el texto del elemento seleccionado
3. Debajo de la etiqueta Destino dibuja un cuadro combinado y establece su
de la lista o el texto introducido directamente en el área de edición por el
propiedad Style a 1 y su propiedad Name como cboDest. Hazlo suficiente­
usuario.
mente grande como para mostrar cuatro o cinco líneas de texto en la parte
que representa el cuadro de lista.
Eventos
4. Crea otro cuadro combinado debajo de la etiqueta Preferencia de asiento, y
La manera en que un cuadro combinado responde a los eventos depende de su
establece la propiedad Style a 2 y la propiedad Name como cboAsiento.
estilo de funcionamiento —o sea, del ajuste de la propiedad Style. Por ejemplo, el
evento DblClick se recibe sólo si la propiedad Style está ajustada a 1 (un cuadro 5. Crea un cuadro combinado debajo de la etiqueta Preferencia de comida.
combinado simple). En los otros dos estilos sólo se recibe el evento Click. Los Establece la propiedad Name del cuadro como cboComida y su propiedad
dos estilos que permiten la introducción de texto reciben el evento Change, cuan­ Style a 0. Tu formulario debe parecerse ahora al que se muestra aquí:
do el usuario escribe en el área de edición del cuadro combinado. En general,
simplemente querrás que tu programa lea la propiedad Text del cuadro combina­
do después de que el usuario haya hecho una selección.

Procedimientos y métodos
Los métodos AddItem, Clear y RemoveItem, que se describieron para los cuadros
de lista, también están implementados para los cuadros combinados, y se usan de
la misma manera.

La aplicación Vuelo 6. Necesitarás escribir dos procedimientos: uno que informe de los resultados
Este proyecto incluye los tres estilos de cuadro combinado uno al lado de otro, de las acciones del usuario cuando éste haga clic en el botón de comando
de manera que puedas experimentar con ellos. La aplicación simula un cuadro de Aceptar, y otro para inicializar los cuadros combinados. Esto último forma­
diálogo que interroga al usuario sobre sus preferencias personales para un próxi­ rá parte del procedimiento Form_Load. Estos procedimientos se muestran
mo vuelo aéreo. en la figura 5.20.

1. Crea un proyecto nuevo. Sitúa tres etiquetas y dos botones de comando en Cuando ejecutes la aplicación observa qué cuadros combinados te permiten es­
el formulario, estableciendo la propiedad Caption de cada objeto para que cribir entradas. Observa también que la apariencia de cada cuadro combinado,
concuerde con los títulos que se muestran aquí: como se muestra en la figura 5.21, te da una pista sobre cómo continuar.

122 123
EL LIBRO DEL VISUAL BASIC
5 El uso de formularios y herramientas de Visual Basic

Sub Command1_Click ( )
Debug.Print cboDest.Text
Debug.Print cboAsiento.Text
Debug.Print cboComida.Text
End
End Sub

Sub Command2_Click ( )
End
End Sub Figura 5.21.
Ejecución de la aplicación Vuelo
Sub Form_Load ( )
cboDest.Text = " "
cboDest.AddItem "Paris"
cboDest.AddItem "Moscú" Estos objetos simplemente informan de la posición del cuadro de desplazamiento
cboDest.AddItem "Nueva York" dentro de la barra; tienes control sobre el rango de la barra de desplazamiento y
cboDest.AddItem "El Cairo" sobre los incrementos a los que el cuadro de desplazamiento puede avanzar. Por
cboDest.AddItem "Melbourne"
ejemplo, si estuvieras usando una barra de desplazamiento que representase el
cboDest.AddItem "Rio de Janeiro"
acelerador de un automóvil, éste podría variar en un rango de 0 a 100 mediante
cboDest.AddItem "Tokyo"
incrementos de 5. Un control de volumen podría variar en un rango de 0 a 10
cboAsiento.AddItem "Pasillo" mediante incrementos de 1.
cboAsiento.AddItem "Ventana"
cboAsiento.AddItem "Centro"
cboAsiento.ListIndex = 1
— Cuadro de
desplazamiento
cboComida.AddItem "Pollo"
Flechas de /
cboComida.Addltem "Lasaña"
desplazamiento
cboComida.AddItem "Vegetariano"
cboComida.AddItem "Diabético"
cboComida.Text = "Sin preferencias Cuadro de desplazamiento

End Sub

Flechas de desplazamiento
Figura 5.20.
El código del programa para la aplicación Vuelo Figura 5.22.
Barras de desplazamiento horizontales y verticales

Barras de desplazamiento horizontales y verticales


Las barras de desplazamiento horizontales y verticales (las cuales se muestran en Para crear estos objetos debes usar las herramientas Horizontal Vertical Scroll Bar
la figura 5.22) se comportan de la misma manera, excepto por sus direcciones. (Barra de desplazamiento horizontal, que se muestra en la figura 5.23) ó Vertical

124 125
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

Scroll Bar (Barra de desplazamiento vertical, que se muestra en la figura 5.24) de Value (valor). Esta propiedad contiene el número que representa la posición actual
la caja de herramientas de Visual Basic. del cuadro de desplazamiento en el interior de la barra. Si estableces esta pro­
piedad desde el programa, Visual Basic moverá el cuadro de desplazamiento
hasta la posición adecuada. Establecer la propiedad Value con un número que
esté fuera del rango definido por las propiedades Max y Min, produce un
mensaje de error.

Figura 5.23. Eventos


La herramienta Horizontal Scroll Bar (Barra de desplazamiento horizontal)
Los eventos principales asociados con una barra de desplazamiento son los even­
tos Change y Scroll. El evento Scroll es emitido repetidamente, mientras que el
cuadro de desplazamiento está siendo arrastrando por el interior de la barra de
desplazamiento. El evento Change se produce después de que se haya modifica­
do la posición del cuadro de desplazamiento. Utiliza el evento Scroll para contro­
lar dinámicamente los cambios que se produzcan en la barra de desplazamiento,
Figura 5.24.
y utiliza el evento Change para obtener el valor final de la posición del cuadro de
La herramienta Vertical Scroll Bar (Barra de desplazamiento vertical) desplazamiento en la barra.

Procedimientos y métodos
Propiedades Ninguno de los procedimientos o métodos que se utilizan comúnmente y que se
han tratado previamente se aplican a las barras de desplazamiento.
Las propiedades estándar, que tienen las barras de desplazamientos, incluyen las
siguientes: Enabled, Height, Left, Name, Top, Visible y Width. Entre las propieda­
des especiales, tanto de las barras horizontales como de las verticales, están Lar- La aplicación Barra de desplazamiento
geChange, Max, Min, SmallChange y Value. Este proyecto simplemente te proporcionará una referencia de cómo funciona
una barra de desplazamiento.
LargeChange (gran cambio). El ajuste de esta propiedad representa el valor añadido
o sustraído al número contenido en la propiedad Value cuando el usuario 1. Crea un proyecto nuevo. Añade una etiqueta y una barra de desplazamien­
hace clic dentro de la barra de desplazamiento. to horizontal al formulario vacío, como se muestra aquí:

Max (máximo). Esta propiedad puede establecerse en un rango que va de -32768


a 32767. Cuando el cuadro de desplazamiento está en su posición lo más a la
derecha o abajo posible, la propiedad Value se establece a este número.

Min (mínimo). Esta propiedad puede establecerse en un rango que va de -32768 a


32767. Cuando el cuadro de desplazamiento está en su posición más a la iz­
quierda o arriba posible, la propiedad Value se establece en este número.

SmallChange (cambio pequeño). El ajuste de esta propiedad representa el valor que


se le añade o resta al número contenido en la propiedad Value cuando el 2. Establece la propiedad BorderStyle de la etiqueta a 1 - Fixed, y la propie­
usuario hace clic en una de las flechas de desplazamiento que hay en los ex­ dad Caption a una cadena vacía. Establece las propiedades de la barra de
tremos de la barra de desplazamiento. desplazamiento horizontal como sigue:

126 127
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

Propiedad Ajuste

LargeChange 10
Max 100
Min 0
SmallChange 2
Figura 5.25.
3. Haz doble clic en la barra de desplazamiento para que aparezca la ventana Ejecución de la aplicación Barra de desplazamiento
de código, e introduce el siguiente procedimiento para gestionar el evento
Change:

Sub HScroll1_Change ( ) Relojes


Label1.Caption = Str$(HScroll1.Va lue)
Los relojes, que se crean mediante la herramienta Timer que se muestra en la fi­
End Sub
gura 5.26,. son objetos que pueden producir eventos que sean emitidos a inter­
Como la propiedad Caption de la etiqueta sólo acepta cadenas de caracte­ valos regulares. Los relojes se programan estableciendo su propiedad Interval
res, debes utilizar la función Str$ para convertir el valor de HScroll1.Value (intervalo) al número de milisegundos (1/1000 segundos) que deben transcurrir en­
en una cadena. tre los eventos que emita.

4. Introduce el siguiente procedimiento para tratar el evento Scroll:

Sub HScroll_Scroll ( )
Label1.Caption = "Moviéndose a" + Str$(HScroll1.Value)
End Sub

Ahora ejecuta la aplicación. Cuando hagas clic en el área gris de la barra de des­ Figura 5.26.
plazamiento, el valor que aparece en la etiqueta cambiará en unidades de 10. La herramienta Timer (Reloj)
Cuando hagas clic en la flecha de desplazamiento de cualquiera de los extremos
de la barra, el valor cambiará en unidades de 2.
Un reloj está limitado por la capacidad de tu ordenador. La mayoría de los orde­
Arrastrando el cuadro de desplazamiento con el ratón puedes ajustar el valor en nadores personales admiten una resolución del reloj no superior a 18 eventos por
otras unidades que no sean ni 2 ni 10. El valor que aparece en la figura 5.25, por segundo, o lo que es lo mismo, que transcurran 56/1000 segundos entre eventos.
ejemplo, podría haberse producido bien haciendo clic en las flechas de despla­ En términos prácticos, esta resolución significa que los valores menores de 56 no
zamiento, bien arrastrando el cuadro de desplazamiento. Observa que el procedi­ son particularmente útiles —en otras palabras, los valores de intervalo que difie­
miento del evento Scroll actualiza el título de la etiqueta a medida que arrastras el ran en 5, 10 e incluso 20, producirán el mismo resultado. Esta limitación no signi­
cuadro de desplazamiento. Elige el comando Break (interrumpir) del menú Run o fica que debas ser optimista en tus cálculos —después de todo, el hardware que
haz clic en el botón Break de la barra de herramientas y a continuación introduce está por venir, probablemente, tendrá mejores relojes— pero significa que no de­
la declaración HScroll1.Value = 17 en la ventana Debug. Observa que la posición berías confiar en los relojes para ser extremadamente preciso.
del cuadro de desplazamiento cambia cuando el valor varía. Ahora introduce la
Además, algunos eventos de reloj simplemente pueden perderse en el éter. Su-
declaración HScroll1.Max = 500. La posición del cuadro de desplazamiento cam­
pón que tu programa recibe un evento de reloj una vez por segundo, pero que
bia otra vez, manteniendo la posición relativa apropiada a los ajustes de las pro­
parte del programa realiza un cálculo muy complejo que lleva 10 segundos reali-
piedades Max y Min.

129
128
EL LIBRO DEL VISUAL BASIC
5 El uso de formularios y herramientas de Visual Basic

zarlo. Cuando el cálculo haya finalizado podrías esperar que hubiera 10 eventos
escala, 200 pulsos por minuto son 3 1/3 pulsos por segundo, ó 1 pulso cada 300
de reloj apilados de alguna manera. En realidad, sólo ocurrirá 1 evento de reloj al
milisegundos. De esta manera, los valores 300 y 1500 pueden servir como los
terminar los cálculos. Antes de generar un evento de reloj, el sistema siempre
puntos máximo y mínimo de una barra de desplazamiento que pongamos en la
comprueba si hay algún otro evento de reloj anterior que esté pendiente; si lo
aplicación. (Ten en cuenta que cuanto más alto sea el valor, más lento será el
hay no se genera un evento de reloj nuevo.
pulso; por tanto, 1500 es el valor mínimo, no el máximo.)
Sin duda te estarás preguntando qué utilidad tienen los relojes dadas estas restric­
1. Crea un proyecto nuevo y añade una barra de desplazamiento al formula­
ciones. En realidad pueden ser bastante útiles, aunque no como una fuente de
rio. A continuación crea un objeto reloj haciendo doble clic en la herra­
cálculo exacta del tiempo. Puedes pensar en los eventos de reloj como en un "ca­
mienta Timer de la caja de herramientas. No tienes que dibujar o cambiar
chete de atención" para tu aplicación. A intervalos regulares, un reloj puede sacu­
de tamaño los objetos reloj, ya que aparecen en el formulario durante la
dir a tu programa y decirle, en efecto, "Eh, es el momento de comprobar las
fase de diseño, pero son invisibles cuando el programa se está ejecutando.
cosas."
2. Pon una etiqueta debajo del extremo izquierdo de la barra de desplaza­
Propiedades miento, y establece su propiedad Caption a Lento. Debajo del extremo de­
Los relojes tienen las propiedades Name y Enabled. La propiedad más importante recho de la barra crea otra etiqueta con el título Rápido. Esto es lo que
de los objetos reloj es la propiedad Interval. Esta propiedad se establece al núme­ debes tener en pantalla:
ro de milisegundos que deben transcurrir entre dos eventos de reloj, con un valor
que va desde 0 hasta 65535 —lo que, teóricamente, genera eventos a una re­
lación de 1000 por segundos hasta algo menos de un evento por minuto. Un in­
tervalo de 0 es equivalente a desactivar el reloj. Si quieres generar un evento n
veces por segundo utiliza la fórmula 1000 / n para encontrar el ajuste para la pro­
piedad Interval. Por ejemplo, si quieres que un evento ocurra cada medio segun­
do (dos veces por segundo), la operación 1000 / 2 te indicará un ajuste de 500 en
la propiedad Interval.
3. Establece la propiedad Interval del objeto reloj a 1000.
Eventos
4. Establece las propiedades de la barra de desplazamiento horizontal como
El evento Timer se genera a intervalos regulares cuando el reloj está activado.
sigue:

Procedimientos y métodos Propiedad Ajuste

No hay procedimientos ni métodos que funcionen sobre los objetos reloj.


LargeChange 100
Max 300
La aplicación Metrónomo
Min 1500
Este proyecto —el cual crea un metrónomo usando un reloj y una barra de des­
SmallChange 25
plazamiento— muestra lo que sucede cuando se intenta utilizar un reloj como si
Value 1000
fuera un cronómetro de alta precisión. Los metrónomos operan, normalmente, en
un rango que va desde los 40 pulsos por minuto, para la música muy lenta, hasta 5. Tendrás que añadir dos líneas de código al programa para esta aplicación,
los 200 para la música muy rápida. 40 pulsos por minuto es lo mismo que 2/ 3 de una en el procedimiento Change de la barra de desplazamiento, y otra en
pulso por segundo, ó 1 pulso cada 1500 milisegundos. En el otro extremo de la el procedimiento Timer del objeto reloj. El procedimiento Change mantie-

130
131
EL LIBRO DEL VISUAL BASIC
5 El uso de formularios y herramientas de Visual Basic

ne al objeto reloj sincronizado con la barra de desplazamiento, y el proce­


crea segmentos de línea, simples y rectos. Se puede alterar el tamaño, el color y
dimiento Timer genera el tic del metrónomo (o, en este caso, su beep).
el diseño de las líneas modificando sus propiedades. La herramienta Shape siem­
Sub HScroll1_Change pre crea un rectángulo en la pantalla, pero estableciendo las propiedades del ob­
Timer1.Interval = HScroll1.Value jeto Shape se pueden crear círculos, óvalos y rectángulos redondeados. Además,
End Sub se pueden establecer los colores y los diseños de las formas.

Sub Timer1_Timer
Beep Propiedades
End Sub
Ambos objetos tienen las propiedades habituales Name y Visible. Los objetos Sha-
Cuando ejecutes la aplicación, el metrónomo hará tic una vez por segundo. Si pe también tienen las propiedades Height, Left, Top y Widht. Los objetos Line tie­
mueves la barra de desplazamiento alterarás la velocidad del tic-tac. Prueba a mo­ nen las propiedades posicionales X1, Y1 y X2, Y2, que son las coordenadas de
ver la ventana por la pantalla o a ejecutar otra aplicación en segundo plano. los dos puntos de los extremos de la línea. Otras propiedades determinan cómo
Cuando no está sucediendo nada más, el reloj es bastante preciso, pero puedes aparecerá el objeto en la pantalla.
ver que algunos de los eventos de reloj se pierden cuando el ordenador dedica
BorderColor(color del borde). Esta propiedad determina el color del contorno del
su atención a alguna otra tarea.
objeto (o, en el caso de los objetos línea, el color de la línea). La propiedad
BorderColor se establece seleccionando un color de una paleta, de la misma
Líneas y formas forma que se hacía con las propiedades BackColor y ForeColor de un for­
Para mejorar la apariencia de los formularios en tus aplicaciones puedes añadirles mulario.
líneas sencillas y gráficos de forma sólida, usando las herramientas Line (línea) y BorderStyle
(estilo del borde). La propiedad BorderStyle controla cómo se dibuja la
Shape (forma) de la caja de herramientas, las cuales aparecen en las figuras 5.27 línea o el contorno de una forma. Se pueden usar cualquiera de estos siete
y 5.28. Los objetos creados con estas herramientas aparecen en la misma rejilla ajustes:
gráfica que las imágenes.
0 - Transparent (transparente)
Los controles línea y forma (al igual que el control forma) son útiles, principal­
mente, para proporcionarle fondos visuales a los formularios. La herramienta Line 1 - Solid (sólido)

2 - Dash (guiones)

3 - Dot (puntos)

4 - DashDot (guiónpunto)

5 - DashDotDot (guiónpuntopunto)
Figura 5.27.
La herramienta Line (Línea) 6 - Inside Solid (interior sólido)

BorderWidht (anchura del borde). Esta propiedad permite especificar la anchura de


la línea o del contorno de la forma. Si estableces BorderWidth con un valor
distinto de 1 no podrás utilizar ninguno de los valores de puntos o guiones de
la propiedad BorderStyle.
Figura 5.28. Los objetos Shape también tienen las propiedades FillColor y FillStyle. A conti­
La herramienta Shape (Forma) nuación se muestra una explicación de cada una de ellas.

132 133
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

FilIColor(color del relleno). Análogamente a la propiedad BorderColor, FillColor 2. Selecciona la propiedad Picture de Picture1 en la ventana Properties. Haz
permite definir el color interior de una forma. Esta propiedad se establece de clic en el botón con los puntos suspensivos que hay al lado del cuadro
la misma manera que la propiedad BorderColor: usando la paleta de colores. Ajustes para que aparezca el cuadro de diálogo Load Picture. En él, es­
FillStyle(estilo del relleno). El ajuste de la propiedad FillStyle determina el diseño tablece el tipo de archivo a archivos (en el cuadro List Files of Type) de
interior de un objeto forma: imágenes con la extensión ICO. En el subdirectorio MISC del directorio
ICONS, que viene con Visual Basic, encontrarás el icono FACE0l.ICO. Se­
0 - Solid (sólido) lecciona este archivo para cargar el icono en el cuadro de dibujo. De la
1 - Transparent (transparente)
misma manera, establece la propiedad Picture de Image1 para cargar el
icono FACE02.ICO en el control de imagen.
2 - Horizontal Line (línea horizontal)
3. Establece la propiedad FillStyle de Shape1 a 0 - Solid, y la propiedad Fi-
3 - Vertical Line (línea vertical) llColor a rojo. (Haz clic en el botón con los puntos suspensivos que hay al
4 - Upward Diagonal (diagonal hacia arriba) lado del cuadro Ajustes y selecciona el color rojo en la paleta.) Establece la
propiedad BorderWidth de Line1 a 4. El formulario debe parecerse ahora al
5 - Downward Diagonal (diagonal hacia abajo) siguiente:
6 - Cross (cruz)

7 - Diagonal Cross (cruz diagonal)

Eventos
Los objetos línea y forma no reciben ningún evento.

Procedimientos y métodos
Ninguno de los métodos tratados en este capítulo se aplican a líneas ni a formas.
4. Mueve la forma hacia el centro del formulario, y luego mueve los otros ob­
El proyecto Rejilla jetos sobre la forma, de manera que se solapen de alguna forma, como se
Este proyecto de ejemplo no es una aplicación completa; en lugar de ello, simple­ muestra aquí:
mente te permite experimentar con objetos de pantalla de manera que te llegues
a sentir más familiarizado con estas herramientas.

1. Crea un proyecto nuevo. En el formulario pon un cuadro de dibujo, un bo­


tón de comando, una forma, una línea y un control de imagen:

Observa que en cada rejilla de la pantalla, el objeto más recientemente creado


aparece encima de los creados previamente. (El cuadro de dibujo y el botón
de comando residen en la rejilla superior, y la forma, la línea y la imagen es­
tán en la rejilla intermedia.)

134 135
5 El uso de formularios y herramientas de Visual Basic
EL LIBRO DEL VISUAL BASIC

El orden en el que ciertos objetos solapan a otros objetos se denomina el orden


Z, y puede ser alterado. Haz clic en Line1 para seleccionarlo, y elige el comando
Bring To Front (traer al frente) del menú Edit de Visual Basic. La línea, que ya
aparecía sobre la forma, ahora también aparece sobre la imagen. Sin embargo, Figura 5.31.
date cuenta de que cuando mueves la línea por la pantalla no tapa al cuadro de La herramienta File List Box (Cuadro de lista de archivos)
dibujo ni al botón de comando. Los comandos Bring To Front y Send To Back
(enviar al fondo) sólo funcionan dentro de una rejilla; los objetos que estén en la
rejilla intermedia siempre aparecerán detrás de los que estén en la rejilla superior. La mayoría de las veces no utilizarás los cuadros de lista de unidades de disco o
Puedes utilizar estos dos comandos con todos los controles, lo cual te permitirá de directorios individualmente. En lugar de ello, cuando el usuario esté seleccio­
ajustar el orden Z dentro de cada rejilla. Prueba a usar el comando Send To Back nando un archivo para abrirlo o guardarlo, le proporcionarás el acceso a todos
después de seleccionar el botón de comando. los componentes del sistema de archivos a la vez. En este caso puedes usar el
control de cuadro de diálogo común, el cual incluye las funciones Archivo Abrir y

Cuadros de lista de unidades de disco, de directorios Archivo Guardar Como empaquetadas eficientemente.

y de archivos Sin embargo, en ocasiones puedes necesitar un cuadro de diálogo con compo­
nentes que estén más allá de los que proporcionan los cuadros de diálogo están­
Las tres herramientas de Visual Basic que muestran las figuras 5.29, 5.30 y 5.31 dar Archivo Abrir y Archivo Guardar Como. Por ejemplo, Microsoft Word tiene
permiten crear cuadros de diálogo personalizados que hagan de interface con el botones adicionales en el cuadro de diálogo Guardar como para Compartir archi­
sistema de archivos. Cada control del sistema de archivo gestiona un componente vos y para las Opciones. En esos casos podrías usar las herramientas Drive List
distinto del sistema: un cuadro de lista de unidades de disco aparece como una Box, Directory List Box y File List Box. (Consulta el capítulo 9 si quieres ver una
lista desplegable que contiene los nombres de las unidades de disco que tiene el aplicación de ejemplo.)
ordenador; un cuadro de lista de directorios muestra todos los subdirectorios del
directorio actual; y un cuadro de lista de archivos muestra todos o algunos de los
Propiedades
archivos que contiene el directorio actual.
Los tres controles del sistema de archivos tienen muchas de las propiedades habi­
tuales: Enabled, FontBold, FontItalic, FontName, FontSize, Height, Left, Name,
Top, Visible y Width. Además, son importantes estas propiedades:

Drive (unidad). Esta propiedad, que se aplica sólo a cuadros de lista de unidades
de disco, contiene el nombre de la unidad de disco seleccionada actualmente.

FileName (nombre de archivo). Sólo los cuadros de lista de archivos tienen la pro­
Figura 5.29. piedad FileName, la cual contiene el nombre del archivo seleccionado actual­
La herramienta Drive List Box (Cuadro de lista de unidades de disco) mente en un cuadro de lista de archivos.

List, ListIndex (lista, índice de la lista). Estas propiedades sólo las tienen los cuadros
de lista de archivos y son idénticas a las propiedades List y ListIndex de los
cuadros de lista.

Path (ruta). En los cuadros de lista de directorios y de archivos, esta propiedad


contiene la ruta de acceso actual. La propiedad Path no se aplica a los cuadros
Figura 5.30.
de lista de unidades de disco.
La herramienta Directory List Box (Cuadro de lista de directorios)

137
136
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

Pattern (patrón). Esta propiedad de los cuadros de lista de archivos contiene una proyecto que use una cuadrícula debe incluir el archivo GRID.VBX en su archivo
cadena que determina los archivos que se mostrarán. Admite los caracteres co­ de proyecto. Consulta el capítulo 11, "Bases de datos y cuadrículas", si necesitas
modín * y ? en los nombres de archivos. Por ejemplo, si se establece la propie­ información más detallada sobre la herramienta Grid.
dad Pattern como *.DAT se mostrarán todos los nombre de archivo que
tengan la extensión DAT.

Eventos
Los cuadros de lista de directorios y de archivos responden al evento Click, aun­
que los cuadros de lista de unidades de disco no. Otros dos eventos son impor­ Figura 5.32.
tantes para los controles del sistema de archivos: La herramienta Grid (Cuadrícula)

Change (cambio). Este evento es reconocido solamente por los cuadros de lista de
unidades de disco y de directorios. Es emitido cada vez que el usuario o el Datos
programa cambian la selección en el cuadro de lista.
La herramienta Data, que se muestra en la figura 5.33, permite crear un control de
PathChange (cambio de ruta). Este evento se aplica sólo a los cuadros de lista de datos a través del cual puedes ofrecer el acceso a datos específicos de una base
archivos. Ocurre cada vez que el usuario hace doble clic en una carpeta de di­ de datos. El control datos tiene diversas propiedades que definen la conexión en­
rectorio o bien el programa haya cambiado las propiedades FileName o Path. tre tu aplicación Visual Basic y la base de datos a la que tienes pensado acceder.
Esto le permite a tu programa actualizar el contenido del cuadro de lista de di­ Antes de usar la herramienta Datos en Visual Basic tendrás que activar la posibili­
rectorios correspondiente. dad de compartir archivos. Consulta el capítulo 11 si necesitas información más
detallada sobre la herramienta Datos.
Procedimientos y métodos
Ninguno de los procedimiento o métodos descritos hasta ahora son aplicables a
los controles del sistema de archivos.

Figura 5.33.
Otras herramientas de Visual Basic La herramienta Data (Datos)

La caja de herramientas de Visual Basic también incluye algunas pocas herramien­


tas que se van a describir brevemente aquí. Estas herramientas y los objetos que OLE 2.0
crean se tratan más adelante en el libro, ya que requieren un mayor esfuerzo de La tecnología OLE (object linking and embedding, incrustación y enlace de obje­
programación y unas técnicas más avanzadas. Consulta los capítulos 11 y 12 si tos) de Microsoft, permite crear en una aplicación un objeto que contenga datos
necesitas más información sobre estas herramientas avanzadas. de otra aplicación que no esté relacionada con la primera. Por ejemplo, se podría
poner en tu programa de Visual Basic un gráfico procedente de un programa grá­
Cuadrículas fico o un detallado dibujo procedente de un programa CAD (Computer aided
design, diseño asistido por ordenador). En lugar de tomar, simplemente, una foto-
La herramienta Grid, que aparece en la figura 5.32, permite crear un control de
grafía del gráfico o del dibujo, OLE mantiene un vínculo con la aplicación origi­
cuadrícula. Una cuadrícula es un bloque de celdas de dos dimensiones que re­
nal de manera que si se modifican los datos originales, la copia que hay en la
cuerda a las filas y a las columnas de una hoja de cálculo. Puedes usar una cua­
aplicación de Visual Basic se actualizará automáticamente.
drícula para implementar funciones del tipo hoja de cálculo en Visual Basic. Un

139
138
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

La herramienta OLE de la caja de herramientas de Visual Basic, que se muestra en Basic proporciona el acceso a esas funciones a través de la herramienta Common
la figura 5.34, permite añadir las posibilidades del enlace y la incrustación de ob­ Dialog (diálogo estándar). El uso de la herramienta Common Dialog te asegura
jetos a un programa de Visual Basic. Veremos en el capítulo 12 el tema del OLE que tu aplicación se adapta al aspecto y funcionamiento de las operaciones que
con detalle. realizan.

Al igual que la herramienta Timer, la herramienta diálogo estándar, que aparece


en la figura 5.35, es invisible durante la ejecución. Sin embargo, cuando se pone
un icono en un formulario, se puede llamar a cualquiera de las cinco funciones
estándar que proporciona la herramienta. Estas funciones son los cuadro de diá­
logo estándar de Windows para Abrir, Guardar como, Color, Fuente e Impresora.
Figura 5.34. Además, la herramienta Common Dialog puede llamar al sistema de Ayuda de
La herramienta OLE Windows. Debes cargar el archivo CMDIALOG.VBX en la ventana Project para ac­
ceder a la herramienta diálogo estándar.

El archivo AUTOLOAD.MAK
Como habrás notado, Visual Basic incluye de forma automática, los archivos
GRID.VBX, CMDIALOG.VBX y MSOLE2.VBX en todos los proyectos que creas.
Sin embargo, a no ser que estés usando una cuadrícula, un cuadro de diálogo es­
Figura 5.3S.
tándar o un control OLE, se pueden borrar estos archivos del archivo del proyec­ La herramienta Common Dialog (Diálogo estándar)
to. Para impedir que Visual Basic los incluya automáticamente en tus proyectos,
elige el comando Open Proyect del menú File y abre el aicación VisuaOAD.MAK
en el cuadro de diálogo Open Proyect. La ejecución de las funciones seleccionadas comienza cuando se establece la pro­
piedad Action (acción) del control diálogo estándar. Las instrucciones de Visual
Cada vez que creas un proyecto nuevo, Visual Basic copia el contenido de AU­
Basic se suspenden hasta que el usuario sale del cuadro de diálogo. Entonces se
TOLOAD.MAK en el nuevo proyecto. Si eliminas los archivos GRID.VBX y MSO-
pueden examinar las propiedades del control para determinar qué acción se pro­
LE2.VBX de AUTOLOAD.MAK (seleccionando el comando Remove File del menú
dujo. No hay eventos ni métodos asociados con un control diálogo estándar. Su
File), éstos no volverán a aparecer en los nuevos proyectos. Deja CMDIA-
funcionamiento se especifica estableciendo los valores de las propiedades y, des­
LOG.VBX en el archivo AUTOLOAD.MAK de momento. De hecho, las herramien­
pués, asignando un valor a la propiedad Action.
tas Grid y OLE desaparecerán de la caja de herramientas. Sin embargo, puedes
incluir estos archivos y herramientas proyecto por proyecto usando el comando Además de la propiedad Action, todas las funciones de Common Dialog usan la
Add File del menú File. propiedad CancelError (cancelar error). CancelError es False por omisión, pero si
se establece como True, Visual Basic producirá un error si el usuario selecciona el
botón Cancelar en el cuadro de diálogo. Si tienes pensado establecer CancelError
Cuadros de diálogo estándar como True, debes usar las posibilidades de gestión de errores de Visual Basic que
Con el objeto de proporcionar al usuario un interface estándar para las operacio­ se describen en el capítulo 8.
nes más comunes de las aplicaciones Windows, Microsoft creó un conjunto de Los párrafos siguientes describen las funciones de la herramienta Common Dia-
cuadros de diálogo para funciones estándar de Windows. El código de estas fun­ log. Como hay muchas, no hemos proporcionado un programa de ejemplo com­
ciones se incluyó por primera vez en Windows 3.1, pero se puede usar con Win­ pleto, pero sí se muestra un fragmento de programa que ilustra el uso típico del
dows 3.0 si se añade el archivo COMMDLG.DLL al directorio SYSTEM. Visual control.

140 141
EL LIBRO DEL VISUAL BASIC
5 El uso de formularios y herramientas de Visual Basic

Abrir "Documentos (*.DOC) |*.DOC|Archivos de texto (*.TXT)|*.txt|Todos


los archivos|*.*”
El cuadro de diálogo Abrir, que se muestra en la figura 5.36, aparece cuando se
asigna el valor 1 a la propiedad Action. Puedes establecer cualquiera de las pro­ El primer filtro limita la lista de archivos a aquellos que tengan la extensión
piedades siguientes para controlar la apariencia del cuadro de diálogo. Ten en DOC, el segundo filtro es para los archivos que tengan la extensión TXT, y el
cuenta que este cuadro de diálogo realmente no abre ningún archivo; simplemen­ tercer filtro permite que se pueda seleccionar cualquier archivo. Observa que
te, permite que el usuario seleccione el nombre del archivo. no hay espacios delante ni detrás de la raya vertical.

Filterlndex
(filtro del índice). Esta propiedad tendrá como valor un número entero,
el cual indica qué pareja de componentes del filtro será la que actúe por omi­
sión. En el ejemplo anterior, los valores admisibles para la propiedad FilterIn­
dex serían 1, 2 y 3.

Flags (banderas). La propiedad Flag se puede establecer como una combinación


de uno o más valores que controlan características especiales del cuadro de
diálogo. Los valores que se pueden usar para las banderas aparecen en el ar­
chivo CONSTANT.TXT y se describen en la Ayuda en pantalla de Visual Basic.
Un ejemplo es la bandera OFN_FILEMUSTEXIST, la cual obliga al usuario a
seleccionar un archivo existente.

Figura 5.36. Ejemplo


El cuadro de diálogo Abrir Este fragmento de programa muestra un cuadro de diálogo Abrir. Obliga al usua­
rio a elegir un archivo que ya exista y aplica un filtro (o máscara) por omisión
para los archivos de datos (*.DAT). Asume que el objeto diálogo estándar se lla­
ma Dlogo.
Propiedades
DialogTitle(título del cuadro de diálogo). Esta propiedad se puede establecer en DIogo.FileName = ""
Dlogo.Filter = "Archivos de datos (*.DAT)|*.DAT| Todos los
cualquier cadena de caracteres. La cadena se muestra en la barra del título del
archivos (*.*) |*.*"
cuadro de diálogo. Por omisión el título es "Abrir".
DIogo.FilterIndex = 1
FíleName (nombre de archivo). Esta propiedad se usa para establecer el nombre Dlogo.Flags = OFN_FILEMUSTEXIST Or OFN_PATHMUSTEXIST
Dlogo.Action = 1
inicial q u e aparecerá en el cuadro Nombre de archivo del cuadro de diálogo.
If DIogo.FileName = "" Then MsgBox "No se ha seleccionado
Después de que se cierre el cuadro de diálogo se puede leer esta propiedad
ningún archivo."
para determinar el nombre del archivo seleccionado.

Filter (filtro). La propiedad Filter se puede establecer para restringir los nombres
de archivos que aparecerán en el cuadro de lista. La propiedad filtro debe ser Guardar como
una cadena de texto con una o más parejas de componentes. Las parejas de El cuadro de diálogo Guardar como, que se muestra en la figura 5.37 (en la parte
componentes están constituidas por una descripción y por un carácter como­ superior de la página siguiente), aparece cuando se asigna el valor 2 a la propie­
dín, separados por la raya vertical (|). Las distintas parejas también se separan dad Action. Las propiedades para Guardar como son idénticas a las ya descritas
por la raya vertical. Por ejemplo, la siguiente cadena especifica tres parejas de para Abrir, excepto que el valor por omisión de la propiedad DialogTitle es Guar­
componentes: dar como.

142 143
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

Figura 5.37.
El cuadro de diálogo Guardar como
Figura 5.38.
El cuadro de diálogo Color
Propiedades
DefaultExt(extensión por omisión). Esta propiedad se puede establecer a una ca­
dena de entre 1 y 3 caracteres, la cual se usará como extensión por omisión si Propiedades
el nombre del archivo se especifica sin extensión. Color (color). Esta propiedad se usa para establecer el color inicial. Después de
que se cierra el cuadro de diálogo, se puede leer esta propiedad para determi­
Ejemplo nar el color seleccionado por el usuario.
Este fragmento de programa muestra un cuadro de diálogo Guardar como. Asume Flags (banderas). Esta propiedad se debe establecer como CC_RGBINIT para esta­
que el objeto diálogo estándar se llama Dlogo. En este ejemplo, la propiedad blecer o leer la propiedad Color.
CancelError se establece como True; en caso contrario, sería imposible determinar
si se ha seleccionado o no un nombre de archivo. Observa que este código real­ Ejemplo
mente no guarda ningún archivo; simplemente, permite que el usuario seleccione
Este fragmento de programa muestra un cuadro de diálogo Color para que el
un nombre de archivo.
usuario muestre un color. Asume que el objeto diálogo estándar se llama Dlogo y
DIogo.Cancel Error = True utiliza el color seleccionado para establecer el color del fondo del formulario ac­
DIogo.DefaultExt = "DAT" tual mediante la propiedad BackColor.
Dlogo.FileName = DEFAULT.DAT"
Dlogo.Color = BackColor ’Color actual
Dlogo.Filter = "Archivos de datos (*.DAT)|*.DAT | Todos los archivos
( *.*) | *.* " Dlogo.Flags = CC_RGBINIT
DIogo.FilerIndex = 1 Dlogo.Action = 3 ’Mostrar el cuadro de diálogo
BackColor = Dlogo.Color ’El color nuevo, o el mismo
Dlogo.Flags = 0FN_0VERWRITEPR0MPT Or OFN_PATHMUSTEXIST
Dlogo.Action = 2 ’si se cancela
MsgBox "Escribiendo el archivo " + DIogo.FileName
Fuentes
Color El cuadro de diálogo Fuentes, que se muestra en la figura 5.39 (al principio de la
El cuadro de diálogo Color, que se muestra en la figura 5.38, aparece cuando se página siguiente), aparece cuando se asigna el valor 4 a la propiedad Action.
asigna el valor 3 a la propiedad Action. Puedes establecer las propiedades si­ Puedes establecer las propiedades siguientes para controlar la apariencia del cua­
guientes para controlar la apariencia del cuadro de diálogo. dro de diálogo.

144 145
5 El uso de formularios y herramientas de Visual Basic
EL LIBRO DEL VISUAL BASIC

Sub EstablecerPropsDel Texto (TxtCntl As Control)


Dlogo.Color = TxtCntl.ForeColor ’Obtener valores actuales
DIogo.FontBold = TxtCntl . FontBold
DIogo.FontItalic = TxtCntl.FontItalic
DIogo.FontStrikethru = TxtCntl.FontStrikeThru
Dlogo.FontUnderline = TxtCntl.FontUnderline
DIogo.FontName = TxtCntl.FontName
DIogo.FontSize = TxtCntl.FontSize
Dlogo.Flags = CF_EFFECTS Or CF_F0RZEF0NTEXIST Or CF_BOTH
Dlogo.Action = 4 ’Mostrar cuadro de diálogo
TxtCntl.ForeColor = Dlogo.Color ’Establecer los nuevos valores
TxtCntl.FontBold = Dlogo.FontBold
TxtCntl.FontItalic = Dlogo.FontItalic
Figura 5.39.
TxtCntl.FontStrikethru = Dlogo.FontStrikethru
El cuadro de diálogo Fuente
TxtCntl.FontUnderline = Dlogo.FontUnderline
TxtCntl.FontName = Dlogo.FontName
TxtCntl.FontSize = Dlogo.FontSize
Propiedades End Sub
Color (color). Esta propiedad permite establecer o leer el color de la fuente. (Sólo
está activa si la propiedad Flags incluye la bandera CF_EFFECTS.) Imprimir
Flags (banderas). Esta propiedad se puede establecer para modificar el comporta­ El cuadro de diálogo Imprimir, que se muestra en la figura 5.40, aparece cuando
miento del cuadro de diálogo. Sin embargo, debe incluir uno de estos valores: se asigna el valor 5 a la propiedad Action. Puedes establecer las propiedades si­
CF_PRINTERFONTS, CF_SCREENFONTS ó CF_BOTH. Estos valores determi­ guientes para controlar la apariencia del cuadro de diálogo.
nan qué fuentes aparecerán en el cuadro de diálogo (sólo fuentes de impreso­
ra, sólo fuentes de pantalla ó ambas). Propiedades
Copies (copias). Esta propiedad, que admite un número entero, controla el número
FontBoId, Fontltalic, FontStrikethru, FontUnderline (fuente negrita, cursiva, tachada, subra­
de copias que se imprimirán.
yada). Estas son propiedades booleanas que se pueden establecer o leer para
determinar la información del estilo de la fuente. El ajuste de la propiedad
Flags debe incluir CC_EFFECTS para activar el ajuste de los estilos.

FontName (nombre de la fuente). Esta propiedad se puede establecer para indicar


la fuente por omisión y para determinar la selección de fuente que ha hecho
el usuario.

FontSize (tamaño de la fuente). Esta propiedad se puede establecer o leer, y deter­


mina el tamaño en puntos de la fuente.

Ejemplo
Esta subrutina permite que se modifiquen los atributos de la fuente de un control
de texto. El control se pasa como parámetro. Asume que el objeto diálogo están­ Figura 5.40.
El cuadro de diálogo Imprimir
dar se llama Dlogo.

147
146
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

Flags (banderas). Esta propiedad gestiona características especiales del cuadro de Ejemplo
diálogo. Puedes consultar el archivo CONSTANT.TXT y el manual de Visual Este fragmento de programa llama a la Ayuda de Windows sobre la función
Basic si necesitas más información.
MsgBox.

Ejemplo Dlogo.HelpCommand = HELP_KEY


Dlogo.HelpFile = "VB.HLP"
Este fragmento de programa muestra un cuadro de diálogo para imprimir. Asume
Dlogo.HelpKey = "MsgBox"
que el objeto diálogo estándar se llama Dlogo. Ten en cuenta que llamar al cua­
D l o g o . Action = 6’Llamar a la Ayuda
dro de diálogo Imprimir realmente no inicia el proceso de impresión. Debes es­
cribir en el objeto impresora en Visual Basic. El cuadro de diálogo simplemente
permite que el usuario seleccione ciertas opciones de impresión.
PrimeraPagina = 1
UltimaPagina = 57
Dlogo.Cancel Error = True ’Abortar si se cancela el cuadro de diálogo
Dlogo.Copies = 1 ’Ajustes por omisión
Dlogo.Min = Primera Pag ina
Dlogo.Max = UltimaPagina
Dlogo.Flags = PD_USEDEVMODECOPIES Or PD_NOSELECTION
’Permitir más de una copia
Dlogo.Action = 5 ’Mostrar el cuadro de diálogo
ImprimirTodas = Dlogo.Flags And PD_ALLPAGES
If Not ImprimirTodas Then
PrimeraPagina = Dlogo.FromPage
UltimaPagina = Dlogo.ToPage
End If

Llamar a la ayuda
Figura 5.41.
La aplicación Ayuda de Windows, que se muestra en la figura 5.41, aparece cuan­
La aplicación Ayuda
do se asigna el valor 6 a la propiedad Action. Puedes establecer las propiedades
siguientes para controlar la apariencia del cuadro de diálogo.

Propiedades Menús
HelpCommand (comando de ayuda). Esta propiedad especifica el tipo de Ayuda que Aunque ya has creado varias aplicaciones pequeñas, puede que te haya dado la
quieres obtener. Normalmente, se utiliza la constate HELP_KEY, lo que indica sensación de que ninguna de ellas parecían "aplicaciones de verdad". ¿Por qué
que se solicita ayuda sobre una palabra clave específica. La definición de no? Para empezar, porque ninguna de ellas tenía barra de menús. Sin embargo,
HELP_KEY aparece en CONSTANT.TXT. esta situación se puede remediar, ya que Visual Basic hace que sea muy sencillo
HelpFile (archivo de ayuda). Esta propiedad especifica el nombre del archivo de crear menús. Los menús funcionan de una manera "orientada hacia los eventos",
Ayuda. muy similar a los objetos que hemos tratado.

HelpKey (clave de ayuda). Esta propiedad especifica la palabra clave que se debe Para crear el menú de una aplicación debes usar la ventana Menu Design (diseño
usar para la pantalla inicial de Ayuda. del menú) de Visual Basic, la cual se muestra en la figura 5.42. Crea un proyecto

148 149
5 El uso de formularios y herramientas de Visual Basic
EL LIBRO DEL VISUAL BASIC

nuevo y abre esta ventana seleccionando el comando Menu Design del menú
Window (ventana) o haciendo clic en el botón Menu Design Window de la barra
de herramientas de Visual Basic.

La barra de menús de la aplicación se construye creando una jerarquía de ele­


mentos en la ventana Menu Design. A cada elemento del menú se le debe definir
una propiedad Caption y una propiedad Name. En Caption, hay que insertar el
texto que se desea que aparezca en la barra de menús o en el menú desplegable.
Name, por su parte, es el nombre que identifica al elemento en el código del pro­
grama. Se necesita un nombre porque cada elemento del menú tiene un procedi­
miento Click.

Supon que tu ordenador incluye un hardware que muestre imágenes de tele­


visión en una ventana. Los menús de la aplicación que controlen el hardware
podrían recordar a un mando a distancia. Aquí tienes el posible diseño de la es­
Figura 5.42.
tructura del menú, con tres niveles de jerarquía: El menú de diseño de ventana de Visual Basic

Archivo
Observa que aparecen unos puntos suspensivos (...) detrás del elemento Seleccio­
Encender nar para indicarle al usuario que esta selección producirá que aparezca un cuadro
de diálogo.
Apagar
Vamos a definir la parte del menú de esta aplicación. Sin embargo, antes de que
Salir
salgas de la ventana Menu Design, debes retocar un poco más la lista del menú
Canal actual.
Seleccionar... En la mayoría de las aplicaciones para Windows se puede utilizar el teclado para
elegir comandos de los menús sin necesidad del ratón. Estos atajos de teclado se
Siguiente
denominan teclas de acceso y, normalmente, consisten en pulsar la tecla Alt y los
Anterior caracteres que están subrayados en el menú. Por ejemplo, en Visual Basic puedes
Volumen escribir Alt, E, S para seleccionar el menú File y de él, el comando Save. En la
ventana Menu Design puedes especificar la tecla de acceso para un elemento del
Anular menú insertando un ampersand (&) delante del carácter que va a estar subrayado
Preestablecido en el menú de la aplicación. (El ampersand no aparece en el menú.)

Bajo Utiliza siempre el primer carácter del título de un elemento del menú como tecla
de acceso, a no ser que exista un conflicto. En nuestra aplicación, por ejemplo,
Medio tanto Seleccionar como Siguiente empiezan con la letra S, así que tendrás que
Alto elegir otro carácter en uno de ellos.

Subir A continuación, puedes ver las entradas del menú para la aplicación de ejemplo,
con los caracteres en las teclas de acceso especificados.
Bajar

151
150
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

&Archivo tos del segundo nivel, utiliza mnu seguido por una abreviatura de tres letras que
&Encender indique el elemento del primer nivel al que están subordinados los elementos del
segundo nivel, y seguido por el título del elemento: mnuAchEncender, por ejem­
&Apagar plo, o mnuCanSeleccionar. De la misma forma, para los elementos del tercer nivel
&Salir incluye dos abreviaturas de tres letras que indiquen los elementos "padre". Aquí
tienes los nombres sugeridos para esta aplicación:
&Canal
mnuArchivo
&Seleccionar...
mnuAchEncender
&Siguiente
mnuAchApagar
&Anterior

&Volumen mnuAchSalir

&Anular mnuCanal

&Preestablecido mnuCanSeleccionar...

&Bajo mnuCanSiguiente

&Medio mnuCanAnterior

&Alto mnuVolumen

&Subir mnuVolAnular

&Bajar mnuVolPreestablecido

Junto con el título (Caption) y la tecla de acceso, cada elemento del menú necesi­ mnuVolPreBajo
ta un nombre (Name). Aunque podría parecer lógico usar la misma palabra para mnuVolPreMedio
el título y para el nombre, con frecuencia es imposible hacerlo así. Por ejemplo,
Exit es una palabra clave de Visual Basic y se puede usar como título, pero no
mnuVolPreAlto
como nombre de un objeto en el código. mnuVolSubir

Lo mejor es utilizar un esquema de nombres estándar que te permita reconocer mnuVolBajar


inmediatamente cada elemento. Es importante que los nombres sean claros, por­
que cada elemento del menú tiene un procedimiento Click, cuando se está traba­ Ahora ya estás listo para ir a la ventana Menu Design y crear el menú de esta
jando en el código es fácil olvidarse de cuál es el elemento del menú sobre el aplicación.
que se trabaja. Por ejemplo, en este proyecto de ejemplo, prueba a usar el prefijo 1. Haz clic en el cuadro de texto Caption de la ventana Menu Design y escri­
mnu para todos los nombres de objetos; ello identificará los objetos como me­ be &Archivo. Luego pulsa Tab para pasar al cuadro Name. Escribe mnuAr-
nús, en oposición, por ejemplo, a los botones de comando o a las barras de des­ cbivo en este cuadro de texto y pulsa la tecla Intro. El título (pero no el
plazamiento. nombre) aparecerá en el cuadro de lista de la parte inferior de la ventana.
Para los elementos del menú que están en el primer nivel de jerarquía, pon el tí­ 2. Haz clic en el botón que tiene la flecha apuntando hacia la derecha, que
tulo del menú detrás del prefijo mnu: mnuArchivo, por ejemplo. Para los elemen­ está sobre el cuadro de lista. Aparecerán cuatro puntos en la línea que hay

152 153
EL LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

debajo de &Archivo para indicar que los siguientes elementos que se inser­ mentís. Ese menú de desplegará, mostrando los comandos que contiene, como se
ten aparecerán en el segundo nivel de la jerarquía del menú. muestra en la figura 5.43.

3. Vuelve al cuadro de texto Caption y escribe &Encender. Pulsa la tecla Tab Si en el formulario haces clic sobre una entrada del menú, Visual Basic abrirá una
para pasar al cuadro Name, escribe mnuAchEncender y pulsa Intro. Vuelve ventana de código para el correspondiente procedimiento Click. En esa ventana
al cuadro Caption y escribe &Apagar, luego pulsa Tab para pasar al cuadro se escribe el código para las operaciones que tendrán lugar cuando el usuario se­
Name, escribe mnuAchApagar y pulsa Intro. Usa el mismo procedimiento leccione el elemento del menú. Por ejemplo, haz clic en el elemento Salir del
para el título &Salir y el nombre mnuAchSalir. Tu ventana Menu Design menú Archivo para abrir la ventana de código del procedimiento del evento
debe ahora parecerse a ésta: mnuAchSalir_Click. El comando de Visual Basic que se usa para terminar una
aplicación es End; así, el procedimiento para Salir debe parecerse a éste:
Sub mnuAchSalir_Click ( )
End
End Sub

Experimenta con la aplicación poniendo instrucciones Debug.Print en diversos


procedimientos del menú y luego ejecutándola otra vez. A medida que seleccio­
nes distintos comandos del menú, ve mirando la ventana Debug para comprobar
que los procedimientos del menú se están ejecutando.

Opciones adicionales para el diseño de los menús


La ventana Menu Design también ofrece otras opciones diversas muy interesan­
tes. Por ejemplo, si introduces un guión (-) como título, Visual Basic colocará una
barra separadora en el menú, lo que visualmente establece grupos de elementos
del menú relacionados. (También debes asignarle un nombre a la entrada del
guión, incluso aunque no se vaya a usar en el programa.)
4. Haz clic en el botón que tiene la flecha apuntando hacia la izquierda para También puedes asignar teclas de atajo a los elementos del menú. Abre la venta­
volver al primer nivel de la jerarquía. Ahora introduce el resto de los títulos na Menu Design otra vez y selecciona &Salir. Luego haz clic en el botón con la
y nombres de la lista. Para introducir los elementos del tercer nivel de la je­ flecha apuntando hacia abajo que hay al lado del cuadro Shortcut (atajo). Puedes
rarquía, haz clic dos veces previamente sobre el botón con la flecha apun­ asignar al comando Salir cualquiera de las combinaciones de teclas que aparecen
tando hacia la derecha. Si cometes algún error al poner un elemento en la en la lista desplegable.
jerarquía, puedes seleccionar el nombre del elemento en el cuadro de lista
y hacer clic en los botones con las flechas apuntando a izquierda y dere­ Los cuadros de control Checked (marcado), Enabled (activado) y Visible (visible)
cha para ajustar su nivel. Los botones con las flechas apuntando arriba y de la ventana Menu Design corresponden a propiedades del elemento del menú
abajo mueven el nombre a una posición diferente en la lista. que está seleccionado. Cada propiedad puede establecerse como True (lo cual se
indica mediante un X en el cuadro de control) o False (el cuadro de control va­
5. Cuando hayas terminado de introducir los elementos del menú haz clic en cío). Establecer la propiedad Checked como True hace que aparezca una marca
el botón OK. de control en el menú al lado del elemento, lo que indicará que la opción está
La barra de mentís aparecerá ahora en el formulario principal de la aplicación. activa. (Puedes ver una marca de este tipo junto al elemento Toolbar del menú
Puedes ver los elementos del menú haciendo clic sobre su nombre en la barra de View de Visual Basic.) La propiedad Enabled se establece como True por omi-

154 155
LIBRO DEL VISUAL BASIC 5 El uso de formularios y herramientas de Visual Basic

Figura 5.44.
Un menú con barras separadoras, una marca de activación y una opción desactivada

objeto.propiedad = {True | False}

Las otras opciones que aparecen en la ventana Menu Design —Window List, In­
Figura 5.43. dex y HelpContextID— son posibilidades avanzadas que están más allá del ámbi­
Un formulario con una barra de menús y menús desplegables to de este libro. Puedes encontrar información sobre estas tres posibilidades en tu
manual de referencia de Visual Basic.

sión; si estableces esta propiedad como False, el elemento del menú aparecerá
atenuado y no se podrá seleccionar en el menú. Si estableces la propiedad Visible Menús popup o emergentes
como False, el elemento del menú no aparecerá en el menú. Aunque los menús normalmente se llaman desde la barra de menús, algunas ve­
La figura 5.44 muestra el aspecto que tendría el menú Volumen de tu aplicación ces puedes querer que aparezca un menú desde un control. Este tipo de menús
de mando a distancia del televisor si añadieses dos barras separadoras al primer se llama emergente, porque no es visible normalmente, pero aparece de repente
nivel, establecieses la propiedad Chechee del elemento mnuVolPreAlto como cuando se hace clic sobre un control. Puedes hacer que cualquier menú aparezca
True, añadieses un nuevo elemento llamado Realmente alto y, como deferencia a como un menú emergente usando el método PopupMenu.
tus vecinos, establecieses su propiedad Enalbes como False. Por ejemplo, podrías asociar el menú Volumen que se muestra en la figura 5.45
Los ajustes Chechee, Enalbes y Visible de la ventana Menu Designó indican los con el dibujo de un botón de volumen. Usa la herramienta Picture para crear un
ajustes al comienzo. Cualquiera de estos ajustes se pueden cambiar desde el códi­ cuadro de dibujo en la pantalla, y luego utiliza la herramienta Shape para dibujar
go del programa con declaraciones de la forma siguiente: un botón de control circular dentro del cuadro de dibujo. (La forma será inicial-

156 157
EL LIBRO DEL VISUAL BASIC

mente un rectángulo. Para crear un círculo debes establecer la propiedad Shape


con el valor 3 - Circle.) Introduce el siguiente código para el evento MouseDown
(ratón abajo) del cuadro de dibujo. 6
Sub Picture1_MouseDown (Boton As Integer, Cambio As Integer,
X As Single, Y As Single)
PopupMenu mnuVolumen

Control del programa


End Sub

Cada vez que el usuario pulse el botón del ratón dentro del área del cuadro de
dibujo, aparecerá el menú Volumen, como muestra la figura 5.45.

Los pequeños programas que has escrito hasta ahora han sido extremadamente
simples: ejecutan declaraciones secuenciales, llevan a cabo tareas bastante direc­
tas y, en general, carecen de complicación. Este capítulo introduce los conceptos
que te ayudarán a obtener un mayor control sobre la manera en que se ejecutará
un programa, permitiéndote escribir código que puede gestionar diversas circuns­
tancias y opciones, con la posibilidad de repetición y con un rango más amplio
de datos.

Realizar elecciones
Los programas que has escrito en los capítulos anteriores constaban única y ex­
clusivamente de comandos y expresiones, los equivalentes de las declaraciones
imperativas en español. Pero nadie, ni siquiera el dictador más exaltado, puede
funcionar solamente dando ordenes. En la vida real la gente debe realizar eleccio­
nes. La herramienta principal de Visual Basic para tratar con las opciones es la
declaración If

Figura 5.45,
Un menú popup La declaración If
Imagina que le estás enseñando a un amigo lo que significan las señales de tráfi­
co. En concreto, lo que debe hacer cuando se encuentre una señal de estrecha­
Observa que en este ejemplo el menú Volumen está disponible tanto como un
miento sin preferencia. Podrías explicar qué se debe hacer cuando se encuentra
popup como a través de la barra de menús. Si quieres que un volumen sea visi­
una señal de ese tipo con las siguientes palabras: "baja la velocidad a 60 Km/h. Si
ble sólo como un popup deberás establecer su propiedad Visible como False en
no viene nadie, continúa tu camino; en caso contrario, detente y deja pasar al
la ventana MenuDesign. La propiedad Visible de un elemento del nivel más alto
otro coche.
se aplica sólo a los elementos de la barra de menús y es ignorada por el método
PopupMenu. En el caso de Visual Basic, la forma de hacerlo no es muy distinta. Observa el si­
guiente ejemplo.

158 159
EL LIBRO DEL VISUAL BASIC 6 Control del programa

Velocidad = 6 ’Se aproxima una señal deestrechamiento por la palabra clave Else, sigue a partir de ahí. Las dos posibles vías de ejecución
If Coches_Viniendo = 0 Then ’No viene ningúncoche son las siguientes:
Velocidad = 100 'Volver a la velocidad inicial
If True Then If False Then
Else ’Viene alguien
’Se ejecutan estas ’Se omiten estas
Velocidad = 0 ’Detenerse
’ instrucciones ’ instrucciones
End If
El se El se
’Se omiten estas ’Se ejecutan estas
La forma clásica de la declaración If (que en inglés es similar al si condicional
’ instrucciones ’ instrucciones
que usamos en castellano) especifica una elección entre dos opciones. Las pala­
End If End If
bras "dos caminos divergentes" lo expresan bastante bien con una imagen visual,
’La ejecución continúa aquí 'La ejecución continúa aquí
aunque el poeta Robert Frost no estaba contemplando un programa de ordena­
dor. Frost estaba preocupado porque solamente era posible viajar por uno de los La declaración If es una declaración compuesta —es decir, se evalúa como una
dos caminos, mientras que un programador debe preocuparse por los dos (ya sola unidad, aunque puede contener muchas otras declaraciones en su interior.
que no sabe cuál va a escoger el usuario). Muchos programadores acostumbran a sangrar esas otras declaraciones para que
sea más fácil ver lo que hay dentro de la declaración If Observa lo difícil que es
Como programador, debes darle instrucciones al ordenador. Como no puedes co­
leer nuestro ejemplo anterior cuando no está sangrado:
nocer siempre con exactitud qué condiciones se encontrará el programa en cada
momento mientras se esté ejecutando, tendrás que incluir instrucciones para ges­ Velocidad = 60 Velocidad = 60
If Coches_Viniendo = 0 Then If Coches_Viniendo = 0 Then
tionar diversos casos. En el ejemplo de la señal de estrechamiento no sabes si tu
Velocidad = 100 Velocidad = 100
amigo se encontrará con coches viniendo, así que le darás las instrucciones co­
Else Else
rrectas para ambas posibilidades. En el código de un programa se crea lo que se Velocidad = 0 Velocidad = 0
denomina una ramificación condicional, utilizando la declaración If End If End If

Aquí tienes la sintaxis de la declaración If o n Visual Basic: Si examinas la definición de la sintaxis de la declaración If podrás ver que la par­
te Else de la declaración es opcional. Ello te permite evitar la programación inne­
If expresión booleana Then
cesaria en el caso de que no haga falta poner ninguna declaración en la cláusula
[declaración]...
Else. De esta manera, estos dos fragmentos de código son equivalentes:
[Else
[declaración]...] If Conde = "Drácula" If Conde = "Drácula"
End If Print "¡Aieeeeeeee! Print "¡Aieeeeeeee!
Else End If
Tras la palabra clave If va una expresión booleana, la cual (como recordarás del End If
capítulo 4) es una expresión que se evalúa como True o False. Aquí tienes otros
ejemplos para llevar el mundo binario a la vida real: True o False, camino izquier­ Varias opciones
do o camino derecho, If o Else (else quiere decir en caso contrario en inglés). Si
La declaración If permite que un programa gestione una elección realizada entre
la expresión booleana resulta True se ejecutan todas las instrucciones que haya
dos opciones posibles. Pero, ¿cómo puede un programa gestionar una elección
detrás de la palabra Then (que quiere decir entonces en inglés) y hasta la palabra
realizada entre muchas opciones? En realidad, con la declaración If tienes todo lo
Else. (Los puntos suspensivos en la descripción de la sintaxis indican que puede
que necesitas para encargarte de una situación en la que se presenten varias op­
haber más de una instrucción.) El programa se salta entonces las instrucciones si­
ciones.
guientes y continúa la ejecución detrás de las palabras clave End If. Si la expre­
sión booleana es False, se omiten las instrucciones que haya inmediatamente A modo de ejemplo, piensa en el problema de identificar a uno de los Tres Cerdi-
detrás de la palabra Then. Cuando el programa encuentra una parte que empieza tos. Evidentemente, tienes tres posibilidades entre las que elegir. En este caso, el

160 161
EL LIBRO DEL VISUAL BASIC 6 Control del programa

material de construcción de la casita es una buena característica distintiva. Puedes de otra declaración If. Aquí tienes una versión del código anterior que ha sido re­
construir un test sencillo, como se muestra en la figura 6.1. hecha usando Else lf a su lado aparece la sintaxis completa de la declaración If de
El uso de la declaración If para realizar selecciones de uno entre muchos puede Visual Basic.
recordarte el juego de las preguntas, en el que una persona piensa en una cosa If Casita = "Paja" Then If expresión booleana Then
de un tipo acordado previamente y el resto de los jugadores tratan de adivinar Cerdito = "Perezoso” [declaración]...
qué es haciendo preguntas que sólo se pueden contestar con "Sí" ó "No". Con ElseIf Casita = "Madera" Then [ElseIf expresión booleana Then

cada pregunta se van eliminando ciertas características, y el juego se mueve en Cerdito = "Indiferente" [declaración]...]
El se [Else
una dirección concreta.
Cerdito = "Aplicado” [declaración]...]
El código de Visual Basic diseñado para implementar la prueba de los Tres Cerdi- End If End If

tos de la figura 6.1 se muestra aquí; la segunda declaración If es una declaración


Como se indica en la descripción de la sintaxis, la cláusula ElseIf puede repetirse
anidada, la cual está contenida completamente dentro de la primera:
muchas veces, lo que elimina la necesidad de escribir varias declaraciones If ani­
If Casita = "Paja" Then dadas.
Cerdito = "Perezoso"
El se
If Casita = "Madera"
La aplicación Tragaperras
Cerdito = "Indiferente" Para explorar más a fondo la declaración If vamos a construir una simulación de
El se una máquina tragaperras. Con un botón de comando, a modo de "palanca", el
Cerdito = "Aplicado" programa Tragaperras mostrará tres iconos aleatorios cada vez que "tires" de la
End If
palanca. Si los iconos coinciden, el usuario gana. El programa incluso llevará el
End If
control de las ganancias del jugador.
Cuando se necesitan más de tres o cuatro pruebas If el anidamiento de declara­
Visual Basic incluye algunos iconos muy apropiados para jugar: puedes usar los
ciones If puede ser complicado. Visual Basic admite una variante de la cláusula
iconos corazón, trébol, diamante y pica, denominados respectivamente MISC34,
Else denominada Else If, la cual combina una cláusula Else con la funcionalidad
MISC35, MISC36 y MISC37. El programa cogerá uno de estos iconos aleatoriamen­
te para cada una de las tres posiciones. Cada juego le cuesta 100 pesetas al juga­
dor. Si los tres iconos coinciden, el jugador gana 1000. Si los tres son diamantes,
el jugador gana 2500.

Crea un proyecto nuevo para diseñar la pantalla. En la parte superior del formula­
rio añade tres controles imagen, los cuales servirán para contener las pantallas de
la máquina tragaperras. Debajo de los controles imagen pon un botón de coman­
do que servirá como "palanca" de la máquina. A la izquierda, añade una etiqueta
para mostrar las ganancias del jugador; a la derecha, crea otro botón de comando
que permita al jugador terminar de jugar. Finalmente, añade cuatro controles ima­
gen más para que contengan los cuatro iconos que vamos a usar. Tu formulario
debe parecerse al que se muestra en la figura 6.2.

Para configurar los cuatro controles imagen de abajo, comienza por seleccionar el
Figura 6.1. que está más a la izquierda y establece su propiedad Name como imgCorazones.
Identificación de un cerdito Luego establece su propiedad Picture seleccionando Picture en la lista de propie-

162 163
EL LIBRO DEL VISUAL BASIC 6 Control del programa

controles imagen, llamándolos imgTreboles, imgDiamantes e imgPicas, y estable­


Piénsatelo ciendo sus propiedades Picture para cargar los archivos MISC35.ICO, MISC36.ICO
y MISC37.ICO en este orden.
Revisa cuidadosamente las presunciones que hagas cuando programes con
la declaración If. Debes tener cuidado de no incluir accidentalmente opcio­ A continuación establece las propiedades de los distintos elementos de la pantalla
nes no deseadas o, por el contrario, de no excluir opciones que debieran como se muestra en la figura 6.3. Cuando termines, tu formulario debe parecerse
incluirse. No seas demasiado rápido en presumir que tu primer intento al a la figura 6.4.
escribir una cláusula Else cubre la única alternativa posible.

Por ejemplo, el código que escribiste para identificar a los Tres Cerditos
Objeto Propiedad Ajuste
asume que si Perezoso e Indeferente son eliminados, la única posibilidad
que queda es Aplicado. Pero, en otras circunstancias, podría ocurrir que Forml BorderStyle 3 - Fixed Double
hubiese más posibilidades. Caption Tragaperras
Name Tragaperras
Un ejemplo similar de esta clase de errores es la prueba del color de un
Image1 BorderStyle 1 - Fixed Single
objeto. Si el objeto no es ni rojo ni blanco, podrías asumir que, por tanto,
Name imgTraga1
es azul. Esto funciona si sabes que todos los objetos son elementos de la
Stretch True
bandera norteamericana; sin embargo, en caso contrario la prueba podría
no ser válida. Image2 BorderStyle 1 - Fixed Single
Name imgTraga2
Stretch True
Image3 BorderStyle 1 - Fixed Single
Name imgTraga3
Stretch True
Command1 Caption Girar
Name btnGirar
Label1 BorderStyle 1 - Fixed Single
Caption (ninguno)
Name lblTotal
Command2 Caption Salir
Name btnSalir

Figura 6.3.

Figura 6.2. los ajustes correctos para la aplicación tragaperras


El diseño inicial para la aplicación Tragaperras
Para comenzar a trabajar en el código del programa, haz doble clic sobre el for­
mulario con el fin de abrir una ventana de código. Introduce las siguientes líneas
dades y haciendo clic en el botón con los puntos suspensivos que hay al lado del
de código en la sección de declaraciones generales:
cuadro Ajustes. En el cuadro de diálogo Load Picture elige el archivo MISC34.ICO
del directorio de iconos correspondiente (\VB\ICONS\MISC si instalaste Visual
Const TREBOL% = 1, CORAZON% = 2. DIAMANTE% = 3, PICAS% = 4
Basic usando los directorios por omisión). Repite este proceso para los otros tres
Dim Ganancias As Currency

164
165
EL LIBRO DEL VISUAL BASIC 6 Control del programa

Los enteros del 1 al 4 relacionarán los números seleccionados aleatoriamente con El procedimiento para el botón Girar aparece en la figura 6.5. Las variables lo­
los iconos apropiados. Las declaraciones de constantes te permitirán utilizar los cales P1, P2 y P3 contendrán cada una un número aleatorio que se utilizará para
nombres TREBOL, CORAZON, DIAMANTE y PICA en el programa, haciendo que seleccionar los iconos que aparecerán en los tres controles imagen de arriba (lla­
resulte más fácil de leer y de entender. La variable Ganancias, que es de nivel de mados, respectivamente, imgTraga1, imgTraga2 y imgTraga3). La variable Pago
formulario, se usa para contabilizar las ganancias del jugador. contendrá las ganancias del jugador correspondientes a una jugada (un "giro" de
Ahora selecciona Form en el cuadro Object de la ventana de código, y Load en el la máquina tragaperras).
cuadro Procedure. Añade estas líneas de código, las cuales se ejecutarán cuando
el formulario se cargue por primera vez (o sea, al comienzo del programa):
Sub Form_Load ( )
Sub btnGirar_CIick ( )
Randomize
Dim P1 As Integer, P2 As Integer, P3 As Integer
Ganancias = 0
Dim Pago As Currency
End Sub

El comando Randomize instruye a Visual Basic para que "mezcle" los números 'Pago para jugar
producidos por su generador de números aleatorios; sin esta declaración, las se­ Ganancias = Ganancias - 100
ries de jugadas siempre serían iguales cada vez que se ejecutase el programa.
'Generar resultados aleatorios
Como el jugador todavía no ha empezado a jugar, debes establecer la variable
P1 = Int(4 * Rnd + 1)
Ganancias a 0.
P2 = Int(4 * Rnd +1)
Aquí tienes el código del botón Salir: P3 = Int(4 * Rnd +1)

Sub btnSalir_Click ( )
'Mostrar el icono 1
End
If P1 = CORAZON Then
End Sub
imgTraga1.Picture = imgCorazones.Picture
ElseIf P1 = TREBOL Then
imgTraga1.Picture = imgTreboles.Picture
ElseIf PI = DIAMANTE Then
imgTraga1.Picture = imgDiamantes.Picture
ElseIf PI = PICAS Then
imgTraga1.Picture = imgPicas.Picture
End If
'Mostrar el icono 2
If P2 = CORAZON Then
imgTraga2.Picture = imgCorazones.Picture
ElseIf P2 = TREBOL Then
imgTraga2.Picture = imgTreboles.Picture
ElseIf P2 = DIAMANTE Then
imgTraga2.Picture = imgDiamantes.Picture

Figura 6.4.
Figura 6.5. (continúa)
El formulario con el diseño completo para la aplicación El procedimiento btnGirar_Click para la aplicación Tragaperras

166
167
6 Control del programa
EL LIBRO DEL VISUAL BASIC

Rnd + 1) utiliza la función interna Rnd de Visual Basic para devolver un número
Figura 6.5. continuación aleatorio entero del rango comprendido entre 1 y n.

El programa examina, a continuación, luego el número aleatorio P1 y establece la


ElseIf P2 = PICAS Then propiedad Picture de imgTraga1 según dicho número, copiando el dibujo de uno
imgTraga2.Picture = imgPicas.Picture de los iconos predefinidos de la parte inferior del formulario. Este proceso se re­
End If pite para imgTraga2 e imgTraga3.

'Mostrar el icono 3 Una vez que se han completado la pantallas de la máquina tragaperras, el progra­
If P3 = CORAZON Then ma comprueba si hay una combinación ganadora. Si los tres números aleatorios
imgTraga3.Picture = imgCorazones.Picture son iguales, el jugador gana. Además, el programa comprueba si la combinación
ElseIf P3 = TREBOL Then ganadora consta de tres diamantes. La variable Pago toma entonces el valor 1000
imgTraga3.Picture = imgTreboles.Picture
o 2500, de acuerdo con la combinación concreta. Si el jugador no ganó, la varia­
ElseIf P3 = DIAMANTE Then
imgTraga3.Picture = imgDiamantes.Picture ble Pago se establece en 0.
ElseIf P3 = PICAS Then Finalmente, el programa añade el pago a las ganancias del jugador y muestra el
imgTraga3.Picture = imgPicas.Picture
importe total en la etiqueta. La función Format de Visual Basic se asegura de que
End If
la cantidad aparezca en pesetas.
'Comprobar si el jugador ha ganado Cuando cierres la ventana de código estarás listo para ejecutar la aplicación. Sin
If P1 = P2 And P2 = P3 Then
embargo, antes de que lo hagas, cambia el tamaño de la ventana para ocultar los
If P1 = DIAMANTE Then
cuatro iconos predefinidos de la parte inferior, como se muestra en la figura 6.6.
Pago = 2500
MsgBox "¡¡Ganaste el GRANDE!!" Seguirán formando parte de la aplicación, pero no aparecerán en el interface del
Else usuario.
Pago = 1000
MsgBox "¡GANASTE!"
End If
Else
Pago = 0
Beep
End If

'Calcular y mostrar el total de ganancias


Ganancias = Ganancias + Pago
lblTotal.Caption = Format(Ganancias, "0 Pts")
End Sub
Figura 6.6.
El formulario redimensionado para la ejecución de la aplicación

Lo primero que hace el programa al ejecutarse es disminuir las ganancias del ju­ ¿Te sientes con suerte? Pulsa F5 para probar tu habilidad con las tragaperras.
gador en 100 ptas., el coste de una jugada. Después, genera tres números aleato­ Cuando termines de jugar es posible que quieras guardar este programa, de ma­
rios que necesita para saber qué dibujo incluir en cada caso. La fórmula Int(n * nera que puedas volver a él más adelante.

168 169
EL LIBRO DEL VISUAL BASIC 6 Control del programa

Hacer repeticiones programa termine de hacer el bucle en algún punto y que continúe con el resto
de instrucciones. Visual Basic te permite realizar esto de varias formas.
Las posibilidades de ejecutar declaraciones de asignación y de realizar elecciones
Puedes añadir una cláusula While (mientras) a la declaración Do o a la declara­
utilizando la instrucción lf te proporcionan, teóricamente, las herramientas nece­
ción Loop. El ejemplo de imprimir números del 1 al 1000 se resuelve fácilmente
sarias para escribir cualquier programa. Una vez más, las cosas son más fáciles en
con un bucle Do While (haz mientras), como se muestra aquí:
la teoría que en la práctica. Considera el problema de imprimir todos los números
que van del 1 al 1000. La solución obvia —escribir un programa con 1000 instruc­ Contador = 1
ciones Print (Print 1, Print 2, Print 3, y así sucesivamente)— sería algo más que Do While Contador <= 1000
tedioso. Afortunadamente, Visual Basic dispone de una manera mejor. Print Counter
Counter = Counter + 1
La declaración Do de Visual Basic puede procesar repetidas veces un conjunto de Loop
instrucciones. Aquí tienes la sintaxis más sencilla de esta declaración:
La variable Contador se establece en 1. Luego una declaración Do While, que se
Do ejecuta "mientras" Contador es menor o igual que 1000, y que termina cuando
[declaración]... Contador pasa de 1000, envuelve una declaración Print y una declaración de
Loop asignación. Cuando el bucle finaliza, la ejecución continúa en las instrucciones
del programa que hay a continuación de la palabra clave Loop.
La palabra clave Do (haz en inglés) marca el comienzo de una declaración com­
puesta, la cual incluye todas las declaraciones que haya hasta la palabra clave La palabra clave While debe ir seguida de una condición en forma de expresión
Loop (bucle en inglés). Las instrucciones se ejecutan en orden hasta que se llega a booleana. Si la expresión es False, se saltan las instrucciones que vienen a conti­
la palabra clave Loop; en ese punto la ejecución comienza de nuevo al comienzo nuación, hasta la palabra Loop, y la ejecución continúa en las instrucciones que
del bloque que contiene la declaración Do. van detrás de la palabra Loop. En este ejemplo, Contador se comprueba al co­
mienzo de cada bucle, incluyendo el primero. (Si Contador se hubiera inicializado
El conjunto de instrucciones que se repiten se denominan un bucle. Cuando un
a 50000 no se habrían ejecutado ninguna de las instrucciones existentes en el in­
programa ejecuta repetidamente esas declaraciones, se dice que está iterando o
terior del bucle.)
haciendo un bucle. El bucle obtiene su nombre del diagrama circular del flujo del
programa, como se muestra en la figura 6.7. Observa que a no ser que se incluya la declaración Contador = Contador + 1, la
expresión booleana siempre sería True (porque Contador siempre se quedaría
El bucle que se muestra en la figura 6.7 es un bucle infinito —o sea, Visual Basic
como 1), y el bucle se ejecutaría indefinidamente. Crear bucles infinitos inadverti­
ejecutará la declaración para siempre. Desde luego, normalmente querrás que el
damente es un error muy común, incluso entre programadores experimentados.
Recuerda que en Visual Basic siempre puedes pulsar Ctrl+Pausa para interrumpir
la ejecución de un programa y detener un bucle infinito.

La palabra clave While puede asociarse con la palabra Loop en lugar de hacerlo
con Do, y lograr un efecto ligeramente distinto, como se muestra en este código:

Do
Contraseña = InputBox("Introduce la palabra secreta")
Loop While Contraseña <> "Groucho"

Poniendo la cláusula While al final del bucle te aseguras de que las instrucciones
del interior del mismo se ejecutarán al menos una vez, debido a que la prueba
Figura 6.7.
que se realiza para determinar su finalización viene detrás de la palabra clave
Un diagrama de un bucle Do

170 171
EL LIBRO DEL VISUAL BASIC 6 Control del programa

Loop. En el ejemplo, un cuadro de diálogo que le pide al usuario que introduzca mando para calcular la media y una etiqueta para mostrar el resultado. Diseña un
la "palabra secreta", aparece repetidamente hasta que el usuario introduce la pala­ formulario que contenga esos tres objetos, y establece las propiedades de los ob­
bra correcta. jetos como se describe en la figura 6.8. Tu formulario debe parecerse al que se
muestra en la figura 6.9.
Finalmente, para hacer que los programas sean más legibles, puedes usar la pala­
bra clave Until (hasta en inglés) en lugar de While. Usar Until invierte la condi­
ción lógica. Compara los dos ejemplos anteriores en los que se usaba While con Objeto Propiedad Ajuste
los mismos ejemplos usando Until.
Form1 Caption Calcular
Ejemplos con While Ejemplos con Until Name Calcular
Command1 Caption Media
Contador = 1 Contador = 1
Name btnMedia
Do While Contador <= 1000 Do Until Contador > 1000
Print Counter Print Counter Label1 BorderStyle 1 - Fixed Single
Counter = Counter + 1 Counter = Counter + 1 Caption [ninguno]
Loop Loop Name lblMedia
Do Do
Combo1 Name cboEntradas
Contraseña = InputBox("Introduce Contraseña = InputBox("Introduce
la palabra secreta") la palabra secreta") Style 1 - Simple Combo
Loop While Contraseña <> "Groucho" Loop Until Contraseña = "Groucho" Text [ninguno]

Figura 6.8.
Aquí tienes la sintaxis completa de la declaración Do de Visual Basic: El ajuste de las propiedades para la aplicación Calcular

Comprobación al comienzo del bucle Comprobación al final del bucle

Do { While | Until } expresión Do


[declaración]... [declaración]...
Loop Loop { While | Until } expresión

La aplicación Calcular
Utilicemos tus recien adquiridos conocimientos para escribir un programa que sir­
va como calculadora de ciertas operaciones específicas. Cuando el usuario in­
troduzca en un cuadro combinado el importe de todos los cheques que haya Figura 6.9.
emitido durante un cierto período, el programa le dirá la cantidad media gastada El diseño del formulario para la aplicación Calcular
por cheque. Para hallar la media, el programa suma todos los valores individuales
y divide el total por el número de cheques —un trabajo ideal para un bucle Do
Ahora tienes que modificar el cuadro combinado un poco. Normalmente un cua­
While.
dro combinado proporciona una lista de opciones para el usuario. En este caso,
Crea un proyecto nuevo en Visual Basic. El interface de Calcular requiere un cua­ tú lo usarás para construir una lista de entradas. Cada vez que el usuario intro­
dro combinado para contener todos los importes de los cheques, un botón de co­ duzca un valor en la parte de texto del cuadro combinado, el programa añade el

172 173
EL LIBRO DEL VISUAL BASIC 6 Control del programa

valor a los elementos de la parte de lista. Para ello necesitas usar un procedimien­ cboInput.Text = "" 'Borra la parte de texto
to de evento que no se trató en el capítulo 5, uno que está basado en el evento KeyAscii = 0 'Ignora la pulsación de tecla
KeyPress (pulsar tecla). End If
End Sub
El evento KeyPress tiene lugar cada vez que el usuario pulsa una tecla. Haz doble
Este procedimiento sirve para detectar la tecla Intro (código ASCII 13). Si la tecla
clic en el cuadro combinado y selecciona KeyPress del cuadro Procedures de la
que el usuario pulsa no es la tecla Intro, Visual Basic simplemente insertará en la
ventana de código. La definición del procedimiento que aparece en la pantalla se
parte de texto del cuadro combinado el carácter que tecleó el usuario. Sin embar­
parecerá a esto:
go, cuando el programa detecta la tecla Intro, este procedimiento toma la parte
Sub cboEntradas_KeyPress (KeyAscii As Integer) de texto del cuadro combinado y la inserta en la parte de lista como un nuevo
elemento. Entonces borra la entrada de la parte de texto y establece KeyAscii a 0.
End Sub
Como 0 es el código ASCII del carácter nulo, Visual Basic simplemente ignora ese
Una variable llamada KeyAscii está definida dentro de los paréntesis. Esta variable carácter.
es un parámetro. Los parámetros son como las variables locales, excepto porque
están inicializadas por el procedimiento que llama, en lugar de serlo por el proce­ Calcular la media
dimiento que contiene la declaración. (Los parámetros en los procedimientos se Después de que el usuario haya introducido todos los valores puede hacer clic en
explican con más profundidad en el capítulo 7.) Por el momento, solamente ne­ el botón Media para que el programa calcule la cantidad media. Haz ahora doble
cesitas saber que el procedimiento del evento KeyPress viene con una variable clic en el botón de comando Media e introduce el siguiente código:
predeclarada llamada KeyAscii. Cuando el procedimiento se comienza a ejecutar,
Sub btnMedia_Click ( )
el valor de KeyAscii es el código ASCII del carácter que el usuario acaba de pul­
Dim Actual As Integer, Total As Single
sar. Por ejemplo, si el usuario escribe la letra A, el valor de KeyAscii será el 65.
Escribir una a genera un valor de 97; escribir un 3 genera un valor de 51. Total = 0 ’La suma de todos los cheques
Actual = 0 ’El cheque actual
El código de KeyPress puede modificar la variable KeyAscii. Si lo hace, Visual Ba­
Do While Actual < cboEntradas.ListCount
sic introducirá en el cuadro combinado el carácter modificado, en lugar del carác­
Total = Total + Val(cboEntradas.List(Actual)) 'Calcula la suma
ter que escribió el usuario. Prueba esta posibilidad por un momento. Define el Actual = Actual + 1 'Siguiente cheque
procedimiento KeyPress como sigue: Loop
lblMedia.Caption = Str$(Total / cboEntradas.ListCount) 'Mostrar
Sub cboEntradas_KeyPress (KeyAscii As Integer)
’la media como texto
If KeyAscii = 83 Or KeyAscii = 84 Then
KeyAscii = 42 End Sub
End If La declaración Dim define dos variables locales: Actual que identifica el valor del
End Sub
cheque con el que el programa está trabajando en cada momento por el número
Pulsa F5 para ejecutar la aplicación y escribe TEST en la parte de texto del cuadro del elemento; y Total, que contiene la suma de todos los valores. Total es iniciali-
combinado. Las letras T y S son reemplazadas por asteriscos. (El código ASCII del zada luego a 0, y el elemento actual puesto a 0. (Los elementos de un cuadro de
asterisco es el 42.) Finaliza la aplicación y edita el código de KeyPress otra vez, lista o de un cuadro combinado se identifican como elemento 0, elemento 1 y así
para que quede así: sucesivamente.)

Sub cboEntradas KeyPress (KeyAscii As Integer) La declaración Do While hace que Visual Basic continúe procesando mientras el
If KeyAscii = 13 Then 'Si la tecla es Intro número del elemento actual sea menor que el número total de elementos. (No
cboEntradas.Addltem cboInput.Text 'Inserta el nuevo texto puedes esperar que el programa encuentre 21 elementos si sólo se han introduci­
'del usuario do 7.) La siguiente declaración contiene la expresión cboEntradas.List(Actual), la

174 175
EL LIBRO DEL VISUAL BASIC 6 Control del programa

cual identifica el elemento de la lista. Como los elementos de un cuadro de lista o Un bucle For se puede escribir como una declaración While, pero es más normal
de un cuadro combinado siempre se almacenan como texto, se utilizará la fun­ utilizar el bucle For al ser más sencillo. La sintaxis de los bucles While se muestra
ción Val de Visual Basic para convertir el texto de los dígitos en un valor numéri­ a continuación:
co. De la misma manera, la función Str$ convierte más tarde la media calculada
en una cadena de texto, antes de que el programa la escriba en el título de la eti­ Incremento positivo Incremento negativo
queta.
variable = primerValor variable = primerValor
Ahora puedes ejecutar el programa Calcular. Escribe una serie de importes de Do While variable <= ultimoValor Do While variable >= ultimoValor
cheques en la parte de texto del cuadro combinado, y pulsa la tecla Intro des­ [declaraciones]... [ declaraciones]...
pués de cada importe. Cuando hayas introducido toda la lista, haz clic en el bo­ variable = variable + incremento variable = variable - incremento
tón Media. El resultado debe ser similar al que se muestra en la figura 6.10. Loop Loop

Observa que la expresión To del bucle For es equivalente a la comparación me­


nor o igual que del bucle While cuando el incremento es positivo, y equivalente a
la comparación mayor o igual cuando el incremento es negativo. Esto implica
que el valor final de variable puede no ser igual que ultimoValor. Como ejemplo,
mira este bucle y su salida.
For Contador = 1 To 10 Step 4
Print Contador
Next Contador

Salida

Figura 6.10. 1
5
Ejecución de la aplicación Calcular
9

Si quieres, puedes reescribir el código del programa Calcular usando un bucle


Bucles que cuentan For. Compara tus cambios con esta versión (la cual muestra las líneas modificadas
La declaración For es una declaración especializada de Visual Basic que gestiona en gris):
bucles que tienen un contador que aumenta o decrece regularmente. Tiene la si­
Sub btnMedia_Click ( )
guiente sintaxis:
Dim Actual As Integer, Total As Single
For variable = primerValor To ultimoValor [Step incremento]
[declaración]... Total = 0 ’La suma de todos los cheques
Next variable For Actual = 0 To cboEntradas.ListCount 1
Total = Total + Val(cboEntradas.List(Actual)) ’Calcula la suma
La declaración For crea un bucle en el que la variable contador se inicializa a pri­ Next Actual
merValor y luego se va incrementando en incremento cada vez que el programa lblMedia.Caption = Str$(Total / cboEntradas.ListCount)
ejecuta el bucle, hasta que alcanza el valor ultimoValor. Si omites la cláusula Step, ’Mostrar la media como texto
se asumirá que el incremento será 1. El valor de primerValor debe ser menor que End Sub

el de ultimoValor, a no ser que el incremento sea negativo; en tal caso, el valor Cuando escribiste tu versión del código, ¿estableciste el valor final del bucle For a
de primerValor debe ser mayor que el de ultimoValor. cboEntradas. ListCount - 1? Este cambio es importante, pero resulta fácil pasarlo

176 177
6 Control del programa
EL LIBRO DEL VISUAL BASIC

If cboEntradas.ListCount = 0 Then
por alto. Recuerda que los números de los elementos de un cuadro combinado
Exit Sub
de Visual Basic comienzan por el 0 —es decir, si hay tres elementos, estarán nu­ End If
merados como 0, 1 y 2. La versión original del código utilizaba un bucle con una
comparación menor que, pero el bucle For utiliza una comparación menor o Este código produce que el programa se limite a ignorar el clic del ratón cuando
igual que. es inapropiado, haciendo que el procedimiento no se siga procesando. Parecerá
que el botón Media no responde, lo que podría, desde luego, confundir al usua­
Estas sutiles diferencias pueden producir errores que hagan que el bucle se ejecu­ rio. Si te preocupa esta posibilidad puedes mostrar un cuadro de diálogo como
te demasiadas veces o muy pocas. Incluso los programadores con experiencia hace el código que se muestra aquí:
cometen estos errores, así que asegúrate de comprobar tus programas cuidadosa­
If cboEntradas.ListCount = 0 Then
mente. Por ejemplo, cuando hice el programa Calcular por primera vez, lo ejecuté
MsgBox "No hay datos para calcular la media"
con los valores de prueba 1, 2, 3 y 4. Como sabía la media de esos valores, 2,5,
Exit Sub
puede verificar que el código estaba funcionando correctamente. Cuando un pro­ End If
grama no produce ningún tipo de resultado, se sabe que contiene un error de
forma inmediata. Sin embargo, cuando el programa produce un resultado, es de­
masiado tentador presumir que el resultado es el correcto. El uso de matrices
En el programa Calcular has usado la variable cboEntradas.List, que es una ma­
Esperar lo inesperado triz. Las variables matriz pueden contener múltiples valores. Esto puede sonar un
Incluso cuando un programa produce resultados correctos durante un cierto tiem­ poco como los valores definidos por el usuario que vimos en el capítulo 3, pero
po, puede que no sean producidos siempre. Eso sucede con el programa Calcu­ no es lo mismo. Una variable registro contiene un número fijo de componentes,
lar. El programa Calcular fallará si el usuario hace clic en el botón Media sin cada cual con un nombre y un tipo de datos distinto. En una matriz, todos los
haber introducido ningún dato en el cuadro combinado. Podrías pensar que na­ componentes son del mismo tipo, y cada componente o elemento individual está
die va a hacer algo así. Pero parte de tu trabajo como programador consiste en numerado, en lugar de tener un nombre distinto. Para referirse a un campo de un
comprender que cualquier cosa que sea posible hacer, probablemente acabará registro se usa tanto el nombre de la variable como el del campo, como en Sie-
haciéndose. Y debes tratar de anticiparte a tales eventos lo mejor que puedas. glinde.Color. Para referirse a un elemento de una matriz se usa el nombre de la
variable seguido por el número del elemento entre paréntesis —cboEntra­
En el programa Calcular, el bucle Do While (el bucle For si hiciste los cambios) das. List(3), por ejemplo. El número que especifica un elemento de una matriz se
evita sumar valores al total si el cuadro combinado está vacío, lo cual es correcto. llama índice. Los valores índice siempre son números enteros. Visual Basic alma­
El problema surge en el cálculo de la media. Como el programa no encuentra cena los valores de la matriz en el orden del índice, comenzando (por omisión)
elementos en el cuadro combinado, la expresión Total / cboEntradas.ListCount en el elemento 0. La figura 6.11 compara el almacenamiento en memoria de va­
produce una división por cero. En este caso, Visual Basic proporciona una cierta riables simples y de registros (tipos definidos por el usuario) con el almacena­
gestión del error al mostrar un cuadro de diálogo en el que dice Division by zero miento en memoria de matrices.
(división por cero), lo cual no es de mucha utilidad al usuario. Y algunos siste­
mas (como el MS-DOS) simplemente finalizarán el programa que trata de dividir
por cero. Claramente, es mejor que tú como programador te anticipes a este error Reservar memoria para las matrices
a que confíes en que el sistema lo gestione de alguna manera (que, posiblemen­ Visual Basic permite crear matrices de cualquier tipo de datos, incluyendo los ti­
te, no sea la adecuada). pos definidos por el usuario. El programa Calcular utilizaba una matriz de cade­
nas de caracteres (cboEntradas.List) que era una propiedad definida del cuadro
Puedes enmendar el programa Calcular de dos maneras distintas. Una consiste en
combinado. Si tú quieres crear una matriz, debes usar una declaración de variable
insertar el código que se muestra a continuación al comienzo del procedimiento
btnMedia_Click. para reservar memoria para ella. Como las otras variables, las matrices se declaran

179
178
EL LIBRO DEL VISUAL BASIC 6 Control del programa

con la palabra reservada Dim. Aquí tienes la sintaxis de una declaración estándar Para evaluar tus progresos como criador de comadrejas, decides calcular la longi­
de matriz: tud media de tus comadrejas y compararla con la media nacional (que es de 22
centímetros). La expresión que calcula esta media es (Siegmund.Longitud + Sie-
{ Dim | Global } nombre( maximoTamaño) [As tipo]
glinde.Longitud + Siegfried.Longitud) /3. Por supuesto, el programa que incorpo­
El valor entre paréntesis (maximoTamaño) se denomina dimensión de la matriz; re esta expresión será válido sólo para esas comadrejas específicas. Cada vez que
le dice a Visual Basic cuánta memoria debe asignar a la matriz. La declaración tu población de comadrejas cambie tendrás que modificar el programa. Por tanto,
crea una matriz con índices que comienzan en el 0 y que continúan hasta máxi- lo que necesitas es una manera más general de almacenar información.
moTamaño. Por ejemplo, la declaración Dim X(3) As Integer, que declara una
En lugar de almacenar las estadísticas vitales de cada comadreja en una variable
matriz con un valor máximoTamaño de 3, realmente crea una matriz con cuatro
con nombre distinto, puedes modificar la descripción del tipo que contiene el
elementos: X(0), X(l), X(2) y X(3). El valor máximoTamaño debe ser un tipo en­
nombre de la comadreja. El nuevo tipo de datos, BTFComadreja, se muestra a
tero, lo que significa que una matriz no puede nunca tener un índice que sea ma­
continuación:
yor de 32767.
Type BTFComadreja
Experimentar con matrices Nombre As String
Color As String
Las matrices son increíblemente útiles, y permiten escribir programas que son
Peso As Integer
más generales y menos dependientes de los datos específicos. Para mostrar esto, Longitud As Integer
vamos a usar a unas viejas amigas nuestras que ya vimos en el capítulo 3: las co­ FechaNacimiento As Double
madrejas copetudas alemanas. ColorCopete As String
LongitudCopete As Integer
End Type

Ahora puedes almacenar toda la información sobre las comadrejas colectivamente


Integer
en una sola variable matriz: Comadrejas. Puedes declarar la variable Comadrejas
(entero)
con la declaración Dim Comadrejas(20) As BTFComadreja. Como la matriz con­
tendrá información sobre varias comadrejas (21 para ser exactos), también necesi­
tarás declarar otra variable que contenga el número de comadrejas que tienes
Long Integer
actualmente. Usa la declaración Dim PoblacionComadrejas As Integer.
(entero largo)

Una vez que declares las variables puedes almacenar datos sobre las comadrejas,
de manera muy parecida a la que usas cuando empleas variables separadas. Las
Record (registro
declaraciones que vienen a continuación muestran cómo se pueden inicializar
(Tipo definido
por el usuario) esos valores:
Entero Cadena de longitud fija Entero largo Com a flotante (doble precisión)
PoblacionComadrejas = 3
Comadrejas(0).Nombre = "Siegmund"
Matriz de
Comadrejas(0).ColorCopete = "marrón"
10 enteros
Comadrejas(0).Peso = 18

Figura 6.11.
La asignación de memoria para variables sencillas, registros y matrices

180 181
6 Control del programa
EL LIBRO DEL VISUAL BASIC

Dim W As Integer, Encontrado As Integer


Comadrejas(1).Nombre = "Sieglinde"
Comadrejas(1).Peso = 14
Encontrado = -1 ’No encontrado todavía
For W = 0 To PoblacionComadrejas - 1 ’Recorrer la matriz
If Comadrejas(W).Nombre = "Siegmund" Then ’Si se encuentra Siegmund
Encontrado = W ’Guardar el Indice en Encontrado
End If
Comadrejas(2).Nombre = "Siegfried"
Next W ’Continuar la búsqueda
Comadrejas(2).Peso = 8
Print Comadrejas(Encontrado).Peso
Ahora, suponiendo que ya has almacenado toda la información sobre las coma­
drejas, puedes escribir un programa que calcule la longitud media de tus animali­ Por desgracia, este programa examinará todos los elementos de la matriz, incluso
tos, independientemente del número de ellas que tengas. No es sorprendente que si Siegmund es la primera comadreja de la matriz. Este problema no es grave si la
se parezca al código del programa Calcular: población de comadrejas es pequeña, pero la búsqueda podría consumir bastante
tiempo si tuvieras miles de comadrejas.
Dim Actual As Integer, Total As Integer, LongitudMedia As Single
Tienes que alterar la condición del bucle de manera que finalice cuando se en­
Total = 0 cuentre la comadreja. Puedes escribir este bucle de dos formas. El primer método
For Actual = 0 To PoblacionComadrejas - 1
consiste en convertir el bucle en una declaración Do While en el que la condición
Total = Total + Comadrejas(Actual).Longitud
del bucle compruebe tanto que no se ha alcanzado el final de la matriz como que
Next Actual
LongitudMedia = Total / PoblacionComadrejas no se haya encontrado el nombre buscado:

Este código continuará siendo útil a medida que la población de comadrejas cam­ Dim W As Integer, Encontrado As Integer
bie. La clave para lograr una buena programación consiste en examinar el proble­ Encontrado = -1 ’No encontrado todavía
ma para ver si puede generalizarse, y luego escribir un programa cine solucione W = 0
el caso general, en lugar de escribir un programa que solucione un solo proble­ ’Hacer el bucle mientras no se acabe la matriz
ma pero que tenga que modificarse constantemente a medida que el problema ’y mientras no se encuentre
Do While (W <= PoblacionComadrejas - 1) And Encontrado = -1
cambie.
If Comadrejas(W).Nombre = "Siegmund” Then 'Si se encuentra Siegmund
Encontrado = W ’Guardar el índice en Encontrado
End If
Usar bucles con matrices
W = W + 1
Como sin duda te han sugerido los programas de este capítulo, las matrices y los Loop ’Continuar la búsqueda
bucles están estrechamente relacionados, como una mano y un guante. Operacio­ ’Imprimir el resultado
nes como sumas, cálculo de medias y buscar máximos y mínimos, todos ellos se Print Comadrejas(Encontrado).Peso
prestan a ser resueltos con matrices. Todas estas operaciones tienen que exami­
nar la matriz completa. Otras operaciones, como las de búsqueda, no. Al convertir el bucle For en un bucle Do While puedes definir una condición de
búsqueda más precisa. Este bucle finalizará cuando W se pase del máximo o
Piensa en la matriz de comadrejas. Ahora que las estadísticas vitales están almace­ cuando la variable Encontrado cambie de valor (lo cual sucederá sólo cuando se
nadas de forma anónima, no puedes utilizar una variable que tenga nombre, encuentre a Siegmund).
como Siegmund para extraer los datos de una comadreja concreta. En lugar de
ello, debes buscar en la matriz hasta que encuentres una comadreja cuyo elemen­ El método alternativo consiste en mantener el bucle For, y salir de él cuando se
to Nombre sea Siegmund. Por ejemplo, si quisieras obtener el peso de Siegmund, encuentre la comadreja. Visual Basic dispone de la instrucción Exit para este pro­
la manera más rápida de lograrlo sería algo como esto: pósito.

182 183
EL LIBRO DEL VISUAL BASIC 6 Control del programa

Dim W As Integer, Encontrado As Integer madrejas a otros criadores de comadrejas. ¿Cómo podrías dimensionar correcta­
mente la matriz?
Encontrado = -1 'No encontrado todavía
For W = 0 To PoblacionComadrejas - 1 ’Recorrer la matriz Podrías, simplemente, coger cualquier número arbitrariamente grande y confiar
If Comadrejas(W).Nombre = "Siegmund" Then ’Si encuentra Siegmund en que sea suficientemente grande. Sin embargo, te encontrarías con dos proble­
Encontrado = W ’Guardar el indice en Encontrado mas si eliges este camino. Uno, gasta memoria; la declaración Dim reserva memo­
Exit For ’Salir del bucle
ria para toda la matriz, tanto si se usa como si no. Dos, estás asumiendo un riesgo
End If
al confiar simplemente en la buena suerte. Si le vendes tu programa a un criador
Next W ’Continuar la búsqueda
Print Comadrejas(Encontrado).Peso
que tenga más comadrejas de las que caben en el programa, el programa fallará,
y tú tendrás un cliente descontento.
Cuando se alcanza la instrucción Fxit (salir), el flujo de control se transfiere a la
declaración que hay detrás de Next W. Para solucionar este problema, Visual Basic dispone de la sentencia ReDim, la
cual redimensiona una matriz. ReDim no es una declaración; es un comando que
Ambos métodos de programación son soluciones aceptables. La primera tiene la se puede ejecutar muchas veces durante el curso de un programa. Para usar Re­
ventaja de indicar explícitamente las condiciones de finalización en el bucle, ha­ Dim debes eliminar la dimensión máximoTamaño de la declaración original de la
ciendo que el código sea más fácil de comprender. El segundo método es ligera­ matriz. Omitir máximoTamaño le dice a Visual Basic que cree una matriz dinámi­
mente más eficiente, porque el bucle no tiene que procesar la prueba adicional ca (una cuyo tamaño puede cambiar) en lugar de una matriz de tamaño fijo. Exa­
de la variable Encontrado cada vez que se repita el bucle. Sin embargo, la decla­ mina este fragmento de programa, el cual no hace nada, excepto ilustrar cómo
ración Exit que finaliza el bucle, está sepultada en el cuerpo del bucle, y puede funciona ReDim:
ser fácilmente pasada por alto por alguien que lea el código. Mi preferencia per­
Dim Prueba( ) As Integer ’En la sección de declaraciones
sonal es el algo más eficiente y ligeramente menos complicado bucle For.

Las tres versiones de este código contienen un problema común: la declaración ’En algún procedimiento de evento
Print. El código presume que se ha encontrado lo que se buscaba, incluso aun­ For Tamaño = 10 To 50 Step 10
que éste podría no ser el caso. Una versión corregida sustituiría la declaración ReDim Prueba(Tamaño) As Integer ’Cambiar tamaño a la matriz Prueba
Next Tamaño
Print por el siguiente código:
Como la declaración original de la matriz Prueba no tiene componente máximo­
If Encontrado = -1 Then
MsgBox "No se ha encontrado" Tamaño, Visual Basic la reconoce como una matriz dinámica. En algún punto se
El se ejecutará el bucle For. En la primera vuelta del bucle, Prueba es dimensionada
Print Comadrejas(Encontrado).Peso como una matriz de 11 elementos (con los elementos numerados del 0 al 10). En
End If la siguiente vuelta del bucle, Prueba es redimensionada como una matriz de 21
elementos. Cuando se completa el bucle, Prueba está dimensionada como una
matriz de 51 elementos. Aquí tienes la sintaxis de la declaración ReDim:
Determinar el tamaño de la matriz durante la ejecución
ReDim [Preserve] variable(máximoTamaño) [As tipo ]
Cuando se escribe una instrucción Dim para declarar una matriz, se está predeter­
minando, efectivamente, el tamaño de la matriz. Quizás se conozca exactamente La sintaxis recuerda a la de la declaración Dim excepto, porque puede incluirse
el tamaño que debe tener la matriz, o quizás se sepa su valor máximo. (Por ejem­ la palabra clave Preserve (preservar) y porque el valor máximoTamaño , puede
plo, podrías saber perfectamente que tener más de 21 comadrejas sería un trabajo ser cualquier expresión entera. Cuando ReDim se usa sin Preserve, cualquier co­
excesivo.) En tales casos, una matriz de tamaño fijo funciona muy bien. Sin em­ pia existente de la matriz es eliminada y se crea una matriz completamente nue­
bargo, el problema surge cuando el tamaño de la matriz es desconocido. Supon, va. Si se usa ReDim con Preserve, los valores de la matriz antigua son preservados
por ejemplo, que quisieras vender tu programa de control de los datos de las co­ en la nueva matriz. Sin embargo, si la dimensión de la nueva matriz es más pe-

184 185
EL LIBRO DEL VISUAL BASIC 6 Control del programa

queña que la dimensión de la antigua, se perderán los valores con índices mayo­
res que la nueva dimensión.

El uso de matrices de controles


Además de las matrices de datos, Visual Basic permite definir matrices de objetos
de control, los cuales son útiles cuando se tienen varios controles que ejecutan
esencialmente la misma acción. Las matrices de control comparten los mismos
procedimientos de eventos. Por ejemplo, si tienes una matriz de tres botones de
comando, se llamará al mismo procedimiento Click independientemente del bo­
tón sobre el que se haya hecho clic.

Visual Basic permite diferenciar entre los elementos de una matriz de control pa­
sando un valor índice al procedimiento. Veamos cómo funciona esto. Crea dos
botones de comando nuevos en un formulario vacío. Establece la propiedad
Name de ambos botones como btnTest. Cuando trates de establecer el valor de la El primer botón tiene un valor índice de 0, y el valor índice del segundo es 1. Si
propiedad Name del segundo botón, Visual Basic presentará un cuadro de diálo­ quieres darle a los botones valores especiales de índice, puedes cambiar la pro­
go que te preguntará si estás tratando de crear una matriz de control: piedad Index en la fase de diseño. Esta propiedad no se puede modificar mien­
tras se está ejecutando el programa.

Los elementos de la matriz de control se identifican por el nombre de la matriz,


seguido por el valor índice entre paréntesis. Por ejemplo, este procedimiento
Click establece los títulos de los botones de comando de tu formulario como la
hora a la que se hizo clic por última vez sobre ellos:
Sub btnTest_Click (Index As Integer)
btnText(Index).Caption = Format(Now, "hh:mm:ss")
Haz clic en Sí en el cuadro de diálogo. Ahora abre la ventana de código haciendo End Sub
doble clic en cualquiera de los dos botones de comando. Verás que se ha añadi­
Las matrices de control son especialmente útiles con botones de opción. Puedes
do un parámetro Index (índice) a cada procedimiento de evento, como en el
definir todos los botones dentro de un solo marco como matriz de control y usar
ejemplo que se muestra aquí:
la propiedad Index o la propiedad Caption en una declaración de asignación, por
Sub btnTest_Click (Index As Integer) ejemplo, podrías usar el procedimiento Click con la matriz de control de botones
de opción que se muestra en la figura 6.12:
End Sub
Sub btnTest_Click (Index As Integer)
Este procedimiento de evento es llamado independientemente del botón sobre el MiComadreja.Color = optColor(Index).Caption
que se haga clic; la propiedad Index del botón es pasada, como un parámetro End Sub
entero, para indicar el botón sobre el que se hizo clic.
Un atajo muy útil para crear una matriz de control consiste en crear el primer ob­
Cuando se crea una matriz de control, Visual Basic le asignará un valor índice a jeto de control y establecer sus propiedades. Luego puedes copiarlo y pegarlo
cada objeto. Usa la ventana Properties para examinar la propiedad Index de los tantas veces como sea necesario para crear controles adicionales que tengan el
dos botones de comando que has creado: mismo tamaño y propiedades.

187
186
EL LIBRO DEL VISUAL BASIC

7
El uso de procedimientos
y funciones
Figura 6.12.
Una matriz de control de botones de opción

La mayoría de los procedimientos que has escrito en los capítulos anteriores han
sido procedimientos de eventos —o sea, fueron diseñados, especialmente, para
responder a eventos concretos producidos por el usuario o por el sistema. Sin
embargo, como podrás recordar, no todos los procedimientos son procedimientos
de eventos. Este capítulo te enseñará a escribir y a usar procedimientos generales
(incluyendo tanto a los procedimientos sub como a los procedimientos de fun­
ción) que llevan a cabo una tarea particular cuando son explícitamente llamados
por el código del programa (en lugar de ser provocados por un evento). También
estudia el uso de los parámetros, los cuales permiten a un programa pasar valores
específicos a los procedimientos y funciones a los que llama. Como verás, se
pueden pasar como parámetros incluso los objetos de Visual Basic. Finalmente,
este capítulo trata algunos procedimientos de evento avanzados, como aquellos
que permiten seguir el movimiento del ratón e implementar posibilidades de
arrastrar y soltar.

Procedimientos generales
Las primeras aplicaciones que escribiste tenían un control de flujo lineal: cuando
se haya ejecutado una instrucción, se ejecutará la que venga secuencialmente de­
trás. En el capítulo anterior, comenzaste a trabajar con ramificaciones condiciona­
les (declaraciones If ) y bucles que modifican el orden en que se ejecutan las
declaraciones. La figura 7.1 muestra un diagrama de estas tres clases de flujo.

Al igual que los bucles, los procedimientos permiten que un programa ejecute un
conjunto de instrucciones más de una vez. Sin embargo, en lugar de ejecutar re-

188 189
EL LIBRO DEL VISUAL BASIC 7 El uso de procedimientos y funciones

MsgBox "Me aburro"


End If
End Sub

Dado el procedimiento que acabas de escribir, los dos fragmentos siguientes de


programas son equivalentes:
Lloriquear Respuesta = InputBox("¿Hemos llegado ya?")
MsgBox "Odio esto" If Respuesta = "No" Then
Lloriquear MsgBox "Me aburro"
End If
MsgBox "Odio esto"
Respuesta = InputBox("¿Hemos llegado ya?")
If Respuesta = "No" Then
MsgBox "Me aburro"
End If
Figura 7.1.
El control del flujo en los programas
Flujo de control
Los procedimientos afectan, obviamente, al flujo de control. Cuando Visual Basic
petidamente un conjunto de declaraciones, los procedimientos permiten incluir encuentra un nombre de procedimiento, "memoriza" la posición actual del pro­
las declaraciones en un grupo que se pueden ejecutar cada vez que se desee. Por grama y significa que se va a ejecutar el procedimiento. Cuando termina el proce­
ejemplo, un procedimiento de evento de Visual Basic se ejecutará cuando el dimiento vuelve a la posición original en el programa y continúa la ejecución
usuario realice una acción; un procedimiento general se ejecutará cuando sea lla­ desde allí. A este proceso se le denomina llamada a un procedimiento porque el
mado por el código de la aplicación. programa llama al nombre del procedimiento. Como Visual Basic puede seguirle
la pista a cientos de niveles de llamadas, un procedimiento llamado por un pro­
Piensa en un programa que imite las acciones de un niño pequeño que viaja en grama puede él mismo contener una llamada a otro procedimiento, y así sucesi­
coche. Este código ilustra el comportamiento conocido como lloriqueo: vamente, como se ilustra en la figura 7.2.
Respuesta = InputBox("¿Hemos llegado ya?")
If Respuesta = "No” Then Parámetros
MsgBox "Me aburro"
Supongamos que estás escribiendo un programa que necesita, en algún momen­
End If
to, imprimir los números enteros del 1 al 10. En otro punto, el mismo programa
En un programa que simula el comportamiento de un niño sería previsible tener necesita imprimir los números del 1 al 17. El código de las dos rutinas se compa­
que duplicar esas líneas varias veces. En lugar de crear varias copias de las decla­ ra aquí:
raciones, podrías reunirlas todas en un procedimiento y ejecutarlo, simplemente,
usando el nombre del procedimiento. Añade una declaración de procedimiento y Primera rutina Segunda rutina
dale un nombre descriptivo:
For Contador = 1 To 10 For Contador = 1 To 17
Sub LLoriqueo ( ) Print Contador Print Contador
Dim Respuesta As String Next Contador Next Contador

Respuesta = InputBox("¿Hemos llegado ya?") Como las rutinas son muy similares, sería bastante fácil generalizarlas —es decir,
If Respuesta = "No" Then hacer que el mismo código sirva para ambos propósitos. La única diferencia entre

190 191
EL LIBRO DEL VISUAL BASIC 7 El uso de procedimientos y funciones

inicializadas por el código que llama al procedimiento. Las rutinas que llaman al
procedimiento inicializan esas variables especificando un conjunto de valores de­
trás del nombre del procedimiento. Aquí tienes la sintaxis de una llamada a un
procedimiento de ese tipo:
nombre [ valor [ , valor]...]

Date cuenta de las comas que separan a los argumentos. Las rutinas de llamada
no necesitan conocer los nombres de los parámetros porque los argumentos se
asignan, en orden, a los parámetros declarados en el procedimiento.

En la declaración del procedimiento, los parámetros se declaran dentro de los pa­


réntesis que van detrás del nombre del procedimiento. Visual Basic permite que
los procedimientos tengan más de un parámetro. Aquí tienes la sintaxis de una
Figura 7.2.
declaración de un procedimiento que incluye parámetros:
Llamadas a procedimientos
Sub nombre ([parámetro [As tipo[, parámetro [As tipo]...]
las dos es el valor final del bucle For, el cual puedes sustituir por una variable. End Sub
Entonces podrías usar un solo procedimiento y llamarlo después de ajustar la va­
Mira el ejemplo anterior reconstruido con parámetros:
riable con el valor apropiado, como se muestra a continuación. (Suponemos que
la declaración Dim FinalContador As Integer aparece en la sección de declaracio­
Primera Segunda
nes generales del programa.)
llamada llamada Procedimiento

Primera llamada Segunda llamada Procedimiento ImprimirBucle 10 ImprimírBucle 17 Sub ImprimirBucle (FinalContador AsInteger)
Dim Contador As Integer
FinalContador = 10 FinalContador = 17 Sub ImprimirBucle ( ) For Contador = 1 To FinalContador
ImprimirBucle ( ) ImprimirBucle ( ) Dim Contador As Integer Print Contador
Next Contador
For Contador = 1 To FinalContador End Sub
Print Contador
Next Contador Para ilustrar el uso de varios parámetros, podrías cambiar el procedimiento Impri-
End Sub
mirBucle para que acepte tanto un valor de comienzo como un valor de finaliza­

Como puedes ver, la combinación de variables y llamadas a procedimientos per­ ción, como se muestra aquí:
mite solucionar problemas de índole general y proporciona unas herramientas de
programación excelentes. Sin embargo, con la implementación mostrada aquí sur­ Primera llamada Segunda llamada Procedimiento

gen algunos problemas prácticos. En concreto, debes declarar variables globales o


ImprimirBucle 1, 10 ImprimirBucle 1, 17 Sub ImprimirBucle (InicioContador As
de nivel de módulo para la comunicación entre el programa principal y el pro­ Integer, FinalContador As Integer)
cedimiento al que llama; y debes recordar los nombres, utilizando nombres de Dim Contador As Integer
variables diferentes para cada procedimiento con el fin de evitar que un procedi­
For Contador = InicioContador To
miento llame al otro y reescriba su propia variable.
Final Contador
Print Contador
Visual Basic soluciona estos problemas permitiendo que todos los procedimientos
Next Contador
tengan parámetros, variables que son locales a un procedimiento pero que son End Sub

192 193
EL LIBRO DEL VISUAL BASIC
7 El uso de procedimientos y funciones

Procedimientos de función Print MaxEntero(7, 14)


ElDobleDeGrande = MaxEntero(3, 4) * 2
En los ejemplos anteriores puedes haber notado que las líneas de comunicación If MaxEntero(Primer Intento, SegundoIntento) > 20 Then
discurren en una sola dirección cuando se trata de una llamada normal a un pro­
Cuando se llama a una función que no necesita parámetros, simplemente se usa
cedimiento —es decir, la rutina que llama pasa valores al procedimiento, el cual
el nombre de la función, como si fuera una variable. La función interna Now de
lleva a cabo algunas acciones, pero no devuelve ninguna información a la rutina
Visual Basic (que devuelve la fecha y hora actuales) es un ejemplo de una fun­
que lo llamó. Sin embargo, se puede usar un tipo especial de procedimientos de­
ción que no requiere parámetros.
nominados procedimientos de función (o, simplemente, función) que devuelva
un valor al que llama, de manera muy similar a lo que hacen las funciones inter­
nas de Visual Basic. Escribir procedimientos
Cuando se declara una función se debe declarar el tipo de valor que devolverá, La explicación que viene a continuación utiliza el término procedimiento para ha­
así como los parámetros que requiera, como muestra la sintaxis que viene a con­ cer referencia a la idea general de una rutina que puede ser llamada. Cuando sea
tinuación: necesario, se especificarán los términos procedimiento de función (o simplemente
función) o procedimiento sub para lograr una mayor claridad.
Function nombre ([parámetro [As tipo][, parámetro [As tipo]...) [As tipo]
[ declaraciones] Nota: Aunque Visual Basic permite procedimientos y funciones defini­
nombre = expresión dos por el usuario, no permite métodos definidos por el usuario; sólo es­
[ declaraciones] tán disponibles los métodos construidos internamente.
End Function
Para crear en Visual Basic un procedimiento que pueda ser llamado debes abrir
una ventana de código. Selecciona el menú New Procedure (procedimiento nue­
Puedes ver dos diferencias que distinguen a un procedimiento de función de un
vo) del menú View. En el cuadro de diálogo New Procedure escribe el nombre
procedimiento sub. Un procedimiento de función aparece entre las declaraciones
del nuevo procedimiento, elige Sub o Function haciendo clic en uno de los boto­
Function y End Function , mientras que un procedimiento sub requiere Sub y End
nes de opciones, y haz clic en el botón OK. Entonces Visual Basic creará un nue­
Sub. Y, como muestra la definición de la sintaxis, en algún lugar del cuerpo de la
vo elemento en el cuadro Procedure de la ventana de código y suministrará la
función debes asignar un valor (expresión) al nombre de la función. Ese es el va­
declaración End apropiada para el procedimiento.
lor que será devuelto a la rutina que llamó a la función. Por ejemplo, esta función
devuelve el mayor de dos números enteros: Vamos a escribir un programa sencillo llamado Conversión de temperaturas que
realizará una simple conversión entre temperaturas Celsius y Fahrenheit. Abre un
Function MaxEntero (X As Integer, Y As Integer) As Integer
If X > Y Then proyecto nuevo y pon una barra de desplazamiento vertical, seis etiquetas y dos
MaxEntero = X cuadros de texto en el formulario, organizando los elementos como se muestra
Else en la figura 7.3. Establece las propiedades de los objetos con los ajustes que se
MaxEntero = Y muestran en la figura 7.4.
End If
End Function El programa permitirá que el usuario ajuste la barra de desplazamiento a cual­
quier temperatura entre los puntos 40 y 212 de la escala Fahrenheit o las corres­
La sintaxis para llamar a una función es ligeramente diferente de la que se usa
pondientes temperaturas (40 y 100) de la escala Celsius. La aplicación mostrará
para llamar a un procedimiento. Como una función devuelve un valor, puede ser
entonces el valor de la temperatura elegida tanto en las escalas Fahrenheit como
llamada desde cualquier posición en que pueda ir una expresión. Los parámetros
Celsius. Oberva que el ajuste la propiedad Min de la barra de desplazamiento es
de la función aparecen entre paréntesis para separarlos de otras partes de la ex­
mayor que el ajuste Max. Al establecer las propiedades de esta forma se obliga a
presión. Aquí tienes algunas declaraciones que llaman a la función MaxEntero:
que la barra de desplazamiento use los números más grandes en la parte de arri-

194
195
EL LIBRO DEL VISUAL BASIC 7 El uso de procedimientos y funciones

Figura 7.4. continuación

Objeto Propiedad Ajuste

Label5 Alignment 0 - Left Justify


Caption 100
Labe16 Alignment 0 - Left Justify
Caption - 40
Text1 Name txtGradosF
Text [ninguno]
Text2 Name txtGradosC
Figura 7.3. Text [ninguno]
El diseño inicial del formulario para la aplicación Conversión de temperaturas

Para mayor simplicidad, el programa siempre "piensa" en grados Celsius y efectúa


ba de su rango, en lugar de mostrar los más pequeños arriba, que es lo que nor­ una conversión para obtener la temperatura Fahrenheit. Primero debes escribir la
malmente hace cuando el ajuste de Min es menor que el de Max. función que devuelva una temperatura Fahrenheit cuando el programa suministre
una temperatura Celsius. Abre la ventana de código del formulario. Selecciona el
comando New Procedure del menú View. En el cuadro de diálogo escribe CaF,
Objeto Propiedad Ajuste elige el botón de opción Function y haz clic en OK. Luego edita la nueva función
como sigue (asegúrate de añadir el parámetro y el tipo a la primera línea):
Form1 BorderStyle 3 - Fixed Double
Caption Conversión de temperaturas Function CaF (TempC As Integer) As Integer
Name Temp CaF = CInt(TempC * 9 / 5 + 32)
End Function
VScroll1 LargeChange 10
Max - 40 La función CaF utiliza la fórmula de conversión estándar. Acepta una temperatura
Min 100 Celsius como parámetro y devuelve la temperatura equivalente medida en la es­
Name vscTermometro cala Fahrenheit. Para simplificar la salida y el uso de las barras de desplazamien­
SmallChange 1 to, los valores se restringen a valores enteros. (La función CInt convierte un valor
Label1 Alignment 2 - Center en coma flotante en un entero redondeándolo.)
Caption Fahrenheit Ahora puedes escribir el código que lee el valor de la barra de desplazamiento y
Label2 Alignment 2 - Center muestra los valores de la temperatura. Introduce el siguiente procedimiento sub
Caption Celsius debajo de la función:
Label3 Alignment 1 - Right Justify
Sub MostrarTemps ()
Caption 212 Dim TempC As Integer
Label4 Alignment 1 - Right Justify
Caption -40 TempC = CInt(vscTermometro.Value)
txtGradosC.Text = Str$(TempC)
Figura 7.4. (continúa) txtGradosF.Text = Str$(CaF(TempC))
El ajuste de las propiedades para la aplicación Conversión de temperaturas End Sub

196 197
EL LIBRO DEL VISUAL BASIC
7 El uso de procedimientos y funciones

Después de que introduzcas la primera línea (la declaración Sub), observa que
Visual Basic añade el nombre del procedimiento al cuadro Procedure y que aña­ Pensar por delante
de la declaración End Sub al código que estás escribiendo. Como puedes ver, es Pudiera parecer como si hubiéramos realizado cierto trabajo innecesario al escri­
posible crear un procedimiento nuevo seleccionando el comando New Procedure bir el código de la aplicación Conversión de temperaturas. Después de todo,
del menú View o introduciendo la declaración Sub o Function del nuevo procedi­ como cada procedimiento se usa sólo una vez, ¿por qué no hacer todos los cálcu­
miento en cualquier parte de la ventana de código. los en línea y centralizar todo el código en el procedimiento del evento Change
de la barra de desplazamiento? El código del programa resultante sería algo así:
El código del procedimiento MostrarTemps lee el valor de la barra de desplaza­
miento, vscTermometro. Value, y lo almacena en la variable TempC. Este valor se Sub vscTermometro_Change ( )
muestra en el cuadro de texto txtGradosC. Luego se establece el valor del cuadro Dim TempC As Integer
de texto txtGradosF con el resultado generado por la función CaF.
TempC = CInt(vscTermometro.Value)
Finalmente, selecciona vscTermometro (la barra de desplazamiento) del cuadro txtGradosC.Text = Str$(TempC)
Object de la ventana de código y edita los procedimientos Change y Scroll como txtGradosF.Text = Str$(CaF(TempC))
se muestra aquí: End Sub

Sub vscTermometro_Change ( ) De hecho, este programa es perfectamente aceptable y funcionaría igual de bien
MostrarTemps que la primera versión. Pero el programa Conversión de temperaturas original es
End Sub preferible por las siguientes razones:

■ Sustituye en el programa las fórmulas por funciones con nombre. Los nom­
Sub vscTermometro_Scroll ( )
MostrarTemps bres añaden claridad y ayudan a explicar lo que está sucediendo en el pro­
End Sub grama.

Ahora, cada vez que el usuario cambie la barra de desplazamiento, el procedi­ ■ Contiene rutinas generales que se pueden usar de nuevo. Copiar la función
miento MostrarTemps llevará a cabo su trabajo. Ejecuta la aplicación para ver si CaF a otro programa sería trivial.
funciona de la manera que esperabas. El resultado debe asemejarse al que se ■ Los procedimientos son partes que pueden ser manipuladas fácilmente si
muestra en la figura 7.5.
se decide alterar el programa.

A modo de ilustración piensa en una mejora del programa. En la versión actual


debes usar la barra de desplazamiento para ajustar una temperatura concreta.
Pero podría ser útil permitir al usuario que introdujese el valor de la temperatura
directamente, y a continuación hacer que el programa calcule la conversión re­
querida. Mediante los bloques que ya has creado puedes conseguir que esta tarea
sea relativamente simple. Si hubieras escrito el programa como un sólo bloque,
un cambio de este tipo requeriría duplicar o reescribir el código.

Generalizar
Las mejores herramientas son las que se pueden utilizar para más de un trabajo.
A menudo se pueden convertir en una rutina general unas pocas líneas de código
Figura 7.5. específico que sea útil en un solo contexto. Piensa en el programa que escribiste
Ejecución de la aplicación Conversión de temperaturas en el capítulo 6 para buscar una comadreja en particular por su nombre; en la fi-

198
199
7 El uso de procedimientos y funciones
EL LIBRO DEL VISUAL BASIC

gura 7.6 aparece una versión completa. La figura 7.7 muestra una versión que usa
Function BuscarComadreja (SuNombre As String) As Integer
un procedimiento general derivado del código original. Esta segunda versión pro­
Dim W As Integer, Encontrado As Integer
porciona una rutina que buscará cualquier comadreja por su nombre y que, segu­
ramente, será útil muchas veces en el programa.
Encontrado = -1
For W = 0 To PoblacionComadrejas - 1

Cómo funcionan los parámetros If Comadrejas(W).Nombre = "Siegmund" Then


Encontrado = W
Hasta ahora has utilizado los parámetros simplemente para pasar argumentos a Exit For
los procedimientos. Pero los parámetros son en realidad mucho más flexibles que End If
eso. Veamos los dos mecanismos que están disponibles en Visual Basic para pa­ Next W
BuscarComadreja = Encontrado
sar parámetros.
End Function

Pasar por referencia W = BuscarComadreja("Siegmund")

Cuando presentamos los parámetros por primera vez los describimos como varia­ If W = -1 Then
MsgBox "No se ha encontrado"
bles locales. En realidad, ese no es siempre el caso. Piensa en el procedimiento
El se
Incremento , el cual suma 1 al valor del parámetro X: Print Comadreja(W).Peso
Sub Incremento (X As Integer) End If
X = X + 1
End Sub

Figura 7.7.
Código con un procedimiento general que puede encontrar cualquier comadreja

Dim W As Integer, Encontrado As Integer Si X fuera una variable local, este procedimiento no tendría ninguna utilidad. El
valor del parámetro de la rutina que llama sería asignado a X, y el procedimiento
Encontrado = -1
incrementaría el valor y luego terminaría, destruyendo, efectivamente, la variable
For W = 0 To PoblacionComadrejas - 1
If Comadrejas(W).Nombre = "Siegmund" Then local. En realidad, X es una referencia del valor original. En el código que se
Encontrado = W muestra aquí, tras llamar al procedimiento Incremento se imprimiría el valor 4:
Exit For
End If Dim A As Integer
Next W A = 3
If Encontrado = -1 Then Incremento A
MsgBox "No se ha encontrado" Print A
Else
Como el parámetro X es una referencia, no se asignará memoria para almacenar
Print Comadreja(Encontrado).Peso
el valor. En lugar de ello, Visual Basic simplemente almacena la información de
End If
que X es una referencia. La utilización de la referencia permite a Visual Basic
operar de manera muy eficiente. Esta eficiencia no es evidente en el caso de las
Figura 7.6.
variables integer, pero mira el procedimiento Al_lado que imprime su parámetro
El código de un programa que busca a una comadreja por su nombre de cadena encerrado entre paréntesis:

200 201
EL LIBRO DEL VISUAL BASIC 7 El uso de procedimientos y funciones

Sub Al_lado (Str As String) Pasar por referencia es, generalmente, más eficiente, pero pasar por valor te pro­
Print "("; porciona una variable local, que necesitarás algunas veces en tus programas. Por
Print Str; ejemplo, veamos una función que calcula x elevado a y, o xy. Este cálculo usa la
Print ")" multiplicación repetidamente —x3 ,por ejemplo, es igual a x * x * x). Para una
End Sub
mayor simplicidad, la función ignorará los exponentes negativos. El parámetro Y
Si los parámetros fueran realmente variables locales, Visual Basic tendría que especifica el número de multiplicaciones que hay que realizar. El valor de Y es
asignar espacio para cada una de las cadenas pasadas y copiar la cadena en cada "decrementado" después de cada multiplicación, y el cálculo se completa cuando
llamada. Como las cadenas pueden ser de miles de caracteres de largo, implica Y llega a 0.
mucho menos trabajo crear una referencia al valor original.
Function ElevadoA (X As Single, ByVal Y As Integer) As Single
Dim Resultado As Single
Pasar por valor
También puedes hacer que los parámetros funcionen de la otra manera —es de­ Resultado = 1
cir, exactamente igual que las variables locales. Si comienzas la declaración de Do While Y > 0
Resultado = Resultado * X
parámetros con la palabra clave ByVal (por valor), Visual Basic asignará espacio
Y = Y - 1
local para el parámetro y copiará el valor del argumento en el parámetro. Aqui
Loop
tienes un ejemplo de una declaración de ese tipo: ElevadoA = Resultado
Sub Incremento (By Val X As Integer) End Function
X = X + 1
Como quieres modificar Y localmente pero no quieres cambiar el valor de la va­
End Sub
riable que se pasó, debes declarar Y con la palabra clave ByVal. Examina el si­
guiente fragmento de código, el cual llama a la función ElevadoA:

'Aproximar e^n usando la serie de Taylor


Resultado = 1
Reciclar el código For Aproximación = 1 To 10
Resultado = Resultado + ElevadoA(N, Aproximación) /
Hoy estás escribiendo programas que almacenan datos de comadrejas co­
Factorial(Aproximacion)
petudas alemanas. Mañana pueden ser mugwumps. Y cuando estés escri­ Next Aproximacion
biendo tu programa para los mugwumps sería práctico poder decir, "oh, yo
escribí algo igual que esto hace dos semanas". Si escribes rutinas de propó­ El programador espera que esta rutina haga 10 bucles mientras realiza el cálculo.
sito general siempre podrás recuperar el código de la programación ante­ Sin embargo, si la función ElevadoA que está llamando no utilizase la palabra cla­
rior y usarlo en la nueva. El código ya está depurado, tienes que hacer ve ByVal, esta rutina haría un bucle infinito. Después de que la rutina llamase a
menos trabajo y el proyecto se termina antes. ¿Qué más puedes pedir? ElevadoA por primera vez, Aproximacion sería puesta a 0 (porque la variable lo­
cal Y sería una referencia de Aproximacion). La función Factorial sería llamada
Aunque es bueno reutilizar el código que tú mismo has desarrollado, nor­ con un valor incorrecto, y luego la declaración For incrementaría Aproximacion
malmente, es poco ético (y a menudo ilegal) copiar directamente el código en 1 y se repetiría el bucle de nuevo. Como ElevadoA continuaría poniendo Apro­
que haya escrito otro. Sin embargo, eres libre de copiar el código de los ximacion a 0, el bucle For no se detendría nunca.
programas que vienen de ejemplo con Visual Basic; Microsoft ha dado per­
miso para copiar el código. (La autorización aparece en la parte superior Una buena regla de seguridad consiste en que cualquier declaración de paráme­
del módulo principal de cada aplicación.) tros de los tipos integer, long o single debe ser una declaración ByVal (es decir,
el parámetro debe pasarse como un valor) a no ser que la rutina que llama espe-

202 203
EL LIBRO DEL VISUAL BASIC
7 El uso de procedimientos y funciones

re explícitamente que el procedimiento modifique el valor que se pasa. Por el Para pasar una matriz como argumento a un procedimiento, simplemente se usa
contrario, las cadenas y las matrices deben pasarse por referencia para obtener el nombre de la matriz seguido por unos paréntesis vacíos. Este fragmento de có­
una mayor eficiencia. Los tipos definidos por el usuario (como BTFComadreja) y digo muestra cómo se puede usar el procedimiento MediaD:
los controles sólo pueden pasarse por referencia en Visual Basic.
Dim MisDatos(100) As Double, ElementosLeidos As Integer
En el caso de los otros tipos de datos (double, currency y variant), la decisión no ElementosLeidos = CargarDatos(MisDatos( ), 100)
es tan fácil. La práctica de la buena programación dicta que estos parámetros se Print "Valor medio de los datos:"; MediaD(MisDatos( ),
pasen por valor porque será menos probable que se modifique su valor inadverti­ ElementosLeidos)
damente. Pero es más eficiente pasar estos parámetros por referencia. MisDatos se declara como una matriz de dimensión 100. Se llama al procedimien­
Mi consejo es asegurar primero los buenos principios de la ingeniería: pasar todas to CargarDatos (que no se muestra aquí), y MisDatos se pasa como parámetro,
las variables (excepto cadenas, matrices y tipos definidos por el usuario) inicial­ junto con el tamaño máximo de la matriz. Presumiblemente, la rutina CargarDatos
mente por valor. Después de que hayas terminado el programa y lo hayas ejecu­ rellena tantos datos de la matriz como sea posible. Luego el programa imprime la
tado correctamente, puedes investigar las maneras de lograr que sea más rápido. media. La llamada a MediaD pasa la matriz y el número de elementos que se le­
Entonces, si el programa opera incorrectamente después de quitar algunas de las yeron con CargarDatos.
palabras clave ByVal, también sabrás dónde buscar los problemas. Desde luego, cuando sea necesario, también se pueden pasar elementos indivi­
duales de una matriz. Simplemente, indica el índice en la matriz del elemento es­
Pasar matrices como parámetros pecífico que quieres pasar, como en esta línea de código:

Se puede declarar un parámetro matriz igual que cualquier otro, excepto que se Print "La raíz cuadrada del elemento tres es"; sqr(MisDatos(3))

omite el tamaño de la matriz en la declaración. Por ejemplo, esta función calcula Puedes modificar la aplicación Calcular del capítulo 6 para que use una función,
la media de una matriz de valores con precisión doble: como se muestra en la figura 7.8. Cada vez que hagas clic en el botón Media el
Function MediaD (Dmatriz( ) As Double, ByVal Delementos As Integer) programa redimensiona la matriz dinámica ListaDeValores para que se adapte al
As Double número de elementos del cuadro de lista. Como el cuadro de lista contiene una
Dim Total As Double, Ix As Integer matriz de cadenas en lugar de números, cada elemento debe ser convertido a me­
dida que se copia en ListaDeValores. El programa pasa luego la matriz entera a la
Total = 0 función MediaD.
For Ix = 0 To Delementos - 1
Total = Total + Dmatriz(Ix) Este programa modificado es un poco más largo que la aplicación original. Pero
Next Ix has creado una nueva herramienta —la función MediaD— que podrás utilizar
If Delementos = 0 Then una y otra vez. Por ejemplo, si quieres ampliar el programa Calcular para que
MediaD = 0 gestione más de una cuenta, puedes llamar a la función MediaD para cada cuen­
Else
ta, en lugar de tener que escribir un bucle separado para cada una de ellas. Si ne­
MediaD = Total / Delementos
cesitas escribir un programa que calcule el volumen medio de las precipitaciones
End If
End Function de lluvia, puedes cargar el programa Calcular, copiar la función MediaD y pegarla
en tu nuevo programa.
El parámetro Dmatriz se declara como una matriz del tipo doble, pero su tamaño
no se declara. Este código es otro ejemplo de una solución generalizada. Como el
tamaño de la matriz no se declara, la misma función puede ser llamada con argu­ Asignación local
mentos que sean matrices de cualquier tamaño (en la medida en que los elemen­ Estás familiarizado con las variables locales desde que hablamos sobre el ámbito
tos de las matrices sea del tipo doble). en el capítulo 3. Ahora que estás trabajando con parámetros, que son similares a

204 205
EL LIBRO DEL VISUAL BASIC 7 El uso de procedimientos y funciones

las variables locales, sería interesante echar una mirada a la manera en que Visual a procedimientos distintos. Los ordenadores modernos ejecutan esta asignación y
Basic gestiona la memoria usada por las variables locales. liberación temporal de memoria de manera muy eficiente.

Cuando se arranca un programa, Visual Basic sabe cuántas variables globales Sin embargo, algunas veces puede que no quieras perder el valor almacenado en
existen y asigna memoria para ellas. Pero no sabe cuántas variables locales exis­ una variable local una vez que el procedimiento que contiene a la variable finali­
ten e, incluso, no sabe si todos los procedimientos del programa serán llamados. za. Podrías declarar una variable de nivel de módulo o una variable global, pero
Las variables locales y los parámetros se crean cuando se llama al procedimiento esta solución no es deseable si la variable la usa un solo procedimiento.
en el que están contenidos, y luego serán destruidos cuando el procedimiento fi­
Visual Basic dispone de la palabra clave Static (estática) para solucionar el pro­
nalice. Si se llama de nuevo al procedimiento, las variables se vuelven a crear.
blema. Si utilizas Static en lugar de Dim en el interior de un procedimiento, las
Este procedimiento no sólo retrasa la asignación de memoria hasta que se necesi­
variables así declaradas tendrán un ámbito local, y serán visibles sólo para ese
ta sino que permite que la memoria sea reutilizada por variables que pertenecen
procedimiento; pero serán permanentes, como si estuviesen declaradas a nivel de
módulo. Visual Basic inicializa todas las variables Static a 0, lo que las hace muy
útiles para situaciones como la siguiente:

Sub Command1_Click ( )
Function MediaD (Dmatriz( ) As Double, ByVal Delementos Static Contador As Integer
As Integer) As Double Contador = Contador + 1
Dim Total As Double, Ix As Integer MsgBox "Este botón se ha pulsado" + Str$(Contador) + "veces."
End Sub
Total = 0 'Suma de todos los elementos
For Ix = 0 To Delementos - 1 Abre un formulario nuevo, añade un solo botón de comando y prueba este pro­
Total = Total + Dmatriz(Ix) 'Calcular la suma grama. Después, sustituye la palabra clave Static por Dim para que veas que el
Next Ix programa no trabaja con una variable puramente local.
If Delementos = 0 Then
MediaD = 0
Else Objetos como parámetros
MediaD = Total / Delementos 'Calcular y devolver la media
End If Los procedimientos que has escrito hasta ahora han pasado valores numéricos,
End Function matrices y cadenas como parámetros. Visual Basic también permite pasar contro­
les y formularios. La sintaxis es similar: simplemente, hay que utilizar las palabras
Sub btnMedia_Click ( ) clave Control o Form en lugar de String, Integer; etc., en la declaración del proce­
Dim I As Integer
dimiento.
ReDim ListaDeValores(cboEntradas.ListCount - 1)
For I = 0 To cboEntradas.ListCount - 1 Esta posibilidad aumenta la capacidad para escribir código de propósito general.
ListaDeValores(I) = Val(cboEntradas.List(I)) Por ejemplo, supon que estás escribiendo una aplicación que tiene varios boto­
Next I
nes en la pantalla. En diversos puntos de la aplicación quieres dirigir la atención
lblMedia.Caption = Str$(MediaD(ListaDeValores( ),
a un botón concreto mediante la técnica de poner en cursiva su título y de poner
cboEntradas.ListCount))
el color del fondo en rojo. El siguiente procedimiento hace justamente eso:
End Sub
Sub Atencion (Btn As Control)
Btn.FontItalic = True
Figura 7.8. Btn.BackColor = RED 'RED (rojo) está definido en CONSTANT.TXT
Una modificación de la aplicación Calcular End Sub

206 207
EL LIBRO DEL VISUAL BASIC 7 El uso de procedimientos y funciones

Los objetos se pasan como parámetros usando sus nombres. Podrías pasar un bo­
tón que se llamase btnSiguiente a este procedimiento mediante la declaración Objeto Propiedad Ajuste
Atencion btnSigniente.
Form1 Caption Error
De manera similar, puedes declarar que un formulario sea un parámetro. Puedes
Name Escapar
establecer o examinar las propiedades del formulario y llamar a sus métodos. El
Label1 Caption Fallo de inicialización:
formulario se pasa usando su nombre, o también puedes utilizar la variable inter­
FontSize 12
na Me( yo), que es el formulario activo en ese momento.
Label 2 Caption Error de memoria en un chip
de RAM - el tercero por la izquierda
La aplicación Escapar
Image1 Picture TRFFC14.ICO
Construyamos un programa llamado Escapar que le gaste una broma al usuario.
Command1 Caption Cancelar
Emitirá un mensaje de error, como si hubiera fallado al arrancar. El usuario verá
Command2 Caption Reintentar
un cuadro de diálogo con dos botones de comando, Cancelar y Reintentar. Sin
embargo, lo que sucederá cuando el usuario pulse uno de estos botones será
Figura 7.10.
bastante inusual. El botón se "escapará" rápidamente a algún punto aleatorio del
El ajuste de las propiedades para la aplicación Escapar
formulario y el usuario nunca será capaz de cancelar el programa simplemente
haciendo clic en los botones. La aplicación muestra la manera de pasar objetos
La figura 7.11 contiene el código del programa para la aplicación Escapar, mien­
como parámetros y el modo de usar el método Move (mover) —un método que
tras que la figura 7.12 muestra el aspecto que tendrá la aplicación cuando el
se puede implementar para la mayoría de los controles de Visual Basic.
usuario la ejecute.
Todos los botones de comando deben tener el mismo comportamiento. En cierta
El procedimiento Saltar usado en esta aplicación puede ajustar la posición no
medida, te puedes asegurar de que esto sea así llamando a un procedimiento co­
sólo de los botones de comando sino de casi cualquier tipo de control que sea
mún. Pero una de las acciones del procedimiento moverá al botón a una nueva
pasado como parámetro, ya que la mayoría de los controles poseen un método
ubicación. Esta acción significa que hay que llamar al método Move del botón, lo
Move. Sin embargo, algunas veces puede que quieras ejecutar ciertas clases de
cual requiere que se pase el botón como parámetro.
procesos que sean propios de ciertas clases de objetos. Visual Basic dispone de la
Crea un proyecto nuevo y organiza en el formulario dos etiquetas, dos botones declaración If TypeOf (si el tipo de) para determinar el tipo del parámetro control.
de comando y un control imagen, como se muestra en la figura 7.9. La figura 7.10 Funciona de la misma manera que una declaración If convencional; sólo es dife­
muestra los ajustes adecuados de las propiedades. rente la sintaxis de la primera línea:

If TypeOf objeto Is tipoDeObjeto Then

Si quisieras que el procedimiento Saltar distinguiese los botones de opciones de


los otros tipos de controles, la primera línea de la declaración If TypeOf sería
como ésta:
If TypeOf Ctl Is OptionButton Then

Procedimientos de evento avanzados


Figura 7.9.
Este apartado estudia algunos procedimientos de eventos de Visual Basic que son
El diseño inicial del formulario para la aplicación Escapar más complicados que los simples Click y DblClick. Estas técnicas te permitirán

208 209
EL LIBRO DEL VISUAL BASIC 7 El uso de procedimientos y funciones

construir aplicaciones que tengan una gestión del teclado y del ratón más sofisti­
cada e implementar una técnica gráfica denominada arrastrar y soltar.

Eventos del ratón


Nuestros ejemplos anteriores sólo le prestaban atención al ratón cuando era utili­
zado para hacer clic sobre un objeto. Todo lo que tenías que hacer entonces era
crear el código para un procedimiento Click o DblClick. Pero ciertos tipos de apli­
caciones necesitan vigilar las actividades del ratón mucho más de cerca.
Figura 7.12.
Por ejemplo, un programa de dibujo necesita saber la posición del ratón cuando
Ejecución de la aplicación Escapar
se está arrastrando un gráfico o creando una imagen nueva. Un juego puede utili­
zar la posición del ratón para controlar algún aspecto de la partida. Sin embargo,
los eventos del ratón están asociados con formularios y con cuadros de dibujo,
Visual Basic no contiene un objeto ratón. En lugar de ello, se emite un evento
pero también se pueden usar con otros objetos. Por motivos pedagógicos, este
MouseMove cada vez que cambia la posición del ratón. La mayoría de las veces,
apartado se concentra en el trabajo con formularios.

Todos los formularios tienen estas tres plantillas de procedimientos:


Sub Form_MouseDown (Button As Integer, Shift As Integer,
Function EnteroAleatorio (EntMin As Integer, EntMax As Integer) X As Single, Y As Single)
As Integer
EnteroAleatorio = Int(EntMax - EntMin + 1) * Rnd + EntMin Sub Form_MouseUp (Button As Integer, Shift As Integer,
End Function X As Single, Y As Single)

Sub Saltar (Ctl As Control) Sub Form_MouseMove (Button As Integer, Shift As Integer,
Dim Horiz As Integer, Vert As Integer X As Single, Y As Single)

Horiz = EnteroAleatorio(0, Width - Ctl.Width) Visual Basic llama a estos tres procedimientos cuando el usuario interactúa con el
Vert = EnteroAleatorio(0, Height - Ctl.Height - 375 ) ratón. El evento MouseDown tiene lugar cada vez que se pulsa un botón del ra­
Ctl.Move Horiz, Vert tón. El evento MouseUp ocurre cuando se suelta un botón del ratón. El evento
End Sub MouseMove sucede cuando la posición del ratón cambia. La figura 7.13 describe
los parámetros que se pasan a estos tres procedimientos de evento.
Sub Command1_Click ( )
Saltar Command1
End Sub Parámetro Descripción

Sub Command2_Click ( ) Button Este parámetro contiene un valor que indica el botón del ratón
Saltar Command2 pulsado. Se crea combinando las constantes apropiadas con una
End Sub operación Or: LEFT_BUTTON (botón izquierdo), RIGHT_BU-
TTON (botón derecho), MIDDLE_BUTTON (botón central).

Figura 7.11.
Figura 7.13. (continúa)
El código del programa de la aplicación Escapar Los parametros de los procedimientos de evento del ratón

210 211
7 El uso de procedimientos y funciones
EL LIBRO DEL VISUAL BASIC

Figura 7.14. continuación


Figura 7.13. continuación

Parámetro Descripción Sub Form_MouseUp (Button As Integer, Shift As Integer,


X As Single, Y As Single)
Shift Este parámetro representa el estado de las teclas Mayús, Ctrl y If (Button And LEFT_BUTTON) <> 0 Then
Alt usando las constantes SHIFT_MASK, CTRL_MASK y Dibujando = False 'Parar de dibujar
ALT_MASK. Se pone un bit a 1 si la tecla está siendo pulsada. End If
End Sub
X, Y Estos valores corresponden a la posición actual del ratón,
usando las coordenadas del sistema especificadas por las
Sub Form_MouseMove (Button As Integer, Shift As Integer,
propiedades de escala. X As Single, Y As Single)
If Dibujando Then
If (Shift And SHIFT_MASK)) = SHIFT_MASK Then
La mejor manera de ilustrar estos eventos es escribir una aplicación sencilla. El Line -(X, Y), RED 'Dibujar lineas rojas
código para la aplicación Dibujo de líneas, que se muestra en la figura 7.14, está El se
basado en el programa Scribble de la documentación de Visual Basic. Esta aplica­ Line -(X, Y) 'Dibujar lineas negras
ción usa el método Line (línea), un método gráfico para dibujar en un formulario. End If
End If
(Trataremos con más detalle el método Line en el capítulo 10.)
End Sub

'De CONSTANT.TXT Cuando ejecutes esta aplicación, la variable Dibujando estará inicialmente esta­
Const LEFT_BUTTON = 1, SHIFT_MASK =1, RED = &HFF& blecida como False. Sin embargo, cuando pulses el botón izquierdo del ratón la
variable será puesta a True. Cuando sueltes el botón del ratón, Dibujando será
Dim Dibujando As Integer
puesta a False otra vez. A medida que mueves el ratón con el botón pulsado, el
programa dibuja una línea desde la última coordenada conocida (CurrentX, Cu­
Sub Form_Load ( )
Dibujando = False 'No dibujar al empezar rrent Y) hasta la posición actual del ratón. Si pulsas la tecla Mayéis mientras estás
End Sub dibujando, el color de la línea cambiará a rojo hasta que sueltes la tecla.

Sub Form_MouseDown (Button As Integer, Shift As Integer, Nota: En los ratones que tienen solamente un botón, dicho botón está
X As Single, Y As Single) definido como el botón izquierdo. Si tienes un ratón de dos botones y has
If (Button And LEFT_BUTTON) <> 0 Then usado el Panel de Control de Windows para intercambiar el sentido de
Dibujando = True 'Dibujar mientras que el botón esté pulsado los botones del ratón, Visual Basic pasará el valor LEFT_BUTTON cuan­
CurrentX = X do pulses el botón derecho, y el valor RIGHT_BUTTON cuando pulses el
CurrentY = Y
izquierdo.
End If
End Sub
Eventos del teclado
En el capítulo 6 se introdujo el evento KeyPress, el cual es emitido hacia ciertos
Figura 7.14. (continúa)
objetos cuando el usuario está escribiendo. Visual Basic también dispone de un
El código del programa para la aplicación Dibujar línea

213
212
EL LIBRO DEL VISUAL BASIC 7 El uso de procedimientos y funciones

grado de control todavía más preciso con los eventos KeyUp y KeyDown (tecla arrastrado se denomina objeto fuente, y el ítem que recibe el evento DragDrop
arriba y tecla abajo), los cuales son emitidos cuando el usuario pulsa y suelta te­ (arrastrar/soltar) se denomina destino. Cuando el usuario suelta el objeto fuente
clas en el teclado. Sin embargo, sólo aplicaciones muy especializadas requieren el (soltando el botón del ratón), Visual Basic emite un evento DragDrop al destino.
uso de estos eventos; la información completa está contenida en el manual de Además, se emiten eventos DragOver (arrastrar sobre) a todos los objetos por en­
referencia de Visual Basic. cima de los cuales haya pasado el objeto fuente.

Los formularios tienen otra posibilidad interesante relacionada con las pulsaciones La característica arrastrar y soltar te permiten diseñar un interface de usuario sim­
de teclas del usuario. Normalmente, las pulsaciones de teclas (y sus eventos aso­ ple, en el cual las tareas se puedan llevar a cabo sin comandos, menús o botones.
ciados) son enviados directamente al objeto (un cuadro de texto, por ejemplo) Este método es muy intuitivo en muchas situaciones y, a menudo, es mucho más
que es el foco de atención actual. Sin embargo, estableciendo la propiedad Key- rápido que otros métodos. Ejemplos obvios son los de arrastrar iconos de archi­
Preview (revisión previa de la tecla) de un formulario como True, se obliga a que vos a una carpeta de directorio en el Administrador de archivos de Windows e
los procedimientos de los eventos KeyPress, KeyUp y KeyDown del formulario imprimir un archivo arrastrándolo al Administrador de impresoras de Windows.
sean ejecutados primero. Estos procedimientos pueden, por tanto, filtrar la infor­
Para mostrar las posibilidades de la técnica de arrastrar y soltar vamos a escribir
mación que se está pasando a los procedimientos KeyPress, KeyUp y KeyDown
una aplicación llamada Correo electrónico, la cual simulará un entorno de escrito­
del objeto.
rio para correo electrónico. Te permitirá crear mensajes nuevos y arrastrarlos has­
Por ejemplo, para registrar todas las teclas que pulse el usuario, podrías definir la ta un buzón de correo desde el que serán enviados a través de la red. (Aquí se
siguiente función (asumiendo que GuardarTodo está declarada como una varia­ muestra sólo la característica de arrastrar y soltar; el código fuente de un sistema
ble de cadena de nivel del formulario): de correo electrónico podría llenar un libro entero.)

Sub Form_KeyPress (KeyAscii As Integer) Comienza por crear un formulario nuevo. Añade dos botones de comando y siete
GuardarTodo = GuardarTodo + Chr$(KeyAscii) pequeños controles imagen, como se muestra en la figura 7.15. Los tres controles
End Sub imagen de la parte de abajo de la pantalla contendrán las copias principales de
Si la propiedad KeyPreview del formulario está establecida como True y si el pro­ los iconos, como hacían los controles imagen de la aplicación Tragaperras del ca­
cedimiento de gestión del teclado de nivel del formulario modifica la variable pítulo 6. Después de que inicialices estos controles puedes reducir el tamaño del
KeyAscii, el procedimiento del evento KeyPress del objeto seleccionado actual­ formulario para ocultarlos de la vista.
mente verá la tecla modificada. Si el procedimiento de nivel del formulario esta­
blece KeyAscii en 0, no se llamará al procedimiento KeyPress del objeto.

Arrastrar y soltar

Visual Basic también proporciona un soporte especial para otra forma de interac­
ción del usuario, denominada arrastrar y soltar. El término arrastrar y soltar se re­
fiere al uso del ratón para arrastrar un objeto que aparece en la pantalla a algún
otro lugar. Has visto este proceso en el Administrador de archivos de Windows,
el cual permite mover archivos de un directorio a otro arrastrando sus iconos.

La "arrastrabilidad" de un objeto se activa estableciendo su propiedad DragMode


(modo de arrastre) en 1. Cuando DragMode se establece en 1, el control no reci­
be más los eventos Click y MouseDown. En su lugar, el objeto se mueve cuando
el usuario hace clic sobre él y comienza a arrastrarlo. El ítem que está siendo Figura 7.15.
El diseño inicial del formulario de la aplicación Correo electrónico

214 215
EL LIBRO DEL VISUAL BASIC 7 El uso de procedimientos y funciones

Establece las propiedades de los tres controles imagen (Image5, Image6 e Ima-
ge7) como se muestra en la figura 7.16. La propiedad Tag es ignorada por Visual
Basic; la puedes utilizar para mantener e identificar el texto que quieras. Esta apli­
cación utiliza la propiedad Tag para distinguir el icono de una carta de los otros
iconos.

Objeto Propiedad Ajuste

Image5 Name imgBuzonVacio


Picture MAIL16A.ICÔ
Image6 Name imgBuzonLleno
Figura 7.17.
Picture MAIL16B.ICO
Los tres iconos inferiores utilizados en la aplicación Correo electrónico
Image7 DragMode 1 - Automatic
Index 0
Name imgCarta
Picture MAIL01A.ICO
Tag Carta
Objeto Propiedad Ajuste

Figura 7.16. Form1 BorderStyle 3 - Fixed Double


Elajuste de las propiedades de los tres controles imagen de la parte inferior Caption Correo electrónico
de la aplicación Correo electrónico
Image1 BorderStyle 1 - Fixed Single
Name imgBuzon
Estableciendo la propiedad DragMode de Image7 (el icono carta) permites al
Image2 DragMode 1 - Automatic
usuario arrastrar cartas por la pantalla. El ajuste en 0 de la propiedad Index hace
Name imgLapiz
que el icono de la carta sea una matriz de control, aunque la matriz contenga un
Picture PENCIL09.ICO
solo elemento en este momento. (Dentro de un momento verás cómo usa esto el
Image3 DragMode 1 - Automatic
programa.) La figura 7.17 te muestra el aspecto que debe tener la fila inferior de
Name imgTeléfono
controles imagen del formulario después de establecer las propiedades.
Picture PHONE01.ICO
Ahora establece las propiedades de los demás objetos como se indica en la tabla Image4 DragMode 1 - Automatic
de la figura 7.18. Después de que cambies el tamaño del formulario, de manera Name imgClip
que no sean visibles las tres imágenes inferiores, el formulario debe parecerse al Picture CLIP1.ICO
mostrado en la figura 7.19. El control imagen que aparece en la parte superior iz­ Command1 Caption Mensaje nuevo
quierda servirá como buzón en el que se pueden echar los iconos carta. Los ico­ Name btnNuevo
nos que ves en el escritorio (el lápiz, el teléfono y el clip) no pueden ser echados
Command2 Caption Vaciar buzón
al correo. El buzón mostrará el icono de buzón vacío (de Image5) cuando esté
Name btn Vaciar
vacío, y el icono de buzón lleno cuando el usuario arrastre cartas a él. Los boto­
nes de comando permitirán al usuario crear cartas nuevas (con el icono carta) y
Figura 7.18.
vaciar el buzón.
El ajuste de las propiedades restantes para la aplicación Coreo electrónico

216 217
EL LIBRO DEL VISUAL BASIC 7 El uso de procedimientos y funciones

SiguienteCarta. Después de que Visual Basic cree el nuevo miembro de la matriz


de controles (imgCarta), se le da una posición en la ventana a este nuevo miem­
bro y se hace que sea visible. Luego se incrementará la variable SiguienteCarta
de manera que el siguiente evento Clic cree una carta nueva.

El botón Vaciar buzón simplemente devuelve el icono (la propiedad Picture) del
buzón a su valor por omisión:

Sub btnVaciar_Click
imgBuzon.Picture = imgBuzonVacio.Picture
Figura 7.19.
End Sub
El diseño del formulario terminado para la aplicación Correo electrónico El buzón necesita su propio procedimiento de arrastrar y soltar. Cuando se suelta
un control sobre el buzón, el programa comprueba la propiedad Tag del objeto
fuente. Si el objeto fuente no es una carta, el procedimiento termina, y no se
El código para esta aplicación requiere la siguiente declaración:
mueve el objeto fuente. En caso contrario, la declaración Unload eliminará la car­
Dim SiguienteCarta As Integer ta, y la propiedad Picture del buzón cambiará al icono imgBuzonLleno.

Se necesitan, además, dos procedimientos de nivel de formulario. El procedimien­ Sub imgBuzon_DragDrop (Source As Control, X As Single, Y As Single)
If Source.Tag <> "Carta" Then
to Form_Load inicializa el icono buzón y la variable SiguienteCarta; el procedi­
Beep
miento Form_DragDrop mueve el control al punto que el usuario especifique:
Exit Sub
Sub Form_Load ( ) End If
imgBuzon.Picture = imgBuzonVacio.Picture Unload Source
SiguienteCarta = 1 imgBuzon.Picture = imgBuzonLleno.Picture
End Sub End Sub

Ejecuta esta aplicación y prueba a hacer clic en el botón Mensaje nuevo varias ve­
Sub Form_DragDrop (Source As Control, X As Single, Y As Single)
Source.Move X, Y
ces para crear cartas nuevas. Excepto el buzón, se pueden arrastrar el resto de las
End Sub imágenes del escritorio. Arrastrar una carta al buzón hace que cambie el icono
del buzón, y hacer clic en el botón Vaciar buzón devuelve el icono original del
La ventana básica sólo muestra tres iconos. Para permitir que el usuario cree nue­
buzón. Observa que el programa no te permite arrastrar el teléfono, ni el lápiz ni
vos objetos carta debes escribir el código para el botón Mensaje nuevo:
el clip al buzón.
Sub btnNuevo_Click ( )
Este sencillo programa usa la variable SiguienteCarta para especificar un índice
Load imgCarta(SiguienteCarta )
que se incrementa continuamente para los elementos siguientes de la matriz de
imgCarta(SiguienteCarta).Left = btnNuevo.Left - 2000
+ SiguienteCarta * 100 controles Carta. En una versión del programa que funcionase en el mundo real
imgCarta(SiguienteCarta).Top = btnNuevo.Top querrías mantener muy controlada la cuenta de los valores del índice. Visual Ba­
imgCarta(SiguienteCarta).Visible = True sic permite un máximo de 255 elementos en una matriz de controles, lo que sig­
SiguienteCarta = SiguienteCarta + 1 nifica que el programa fallaría si el usuario tratase de crear 256 cartas o más. En
End Sub condiciones ideales, el programa controlaría la eliminación de elementos de la
El programa llama primero al procedimiento Load. Como imgCarta es una matriz matriz de controles y volvería a usar los valores índice de los elementos que se
de controles, Load crea un control nuevo y le asigna el índice especificado por hubieran descargados.

218 219
8
Depuración y gestión
de errores
Este capítulo se centra en los errores y en qué hacer al respecto. Independiente­
mente de la experiencia que tengas como programador, tus programas rara vez
funcionarán perfectamente al primer intento. Es más, también de forma inde­
pendiente a la habilidad que tengan los usuarios que trabajen con tus programas,
están casi obligados a producir o a encontrarse con cierto número de errores du­
rante la ejecución. Primero veremos el proceso de buscar y eliminar bugs (erro­
res) y luego el proceso de gestionar los errores que se produzcan durante la
ejecución del programa.

Los bugs (bichos en inglés) son esos insidiosos gremlins que llenan los programas
que tú "sabes" que son correctos, incluso aunque no estés obteniendo los resulta­
dos correctos. Anecdóticamente, uno de los primeros bugs de ordenador que es­
tán registrados realmente era un bicho. El ordenador Mark II fue un ordenador
electromecánico construido en 1945. Un día el ordenador dejó de funcionar mis­
teriosamente. Una ardua búsqueda reveló que una polilla había sido atrapada en­
tre los contactos de un relé. Grace Murray Hopper, una de las creadoras del
lenguaje COBOL y una de las pioneras de la industria de los ordenadores, recu­
peró el infortunado lepidóptero y escribió en el libro de registro del proyecto
"Primer bicho real que se ha encontrado".

Sin embargo, los bugs que se tratan en este capítulo son errores en la lógica de
los programas. Desde luego puedes cometer todo tipo de errores que evitarán
que tu programa funcione —por ejemplo, tratando de asignar un valor de cadena
a una variable de tipo double. Pero Visual Basic avisa de esos errores bastante
evidentes en cuanto se los encuentra, lo que hace que sean fáciles de localizar y

221
EL LIBRO DEL VISUAL BASIC 8 Depuración y gestión de errores

de eliminar. Los bugs realmente interesantes son lo que debes encontrar y solu­
cionar por ti mismo.

Debbuging (o depuración) es, simplemente, el proceso de buscar y eliminar bugs.


Al contrario que los sistemas tradicionales de eliminación de pestes, la depura­
ción de programas de ordenador no tiene efectos laterales tóxicos, a no ser que
cuentes las horas sin dormir y las innumerables tazas de café que puede conllevar
la búsqueda de un bug casi ilocalizable.

Depurar un programa puede ser interesante e incluso excitante. Perseguir y elimi­


nar un bug del programa, generalmente produce una sensación de satisfacción
real, ya se derive del hecho de recuperar o reparar el programa, del objetivo Figura 8.1.
logrado o de la emoción de la caza. El ejercicio intelectual puede ser también en- Los botones de la barra de herramientas que se usan en la depuración de programas
riquecedor, permitiéndote examinar y analizar tus propios procesos de pensa­
miento.
la ventana Debug. Cada declaración sólo puede ocupar una línea. Las declaracio­

Herramientas de depuración nes se ejecutan dentro de la ventana Debug cuando se pulsa la tecla Intro. El có­
digo de la ventana de código no se modifica.
Aunque no queramos admitirlo, los bugs son realmente errores del programador.
Normalmente, lo que se hace es imprimir los valores de variables y de expresio­
Sin embargo, algunas veces aparecen de manera tan infrecuente o bajo condicio­
nes que interesan, pero se pueden hacer muchas cosas más. De hecho se puede
nes tan inusuales que parecen exhibir algún tipo de inteligencia maligna que se
ejecutar prácticamente cualquier instrucción de programación de Visual Basic; se
divierte burlándose de nosotros. Yo he tenido la experiencia de un bug que sólo
puede, por ejemplo, modificar una variable o ejecutar un procedimiento desde la
aparecía en semanas alternas y con un programa que funcionaba perfectamente
ventana Debug. Sin embargo, debes darte cuenta de que sólo se pueden modifi­
bien, excepto cuando una aplicación concreta se ejecutaba inmediatamente de­
car las variables locales y los parámetros del procedimiento actual y las variables
lante de él. Mucho más habitual es la rutina que, simplemente, no funciona.
globales y de nivel de módulo; no se pueden examinar ni cambiar variables loca­
Cuanto te encuentres con un problema como ese, posiblemente querrás usar al­
les de ningún procedimiento que no sea el actual. También se pueden cambiar
gunas de las herramientas que Visual Basic ofrece para llevar a cabo la depura­
los valores de todas las propiedades que se puedan modificar durante la ejecu­
ción del programa.
ción del programa.
A medida que trabajes con las distintas herramientas de depuración verás que al­
A modo de demostración, crea un proyecto nuevo que contenga un solo botón
gunos de los botones de la barra de herramientas ofrecen prácticos atajos. La fi­
de comando. Añade el procedimiento general PierdeElTiempo y el procedimiento
gura 8.1 identifica los botones de la barra de herramientas que son más útiles en
Click para el botón de comando, como se muestra en la figura 8.2.
la depuración de programas.
Pulsa E5 para ejecutar la aplicación. Haz clic en el botón de comando, y a conti­
La ventana Debug nuación pulsa Ctrl+Pausa para que Visual Basic detenga la aplicación y muestre la
Como ya sabes, se puede pulsar Ctrl+Pausa en cualquier momento en que un ventana de código, la cual se parecerá a la de la figura 8.3. (Lo más probable es
programa esté funcionando para interrumpir la aplicación y activar la ventana De­ que la aplicación se detenga en la rutina PierdeElTiempo; si no es así, pulsa F5
bug. Si se estaba ejecutando un procedimiento concreto cuando se interrumpa el para reiniciar el programa y prueba a pararlo otra vez.)
programa, también se verá la ventana de código de ese procedimiento. En ese En la ventana de código que se muestra en la figura 8.3, aparece un recuadro al­
momento se puede introducir código y ejecutar declaraciones de Visual Basic en rededor de la línea Next B, que es la declaración que Visual Basic ejecutará a

222 223
EL LIBRO DEL VISUAL BASIC 8 Depuración y gestión de errores

biendo que tienen valores asignados, debido a que la ventana Debug está limita­
Sub PierdeElTiempo da al ámbito del procedimiento que se está ejecutando. Si introdujeses la instruc­
Dim A As Single, B As Integer ción Print C o Print D, Visual Basic supondría que estas utilizando simplemente
variables no declaradas en el procedimiento actual e imprimiría una línea en
A = .5
blanco. Tienes acceso a todas las variables y propiedades cuyo ámbito sea de ni­
For B = 1 To 10000
vel de módulo o global, lo cual te permite ejecutar instrucciones como Print
A = A + B
Command1.Caption y Print Form1.Height.
Next B
End Sub Nota: Si has incluido la declaración Option Explicit en la sección de de­
claraciones generales del programa, Visual Basic ni siquiera imprimirá
Sub Command1_Click ( )
una línea en blanco cuando intentes ver en la ventana Debug el valor
Dim C As String, D As Integer
de una variable no declarada. En su lugar verás el mensaje Variable not
C = "Hola marinero” delined (variable no definida).
For D = 1 To 100
Si quieres probar a modificar una propiedad o una variable dentro de la ventana
PierdeElTiempo
Debug, puedes utilizar para ello las mismas declaraciones y expresiones que usa­
Next D
C = "Buenas noches, Gracia"
rías en un programa. Por ejemplo, podrías reducir el tamaño de la ventana del
End Sub formulario ejecutando la declaración Form1.Height = Form1 .Height / 2. O podrías
ejecutar cualquier procedimiento o método introduciendo su nombre. Por ejem­
plo, cuando escribes la declaración Print estás llamando al método Print del ob­
jeto que representa a la ventana Debug (un objeto llamado Debug). No estás
Figura 8.2.
El código del programa para la aplicación Girar la ruleta limitado a los procedimiento internos de Visual Basic; también puedes ejecutar
cualquiera de los procedimientos que tú hayas escrito.

Expresiones Watch
Cuando simplemente quieras comprobar el valor de una variable, Visual Basic
ofrece una técnica rápida que no necesita de la instrucción Print. Haz doble clic
sobre el nombre de la variable en la ventana de código —prueba a hacer doble
clic sobre la variable B del procedimiento PierdeElTiempo— y luego selecciona el
comando Instant Watch (comprobación instantánea) del menú Debug o haz clic
en el botón Instant Watch de la barra de herramientas. Aparecerá el cuadro de
diálogo Instant Watch que se muestra en la figura 8.4, y mostrará el valor de la
variable que hayas seleccionado.
Figura 8.3.
La ventana de código de un programa interrumpido A la variable seleccionada se le denomina una expresión watch (de comproba­
ción). Como su nombre implica, una expresión watch puede contener más de
una variable. Si seleccionas A + B en el procedimiento PierdeElTiempo, el cuadro
continuación. En la ventana Debug podrías introducir la declaración Print B (o
de diálogo Instant Watch mostrará el valor de la expresión completa.
simplemente ? B) para ver cuántas veces se ha ejecutado el bucle For. Podrías in­
troducir Print A para ver el valor actual de A. Sin embargo, no podrías escribir También puedes añadir una expresión watch a la ventana Debug para que pue­
Print C o Print D para examinar las otras variables de la aplicación, incluso sa­ das conocer el valor de la expresión en todo momento sin que tengas que abrir

224 225
EL LIBRO DEL VISUAL BASIC 8 Depuración y gestión de errores

La figura 8.6 muestra la ventana Debug después de haber añadido dos expresio­
nes de comprobación. Las expresiones muestran la variable D del procedimiento
Commandl_Click y la variable B del procedimiento PierdeElTiempo.

Si quieres modificar o eliminar una expresión watch que haya sido añadida a la
ventana Debug, elige el comando Edit Watch del menú Debug y haz los cambios
necesarios en el cuadro de diálogo Edit Watch en el que aparece.
Figura 8.4.
El cuadro de diálogo Instant Watch

el cuadro de diálogo Instant Watch. Para añadir la expresión seleccionada, haz


clic en el botón Add Watch del cuadro de diálogo Instant Watch o selecciona el
comando Add Watch del menú Debug. En el cuadro de diálogo Add Watch, que
se muestra en la figura 8.5, haz clic en el botón OK para hacer que la expresión
watch aparezca en la parte superior de la ventana Debug.

Figura 8.6.
La ventana Debug con expresiones watch

El árbol de llamadas (¿dónde estoy?)


En el sencillo ejemplo del apartado anterior (la aplicación Girar la ruleta), era
bastante evidente lo que estaba sucediendo cuando el programa se interrumpió.
Sin embargo, en un aplicación más compleja la secuencia de eventos puede no
ser tan clara. En tales casos puedes seleccionar el comando Calis (llamadas) del
menú Debug o hacer clic en el botón Calis de la barra de herramientas para que
aparezca un cuadro de diálogo que muestre la lista de llamadas del programa a
Figura 8.5. procedimientos que estén activos.
El cuadro de diálogo Add Watch
La figura 8.7 muestra el cuadro de diálogo Calis de nuestra aplicación Girar la ru­
leta. La primera línea del cuadro de diálogo muestra el procedimiento actual —en
Se puede, incluso, añadir una expresión watch a la ventana Debug sin seleccio­ este caso, el procedimiento PierdeElTiempo, el cual está en el módulo Form1.
narla previamente en el código del programa. El modo de hacerlo es escribir, Este procedimiento ha sido llamado por el procedimiento del evento Com-
simplemente, la expresión directamente en el cuadro de texto Expression del cua­
mand1_Click, también del módulo Form1. La secuencia de llamadas acaba aquí
dro de diálogo Add Watch. La parte Context (contexto) del cuadro de diálogo
porque el procedimiento Click fue iniciado por un evento del usuario. En el caso
permite especificar el procedimiento o el módulo en el que están definidas las va­
de un programa más complejo, el cuadro de diálogo Calis podría contener mu­
riables de la expresión —lo cual puede ser muy útil, por ejemplo, en el caso de
chas entradas indicando el anidamiento de las llamadas a los procedimientos.
que tengas una variable de nivel de formulario y una variable local con el mismo
Puedes hacer doble clic sobre cualquiera de estas entradas (o seleccionar una de
nombre. (Trataremos la parte Watch Type del cuadro de diálogo en un apartado
ellas y hacer clic en el botón Show) para que aparezca el código de un procedi­
posterior.)
miento en particular.

226
227
EL LIBRO DEL VISUAL BASIC 8 Depuración y gestión de errores

Static BreakContador As Integer

BreakContador = BreakContador + 1
If BreakContador > 10 And A < 0 Then
Stop
End If

Después de que el programa se haya interrumpido ya sea por un breakpoint o


por una declaración Stop, puedes continuar la ejecución pulsando F5 o selec­
Figura 8.7.
El árbol de llamadas de un programa interrumpido cionando el comando Continue (continuar) del menú Run de Visual Basic. Si has
utilizado una declaración Stop, debes acordarte de quitarla de tu programa. Los
breakpoints permanecen activos sólo durante una sesión de Visual Basic. -
Breakpoints y declaraciones Stop
Usar una declaración Stop puede describirse como técnica invasora —o sea, de­
Cuando pulsaste Ctrl+Pausa para interrumpir el programa Girar la ruleta no tenías bes ir y modificar físicamente el código del programa. Puedes recordar otra técni­
mucho control sobre dónde se detendría el programa. Sin embargo, Visual Basic ca invasora de un capítulo anterior: escribir en la ventana Debug desde el interior
permite marcar explícitamente una o más declaraciones como breakpoints (pun­ del programa. La declaración Debug.Print seguida por una expresión produce
tos de interrupción en inglés), puntos en los que se detendrá la ejecución del que la expresión sea escrita en la ventana Debug sin que el programa se inte­
programa, dándote la oportunidad de estudiarlo e investigarlo para diagnosticar rrumpa de ninguna manera. Repartiendo algunas instrucciones de este tipo por
sus problemas. Si quieres establecer un breakpoint abre la ventana de código del un programa defectuoso se puede descubrir a menudo en qué punto comienzan
procedimiento apropiado y haz clic sobre la declaración en la que el programa se los problemas. Los usos habituales suelen ser imprimir el nombre del procedi­
debe detener. Pulsa F9, selecciona el comando Toggle Breakpoint (activar/de ac­ miento en cuanto comience a ejecutarse o imprimir el nombre de ciertas variables
tivar breakpoint) del menú Debug o haz clic en el botón Toggle Breakpoint de la clave.
barra de herramientas. Visual Basic resaltará la línea para indicar la presencia de
un breakpoint. Aunque las técnicas invasoras permiten llevar a cabo operaciones más sofistica­
das, las técnicas no invasoras, como establecer breakpoints, son preferibles en la
Para eliminar un breakpoint simplemente hay que hacer clic en la línea resaltada mayoría de los casos, ya que evitan el equivalente en programación de dejarse
del programa para seleccionarlo y pulsar la tecla F9, seleccionar el comando Tog­ una esponja o un escalpelo dentro del paciente. Si se te olvida quitar una de­
gle Breakpoint de nuevo o hacer clic en el botón Toggle Breakpoint. Si tienes claración Stop de un procedimiento que no se ejecute con frecuencia antes de
establecidos varios breakpoints puedes elegir el comando Clear All Breakpoints
compilar el programa tú, o lo que sería peor, un cliente que esté utilizando el
(eliminar todos los breakpoints) del menú Debug para quitarlos todos en un úni­
programa, os podríais llevar una desagradable sorpresa cuando el mensaje Stop
co paso.
statement encountered (se ha encontrado una declaración Stop) aparezca en me­
Puedes lograr el mismo efecto que al establecer un breakpoint añadiendo una de­ dio de una aplicación que finalice abruptamente, enviando todos tus datos al país
claración Stop al programa. Esta técnica no es tan satisfactoria como usar un de nunca jamás.
breakpoint porque ello significa tener que modificar el código. Sin embargo, con
un breakpoint Visual Basic interrumpe el programa cada vez que llega a él. Si uti­ Watchpoints
lizas una declaración Stop puedes ser mucho más específico, asegurándote de También se puede usar una herramienta no invasora denominada watchpoint
que tu programa sólo se detendrá bajo determinadas condiciones. Por ejemplo, el (punto de vigía), la cual instruirá a Visual Basic para que detenga el programa
siguiente fragmento de código contiene una declaración Stop que sólo detendrá cuando se encuentre con unas condiciones especiales (al contrario que un break­
el programa después de ejecutarse 10 veces y sólo si el valor de la variable A es point, el cual determina una interrupción cuando se alcanza una línea de código
menor de 0. concreta) o cuando el valor de una expresión cambie.

228 229
EL LIBRO DEL VISUAL BASIC 8 Depuración y gestión de errores

Para establecer un watchpoint debes resaltar la expresión específica en el código la ventana de código cambiará, y el recuadro aparecerá en la primera línea ejecu­
y seleccionar el comando Add Watch (añadir vigía) del menú Debug, o elegir el table del nuevo procedimiento. Si ejecutas una instrucción que contenga más de
comando Add Watch primero y luego escribir la expresión en el cuadro de texto una llamada, irás pasando de un procedimiento a otro en orden. Por ejemplo,
del cuadro de diálogo Add Watch. En este cuadro de diálogo (que ya se vió en la piensa en el programa que se muestra en la figura 8.8. (Los números de refer­
figura 8.5), ve a la sección Watch Type (tipo de vigía), selecciona el botón de op­ encia que aparecen a la izquierda se han añadido simplemente para identificar
ción marcado como Break When Expression Is True (suspender cuando la expre­ varias líneas del programa.)
sión sea verdadera) y luego, haz clic en el botón OK. Visual Basic añadirá la
expresión a la ventana Debug. Si quieres que el programa se pare cuando la ex­ Si ejecutas este programa con un breakpoint establecido en la línea 3 ( A = 4 ) , ini­
presión vigilada cambie, entonces deberás seleccionar el botón Break When Ex­ cialmente aparecerá un recuadro alrededor de la línea 3. Cuando pulses F8 para
pression Has Changed (suspender cuando la expresión haya cambiado) en el iniciar la ejecución paso a paso, el recuadro avanzará a las líneas 4, 8, 9, 12, 15 y
cuadro de diálogo Add Watch. 5. (Como las líneas 7 y 11 se consideran declaraciones no ejecutables, la herra­
mienta de depuración se las salta. Si estableces un breakpoint en una declaración
En cualquier caso, cuando reinicies la ejecución del programa, Visual Basic eva­ no ejecutable, el recuadro aparecerá en la siguiente línea ejecutable cuando el
luará la expresión vigilada después de cada instrucción y detendrá la ejecución programa se interrumpa.)
cuando concurran las condiciones especificadas.
Si estás avanzando paso a paso por un programa y llegas a un procedimiento que
Los watchpoints son herramientas potentes, pero tienen un lado negativo. Aun­ ya hayas depurado, puedes evitar el pasar por cada una de las instrucciones de
que son herramientas no invasoras y ello hace que no tengas que cambiar el có­ ese procedimiento. Si mantienes pulsada la tecla Mayús mientras pulsas F8 o si
digo del programa, ralentizan la ejecución del programa porque las expresiones haces clic en el botón Step Procedure (saltar procedimiento) de la barra de herra­
vigiladas se deben comprobar continuamente. La mejor técnica consiste en utilizar mientas, Visual Basic restringirá el ir paso a paso al procedimiento actual y, sim­
breakpoints y watchpoints juntos: establece un breakpoint en el lugar del progra­ plemente, ejecutará las llamadas a procedimientos de ese procedimiento como si
ma donde sospeches que algo funciona mal. El programa funcionará a su veloci­ cada llamada fuera una sola instrucción. Si usas Mayús+F8 para ir paso a paso
dad normal hasta ese punto. Entonces puedes activar uno o más watchpoints y
continuar la ejecución más despacio.

1 Sub Command1_Click ( )
Paso a paso
2 Dim A As Integer
Otra útil técnica no invasora de depuración es avanzar paso a paso, que permite 3 A = 4 'Breakpoint inicial
ejecutar el programa de instrucción en instrucción. Esto es prácticamente equiva­ 4 debug.Print UnoMas(A) + UnoMenos(A) 'Paso a los procedimientos
lente a establecer un breakpoint en la declaración siguiente a la posición actual, 5 End Sub
ejecutar la declaración actual y eliminar el breakpoint. Cuando se avanza paso a 6
paso por el código se puede examinar el efecto que produce cada una de las ins­ 7 Function UnoMas (X As Integer) As Integer
8 UnoMas = X + 1
trucciones en el programa.
9 End Function
La ejecución la controla la tecla E8 o el botón Single Step (un solo paso) de la ba­ 10
rra de herramientas (o el comando Single Step del menú Debug, aunque la tecla 11 Function UnoMenos (X As Integer) As Integer
de función o el botón de la barra de herramientas son mucho más prácticos). 12 UnoMenos = X - 1
13 End Function
Puedes iniciar la ejecución paso a paso siempre que el programa no esté fun­
cionando. Cada vez que pulses F8, Visual Basic ejecutará una instrucción, y el re­
cuadro que marca la siguiente línea en la ventana de código avanzará. Si la
Figura 8.8.
declaración que se ha ejecutado contiene un procedimiento escrito por el usuario,
El código de un programa para mostrar la ejecución paso a paso

230
231
EL LIBRO DEL VISUAL BASIC 8 Depuración y gestión de errores

por el programa de la figura 8.8 te moverás de la línea 3 a la 4 y luego a la 5. Vi­ mayor de 50 puedes incluir el siguiente código al comienzo del procedimiento
sual Basic ejecuta las líneas 7 a 9 y 11 a 13, pero puedes ahorrarte ir paso a paso que contiene al parámetro:
por dos procedimientos que sabes que son correctos.
If Param < 10 Or Param > 50 Then
Puedes alternar entre paso a paso y paso de procedimiento en cualquier momen­ Debug.Print "La presunción sobre 'Param' ha sido violada.")
to durante la sesión de depuración. Ten en cuenta que un breakpoint que haya Stop
dentro de un procedimiento interrumpirá el programa, incluso si estás usando la End If
ejecución paso a paso.
Aunque es una técnica invasora, el codificar estas presunciones en un programa
Prueba a experimentar estas técnicas en el programa Girar la ruleta que se mues­ puede ayudar algunas veces a localizar los bugs más rápidamente que usando
tra en la figura 8.2. Primero utiliza F9 para establecer un breakpoint en la decla­ breakpoints o la ejecución paso a paso, especialmente si el programa es largo o
ración Next D del procedimiento Command1_Click. Pulsa F5 para ejecutar el complejo.
programa y haz clic en el botón de comando para llegar al breakpoint. Pulsa la
Sin embargo tienes otra alternativa: puedes usar una búsqueda binaria, que es
tecla F9 de nuevo para eliminar el breakpoint. Luego manten pulsada la tecla Ma­
una variante de la técnica de la disminución granular. La estrategia de la búsque­
yéis y pulsa F8 un par de veces. Permanecerás en el procedimiento Cotn-
da binaria es la misma que la del juego infantil de la adivinación. Si tu oponente
mandl_Click (aunque te puedes percatar de una pausa que se produce mientras
elige un numero entre el 1 y el 100 siempre puedes determinar qué número es
se ejecuta el procedimiento PierdeElTiempo.) Cuando vuelvas a Next D, pulsa F8
con no más de ocho intentos de adivinación. El primer intento siempre debe ser
dos veces sin usar la tecla Mayus. Este paso a paso te llevará al interior del proce­
la mitad, 50. Tu oponente debe decirte entonces si es demasiado alto o demasia­
dimiento PierdeElTiempo, donde puedes continuar el paso a paso.
do bajo. Si es demasiado alto debes intentar el 25; si es demasiado bajo, el 75.
Con cada intento eliminarás la mitad de las posibilidades restantes.

Estrategias de depuración De la misma manera, cuando trabajes con un programa complejo y no tengas una
idea clara de dónde buscar, establece un breakpoint por la mitad de la aplicación.
Normalmente es fácil localizar el origen de un problema; a menudo es razonable­ Cuando llegues a la interrupción examina las variables importantes. Si todo pa­
mente obvio que todo esté funcionando excepto un botón o un cierto cálculo. rece estar bien establece el siguiente breakpoint . a mitad de camino entre la po­
Entonces puedes utilizar la clásica técnica de la disminución granular. El término sición actual y el final del programa. Si no, establécelo entre el comienzo del
granular se refiere al tamaño de las estructuras de programa que se tienen que programa y el breakpoint actual, y vuelve a ejecutar el programa. Esta técnica
ejecutar. Puedes comenzar usando breakpoints, los cuales te permiten ejecutar debe conducirte rápidamente a las proximidades del error, y luego puedes pasar
ampliar porciones del programa sin interrupción. A medida que te acerques al fácilmente al paso a paso o a otra técnica apropiada.
punto donde las cosas van mal puedes cambiar al paso de procedimiento y luego
al paso a paso para identificar la instrucción donde se produce el error. No vaciles en utilizar las posibilidades que Visual Basic ofrece para la depuración
con el fin de comprobar tus teorías sobre lo que va mal en el programa. Por
Evidentemente, el párrafo anterior presume de forma optimista que el origen de ejemplo, si descubres que se te ha olvidado incrementar una variable, no te limi­
todos tus problemas es una sola instrucción. Esto a menudo no es así. Puedes en­ tes a detener el proceso de depuración y a modificar el programa. Utiliza la ven­
contrarte con que has realizado unas presunciones sobre valores de variables o tana Debug para establecer la variable con el valor que crees que es correcto y
sobre entradas del usuario que, simplemente, no se corresponden con la realidad, deja que el programa siga funcionando. Algunas veces descubrirás que lo que pa­
y que te obligarán a reescribir partes del programa. Como posiblemente llevarás recía ser la causa del problema en realidad sólo es un efecto lateral o un síntoma
tus presunciones contigo a la sesión de depuración, algunas veces puede ser difí­ del problema real.
cil saber qué es lo que va mal exactamente. En momentos así puede ser ventajo­
so que codifiques tus presunciones en el programa directamente. Por ejemplo, si Puedes usar las herramientas de depuración incluso para experimentar con el flu­
supones que un cierto parámetro nunca tendrá un valor que sea menor de 10 ni jo de control del programa. Digamos que interrumpes el programa en mitad de

233
232
EL LIBRO DEL VISUAL BASIC 8 Depuración y gestión de errores

un procedimiento y que te das cuenta de que deberías haber puesto una decla­
ración If para saltarte las siguientes líneas. Puedes determinar la siguiente instruc­
ción que se va a ejecutar haciendo clic sobre ella o usando el comando Set Next
Statement (establecer siguiente instrucción) del menú Debug. Puedes seleccionar
cualquier instrucción del procedimiento actual, incluso una que esté delante de la
instrucción actual, pero no puedes especificar una instrucción que esté en algún
otro procedimiento.

Un grito de ayuda
El sistema de Ayuda en línea de Visual Basic, que introdujimos en el capítulo 1,
puede proporcionarte una asistencia de un valor incalculable durante la progra­
mación y la depuración. Para acceder rápidamente a la Ayuda, pulsa la tecla F1
en cualquier momento durante el diseño o la depuración de una aplicación, o se­
lecciona una opción del menú Help (ayuda) de Visual Basic. Figura 8.9.
La pantalla de contenidos de la Ayuda de Visual Basic
Visual Basic dispone de ayuda sensible al contexto —es decir, trata de ofrecer la
ayuda más útil para la situación actual. Por ejemplo, si quieres usar la función
Format en un programa pero no recuerdas los parámetros que hay que suminis­
trarle, comienza a escribir la instrucción en el programa. Tan pronto como hayas
escrito la palabra Format, pulsa F1 Visual Basic abrirá una ventana que mostrará
el texto de Ayuda sobre la función Format. De la misma manera, si tu programa
genera un error durante la ejecución con un mensaje como Subscript out of ran­
ge, puedes pulsar El cuando aparezca el cuadro de diálogo con el mensaje y, así,
el sistema de Ayuda de Visual Basic te dirá más cosas sobre el error.

Si necesitas buscar información, puedes elegir varios caminos. Cuando seleccio­


nes el comando Contents (índice) del menú Help o hagas clic en el botón Indice
de la zona superior izquierda de una ventana de Ayuda que esté abierta, Ayuda
mostrará una lista completa de sus categorías de información, como se muestra
en la figura 8.9.

Cada frase subrayada representa un enlace de hipertexto con otra pantalla de


Ayuda. Por ejemplo, si haces clic en la frase Programming Language (o pulsas
Tab hasta llegar a ella y luego pulsas Intro), la pantalla de Ayuda mostrará un ín­
dice de todas las características del lenguaje Visual Basic, como se muestra en la
figura 8.10. Entonces podrás hacer clic sobre cualquiera de los términos de este
índice para buscar información específica sobre ese tema. Por ejemplo, Ayuda
podría proporcionar la sintaxis de una declaración, una descripción del funciona­ Figura 8.10.
miento de la declaración y, algunas veces, incluso un ejemplo de código. Si te re- Parte del índice de Ayuda de Programming Language

234 235
8 Depuración y gestión de errores
EL LIBRO DEL VISUAL BASIC

sulta útil, incluso puedes marcar y copiar el código de ejemplo desde el sistema Algunas veces resulta de utilidad tener la ventana de Ayuda disponible en la pan­
de Ayuda y pegarlo en tu programa. talla mientras se está editando el código. Para evitar que otras ventanas puedan
ocultar la ventana de Ayuda, selecciona el comando Siempre visible del menú
Cuando estés reuniendo y comprobando información, también te puede ser útil la
Ayuda de la ventana de Ayuda. Aparecerá una marca de control al lado de esta
opción Buscar. Al hacer clic en el botón Buscar de la ventana de Ayuda se abre
opción en el menú cuando esté activa. Para desactivarla, simplemente seleccióna­
el cuadro de diálogo Buscar que se muestra en la figura 8.11. Comienza a escribir
la otra vez. Y si quieres imprimir el tema de Ayuda para estudiarlo más tarde, se­
en el cuadro de texto que hay en la paite superior de la ventana la palabra clave
lecciona el comando Imprimir tema del menú Archivo de la Ayuda.
o el concepto que quieras investigar. Con cada letra que escribas, el sistema de
Ayuda estrechará la búsqueda a los elementos que aparecen en el cuadro de lista
que hay justo debajo del cuadro de texto. Luego, puedes seleccionar un elemento
del cuadro de lista y hacer clic en el botón Mostrar temas o, simplemente, hacer
Gestión de errores
clic en el elemento. Cuando lo hagas, el cuadro de lista que hay en la parte infe­ Este capítulo se ha concentrado hasta ahora en los errores del programador que
rior del cuadro de diálogo mostrará una lista de todos los temas de Ayuda relacio­ producen que una aplicación falle o devuelva unos resultados no válidos. Otro
nados. Puedes ver cualquiera de estas pantallas de Ayuda haciendo doble clic en tipo de problemas, denominados errores en tiempo de ejecución, también pue­
el tema o seleccionándolo y haciendo clic en el botón Ir a. den provocar que un programa falle. Los errores en tiempo de ejecución surgen a
Muchos de los temas de Ayuda incluyen ejemplos de código que muestran los menudo debido a condiciones que tú no puedes controlar, como una insuficien­
elementos del lenguaje tratados. Para ver el ejemplo, solamente tienes que hacer cia de memoria o de espacio de almacenamiento en disco, un error del usuario,
clic en el hipervínculo Example (ejemplo) que hay en la parte superior de la pan­ un intento de abrir un archivo que ya ha sido abierto por otro programa, etc.
talla. Si quieres probar a ejecutar el código, haz clic en el botón Copy (copiar) de Otros errores en tiempo de ejecución son bugs, indicadores de errores lógicos en
la parte superior de la ventana del código de ejemplo. En la ventana Copy, selec­ tu programa, como intentar utilizar un elemento de una matriz cuyo índice sea
ciona el código en el que estás interesado y haz clic en el botón Copy. Cuando superior a la dimensión de ésta.
vuelvas a Visual Basic podrás pegar el código seleccionado directamente en la Cuando se produce un error en tiempo de ejecución, Visual Basic normalmente
ventana de código de tu programa. muestra un cuadro de diálogo con un mensaje y finaliza la aplicación. Sin embar­
go, es posible mediante la programación hacerse cargo de la gestión de errores.
Esta técnica, denominada cazar errores, permite que tu programa detecte y, posi­
blemente, solucione el problema, o al menos, termine el programa de una forma
agradable al usuario. El control sobre el sistema se adquiere estableciendo la caza
de errores. Cuando se escribe un procedimiento que caza errores, su estructura
general debe parecerse a esto:

Sub declaración
[ instrucciones]
On Error GoTo etiqueta
Exit Sub
etiqueta:
código de gestión de errores
End Sub

Figura 8.11. La instrucción On Error GoTo etiqueta, en la que etiqueta identifica el código de
El cuadro de diálogo Buscar de la Ayuda gestión de errores, activa la caza de errores. Si ocurre un error en tiempo de eje-

236 237
EL LIBRO DEL VISUAL BASIC 8 Depuración y gestión de errores

cución en las instrucciones que siguen a la declaración On Error GoTo etiqueta, el Instrucción Acción
control es transferido inmediatamente al código de gestión de errores designado
por etiqueta. Etiqueta puede ser cualquier identificador que tú elijas y, cuando se Resume Continúa el programa ejecutando la instrucción que
utiliza para señalar una posición particular en el código, debe terminar en dos produjo el error.
puntos (:). Resume Next Continúa el programa ejecutando la instrucción que
está situada inmediatamente detrás de la que produjo
Para desactivar la caza de errores más adelante en el mismo procedimiento, pue­
el error.
des usar la declaración On Error GoTo (). Cualquier error en tiempo de ejecución
Resume etiqueta Continúa la ejecución del programa ejecutando en un
que ocurra detrás de esa declaración será gestionado directamente por Visual Ba­
punto especificado por etiqueta.
sic, no por el código de gestión de errores del procedimiento. Esta posibilidad de
activar y desactivar la caza de errores es útil sólo cuando es una pequeña parte
Considera el código de programa que se muestra en la figura 8.12, el cual genera
del código la que es susceptible de producir errores en tiempo de ejecución.
un error cuando se trata de dividir por cero.
La caza de errores está activa sólo dentro del procedimiento que contenga la de­
claración On Error GoTo etiqueta. Cuando el procedimiento finaliza, la caza de
errores vuelve a la rutina que originalmente llamó al procedimiento. Si esa rutina
no tiene un gestor de errores, se desactivará la caza de errores. 1 Sub Test ( )
2 Dim XX As Integer, YY As Integer
Una vez que el programa pasa al código de gestión de errores de un procedi­
3 XX = 0
miento, puedes comprobar el valor de la función Err para conocer la causa del 4 YY = 10
error. Err devuelve un número entero que indica el tipo de error —por ejemplo, 5 On Error GoTo Resuelvelo
el error 7 indica que te has quedado sin memoria, el error 53 indica que el pro­ 6 YY = YY /XX
grama no puede encontrar el archivo designado, y así sucesivamente. La lista 7 Debug.Print YY
completa de códigos de error está incluida en la Ayuda en línea de Visual Basic y 8 Y o F i n a l izo :
en su manual de referencia. 9 End
10 Resuelvelo:
Evidentemente, tu gestor de errores no tiene que comprobar todos los errores po­ 11 XX = 2
sibles. El error 53, por ejemplo, solamente se puede producir si tratas de acceder 12 Resume
a un archivo. Si el procedimiento no utiliza archivos, no tienes que comprobar el 13 End Function

error 53.

Después de que hayas determinado qué error ha ocurrido, tienes cuatro opciones Figura 8.12.
para seguir. La alternativa más simple es devolverle el error a Visual Basic.. Pue­ El código de un programa que incluye gestión de errores
des hacer esto usando la declaración Error. La declaración Error tiene un solo pa­
rámetro (el número del error) y fuerza inmediatamente un error en tiempo de
Cuando ejecutes este procedimiento, las instrucciones se ejecutarán secuencial-
ejecución. Añadiendo la línea Error Err al final de tu código de gestión de errores
mente hasta que el programa llegue a la línea 6. En ese punto se produce un
podrás negociar limpiamente cualquier error que no quieras gestionar.
error 11 (división por cero), y el control del programa pasa a la línea 10. El códi­
Las otras tres opciones conllevan la continuación de la ejecución del programa. go de gestión de errores establece como 2 el valor de la variable XX, y la instruc­
Incluyendo la instrucción Resume en el código de gestión de errores rearranca el ción Resume hace que se ejecute de nuevo la línea 6. Esta vez, la expresión no
programa una vez que el error haya sido corregido. Puedes usar cualquiera de es­ generará un error. La declaración de la línea 7 imprimirá el valor 5 y el procedi­
tas tres variaciones: miento terminará.

238 239
EL LIBRO DEL VISUAL BASIC 8 Depuración y gestión de errores

Si se hubiera utilizado la instrucción Resume Next en la línea 12, el programa hu­ Cuando ejecutes este código verás la siguiente salida:
biese continuado en la línea 7, que habría impreso el valor 10 (el valor no mo­ Inicio
dificado de YY) ya que la línea 6 no se ejecutó con éxito. Finalmente, si la Entrando
declaración de la línea 12 hubiese sido Resume YoFinalizo, la ejecución se hubie­ Entrando
se reiniciado en la línea 8, que habría finalizado el programa sin imprimir ningún 5
valor. Saliendo
Fin
Es importante observar que la declaración Resume se aplica sólo al procedimiento
en el que aparece. Tomemos el ejemplo de la figura 8.12 y modifiquemos el códi­ Si modificas la instrucción Resume del código de gestión de errores para que
ponga Resume Next, la salida cambiará a esto:
go para que incluya dos procedimientos, como se ve en la figura 8.13, para mos­
trar la posibilidad de gestión de errores a través de diversos procedimientos. Inicio
Entrando
Fin

En ambos casos, el gestor de errores hace que la ejecución continúe dentro del
procedimiento que contiene el gestor de errores, no en la declaración que real­
Dim XX As Integer
mente produjo el error en el procedimiento ConError. Si quisieras que el progra­
Sub ConError ( ) ma pudiese continuar la ejecución normal dentro del procedimiento ConError
Dim YY As Integer tendrías que añadir un gestor de errores a ese procedimiento.
Debug.Print "Entrando"
YY = 10
YY = YY / XX
Debug.Print YY
Debug.Print "Saliendo"
End Sub

Sub Test ( )
On Error GoTo Resuelvelo
Debug.Print "Inicio"
XX = 0
ConError
Debug.Print "Fin"
End

Resuelvelo:
XX = 2
Resume
End Sub

Figura 8.13.
El código de un programa que muestra la gestión de errores a través de varios
procedimientos

240 241
9
Archivos
Los archivos (o ficheros) proporcionan un sistema para almacenar la información
a largo plazo. Los valores que están almacenados en las variables son transitorios:
desaparecen cuando se cierra la aplicación y son recalculados otra vez cuando se
ejecutan. Para que los datos se almacenen permanentemente, y se pueda acceder
a ellos y recuperarlos, se deben guardar en un archivo.

Este capítulo ilustra cómo gestiona Visual Basic algunas operaciones estándar de
archivos, incluyendo buscarlos, abrirlos, guardarlos y cerrarlos. Te permite crear
una aplicación de ejemplo que muestra las herramientas del sistema de archivos
de Visual Basic. Con estas herramientas se pueden crear cuadros de diálogo que
funcionen como los cuadros de diálogo Archivo Abrir y Archivo Guardar como
creados por el control Common Dialog.

También veremos dos maneras de almacenar y acceder a los datos en los archi­
vos: un método línea por línea, que, esencialmente, trata a la información como
texto; y un método orientado a los registros. Además aprenderás a almacenar la
información de configuración en archivos INI de forma para guardar la informa­
ción de arranque y de configuración de tus aplicaciones Windows.

Visión general del sistema de archivos


Como se vió) en el capítulo 2, el microprocesador del ordenador usa los bits de
información almacenados en la memoria como instrucciones y datos. El diseño
del hardware del microprocesador le permite un acceso inmediato a la RAM (me­
moria de acceso aleatorio) del ordenador. Pero incluso los modernos microorde­
nadores con decenas de megabytes de RAM no pueden mantener en ella toda la
información que necesitan. El sistema necesita otro lugar de almacenamiento para
los datos que no caben en la RAM.

243
EL LIBRO DEL VISUAL BASIC 9 Archivos

Los ordenadores han utilizado varios mecanismos para conseguir lugares externos car el nombre del archivo, el directorio y la unidad de disco. En Visual Basic, nor­
de almacenamiento, desde tarjetas perforadas y discos duros hasta disquetes y malmente, usarás el control Common Dialog para presentar los cuadros de diálo­
CD-ROM. Estos medios externos pueden almacenar cientos de megabytes, e in­ go Archivo Abrir o Archivo Guardar como. Sin embargo, es posible que necesites
cluso gigabytes, a un coste mucho menor que el de la RAM. El coste y la capaci­ crear un cuadro de diálogo que sea similar pero que tenga opciones adicionales.
dad hacen que el almacenamiento externo de la información sea muy atractivo, Se puede crear un cuadro de diálogo de ese tipo utilizando tres de las herramien­
incluso, aunque sea más lento e incómodo. tas de la caja de herramientas de Visual Basic: la herramienta File List Box (cua­
dro de lista de archivos), la herramienta Directory List Box (cuadro de lista de
Las grandes cantidades de datos manipuladas por los sistemas de almacenamiento directorios) y la herramienta Drive List Box (cuadro de lista de unidades de dis­
externo también conlleva el problema de la organización. Se necesita alguna ma­ co), que se muestran en la figura 9.1. Estas herramientas permiten crear tres cla­
nera de decir "bueno, aquí está mi carta a la abuela", o "por allí está mi programa ses de objetos que están diseñados para interactuar unos con otros; casi ninguna
procesador de textos". Los pioneros en el mundo de la Informática, afrontaron aplicación usa estos objetos por separado.
este problema de la organización mediante una analogía empresarial, establecien­
do un sistema de archivadores y llamando archivo a cada grupo independiente
de datos. Los interfaces gráficos de usuario continúan basándose en esta analogía
mediante el uso de iconos de carpetas de archivos y archivadores.

Como el almacenamiento en disco se produce fuera del procesador principal, el


ordenador tiene que establecer un conjunto de actividades para obtener o incluir
información en un archivo. Visual Basic clasifica los archivos según la manera
que tiene el ordenador de acceder a ellos: secuenciales, de acceso aleatorio o bi­ Figura 9.1.
narios. Las herramientas File List Box (cuadro de lista de archivos), Directory List Box (cuadro
de lista de directorios) y Drive List Box (cuadro de lista de unidades de disco)
■ Un archivo secuencial es un archivo de texto plano. Visual Basic lee y es­
cribe en un archivo secuencial solamente una línea cada vez. Cada línea
puede ser tan larga o tan corta como sea necesario.

■ Un archivo de acceso aleatorio es un archivo cuyo contenido puede leer y Crear la aplicación TestDeArchivos
escribir Visual Basic en el orden que necesite. Todas las líneas (o registros)
La aplicación TestDeArchivos muestra cómo crear un cuadro de diálogo utilizan­
deben tener la misma longitud.
do los formularios de Visual Basic y las tres herramientas del sistema de archivos.
■ Un archivo binario es meramente una colección de bytes —Visual Basic El código de TestDeArchivos y el cuadro de diálogo son reutilizables, lo que sig­
no realiza presunciones de cómo están organizados los datos, lo cual per­ nifica que podrás copiarlo en otras aplicaciones que requieran las mismas carac­
mite que un programa organice y acceda a los datos de cualquier manera terísticas de acceso a archivos. El cuadro de diálogo se llamará Archivo Abrir,
que requiera. Este tipo de archivos proporciona una gran flexibilidad, pero para distinguirlo del cuadro de diálogo Abrir Archivo producido por el control
ello significa un mayor trabajo para el programa. (Debido a estas mayores Common Dialog.
demandas no trataremos los archivos binarios en este libro.)
Comienza abriendo un proyecto nuevo. Establece la propiedad Caption del for­
mulario como Principal y la propiedad Name como frmPrincipal. Incluye un bo­
tón de comando en el medio del formulario y establece su propiedad Name
Operaciones con archivos como btnTest y su propiedad Caption como Test. Haz doble clic en el botón de
Cuando se abre un archivo o se guarda el trabajo en un archivo, la mayoría de las comando para abrir una ventana de código y define el procedimiento Click del
aplicaciones para Windows presentan un cuadro de diálogo que permite especifi- botón como se muestra a continuación:

244 245
EL LIBRO DEL VISUAL BASIC 9 Archivos

Sub btnTest_Click ( ) Figura 9.2. continuación


Dim Seleccionado As String
Objeto Propiedad Ajuste
Seleccionado = AbrirDlgArchivos("*.TXT")
I f Seleccionado = " " Then Button1 Caption Abrir
MsgBox "Cancelado" Default True
Else Name btnAbrir
MsgBox "Se ha seleccionado el archivo" + Seleccionado
Button2 Cancel True
End If
End Sub Caption Cancelar
Name btnCancelar
Este procedimiento llama a la función AbrirDlgArcbivos (que todavía no está defi­
nida), la cual mostrará un cuadro de diálogo que permitirá al usuario seleccionar
un archivo basándose en la especificación de archivo *.TXT. Si el usuario no se­ Cuando se cree una aplicación de Visual Basic que tenga más de un formulario,
lecciona un archivo y simplemente cierra el cuadro de diálogo, la función devol­ Visual Basic cargará sólo uno de ellos cuando el programa arranque. Para desig­
verá una cadena vacía; en caso contrario, el procedimiento btnTest_Click mostrará nar a frmPrincipal como el formulario inicial elige Project (proyecto) del menú
el nombre del archivo seleccionado. Options (opciones). En el cuadro de diálogo Project Options, que se muestra en
la figura 9.4, selecciona la opción Start Up Form (formulario inicial). La lista des-
Añadir un segundo formulario
El siguiente paso consiste en crear el cuadro de diálogo que va a mostrar la fun­
ción AbrirDlgArcbivos. Selecciona el comando New Form (nuevo formulario) del
menú File o haz clic en el botón New Form de la barra de herramientas para po­
ner en la pantalla un segundo formulario de Visual Basic. Añádele a este nuevo
formulario un cuadro de lista de archivos, un cuadro de lista de directorios, un
cuadro de lista de unidades de disco y dos botones de comando. Establece las
propiedades de estos objetos como se indica en la figura 9.2, y a continuación or­
ganiza los objetos en el formulario de manera similar a la que se muestra en la fi­
gura 9.3 de la página siguiente.
Figura 9.3.
El diseño del formulario para el cuadro de diálogo Archivo Abrir de la aplicación
Objeto Propiedad Ajuste

Form2 BorderStyle 3 - Fixed Double


Caption Archivo Abrir
Name frmAbrir
File1 Name filLista
Dir1 Name dirLista
Drive1 Name drvLista

Figura 9.2. (continúa) Figura 9.4.


Los ajustes adecuados gara el segundo formulario de la aplicación TestDeArchivos El cuadro de diálogo Project Options (opciones del proyecto) TestDeArchivos

246 247
LIBRO DEL VISUAL BASIC 9 Archivos

plegable Setting (ajuste) que está en la parte superior del cuadro de diálogo con­ Esta instrucción declara una variable global de cadena que contendrá el nombre
tiene una lista con todos los formularios de la aplicación. Selecciona frmPrincipal del archivo seleccionado por el usuario. La variable debe ser global porque a ella
en ella y luego haz clic en OK. accederán tanto la función AbrirDlgArcbivos del módulo de código como los pro­
cedimientos de eventos de frmAbrir.
Nota: Cuando selecciones la opción Start Up Form en el cuadro de diá­
logo Project Options, date cuenta de que el cuadro de lista Settings in­ Ahora añade el siguiente procedimiento al módulo de código:
cluye la opción Sub Main además de una lista con los formularios de tu
Function AbrirDlgArchivos (Mascara As String) As String
aplicación. Si eliges Sub Main le estás diciendo a Visual Basic que no
Load frmAbrir
cargue ningún formulario cuando el programa arranque, sino que ini­
frmAbrir.filLista.Pattern = Mascara
cie la aplicación ejecutando el procedimiento llamado Main (el cual ArchivoSeleccionado = " "
debes proporcionar). Esta opción se puede usar; por ejemplo, si el formu­ frmAbrir.Show 1
lario que muestra tu programa depende del día de la semana o de cier­ AbrirDlgArchivos = ArchivoSeleccionado
tos parámetros de inicialización. End Function

A esta función se la llama con una especificación de archivos en forma de másca­


Añadir un módulo de código
ra (como *.TXT) a modo de argumento. Primero carga en memoria el formulario
A continuación, tendrás que escribir los procedimientos que controlen el cuadro frmAbrir mediante la instrucción Load (cargar). La instrucción Load se asegura de
de diálogo Archivo Abrir, incluyendo la función AbrirDlgArcbivos. Podrías esperar que el formulario esté disponible, pero no hace que sea visible. La siguiente línea
que todo este código estuviese en el formulario frmAbrir, pero hay una conside­ de código establece la propiedad Pattern del objeto filList (el cuadro de lista de
ración previa para que no sea así: el ámbito de todos los procedimientos de un archivos) como la máscara que se ha pasado como argumento. La propiedad Pat­
módulo de formulario está restringido a ese módulo —es decir, sólo un procedi­ tern (patrón) de un cuadro de lista de archivos determina qué archivos aparece­
miento de frmAbrir puede acceder a otro procedimiento que esté en frmAbrir. rán en la lista —por ejemplo, el patrón *.* permite que se muestren todos los
Como la llamada a AbrirDlgArcbivos está en frmPrincipal, la función no puede es­ archivos. Observa que el código está escrito como formulario. objeto.propiedad en
tar situada en frmAbrir. lugar de con la designación típica objeto.propiedad. Como la función AbrirDlgAr­
Una solución posible consiste en poner AbrirDlgArcbivos en frmPrincipal. Pero cbivos no están en el formulario frmAbrir, la función debe nombrar explícitamen­
nosotros estamos interesados en hacer que el cuadro de diálogo sea reutilizable, te al formulario si necesita acceder a un objeto de frmAbrir.
y el botón Test de frmPrincipal está claro que no será necesario para todas las A continuación, la variable ArchivoSeleccionado se establecerá como una cadena
aplicaciones. Una solución mejor consiste en crear un módulo de código separa­ vacía, lo que indicará que todavía no se ha realizado ninguna selección. La si­
do que contenga el código que controle el cuadro de diálogo. Como todos los guiente declaración llama al método Show (mostrar) de frmAbrir, el cual hace que
procedimientos de un módulo de código tienen un ámbito global, hemos resuelto el formulario sea Visible. Show se puede llamar con un argumento de 0 ó de 1.
el problema de la accesibilidad. El módulo de código será una entidad separada Cuando se usa Show 0, el formulario se hace visible, pero se continúa procesan­
que puede ser cargada en cualquier otra aplicación de Visual Basic. do el procedimiento que llamó) al método Show: Cuando se usa Show 1, como en
Añade el módulo de código seleccionando el comando New Module (nuevo mó­ este caso, el formulario especificado no sólo se hace visible, sino que se muestra
dulo) del menú File de Visual Basic o haciendo clic en el botón New Module de de manera modal —o sea, ningún otro formulario de la aplicación puede usarse
la barra de herramientas. Visual Basic añadirá un archivo llamado MODULE1.BAS mientras que éste esté en pantalla. El proceso en el procedimiento que llama se
a la lista de la ventana Project y abrirá la ventana de código de este nuevo mó­ suspende hasta que se cierre el formulario modal.
dulo. En la parte de declaraciones generales del módulo incluye la siguiente de­ Cuando el usuario cierra el cuadro de diálogo, ocultando frmAbrir, la función
claración: AbrirDlgArchivos continúa con su declaración final, que se encarga de establecer
Global ArchivoSeleccionado As String el valor que la función va a devolver como la cadena ArchivoSeleccionado. El

248 249
LIBRO DEL VISUAL BASIC 9 Archivos

control del programa vuelve entonces al procedimiento que llamó a la función Figura 9.5. continuación
AbrirDlgArchivos.

Codificar los procedimientos de eventos Sub btnAbrir_Click ( )


’Asegurarse de que se ha resaltado un nombre de archivo
Todo lo que queda consiste en codificar los procedimientos de eventos en frm-
’en el cuadro de lista de archivos
Abrir. Esos procedimientos están definidos en la figura 9.5. Los comentarios en el
If filLista.ListIndex >= 0 Then
código describen lo que sucede a medida que el programa se ejecuta. Como pue­ ’Obtener la ruta del archivo seleccionado
des ver, el funcionamiento del sistema de archivos es relativamente simple, aun­ ArchivoSeleccionado = filLista.Path
que se debe programar cuidadosamente la interacción entre ellos. (Puedes utilizar ’Asegurarse de que la ruta acaba en una barra inversa
una técnica similar para crear el cuadro de diálogo Guardar como, aunque debes If Right$(ArchivoSeleccionado, 1) <> "\" Then
ArchivoSeleccionado = ArchivoSeleccionado + "\"
End If
’Añadir el nombre del archivo seleccionado a la ruta
ArchivoSeleccionado = ArchivoSeleccionado +
Sub filLista_DblCIick ( ) filLista.List(filLista.ListIndex)
’Hacer doble clic en un nombre de archivo es lo mismo que End If
’hacer clic en el botón Abrir ’Ocultar el formulario (cerrar el cuadro de diálogo)
btnAbrir_Click Hide
End Sub End Sub

Sub dirLista_Change ( )
’Cuando el cuadro de lista de directorios cambie, establece una
’nueva ruta en el cuadro de lista de archivos realizar una pequeña programación adicional para comprobar que la entrada del
filLista.Path = dirLista.Path
usuario sea válida; la documentación de Visual Basic proporciona una informa­
End Sub
ción más amplia.)
Sub drvLista_Change ( )
’Cuando el cuadro de lista de unidades de disco cambie,
Ejecutar y guardar la aplicación TestDeArchivos
’establece una nueva ruta en el cuadro de lista de directorios.
’También se produce un evento Change para dirLista Cuando ejecutes la aplicación TestDeArchivos verás solamente el formulario ini­
dirLista.Path = drvLista.Drive cial que hemos designado (con el título Principal), el cual contiene el botón Test.
End Sub Haz clic en el botón Test para que aparezca el cuadro de diálogo Archivo Abrir.
Elige diferentes directorios y unidades de disco para ver cómo reaccionan los
Sub btnCancel_Click ( )
controles. Cuando selecciones un archivo, un cuadro de mensaje te informará de
'No se ha seleccionado ningún archivo; borra la cadena
tu elección. Si no seleccionas ningún archivo o si haces clic en el botón Cancelar,
’de caracteres y oculta el formulario
ArchivoSeleccionado = " " un mensaje te avisará de que has cancelado el cuadro de diálogo. Puedes hacer
Hide clic otra vez en el botón Test y abrir de nuevo el cuadro de diálogo, tantas veces
End Sub como quieras.

Como puedes ver, se requiere muy poco esfuerzo para copiar las posibilidades
Figura 9.5. (continúa) del control Common Dialog (que se trató en el capítulo 5). La aplicación Test­
Código del programa para los procedimientos de eventos en la aplicación TestDeArchivos DeArchivos podría programarse con un solo formulario y alrededor de 10 líneas

250 251
El LIBRO DEL VISUAL BASIC 9 Archivos

de código en el procedimiento btnTest_Click si estuvieras usando el control Com- utilizan para separar una línea de otra en un archivo secuencial. Los teletipos im­
mon Dialog. primían en rollos de papel una línea cada vez. Además de imprimir texto también
Asegúrate de guardar la aplicación TestDeArchivos porque puedes utilizar la fun­ respondían a ciertos códigos de control no imprimibles como Ctrl+G, el cual ha­
ción AbrirDlgArchivos en otros proyectos. Cuando finalices la aplicación, elige el cía sonar un timbre en la máquina. Comenzar una línea nueva de texto requería
comando Save Project (guardar proyecto) del menú File. Utiliza los nombres dos códigos de control: el retorno de carro (ASCII 13), que movía la cabeza de
impresión al comienzo de la línea; y el avance de línea (ASCII 10), que avanzaba
FRMPPAL.FRM, FRMABRIR.FRM y FRMABRIR.BAS para el formulario principal, el
el papel una línea. Estos códigos estaban contenidos en los archivos de texto jun­
formulario del cuadro de diálogo y el módulo de código. Guardar el archivo del
proyecto como TESTARCH.MAK. to con el propio texto.

A medida que se desarrollaron nuevos dispositivos como los terminales y las im­
Archivos secuenciales presoras de margarita, sus fabricantes adoptaron algunas de estas convenciones
de caracteres de control. El mundo MS-DOS/Windows también ha heredado el le­
Como ya se ha mencionado antes, el método más simple para procesar archivos gado retorno de carro/avance de línea. Por tanto, a menudo verás esté par de ca­
de datos implica leer o escribir líneas de datos como si fueran líneas secuenciales racteres abreviados como CR y LF.
del texto de un libro. Un editor de textos como la aplicación Bloc de notas de
Windows, por ejemplo, trata los documentos de manera secuencial: lee la primera Abrir y cerrar archivos secuenciales
línea en la memoria y la muestra en pantalla, luego lee y muestra la segunda lí­
La instrucción Open (abrir) le dice a Visual Basic a qué archivo debe acceder.
nea, y así sucesivamente. Cuando se le dice al programa que guarde el documen­
Normalmente, usarás un cuadro de diálogo estándar como el que has diseñado
to ocurre un proceso similar a medida que el documento se va escribiendo en el
anteriormente en este mismo capítulo para obtener el nombre de un archivo. Lue­
archivo línea por línea. La figura 9.6 ilustra este proceso.
go, especificarás ese nombre de archivo en la instrucción Open utilizando esta
Date cuenta de los símbolos <CR> y <LF> de la ilustración. Estos dos caracteres sintaxis:
son reminiscencias históricas de los días de las comunicaciones por teletipo, y se
Open nombreDeArchivo For {Input | Output} As #numeroDeArcbivo

Además de proporcionar el nombre del archivo, debes decirle a Visual Basic si


quieres leer del archivo (input) o escribir en él (output), y debes darle un número
de archivo. El número del archivo debe estar entre el 1 y el 255. Aquí tienes algu­
Bytes en un archivo almacenado en disco nas instrucciones que abren archivos:

Open "C:\CONFIG.SYS" For Input As #1

Doc$ = "C:\WWATCH1\BANZAI.DOC"
Open Doc$ For Input As #2
Datos mostrados en pantalla
Open "RESULTAD.TXT" For Output As #15

Si tratas de abrir un archivo para lectura (input) cuando el archivo todavía no


existe, Visual Basic producirá un error. Si estás abriendo el archivo para escritura
(output), Visual Basic siempre creará un archivo nuevo, reemplazando cualquiera
que ya exista con el mismo nombre. Si quieres comprobar la existencia de un ar­
Figura 9.6. chivo antes de abrirlo para escritura, utiliza la función Dir$. Si llamas a la función
Un archivo secuencial en disco y en la pantalla Dir$ con un nombre de archivo como parámetro, la función devolverá una copia

252 253
EL LIBRO DEL VISUAL BASIC 9 Archivos

del nombre del archivo (lo que significa que el nombre existe) o una cadena va­ y el código utiliza la variable VariableDeLinea para almacenar cada línea de texto
cía (lo que significa que no existe ningún archivo que tenga el nombre especifi­ que va leyendo.
cado). Este fragmento de programa ilustra la función Dir$:

If Dir$("EDIP0.TXT") <> " " Then Escribir en archivos secuenciales


If InputBox("EDIP0.TXT" ya existe. ¿Lo borro?”) <> "Si" Then
Escribir en un archivo secuencial es tan fácil como leer en uno de ellos. La ins-
Exit Sub
trucción Print # escribe en un archivo secuencial de manera muy parecida a
End If
como el método Print escribe en un formulario. Aquí tienes la sintaxis de la ins­
End If
Open "EDIP0.TXT" For Output As #15 trucción Print #■ :

Después de que hayas terminado de trabajar con un archivo debes cerrarlo. La Print #numeroDeArchivo [, expresión [{ , | } expresión]... ]{ , | ; }]
declaración Close (cerrar) de Visual Basic tiene la siguiente sintaxis:
Los valores de expresiones separadas por punto y coma se escriben sin espacios
Glose #numeroDeArchivo entre ellas, mientras que los valores de las expresiones separadas por comas se
escriben en campos de impresión separados (cada campo de impresión tiene 14
El número de archivo de la instrucción Close corresponde con el número que le
caracteres de largo). Al texto escrito se le añade un retorno de carro y un avance
asignaste al archivo en la instrucción Open. Cuando cierres un archivo, todos los
de línea a no ser que el último carácter de la instrucción Print # sea una coma o
datos escritos en él (si hay alguno) se guardarán, y entonces otros programas ten­
un punto y coma.
drán acceso al archivo.

La aplicación Configurador
Leer de archivos secuenciales Construyamos un pequeño programa de ejemplo usando lectura y escritura se­
Leer de un archivo secuencial es notablemente fácil. Una sola instrucción, Line cuencial. Lo llamaremos Configurador, ya que te permitirá editar tu archivo CON­
Input #, lee cada línea de texto. Como puedes ver en la sintaxis de la instrucción, FIG.SYS.
se debe identificar el archivo (por el número) y proporcionar una variable de ca­ Crea un proyecto nuevo y sitúa un cuadro de texto grande y tres botones de co­
dena en la que almacenar el texto leído: mando en el formulario como se muestra en la figura 9.7. Establece las propieda­
Line Input #númeroDeArchivo, variableDeCadena des de los objetos según puedes ver en la figura 9.8.

La función EOF (que son las iniciales de fin de archivo en inglés) te permite saber
cuándo se acaban Tiene un solo argumento (un número de archivo) y devuelve
un valor de True, si toda la información ha sido leída. Aquí tienes un ejemplo de
código que abre, lee, procesa y cierra un archivo secuencial:
Open VariableDeArchivo For Input As #1
Do While Not EOF(1)
Line Input #1, VariableDeLinea
Procesar VariableDeLinea ’Procedimiento del usuario para
’gestionar una linea de texto
Loop
Close #1

Este código presupone la existencia de las variables de cadena VariableDeArchi­


vo y VariableDeLinea. VariableDeArchivo se inicializa con el nombre del archivo, Figura 9.7.
El diseño inicial del formulario para la aplicación Configurador

254 255
L LIBRO DEL VISUAL BASIC 9 Archivos

Objeto Propiedad Ajuste


Sub Form_Load ( )
TextoModificado = False
Form1 BorderStyle 3 - Fixed Double
ConfigEncontrado = False
Caption Configurador
CRLF = Chr$(13) + Chr$(10)
Name CEdit End Sub
Text1 Multiline True
Name txtContenido Sub btnAbrir_Click ( )
ScrollBars 3 - Both Dim CLinea As String
Text [ninguno]
If ConfigEncontrado Then
Command1 Caption Abrir
Beep
Name btnAbrir Exit Sub
Command2 Caption Guardar End If
Name btnGuardar Open "C:\CONFIG.SYS" For Input As #1
Caption Salir Do While Not EOF(1)
Command3
Line Input #1, CLinea
Name bntSalir
txtContenido.Text = txtContenido.Text + CLinea + CRLF
Loop
Figura 9.8. CIose #1
El ajuste de las propiedades para la aplicación Configurador ConfigEncontrado = True
End Sub

En la sección de declaraciones generales del código, añade las siguientes declara­


Sub btnGuardar_Click ( )
ciones: If Not (ConfigEncontrado And TextoModificado) Then
Dim TextoModificado As Integer, ConfigEncontrado As Integer, Beep
CRLF As String Exit Sub
End If
A continuación introduce los procedimientos que se muestran en la figura 9.9 co­ Open "C:\CONFIG.SYS" For Output As #1
rrespondientes a sus objetos respectivos. Print #1, txtContenido.Text
CIose #1
Observa que la variable de cadena CRLF aparece en el código del programa Con­
End Sub
figurador. Normalmente, la implementación del fin de línea está oculta. La ins­
trucción Line Input # lee hasta el final una línea y luego pasa una cadena que Sub bntSalir_Click ( )
contiene todos los caracteres de la línea, excepto los terminadores. La instrucción End
Print #1 escribe lo que especifiques y añade, automáticamente, los caracteres de End Sub
final de línea. Sin embargo, en el programa de ejemplo, el retorno de carro/avan-
ce de línea que había sido eliminado por la instrucción Line Input # es insertado Sub txtContenido_Change ( )
de nuevo, de manera que el cuadro de texto sepa dónde está situado el final de TextoModificado = True
End Sub
la línea y pueda darle un formato adecuado a la presentación en pantalla.

La figura 9.10 muestra el aspecto que puede tener la aplicación Configurador


cuando ejecutes el programa y lo utilices para editar el archivo CONFIG.SYS. Figura 9.9.
El código del programa de la aplicación Configurador
256
257
EL LIBRO DEL VISUAL BASIC 9 Archivos

Ignorar los límites de la línea


Aunque la instrucción Print # normalmente se emplea para escribir solamente
una línea (o parte de una línea), también es posible utilizarla para escribir varias
líneas de texto a la vez, como hemos hecho en la aplicación Configurador. La ins­
trucción Line Input #, por el contrario, está limitada a procesar la lectura de una
línea cada vez.

Sin embargo, se puede usar la función Input$ de Visual Basic para leer caracteres
de un archivo. La función Input$ devuelve una cadena de caracteres leídos del
archivo, incluyendo los caracteres de retorno de carro y avance de línea. Esta es
Figura 9.10.
la sintaxis:
Editando) el archivo CONFIG.SYS con la aplicación Configurador
Input$( númeroDeCaracteres, #númeroDeArchivo)

Se puede especificar la cantidad de caracteres que se van a leer cada vez, entre 1
y 32767 (númeroDeCaracteres). Si el archivo contiene menos caracteres que el
Archivos de acceso aleatorio
número que indiques, Visual Basic generará un mensaje de error Input past end La mayoría de los programadores se encuentran alguna vez con dos problemas
of file (la lectura sobrepasó el final del archivo). referentes a las lecturas secuenciales tal y como se han descrito. Un problema
consiste en que no siempre resulta eficiente representar datos en forma de texto.
El programa Configurador podría haberse escrito fácilmente utilizando la función
For ejemplo, se puede almacenar el número 42,1596 en una variable de precisión
Input$. Aquí tienes el procedimiento btnAbrir_Click ( ) reescrito con Input$■ .
simple de 4 bytes, pero se necesitaría utilizar 7 bytes para almacenar el número
Sub btnAbrir_Click ( ) como texto en un archivo secuencial. El otro problema consiste en que algunas
Dim CLinea As String veces es necesario procesar la información de manera no secuencial.
If ConfigEncontrado Then
Beep Volvamos una vez más a nuestras amigas las comadrejas copetudas alemanas.
Exit Sub Cuando las dejamos la última vez, estábamos construyendo una base de datos
End If para mantener su información. La presunción en ese momento consistía en supo­
Open "C:\CONFIG.SYS" For Input As #1 ner que toda la información sobre las comadrejas podía mantenerse en variables
txtContenido.Text = Input$(LOF(1), #1) ’Supone que el archivo tiene del programa (una matriz). Sin embargo, con este enfoque los cambios en los da­
’me nos de 32767 caracte­ tos requieren cambios en el programa, un problema que es equivalente, en líneas
res
generales, a tener que modificar físicamente el procesador de textos cada vez. que
Close #1
escribas un documento.
ConfigEncontrado = True
End Sub Desde luego, la solución estriba en almacenar los datos en un archivo. Sin embar­
Este procedimiento lee el archivo CONFIG.SYS completo de una vez, lo cual es go, no querrás almacenar los datos como texto; es preferible almacenarlos exacta­
aceptable porque CONFIG.SYS, normalmente, es un archivo muy pequeño. Con mente como están almacenados en el programa: enteros como enteros, números
un archivo más grande necesitarás un bucle que compruebe si se ha llegado al fi­ de precisión doble como números de precisión doble, etc. Además, debes poder
nal del archivo (EOF). Observa que el nuevo procedimiento también utiliza la acceder a las estadísticas vitales de cualquier comadreja en cualquier momento,
función LOF (que es la abreviatura de longitud del archivo en inglés). Esta fun­ sin tener que procesar el archivo entero linealmente hasta encontrar lo que nece­
ción toma como parámetro un número de archivo, y devuelve el número de sitas. En las páginas siguientes construiremos la base de datos Comadrejas para
bytes que contiene. que sirva de ejemplo de un programa que usa archivos de acceso aleatorio.

259
258
EL LIBRO DEL VISUAL BASIC 9 Archivos

Type BTFComadreja
Abrir y cerrar archivos de acceso aleatorio
Nombre As String * 32
La sintaxis de la instrucción Open para los archivos de acceso aleatorio es la si­ Color As String * 12
guiente: Peso As Integer
Longitud As Integer
Open nombreDeArchivo For Random As númeroDeArchivo FechaNacimiento As Double
Len = longitudDelRegistro ColorCopete As String * 12
LongitudCopete As Integer
En esta versión de la instrucción Open no se especifica el modo de lectura o de End Type
escritura, porque se puede leer y escribir en archivos de acceso aleatorio sin tener
La expresión String * 32 adjudica el tamaño fijo de 32 bytes a todos los nombres
que abrirlos y cerrarlos cada vez. Adicionalmente, debes suministrar una longitud
de comadreja. Si un nombre tiene menos de 32 caracteres, Visual Basic lo rellena­
del registro, que es el número de bytes que se deben leer o escribir con cada ins­
rá con espacios. Los nombres con más de 32 caracteres se truncarán. Así, la longi­
trucción Get o Pul (las instrucciones para leer y escribir en el archivo). Por ejem­
tud de un registro BTFComadreja es ahora de 70 bytes (32+12+2+2+8+12+2).
plo, si tienes pensado usar un archivo que contenga números enteros, la longitud
del registro debe ser 2. Si en lugar de ser enteros, todos los valores fueran mone­ Cerrar un archivo de acceso aleatorio es simple: usa la instrucción Close exacta­
tarios, la longitud del registro sería 8. Si no especificas una longitud para el regis­ mente como si fuese un archivo secuencial. Por ejemplo, si abres un archivo de
tro, Visual Basic asumirá una longitud de 128. (Muy raro sería que este valor por acceso aleatorio como archivo #1, usa la instrucción Close #1 para cerrarlo.
omisión no sea apropiado para tu archivo.)

Para determinar la longitud del registro de la base de datos Comadrejas es nece­ Leer y escribir en un archivo de acceso aleatorio
sario ver qué datos deseamos leer y escribir. En el capítulo 6 definimos el tipo de Para leer y escribir en un archivo de acceso aleatorio se utilizan las instrucciones
datos BTFComadreja como sigue: Get y Put. La sintaxis de las dos instrucciones es simple:

Type BTFComadreja Get #númeroDeArchivo, [númeroDeRegistro], variable


Nombre As String Put #númeroDeArchivo, [númeroDeRegistro], variable
Color As String
La instrucción Get lee del archivo y almacena los datos en la variable, mientras
Peso As Integer
Longitud As Integer que la instrucción Put escribe el contenido de la variable en el archivo. En ambos
FechaNacimiento As Double casos se puede especificar opcionalmente el número del registro. Si no se especi­
ColorCopete As String fica el número del registro, se utilizará la siguiente posición secuencial.
LongitudCopete As Integer
Un archivo de acceso aleatorio se parece mucho a una matriz de un tipo definido
End Type
por el usuario. La diferencia principal radica en que los datos se almacenan en un
Suponiendo que todos los registros sean como éste, podemos sumar todos los disco, en lugar de hacerlo en la memoria y, de esta manera, los datos no se des­
campos componentes para obtener el tamaño del registro. Por desgracia, tres de vanecerán cuando el programa finalice. (Ten en cuenta también que el índice de
los campos son cadenas de caracteres (strings), y no tenemos manera de conocer los registros en un disco comienza en el 1 —registro 1—, mientras que los índi­
sus tamaños. ces de una matriz comienzan a partir del 0.) La figura 9.11 muestra la manera en
Para solucionar este problema, Visual Basic permite declarar tamaños fijos para que se almacenan los registros en un disco.
las cadenas. Si te decides por esta posibilidad e impones algunas restricciones a
los datos, podrás calcular la longitud del registro. Por ejemplo, si restringes los La aplicación de la base de datos Comadrejas
nombres de las comadrejas a un máximo de 32 caracteres y los nombres de los Ahora comencemos a construir la aplicación de la base de datos Comadreja, la
colores a 12 caracteres, podrás redefinir el tipo BTFComadreja como sigue: cual mantendrá los datos de nuestras comadrejas copetudas alemanas. Evidente-

260 261
EL LIBRO DEL VISUAL BASIC 9 Archivos

más, habrá botones de comandos que permitirán añadir una comadreja nueva al
archivo o eliminar una de ellas.

Para comenzar, crea un proyecto nuevo. Dispon un cuadro combinado sobre el


formulario, así como seis cuadros de texto, siete etiquetas y dos botones de co­
mando. El diseño inicial se muestra en la figura 9.12 de la página anterior.

Establece las propiedades de los objetos de pantalla como se especifica en la fi­


gura 9.13. Cuando lo hayas hecho, el formulario debe parecerse al que se mues­
tra en la figura 9.14.

Figura 9.11. Objeto Propiedad Ajuste

Los registros en un archivo de acceso aleatorio


Form1 BorderStyle 3 - Fixed Double
Caption Comadrejas
mente, si resulta que no tienes ninguna comadreja, recuerda que puedes modifi­ Name Comadrejas
car fácilmente el programa para que gestione otros tipos de datos. Label1 1 - Right Justify
Alignment
El plan básico para la base de datos Comadrejas implicará la utilización de un ar­ Caption Nombre:
chivo de acceso aleatorio para almacenar la información sobre las comadrejas. Combol Name cboNombre
Cuando se ejecute la aplicación, ésta examinará el archivo, obtendrá los nombres Style 2 - Dropdown list
de todas las comadrejas y mostrará la lista de los nombres en un cuadro de lista. Label 2 Alignment 1 - Right Justify
Cuando el usuario elija un nombre del cuadro de lista, el programa buscará el Caption Color:
registro de esa comadreja en el archivo y mostrará la información relevante. Ade- Text1 Name txtColor
Text [Ninguno]
Label 3 Alignment 1 - Right Justify
Caption Peso:
Text2 Name txtPeso
Text [Ninguno]
Label4 Alignment 1 - Right Justify
Caption Longitud:
Text3 Name txtLongitud
Text [Ninguno]
Label5 Alignment 1 - Right Justify
Caption Fecha de nacimiento:
Text4 Name txtFechaNacimiento
Text [Ninguno]

Figura 9.12.
Figura 9.13. (continúa)
El diseño inicial del formulario para la aplicación de la hase de datos Comadrejas
El ajuste de las propiedades para la aplicación de la hase de datos Comadrejas

262 263
EL LIBRO DEL VISUAL BASIC 9 Archivos

Figura 9.13. continuación Type BTFComadreja


Nombre As String * 32
Objeto Propiedad Ajuste Color As String * 12
Peso As Integer
Label6 Alignment 1 - Right Justify Longitud As Integer
Caption Color del copete: FechaNacimiento As Double
ColorCopete As String * 12
Text 5 Name txtColorCopete
LongitudCopete As Integer
Text [Ninguno]
End Type
Label 7 Alignment 1 - Right Justify
Caption Longitud del copete: Global Const COMADREJA_LONGITUD = 70
Text6 Name txtLongitudCopete
Text [Ninguno] Al definir la constante COMADREJA_LONGITUD hacemos que el programa sea
Command1 Caption Añadir más fácil de leer; ver el nombre de la constante en lugar del número 70 es un re­
Name btnAñadir cordatorio de lo que realmente significa ese valor. Sin embargo, una razón más
Command2 Caption Eliminar importante para definir la constante es la posibilidad de modificar el programa.
Name btnEliminar
Supón que en el futuro necesitas redefinir el tipo BTFComadreja; quizás tengas
que añadir un campo nuevo, o quizás decidas que 32 caracteres son insuficientes
para los nombres. Si no hubieses utilizado un nombre de constante para la longi­
tud del registro, tendrías que examinar todas las líneas del programa, buscando el
número 70, y cambiándolo por el nuevo valor. Además, tendrías que asegurarte
de que el 70 era realmente una referencia al tamaño del registro y no algún otro
valor. Usando el nombre de una constante no tienes más que cambiar el valor de
la constante y el resto del programa será actualizado instantáneamente para traba­
jar con el tamaño del registro recién definido.

El resto de las declaraciones son locales del formulario. Cierra la ventana de códi­
go del módulo de código y abre la del formulario. Añade las siguientes líneas a la
sección de declaraciones generales:

Dim ComadrejaActual As Integer 'Número de la comadreja actual


Dim NumeroDeComadrejas As Integer 'Número total de comadrejas
Dim RegistroModificado As Integer 'Bandera booleana
Figura 9.14.
El diseño del formulario de la aplicación de la base de datos Comadrejas completado Estas variables contendrán un número de índice que indicará, respectivamente,
qué registros se están mostrando en pantalla, el número total de comadrejas al­
macenadas en el archivo y si el usuario ha modificado o no cualquiera de los da­
Esta aplicación necesita algunas declaraciones globales. Como las variables globa­
tos de la pantalla.
les y las declaraciones de tipo no se pueden declarar en un módulo de formu­
lario, es necesario crear un módulo de código. Elige el comando New Module del Para inicializar el sistema, el programa debe leer todos los registros del archivo y
menú File. Añade las siguientes declaraciones a la sección de declaraciones gene­ poner los nombres de todas las comadrejas en el cuadro de lista. El usuario podrá
rales de la ventana de código: entonces elegir un nombre. El programa responderá leyendo todo el registro de

264 265
EL LIBRO DEL VISUAL BASIC 9 Archivos

esa comadreja y mostrándolo en pantalla. Si el usuario modifica el registro, esos que indica que el registro todavía no ha sido modificado. El procedimiento Ac-
cambios se escribirán en el archivo. tualizarComadrejaActual comprueba si el registro ha sido modificado. Si no lo
ha sido, simplemente termina. En caso de que el usuario haya modificado el re­
Para ilustrar un estilo de programación que funcione bien con grandes cantidades
gistro, se leerá el valor actual de cada campo y el registro resultante se escribirá
de datos, el programa no leerá todos los registros en una matriz sino que trabaja­
de vuelta en el disco.
rá únicamente con variables de memoria. Como recordarás, una matriz no puede
tener un índice mayor de 32767. Esas son muchas comadrejas y, a 70 bytes por
registro, necesitarías más de 2 megabytes de RAM. Manteniendo en memoria sólo Sub MostrarComadreja (ByVal Ix As Integer)
un registro cada vez podrías reducir considerablemente los requerimientos de me­ Dim Comadreja As BTFComadreja
moria.
Get #1, Ix + 1, Comadreja
Para que sea más sencillo, el programa requiere que todos los nombres estén a la ComadrejaActual = Ix
vez en la memoria, pero si el nombre medio tiene 8 ó 9 caracteres, esto no debe­ cboNombre.ListIndex = Ix
ría ser un problema. Suponiendo que el archivo de datos existe en una posición txtColor.Text = Comadreja.Color
predeterminada en el disco, entonces podemos escribir la siguiente rutina de ini­ txtPeso.Text = Str$(Comadreja.Peso)
cialización. (En esta aplicación no utilizaremos la función AbrirDlgArchivos. En su txtLongitud.Text = Str$(Comadreja.Longitud)
txtFechaNacimiento.Text = Format(Comadreja.FechaNacimiento,
lugar supondremos que el archivo de datos tiene un nombre y una ruta fijos. En
"dd/mm/yy")
mi ordenador, Visual Basic están en el directorio C:\VB; asegúrate de usar una
txtColorCopete.Text = Comadreja.ColorCopete
ruta de acceso que sea válida para el tuyo.) txtLongitudCopete.Text = Str$(Comadreja.LongitudCopete)
RegistroModificado = False
Sub ComadrejaInicio ( )
End Sub
Dim Comadreja As BTFComadreja, C As Integer

Sub ActualizarComadrejaActual
Open "C:\VB\COMADREJ.DAT" For Random As #1 Len = COMADREJA_LONGITUD
Dim Comadreja As BTFComadreja
NumeroDeComadrejas = LOF(1) / COMADREJA_LONGITUD
For C = 1 To NumeroDeComadrejas
If Not RegistroModificado Then
Get #1, C, Comadreja
Exit Sub
cboNombre.AddItem Comadreja.Nombre
End If
Next C
Comadreja.Nombre = cboNombre.Text
End Sub
Comadreja.Color = txtColor.Text
La instrucción Open abre o crea un archivo. La función LOF devuelve el número Comadreja.Peso = Val(txtPeso.Text)
Comadreja.Longitud = Val(txtLongitud.Text)
total de bytes del archivo, que es dividido por el tamaño de un registro para ob­
Comadreja.FechaNacimiento = DateValue(txtFechaNacimiento.Text)
tener el número total de registros. Luego se leen todos los registros existentes, y
Comadreja.ColorCopete = txtColorCopete.Text
se insertan todos los nombres de comadrejas en el cuadro de lista. Comadreja.LongitudCopete = Val(txtLongitudCopete.Text)
Cuando la inicialización esté completa, el usuario podrá elegir un nombre de co­ Put #1, ComadrejaActual + 1, Comadreja
RegistroModificado = False
madreja para ver sus datos y editarlos. Los procedimientos que se muestran en la
End Sub
figura 9.15 responden a estos requerimientos.

El procedimiento MostrarComadreja toma un número de índice como parámetro.


Establece ComadrejaActual a ese número y obtiene los datos de esa comadreja, Figura 9.15.
Los procedimientos MostrarComadreja y ActualizarComadrejaActual
actualizando todos los campos de pantalla. A continuación establece una bandera

266 267
EL LIBRO DEL VISUAL BASIC 9 Archivos

Las otras tareas principales del programa consisten en crear nuevos registros y en un procedimiento de evento de un objeto específico. Es mejor crear el trabajo es­
eliminar los antiguos. Puedes crear registros nuevos con la función que se mues­ pecífico de la aplicación en procedimientos generales y hacer que el código de
tra en la figura 9.16. (Trataremos los procedimientos de eliminación después.) La los procedimientos de eventos sirva de vínculo entre el interface de usuario y la
función ComadrejaNneva rellena un registro de comadreja con el nombre pasado parte funcional del programa.
a la función y con valores por omisión para los otros campos. Incrementa Nume-
El primer vínculo importante consiste en conectar el arranque del programa con
roDeComadrejas para que tenga en cuenta a la nueva comadreja, escribe el nue­
la inicialización de la base de datos. Cuando se arranca una aplicación, el primer
vo registro en el archivo de datos y luego añade el nombre al cuadro de lista.
procedimiento que es llamado es el procedimiento Load.
Como el nuevo registro siempre se añade al final del archivo, su índice en el cua­
dro de lista es el mismo que el valor antiguo de NumeroDeComadrejas, el cual es Sub Form_Load ( )
devuelto al procedimiento de llamada como valor de la función. ComadrejaInicio
End Sub
Los procedimientos de este programa que has escrito hasta ahora, se han definido
También debes enlazar la elección por parte del usuario de un nombre en el cua­
en la sección general del formulario porque cada rutina lleva a cabo una tarea es­
dro de lista con la presentación en pantalla del registro por parte del programa, y
pecífica. Estos procedimientos pueden ser llamados por cualesquiera otros proce­
debes enlazar la creación de un nuevo registro con el botón Añadir. Estas dos ru-
dimientos, incluyendo a los procedimientos de eventos, de manera que es mejor
tinas realizan esas conexiones:
definirlos como unidades independientes en lugar de codificarlos como parte de
Sub cboNombre_Click ( )
MostrarComadreja cboNombre.ListIndex
End Sub

Function ComadrejaNueva (NuevoNombre As String) As Integer


Sub btnAñadir_Click ( )
Dim Comadreja As BTFComadreja
Dim NuevoNombre As String

Comadreja.Nombre = NuevoNombre
NuevoNombre = InputBox("¿Cuál es el nombre de la nueva comadreja?”)
'Asignar la información por omisión
If NuevoNombre = " " Then
Comadreja.Color = "Marrón"
Exit Sub
Comadreja.Peso = 0
End If
Comadreja.Longitud = 0
MostrarComadreja ComadrejaNueva(NuevoNombre)
Comadreja.FechaNacimiento = Now
End Sub
Comadreja.ColorCopete = "Marrón"
Comadreja.LongitudCopete = 0 Configurar la presentación del registro es fácil porque simplemente añadiendo 1
'Asignar un número de indice para devolver al índice del nombre del cuadro de lista se obtiene la posición índice del registro
NumeroDeComadrejas = NumeroDeComadrejas + 1
en el archivo. Con la segunda rutina, al hacer clic en el botón Añadir, se le pre­
'Escribir el nuevo registro en el disco
gunta al usuario un nombre para la nueva comadreja. Si el usuario no propor­
Put #1, NumeroDeComadrejas, Comadreja
'Añadir el nombre a la lista de comadrejas ciona un nombre no se añade el registro. Si el usuario proporciona un nombre, el
cboNombre.Addltem Comadreja.Nombre procedimiento llama a ComadrejaNueva para crear un registro y pasar directa­
RegistroModificado = False mente a MostrarComadreja el valor del índice que aquella devuelve, de manera
End Function que se pueda mostrar el nuevo registro.

Para completar la aplicación debemos implementar soporte para la edición de los


Figura 9.16.
registros de las comadrejas. Se requieren dos simples rutinas para cada cuadro de
La función ComadrejaNueva texto: el procedimiento Change ejecutará la declaración RegistroModificado =

268 269
EL LIBRO DEL VISUAL BASIC 9 Archivos

True, y el procedimiento LostFocus actualizará el registro llamando a Actualizar-


Figura 9.17. continuación
ComadrejaActual. El código de cada cuadro de texto aparece en la figura 9.17.

Sub txtColorCopete_LostFocus ( )
Sub txtColor_Change ( ) ActualizarComadrejaActual
RegistroModificado = True End Sub
End Sub
Sub txtLongitudCopete_Change ( )
Sub txtColor_LostFocus ( ) RegistroModificado = True
ActualizarComadrejaActual End Sub
End Sub
Sub txtLongitudCopete_LostFocus ( )
Sub txtPeso_Change ( ) ActualizarComadrejaActual
RegistroModificado = True End Sub
End Sub

Sub txtPeso_LostFocus ( )
ActualizarComadrejaActual
End Sub Es mejor establecer una bandera en el procedimiento Change que llamar directa­
mente a la rutina ActualizarComadrejaActual, ya que Visual Basic llamará al pro­
Sub txtLongitud_Change ( ) cedimiento Change cada vez que el contenido del cuadro de texto cambie. Por
RegistroModificado = True ejemplo, si escribes el texto Negro en el cuadro de texto Color, el procedimiento
End Sub Change es llamado cinco veces, una vez por cada letra introducida. Pero el regis­
tro no tiene que ser actualizado hasta que el dato del cuadro de texto esté com­
Sub txtLongitud_LostFocus ( )
pleto, así que el procedimiento llama a la rutina de actualización en el
ActualizarComadrejaActual
procedimiento del evento LostFocus.
End Sub
¿Qué es el evento LostFocus? Cualquier control de la pantalla puede ser el "foco
Sub txtFechaNacimiento_Change ( )
de atención" en algún momento durante la ejecución de una aplicación. Windows
RegistroModificado = True
controla la situación mediante los eventos GotFocus y LostFocus. Cuando se hace
End Sub
clic en un cuadro de texto, por ejemplo, se emite el evento GotFocus. El foco se
Sub txtFechaNacimiento_LostFocus ( ) queda en el cuadro de texto mientras estás escribiendo. Cuando pulsas la tecla
ActualizarComadrejaActual Tab o haces clic en otro control, el cuadro de texto recibe un evento LostFocus, y
End Sub el nuevo control recibe GotFocus. Por tanto, cuando se ejecute el procedimiento
LostFocus de un cuadro de texto sabrás que el usuario ha terminado de escribir y
Sub txtColorCopete_Change ( )
que el programa puede llamar con total seguridad a la rutina de actualización.
RegistroModificado = True
End Sub La aplicación de la base de datos Comadrejas está ahora preparada para funcio­
nar. Pulsa F5 para arrancarla. Como es la primera vez que ejecutas el programa
no aparecerán entradas en el cuadro de lista. Haz clic en el botón Añadir e intro­
Figura 9.17. (continúa) duce los datos de tres o cuadro comadrejas. A continuación pulsa la combinación
Los procedimientos de los eventos para los cuadros de texto de la aplicación de teclas Alt+F4 para salir del programa e, inmediatamente, ejecútalo otra vez.

270 271
EL LIBRO DEL VISUAL BASIC 9 Archivos

Como se puede ver en la figura 9.18, debes poder elegir de entre los nombres COMADREJ.DAT
que introdujiste en la sesión anterior.

Figura 9.19.
Un archivo de datos de cuatro registros de la base de datos Comadrejas

COMADREJ.DAT COMADREJ.TMP

A
Figura 9.18.
1. Copiar los registros
Ejecución de la aplicación de la base de datos Comadrejas A, C y D al nuevo
B
archivo

Eliminar registros D

El modelo lógico de esta aplicación es eficiente y relativamente fácil de compren­


3. Asignarle el
der. Pero la simplicidad tiene un precio: no hay una manera sencilla de borrar re­ nombre original
gistros. 2. Borrar el al archivo nuevo
archivo original
Imagina que el archivo de la base de datos COMADREJ.DAT contiene cuatro re­
gistros para las comadrejas que, de forma poco imaginativa, denominaremos A, B,
C y D, como se muestra en la figura 9.19. Crear estos registro ha producido un ar­
COMADREJ.DAT COMADREJ.DAT
chivo que contiene 280 bytes (4 x 70).

No se pueden quitar simplemente bytes del medio del archivo y "tirarlos". Si qui­
sieras borrar el registro de la comadreja B, por ejemplo, solamente tendrías dos
posibilidades: copiar todos los registros excepto el de B a un archivo nuevo, o
sobrescribir el registro B con datos nuevos. Si haces la copia, luego podrías borrar
el archivo original y ponerle a la copia el nombre del archivo original. Esta solu­
ción se ilustra en la figura 9.20.

Si sobrescribes el registro de B con otros datos —por ejemplo, con los de un re­
gistro que contenga todos los datos en blanco—, el cuadro de lista podría llegar a Figura 9.20.
estar lleno de entradas en blanco. Podrías pensar que la rutina de inicialización Copiar registros y cambiar el nombre del archivo

272 273
EL LIBRO DEL VISUAL BASIC 9 Archivos

no tendría más que omitir cualquier registro que tuviese el campo nombre en
blanco. Por desgracia, si omites registros, la aplicación no será capaz de encontrar A
el registro que corresponde a cada entrada en la lista. La figura 9.21 ilustra este
problema. (En blanco)

La aplicación, tal y como está escrita actualmente, requiere un mapa de uno a


uno entre los nombres del cuadro de lista y los registros del archivo. (Este reque­ C
rimiento también significa que no se puede establecer como True la propiedad
Sorted del cuadro de lista, ya que desordenaría la relación entre los valores índice D
del cuadro de lista y la posición de los registros en el archivo.) Sin embargo, se
puede sortear este problema manteniendo un mapa separado entre el índice del Registros
Figura 9.22.
cuadro de lista y las posiciones del archivo. La figura 9.22 muestra un ejemplo.
Hacer mapas de las posiciones del cuadro de lista
¿Qué solución es la preferible? Si sabes que los datos de la aplicación van a ser
siempre pocos, el método de copiar y cambiar el nombre podría ser el mejor.
Puede implementarse sin afectar al código que ya está escrito y la aplicación si­ ya que no tendrá ninguna utilidad si los usuarios no pueden aceptar las decisio­
gue siendo fácil de comprender. Sin embargo, en un programa que maneje gran­ nes que hayas tomado con respecto al diseño.
des cantidades de datos, copiar grandes archivos conllevaría un gran gasto de
Echemos una mirada más de cerca a las dos alternativas para borrar registros de
tiempo y requeriría suficiente espacio libre en el disco, para que tanto el archivo
la base de datos Comadrejas. La solución de copiar y cambiar el nombre no re­
original como la copia coexistan a la vez; si el espacio en el disco es reducido, el
quiere cambios en el código existente. Simplemente, añade al programa el proce­
programa podría fallar. Crear un mapa permite al programa funcionar más depri­
dimiento que se muestra en la figura 9.23.
sa, algo que los usuarios finales aprecian. Pero esta solución implicará añadir
complejidad (y posiblemente bugs) y reescribir parte del código existente. El procedimiento btnEliminar_Click abre un archivo nuevo y copia todos los re­
gistros, excepto el actual en él. Luego se cierran ambos archivos. La instrucción
Como programador, a menudo tendrás que tomar decisiones como ésta. Es muy
Kill (eliminar) toma como parámetro el nombre del archivo original y borra ese
importante comprender con claridad las tareas del programa y la naturaleza de
archivo. Después, la instrucción Name (nombre) cambiará de nombre al archivo
los datos antes de tomar una decisión. No importa que el código no tenga bugs,
copiado. Cuando se haya terminado con el archivo de datos, se borrará el conte­
nido del cuadro de lista y el programa llamará de nuevo al procedimiento Coma-
drejalnicio para volver a cargar el cuadro de lista.

A La segunda alternativa, usando una matriz como mapa, es algo más compleja por­
que requiere realizar modificaciones en el código ya existente. La figura 9.24 con­
(En blanco) tiene sólo las rutinas que deben modificarse para producir la versión que utiliza
el mapa; las líneas que se han añadido o modificado aparecerán resaltadas.
C El programa modificado utiliza una propiedad llamada ItemData, que es una ca­
racterística interna del cuadro de lista. ItemData es una matriz que contiene un
D entero largo por cada elemento del cuadro de lista. Esta matriz se utiliza para al­
Registros macenar el mapa —es decir, contiene el índice real del archivo de disco de cada
Figura 9.21. entrada. En la versión original, la variable ComaclrejaActual podía referirse tanto
Sobrescribir un registro con blancos a la posición en el archivo como al índice del cuadro de lista. En la nueva ver-

274 275
EL LIBRO DEL VISUAL BASIC

Function ComadrejaNueva (NuevoNombre As String) As Integer


Sub btnEliminar_Click ( )
Dim comadreja As BTFComadreja
Dim Comadreja As BTFComadreja, C As Integer

Comadreja.Nombre = NuevoNombre
’Copiar todos los registros excepto el actual en el archivo
’Asignar la información por omisión
’temporal Comadreja.Color = "Marrón"
Open "C:\VB\COMADREJ.TMP" For Random As #2
Comadreja.Peso = 0
Len = COMADREJA_L0NGITUD
Comadreja.Longitud = 0
For C = 1 To NumeroDeComadrejas
Comadreja.FechaNacimiento = Now
If C <> ComadrejaActual + 1 Then
Comadreja.ColorCopete = "Marrón"
Get #1, C, Comadreja
Comadreja.LongitudCopete = 0
Put #2, , Comadreja
'Asignar un número de indice para devolver
End If
ComadrejaNueva = cboNombre.ListCount
Next W
’Incrementar el número de comadrejas
’Cerrar y cambiar el nombre
ComadrejaNueva = NumeroDeComadrejas + 1
Close #1
’Escribir el nuevo registro en el disco
Close #2
Put #1, NumeroDeComadrejas, Comadreja
Kill "C:\VB\COMADREJ.DAT"
’Añadir el nombre a la lista de comadrejas
Name "C:\VB\COMADREJ.TMP" As "C:\VB\COMADREJ.DAT“
cboNombre.AddItem Comadreja.Nombre
’Borrar el cuadro de lista y volver a cargar la base de datos
cboNombre.ItemData(cboNombre.Newlndex) = NumeroDeComadrejas
cboNombre.Clear
ComadrejaInicio R e g i stroModificado = False
End Sub End Function

Sub MostrarComadreja (ByVal Ix As Integer)


Dim Comadreja As BTFComadreja
Figura 9.23.
El procedimiento btnEliminar_Click para la aplicación de la base de datos Comadrejas Get #1, cboNombre.ItemData(Ix), Comadreja
ComadrejaActual = Ix
cboNombre.ListIndex = Ix
sión, ComadrejaActual se refiere sólo al índice en el cuadro de lista; la posición txtColor.Text = Comadreja.Color
en el archivo debe obtenerse con la expresión cboNombre.ItemData(Comadreja- txtPeso.Text = Str$(Comadreja.Peso)
Actual). txtLongitud.Text = Str$(Comadreja.Longitud)
txtFechaNacimiento.Text = FormatComadreja.FechaNacimiento,
Los cambios de los procedimientos ComadrejaNueva, MostrarComadreja y Actua-
"dd/mm/yy”)
lizarComadrejaActual son triviales, y simplemente sirven para asegurarse de que txtColorCopete.Uext = Comadreja.ColorCopete
el mapa se usa y se mantiene correctamente. Los cambios en ComadrejaInicio txtLongitudCopete.Text = Str$(Comadreja.LongitudCopete)
son relativamente evidentes: a medida que se lee un registro del archivo, se com­ RegistroModificado = False
prueba si el primer carácter del campo nombre es un blanco (un espacio); en End Sub
caso de que así sea, ese registro se ignora. A medida que el programa lee los re­
gistros escribe los valores apropiados en la matriz mapa ItemData. La propiedad
NewIndex (nuevo índice) contiene el valor ListIndex del elemento que se haya Figura 9.24. (cont.)

añadido más recientemente. Como no necesitarás tener más la relación de uno a El código revisado del programa, implementando un mapa mediante una matriz

276
9 Archivos
EL LIBRO DEL VISUAL BASIC

Figura 9.24. continuación


Figura 9.24. continuación

Sub ActualizarComadrejaActual Comadreja.Nombre = " "


Dim Comadreja As BTFComadreja Put #1, cboNombre.ItemData(ComadrejaActual), Comadreja
’Actualizar la lista de nombres y el mapa eliminando un elemento
If Not RegistroModificado Then cboNombre.RemoveItem ComadrejaActual
Exit Sub End Sub
End If
Comadreja.Nombre = cboNombre.Text
Comadreja.Color = txtColor.Text
u n o entre el disco y el cuadro de lista, puedes establecer la propiedad Sorted del
Comadreja.Peso = Val(txtPeso.Text)
Comadreja.Longitud = Val(txtLongitud.Text) cuadro de lista como True en esta versión del programa.
Comadreja.FechaNacimiento = DateValue(txtFechaNacimiento.Text)
Finalmente, el procedimiento btnEliminar_Click es completamente distinto en el
Comadreja.ColorCopete = txtColorCopete.Text
código revisado. Para eliminar el registro actual, el programador lo sobrescribe
Comadreja.LongitudCopete = Val(txtLongitudCopete.Text)
Put #1, cboNombre.ItemData(ComadrejaActual), Comadreja
con un registro en blanco. Una vez se haya sobrescrito el registro, se eliminara el
RegistroModificado = False nombre correspondiente del cuadro de lista.
End Sub Queda un problema menor con la versión que utiliza el mapa: cada registro bo­
rrado requiere espacio, y los registros nuevos se añaden al final del archivo. Sería
Sub Comadreja Inicio ( )
magnífico si el procedimiento ComadrejaNueva usase los registros borrados, en
Dim Comadreja As BTFComadreja, C As Integer
caso de que haya alguno, en lugar de ampliar el archivo automáticamente. Este
Open "C:\VB\COMADREJ.DAT" For Random As #1 cambio evitaría que el archivo de datos se hiciese innecesariamente grande. Im-
Len = COMADREJA_LONGITUD plementar esta modificación queda como ejercicio para el lector. (Siempre he
NumeroDeComadrejas = L0F(1) / COMADREJA_LONGITUD querido decir eso.)
For C = 1 To NumeroDeComadrejas
Get #1, C, Comadreja
’Saltar los registros borrados
Configuración
If Mid$(Comadreja.Nombre, 1, 1) <> " " Then
cboNombre.AddItem Comadreja.Nombre A menudo querrás guardar uno o dos datos importantes de una sesión de trabajo
cboNombre.ItemData(cboNombre.NewIndex) = C de un programa a otro —quizás la configuración de una opción, como el modo
End If analógico o digital de tu programa reloj. Las variables normales no sirven porque
Next C desaparecen cuando el programa finaliza. Podrías crear un archivo de datos, pero
End Sub eso sería mucho trabajo para tan pocos datos.

Sub btnEliminar_Click ( ) La solución estándar para este problema en el caso de las aplicaciones para Win­
Dim Comadreja As BTFComadreja dows consiste en almacenar los valores en el archivo W I N . I N I , que es el archivo
de inicialización de Windows. Cada aplicación tiene su propia sección en este ar­
’Sobrescribir el registro actual chivo, indicada por un nombre entre corchetes. A continuación del nombre están
los nombres de las variables y sus valores. A q u í tienes algunas líneas de mi archi­
(continúa) vo W I N . I N I :

279
278
EL LIBRO DEL VISUAL BASIC 9 Archivos

[Paint Shop]
Las funciones del perfil de Windows
OpenDir=C:\DOCS
FileData=65,65,0,0,0,0 Las funciones que leen y escriben WIN.INI son parte de KERNEL.DLL, una librería
SaveDir =C:\DOCS\BOOK de enlace dinámico estándar de Windows. Las funciones se llaman GetProfile-
String y WriteProfileString. Para usar estas funciones en un programa dé Visual
[Corel Draw] Basic debes declararlas. La declaración es similar a una declaración de procedi­
Dir=C:\WIND0WS\C0REL miento, pero le dice a Visual Basic que el procedimiento se encuentra en algún
otro sitio que no es la propia aplicación de Visual Basic.
[Clock]
iFormat=0 A continuación, se muestran las declaraciones de las dos funciones GetProfile-
String y WriteProfileString. Date cuenta de que cada declaración debe introducir­
La manera obvia de proceder consiste en abrir el archivo WIN.INI, leer cada línea
se como una sola línea (sin retornos de carro), aunque aquí no tengamos más
buscando la sección correcta, y luego editar las líneas que hay detrás. Esto podría
remedio que reproducirlas en varias líneas:
ser un montón de trabajo si tuvieras que escribir todo el código tú mismo. Sin
embargo, esta operación se realiza con tanta frecuencia que, afortunadamente, Declare Function GetProfileString Lib "Kernel"
está construida dentro del propio Windows. Aunque ninguna función de Visual (ByVal lpNombreAp As String, ByVal lpPalabraClave As String,
Basic puede acceder a ese código, tú puedes escribir tus propias funciones. ByVal lpPorOmision As String, ByVal lpCadenaDevuelta As String,
ByVal nTamaño As Integer) As Integer

Librerías de enlace dinámico Declare Function WriteProfileString Lib "Kernel"


(ByVal lpNombreAp As String, ByVal lpPalabraClave As String,
Se puede acceder a las funciones que están creadas internamente en Windows o ByVal lpCadena As String) As Integer
en aplicaciones para Windows si esas funciones forman parte de una librería de
enlace dinámico (una DLL). Si miras el directorio SYSTEM de Windows verás mu­ La declaración de GetProfileString le dice a Visual Basic que la función se en­
chos archivos que tienen la extensión DLL. Algunos de ellos vienen con Win­ cuentra en KERNEL.DLL, que tiene cuatro parámetros de cadena y uno entero, y
dows; otros (como VBRUN300.DLL) vienen con las aplicaciones que hayas ido que devuelve un número entero. El primer parámetro de GetProfileString es una
incorporando al sistema. Si conoces las definiciones de las funciones de esos ar­ cadena que corresponde al nombre de la aplicación (nombre de la sección) en
chivos puedes llamar prácticamente a todas las funciones desde tus aplicaciones WIN.INI. El segundo parámetro es la palabra clave (el nombre de la "variable"). El
Visual Basic. tercer parámetro es el valor por omisión que se devuelve si no se encuentra la
palabra clave. El cuarto parámetro es una cadena vacía que será ocupada por el
Para llamar a estas funciones desde Visual Basic es necesario conocer cierta infor­ valor de la variable de configuración. El quinto parámetro es un entero que defi­
mación técnica sobre los tipos de datos, el paso de parámetros, etc. Parte de esta ne la longitud de la cadena vacía. El valor devuelto es el tamaño de la cadena de
información viene en el análisis de la instrucción Declare del manual de refe­ la variable de configuración.
rencia de Visual Basic. Si necesitas información específica sobre una función de­
terminada a la que puedas llamar, debes consultar los manuales de los productos La declaración WriteProfileString es similar pero más simple. WriteProfileString
que suministran DLL. también toma como primer parámetro una cadena que identifique la sección en
WIN.INI, y utiliza la palabra clave como segundo parámetro. El tercer parámetro
Atención: La instrucción Declare es muy potente. Te da acceso a casi to­ es el valor que quieras asignar a la palabra clave en WIN.INI.
das las funciones del sistema Windows. Pero debes tener mucho cuida­
do. Debido a que las llamadas se realizan directamente al sistema no
dispones del beneficio del chequeo de errores de Visual Basic. Potencial­ Empaquetar las fundones para Visual Basic
mente, podrías hacer que el sistema se viniese abajo si te equivocas en Crea un nuevo proyecto en Visual Basic y elige New Module del menú File. Ten­
una declaración o llamas a una función con valores incorrectos. drás que crear dos procedimientos, ObtenerIni y EstablecerIni, y ponerlos en el

280 281
EL LIBRO DEL VISUAL BASIC 9 Archivos

nuevo módulo. Luego puedes incluir este módulo en cualquier aplicación que es­ ción. Si el usuario mueve la ventana a una posición en la pantalla, la ventana
cribas, y acceder así a las variables de WIN.INI. aparecerá en esa misma posición la próxima vez que se ejecute la aplicación. De
la misma manera, si el usuario le cambia el tamaño a la ventana, ésta aparecerá
En la sección de declaraciones generales de la ventana de código, introduce las con el nuevo tamaño la siguiente vez que el usuario ejecute la aplicación. La apli­
declaraciones de las funciones GetProfileString y WriteProfileString como se cación Memoria realiza exactamente esta tarea (y nada más).
muestran en el apartado anterior. A continuación introduce el código de
y de EstablecerIni como se muestra en la figura 9.25. Cierra la ventana del módulo del código en el que has creado las funciones Esta­
blecerIni y ObtenerIni. Establece las propiedades Nombre y Caption del formu­
Los procedimientos ObtenerIni y EstablecerIni te permiten ahora leer y escribir en
lario como Memoria. Luego, añade el código que se muestra en la figura 9.26. El
el archivo WIN.INI con un simple interface de Visual Basic. Por ejemplo, la línea procedimiento Form_Load lee las variables de configuración; si contienen valores,
de código EstablecerIni "Godzilla”, "Color", "Verde" producirá que se añadan estas
utiliza esos valores para establecer las propiedades de la posición del formulario.
líneas a tu archivo WIN.INI:
El procedimiento Form_Unload, que es llamado cuando la aplicación finaliza, es­
[Godzilla] cribe la posición actual en el archivo WIN.INI.
Color=Verde

La aplicación Memoria
Puedes probar estas funciones con un pequeño programa de demostración. Una Sub Form_Load ( )
utilización clásica que se le da a las variables de configuración consiste en usarlas Dim Coger As String
para almacenar la última posición y tamaño conocidos de la ventana de la aplica-
Coger = ObtenerIni("Memoria", "Arriba")
If Coger <> " " Then
Memoria.Top = Val(Coger)
Function ObtenerIni (NombreAp As String, PalabraClave As String) End if
As String
Dim CadenaObtenida As String * 128, Temp As Integer Coger = ObtenerIni("Memoria", "Izquierda")
If Coger <> " " Then
Temp = GetProfileString(NombreAp, PalabraClave, " " , Memoria.Left = Val(Coger)
CadenaObtenida, Len(CadenaObteni da)) End if
’Obtener la cadena devuelta pero sin incluir el código ASCII 0 Coger = ObtenerIni("Memoria", "Alto")
ObtenerIni = Left$(CadenaObtenida, Temp) If Coger <> " " Then
End Function Memoria.Height = Val(Coger)
End if
Sub EstablecerIni (NombreAp As String, PalabraClave As String,
ValorClave As String) Coger = ObtenerIni("Memoria", "Ancho")
Dim Temp As Integer If Coger <> " " Then
Memoria.Width = Val(Coger)
Temp = WriteProfileString(NombreAp, PalabraClave, ValorClave) End if
End Sub End Sub

Figura 9.26. (continúa)


Figura 9.25.
Los procedimientos ObtenerIni y EstablecerIni El código del programa de la aplicación Memoria

283
282
EL LIBRO DEL VISUAL BASIC

Figura 9.26. continuación

10
Sub Form_Unload ( )
EstablecerIni "Memoria", "Arriba", Str$(Memoria.Top)
EstabiecerIni "Memoria", "Izquierda”, Str$(Memoria.Left)

Programación gráfica
EstablecerIni "Memoria", "Alto", Str$(Memoria.Height)
EstablecerIni "Memoria", "Ancho", Str$(Memoria.Width)
End Sub

Consejo: No se considera "correcto” que una aplicación escriba más de Este capítulo es una introducción a los gráficos de Visual Basic. Trabajar con grá­
nueve o diez valores en el archivo WIN.INI. Si tu programa requiere una ficos puede ser divertido, aunque no necesariamente fácil. Windows es en su
gran cantidad de información de configuración, debes pensar en crear
interior un entorno gráfico; recuerda que los mejores programas escritos para
un archivo de datos privado que sea procesado en tu código.
Windows hacen uso de esa fuerza.
Pulsa F5 para ejecutar la aplicación. Cuando aparezca el formulario vacío, utiliza
el ratón para moverlo o cambiar su tamaño. Ahora termina la aplicación haciendo
doble clic en el cuadro del menú control del extremo superior izquierdo de la Formularios y cuadros de dibujo
ventana o seleccionando el comando Cerrar del menú control del formulario.
Hasta este punto, la mayor parte de los "dibujos" que has hecho en Visual Basic
(Debes usar el menú control; seleccionar End del menú Run de Visual Basic ter­
los has realizado durante la fase de diseño. Visual Basic también dispone de va­
mina la aplicación sin descargar —unload— el formulario.) Cuando hayas vuelto
rios métodos gráficos que permiten escribir en la pantalla durante la fase de eje-
al modo de diseño verás el formulario tal y como se diseñó originalmente. Pero si
cución, realizando tareas como imprimir texto, dibujar líneas, dibujar círculos, etc.
vuelves a pulsar F5 para ejecutar de nuevo la aplicación, las propiedades posicio-
Estos métodos está asociados con formularios, cuadros de dibujo y con un objeto
nales se cargarán desde el archivo WIN.INI y la ventana aparecerá con el mismo
especial denominado Printer (impresora). El estudio que sigue se centra en los
tamaño y en la misma posición que cuando saliste de la aplicación por última
formularios, pero las propiedades y los métodos que se describen se aplican tam­
vez. Asegúrate de guardar el programa para que tengas disponible el módulo que
bién a los cuadros de dibujo. Imprimir y el objeto Printer se tratarán en la última
contiene los procedimientos ObtenerIni y EstablecerIni cuando los necesites.
parte de este capítulo.

Gestión de la pantalla
Las imágenes que aparecen en un monitor son el reflejo directo de la memoria de
vídeo, un banco de RAM que pertenece a la tarjeta controladora del vídeo. Las
imágenes de la pantalla están compuestas por muchos puntos individuales llama­
dos pixels (que es una abreviatura de picture elements, elementos del dibujo). El
número de pixels que componen la pantalla determinan la cantidad de memoria
de vídeo que se necesita. Una pantalla monocroma requiere un sólo bit por pixel.
Si el bit correspondiente de la memoria de vídeo vale 1, el pixel se enciende en
la pantalla. Cuando el bit vale 0, el punto es negro. Si la resolución de la pantalla

284 285
i LIBRO DEL VISUAL BASIC 10 Programación gráfica

es de 640 por 320 pixels, por ejemplo, se usan 204800 (640 x 320) bits, ó 25600 Ejecuta la aplicación y haz clic en el formulario varias veces para poner algo de
bytes, para controlar la pantalla. texto en la pantalla. Ahora minimiza la ventana o pon la ventana de otra aplica­
ción delante de la tuya. Cuando restaures el formulario para que la suya sea la
En un monitor de color se necesitan más de un bit para controlar cada pixel, ya
ventana que esté delante de todas las demás, verás que el texto ha desaparecido.
que el color se crea mezclando varias intensidades de rojo, verde y azul. Depen­
diendo del tipo de controlador puede llevar de 4 a 32 bits por pixel controlar un En este caso, cuando se restauró el formulario, Visual Basic llamó al procedimien­
monitor de color. (Cuantos más bits, más colores se podrán mostrar simultánea­ to Form_Paint. Como tú no lo habías escrito, no sucedió nada. Evidentemente, si
mente en la pantalla.) En ordenadores de alto precio con grandes pantallas en co­ tienes la intención de escribir aplicaciones gráficas, debes escribir un procedi­
lor, la RAM de vídeo puede ser a veces de hasta 4 megabytes. miento que pueda reconstruir la pantalla para el evento Paint. Esto supone cierta
planificación cuidadosa. El mejor enfoque consiste en poner todo el código de
Mostrar gráficos en pantalla los gráficos en el propio procedimiento Paint. Cuando estés preparado para dibu­
Todas las imágenes de la pantalla, desde las líneas de varios colores hasta el sim­ jar una imagen por primera vez, llama al procedimiento Paint directamente. Lue­
ple texto, se crean estableciendo los valores de los bits adecuados en la memoria go, todo estará ya en su lugar, de manera que si es necesario refrescar la pantalla,
de vídeo. Los métodos gráficos de Visual Basic se encargan de realizar todo ese Visual Basic puede llamar automáticamente a tu procedimiento Paint.
proceso por ti. Esos métodos gráficos —que se llaman Print, Line, Circle y Pset —
Prueba a modificar el programa Hola que acabas de escribir usando esta técnica.
dibujan en la pantalla texto, líneas, arcos y puntos individuales. Además, un mé­
Primero introduce este código en la sección de declaraciones generales:
todo llamado Point determina el color de un punto concreto, y el método Cls bo­
rra el formulario para que quede vacío. Dim NumeroDeClicks As Integer 'Visual Basic la inicializa a 0

En un entorno en el que un sé)lo programa controle la pantalla, una imagen que A continuación añade estos dos procedimientos de evento:
se dibuje en esa pantalla se quedará allí. Windows, sin embargo, es un entorno Sub Form_Click ( )
multitarea. Después de que se haya dibujado una imagen en un formulario, el NumeroDeClicks = NumeroDeClicks + 1
usuario puede cambiar a otra aplicación que, a su vez, dibujará algo en la panta­ Form_Paint
lla. La "diversión" comienza cuando el usuario cambia de la segunda aplicación y End Sub
espera ver la imagen creada por tu programa, cuando en realidad ésta ha sido
Sub Form_Paint ( )
borrada por la segunda aplicación.
Dim I As Integer
Windows resuelve este problema con el evento Paint (pintar), el cual es gestio­
Cls 'Borrar la pantalla; comenzar a escribir
nado por un procedimiento de evento de Visual Basic. Si la presentación en pan­
'desde la parte superior del formulario
talla de una aplicación ha sido tapada por alguna otra ventana, Windows envía
For I = 1 To NumeroDeClicks
un evento Paint a la aplicación cuando recupera el control de la pantalla, permi­
Print "Hola”
tiéndole "redibujar" la presentación en pantalla. El mismo proceso ocurre (sin una Next I
aplicación que interfiera) cuando se minimiza una ventana que contiene dibujos End Sub
o controles y luego se restaura.
Cuando ejecutes esta versión del programa, prueba a minimizar o a ocultar la
Una aplicación sencilla puede demostrar lo que ocurre. Crea un proyecto nuevo. ventana del formulario. Verás que lo que hay en pantalla siempre vuelve a apare­
Añade el siguiente código como procedimiento para el evento Click del formula­ cer cuando se restaura el formulario.
rio, y luego ejecuta la aplicación:

Sub Form_Click ( )
La propiedad AutoRedraw
Print "Hola" Visual Basic también ofrece una técnica más simple para redibujar la pantalla.
End Sub Cada formulario tiene una propiedad AutoRedraw (auto-redibujado) que está es-

286 287
EL LIBRO DEL VISUAL BASIC 10 Programación gráfica

tableada como False por omisión. Si estableces esta propiedad como True, el pantalla, con valores que se incrementan a medida que nos movemos hacia la
propio Visual Basic gestionará todo el redibujado. derecha a lo largo del eje horizontal y hacia abajo a lo largo del eje vertical del
formulario. Las propiedades Top y Left de un objeto específico determinan su
Para probar esto utiliza el código original del programa de ejemplo Hola (sin in­
desplazamiento desde el punto origen (0, 0, el extremo superior izquierdo).
cluir el procedimiento Form_Paint):
Sub Form_Click ( )
Print "Hola"
End Sub

Ahora establece la propiedad AutoRedraw como True y pulsa F5 para ejecutar la


aplicación. Esta vez, el contenido del formulario no se perderá si el formulario es
ocultado o minimizado, incluso, aunque el programa no tenga un procedimiento
Form_Paint.

Esto es, desde luego, un atajo. Cuando se establece la propiedad AutoRedraw


como True, simplemente delegas la responsabilidad de la gestión de la pantalla a
Visual Basic. Visual Basic realiza esta tarea asignando cierta cantidad de memoria
(el número de bits que se requieran para duplicar la imagen de tu formulario).
Cuando se dibuja en el formulario, Visual Basic realiza una copia en esta memo­ Figura 10.1.
ria de seguridad. Cuando necesita restaurar el contenido del formulario, sólo tiene El sistema de coordenadas por omisión de Visual Basic
que escribir la copia que tiene en la memoria de seguridad en la memoria de ví­
deo del ordenador.
Las propiedades Top, Left, Width y Height se miden en twips. Como recordarás
El problema está, pues, en elegir entre un programa más simple que requiere más
del capítulo 5, un twip es una unidad de medida equivalente a 1/1440 pulgadas, o
memoria y un programa complejo que requiere menos memoria. Mientras que es­ 1/
20 puntos. (Un punto, que aproximadamente es
1/
72 pulgadas, es una medida ti­
cribas aplicaciones sencillas, de un solo formulario, probablemente será adecuado
pográfica estándar que se utiliza en la medida de las fuentes.) De esta manera, un
establecer como True la propiedad AutoRedraw. Sin embargo, cuando las aplica­
objeto que tenga 1/2 pulgada de alto y 2 de ancho tendrá sus propiedades Height
ciones que crees adopten un tamaño mayor, no querrás desperdiciar memoria en
y Width establecidas a 720 y 2880, respectivamente (una pulgada equivale a 2,54
mantener copias de seguridad del contenido de los formularios y, por tanto, ten­
centímetros).
drás que escribir procedimientos Form_Paint.

Nota: En aplicaciones que no utilicen métodos gráficos, la propiedad


Si te sientes más a gusto trabajando con otras unidades de medida puedes cam­
AutoRedraw siempre debe establecerse como False. Los cuadros de texto, biar el ajuste de la propiedad ScaleMode (modo de la escala) para que Visual Ba­
etiquetas, cuadros de lista, cuadros combinados y otros controles simila­ sic informe de las coordenadas de pantalla utilizando otras escalas. La figura 10.2
res no se ven afectados por los eventos Paint y, por tanto, no es necesario describe las unidades de medida que corresponden a los diversos ajustes de la
mantener copias de seguridad del formulario. propiedad ScaleMode.

Se puede ver, fácilmente, el efecto de cambiar el ajuste de ScaleMode. Incluye en


Las coordenadas de la pantalla el formulario un objeto de la caja de herramientas y examina sus propiedades
Visual Basic proporciona un sistema de coordenadas por omisión que determina Top, Left, Width y Height. Ahora modifica el ajuste de la propiedad ScaleMode
la posición de los objetos en un formulario. Este sistema, que se ilustra en la figu­ del formulario (no la del objeto), y vuelve a examinar las propiedades del objeto.
ra 10.1, asigna las coordenadas iniciales (0, 0) al extremo superior izquierdo de la Si cambias el ajuste de la propiedad ScaleMode a 5, un control cuya propiedad
Height fuese originalmente 720 (twips) tendrá ahora un ajuste de 0,5 (pulgadas).

288
289
EL LIBRO DEL VISUAL BASIC
10 Programación gráfica

Si estableces la propiedad ScaleMode en 6, el ajuste de Height cambiará a 12,7


(milímetros).

Ajuste de Unidad de
ScaleMode medida

0 Definida por el usuario


1 Twips (20 por punto, 1440 por pulgada) (actúa por omisión)
2 Puntos (72 por pulgada)
3 Pixels (depende del monitor)
4 Caracteres (6 por pulgadas verticalmente, 12 por pulgada Figura 10.3.

horizontalmente) Trabajar con una unidad de medida definida por el usuario


5 Pulgadas
6 Milímetros
define mediante las propiedades ScaleLeft y ScaleTop, las cuales están estable­
7 Centímetros cidas por omisión en 0. Estableciendo nuevos valores para estas propiedades, se
puede definir un nuevo sistema de coordenadas. Por ejemplo, estableciendo Sca­
Figura 10.2. leLeft como 3 y ScaleTop como -4 se cambia el punto de origen de las coorde­
Los ajustes de la propiedad ScaleMode nadas (la esquina superior izquierda) de (0, 0) a (3, -4). Las coordenadas de la
esquina inferior derecha se definen como (ScaleLeft + ScaleWidth, ScaleTop +
El ajuste 4 de ScaleMode, que mide en caracteres, es un poco extraño porque uti­ ScaleHeight). De esta manera, si establecieses ScaleHeight a 17 y ScaleWidth a 10,
liza una escala diferente para medidas verticales y horizontales. Con las demás las coordenadas de la esquina inferior derecha serían (13, 13) en el nuevo sistema
unidades de medida, un objeto que tenga n de ancho y n de alto sería cuadrado. de medidas, como se muestra en la figura 10.4.
Cuando se utilizan caracteres como unidad de medida, un objeto con una altura
Si quisieras ver el formulario como un sistema de coordenadas cartesianas están­
de 6 y una anchura de 12 es un cuadrado de 1 pulgada.
dar con el punto (0, 0) como el centro del formulario, (figura 10.5), tendrías que

ScaleMode 0
Si estableces la propiedad ScaleMode a 0, puedes utilizar tu propia escala de me­
dida. Para definir el sistema particular de medidas se deben establecer las pro­
piedades ScaleHeight y ScaleWidth. Por ejemplo, si estableces ScaleWidth a 500,
le estás diciendo a Visual Basic que use una escala que contenga 500 unidades
entre los extremos horizontales del formulario. Si entonces estableces la propie­
dad Width de una etiqueta a 250, por ejemplo, la etiqueta estará exactamente en
el medio de la anchura del formulario, como se muestra en la figura 10.3. La pro­
piedad ScaleHeight se establece de manera similar. No es necesario que las uni­
dades de altura tengan absolutamente nada que ver con las de anchura.

Además de establecer las escalas vertical y horizontal, también se puede definir


un punto de origen alternativo para la esquina superior izquierda. Esta esquina se

290 291
EL LIBRO DEL VISUAL BASIC
10 Programación gráfica

que calcular cuántos twips a la derecha y hacia abajo tienes que dibujar los ejes,
convertir todos los valores de x y de y en twips y añadirles el desplazamiento
desde el origen. Pero si defines un sistema de coordenadas apropiado al proble­
ma, sólo tendrás que calcular x e y; Visual Basic hará el resto. La figura 10.6 con­
tiene el programa que dibuja este gráfico.

Dado un valor de X , la función FdeX calcula Y de acuerdo con la fórmula. Obser­


va que el resto del programa funciona independientemente de la fórmula de
FdeX. El código principal es el procedimiento Form_Paint, el cual es llamado por
Visual Basic cada vez que necesita actualizar la pantalla.

Figura 10.5. El programa establece primero la escala a un sistema de coordenadas cartesianas


Un sistema de coordenadas cartesianas definido por el usuario estándar mediante la instrucción Scale. Luego, dibuja los ejes usando el método
Line. En su forma más simple, el método Line tiene la siguiente sintaxis:

[objeto.]Line [(x1, y1)]-(x2, y2)


establecer la propiedad ScaleTop en un valor positivo y la propiedad ScaleLeft al
correspondiente valor negativo. Después, tendrías que definir ScaleWidth como
un valor positivo y ScaleHeight como el correspondiente valor negativo. En la fi­
gura 10.5 se ilustra un sistema de coordenadas en el que el extremo superior Function FdeX (ByVal X As Single) As Single
izquierdo se define como (-40, 40), la propiedad ScaleWidth como 80 y la propie­ FdeX = X ^ 2 - X * 3 + 12
dad ScaleHeight como -80. End Function

Desde un programa se puede establecer la escala de un formulario ajustando las


Sub Form_Paint ( )
propiedades individualmente o usando el método Scale. La sintaxis de este méto­
Dim X As Single
do es la siguiente:

[objeto.]Scale [( izquierda , arriba)-( derecha, abajo)] 'Configurar la pantalla


Cls
Observa que esta sintaxis incluye sólo las coordenadas de la esquina superior iz­ Scale (-150, 150)-(150, -150)
quierda y de la esquina inferior derecha. Visual Basic calcula ScaleHeight y Scale­ 'Dibujar los ejes
Width a partir de estos dos puntos. De esta manera, la instrucción que establece Line (-150, 0)-(150, 0)
el formulario de la figura 10.5 sería Scale (-40, 40)-(40, -40). Si se usa el método Line(0, -150)-(0, 150)
'Dibujar el gráfico
Scale sin parámetros se vuelve a la escala de medida en twips y el origen de la
CurrentX = -10
esquina superior izquierda vuelve a ser (0, 0).
CurrentY = FdeX(-10)
For X = -10 To 10
Ecuaciones y cuadrículas Line -(X, FdeX(X))
Next X
Si estas pensando que esta información no tiene mucho valor, te equivocas. En
End Sub
realidad, un sistema de medidas definido por el usuario puede hacerte la vida
mucho más fácil. Supongamos que estás escribiendo un programa que represente
gráficamente funciones matemáticas y que quieres representar la función y = x2 -
Figura 10.6.
3x + 12 en el dominio -10 <=x<=10. Si usas la escala y origen estándar tendrás El código del programa para representar gráficamente una ecuación

292
293
EL LIBRO DEL VISUAL BASIC 10 Programación gráfica

Dibuja una línea que comience en (x1, y1) y termine en (x2, y2).
Sub Form_Paint ( )
Finalmente, el programa dibujará el gráfico utilizando una variante del método Dim I As Integer
Line que no especifica punto de comienzo. En este caso, Visual Basic empezará
desde la última posición conocida, cuyas coordenadas están almacenadas en las 'Configurar la pantalla
propiedades CurrentX y CurrentY del formulario. CurrentX y CurrentY sólo es ne­ Cls
Scale (0, 0) -(8, 8)
cesario que se establezcan una vez en el programa; después de la ejecución de
'Dibujar la cuadricula
cada instrucción Line, Visual Basic actualiza el valor de las propiedades.
For I = 1 To 7
Puedes abrir un formulario nuevo, introducir este código y ejecutarlo sin más Line (0, I) -(8, I) 'Horizontal
controles o rutinas. Un ejemplo de la salida se muestra en la figura 10.7. Line (I, 0) -(I, 8) 'Vertical
Next I
End Sub

Figura 10.8.
El código del programa para dibujar una cuadrícula de 8x8

Figura 10.7.
La representación gráfica de la Junción FdeX

Observa que el código de la figura 10.6 usa el valor por omisión (1) para Step. Si
quieres que el gráfico sea más fino añade una cláusula Step a la declaración For
como se muestra aquí:
Figura 10.9.
For X = -10 To 10 Step 0,1
Una cuadrícula de 8 x 8 dibujada por el código del programa de la figura 10.8
Incluso, aunque no hayas representado gráficamente una función desde el institu­
to, podrás darte cuenta de que un sistema de medida definido por el usuario es Como se ha mencionado antes, todas las propiedades y métodos que se tratan
de gran ayuda para tareas como dibujar un tablero de ajedrez o construir una aquí también se aplican a los cuadros de dibujo, de la misma manera que a los
cuadrícula para un juego como el Go. Se puede definir una escala personalizada formularios. Cada cuadro de dibujo, por ejemplo, puede tener su propio sistema
que sea del tamaño de la cuadrícula —por ejemplo, de 0 a 8 (o de 1 a 9) para un de coordenadas definido por las propiedades de la escala. Debes incluir el nom­
tablero de ajedrez. Luego, en lugar de tener que calcular las posiciones de las lí­ bre del control cuadro de dibujo cuando uses estas propiedades y métodos; en
neas, simplemente puedes dibujarlas en las posiciones 0, 1, 2 y así sucesivamente. caso contrario, se aplicarán por omisión al formulario. Por ejemplo, si tienes un
El código que se muestra en la figura 10.8 dibuja la cuadrícula de 8 por 8 que objeto en el cuadro de dibujo cuya propiedad Name sea MiDib, puedes dibujar
aparece en la figura 10.9. una cuadrícula de 8 por 8 con el código que se muestra en la figura 10.10.

294 295
EL LIBRO DEL VISUAL BASIC 10 Programación gráfica

Sub DibujarCuadricula ( ) Sub Form_Paint ( )


Dim I As Integer Dim X As Single

'Configurar el cuadro de dibujo 'Configurar la pantalla


MiDib.Cls Cls
MiDib.Scale (0, 0)-(8, 8) Scale (-150, 150)-(150, -150)
'Dibujar la cuadricula 'Dibujar los ejes
For I = 1 To 7 Line (-150, 0)-(150, 0), RGB(0, 255, 0)
MiDib.Line (0, I) - (8, I) 'Horizontal Line (0, -150)-(0, 150), RGB( 0, 255, 0)
MiDib.Line (I, 0)-(I, 8) 'Vertical 'Dibujar el gráfico
Next I CurrentX = -10
End Sub CurrentY = FdeX(-10)
For X = -10 To 10
Line -(X, FdeX(X))
Next X
Figura 10.10.
End Sub
El código del programa para dibujar una cuadrícula de 8 x 8 en un cuadro de dibujo

Figura 10.11.
Colores El código del programa para emplear colores en el gráfico usando el método Line
Volvamos por un momento al gráfico que se muestra en la figura 10.7. Para dis­
tinguir las líneas del gráfico de la de los ejes, sería de utilidad dibujar a estos en
otro color. El método Line permite usar un parámetro opcional para establecer el
color de la línea que estás dibujando. De forma alternativa puedes establecer la Sub Form_Paint ( )
propiedad ForeColor, la cual determina el color de cualquier cosa que se dibuje Dim X As Single
en el formulario (incluyendo el texto impreso en él). Las figuras 10.11 y 10.12
'Configurar la pantalla
contienen el código que dibuja los ejes del gráfico en verde y la línea que repre­
Cls
senta a la función en el color por omisión. El código de la figura 10.11 especifica
Scale (-150, 150)-(150, -150)
el color con el método Line; el de la figura 10.12 establece la propiedad ForeCo­ 'Dibujar los ejes
lor del formulario. GuardarColor = ForeColor
ForeColor = RGB(0, 255, 0)
Ambas rutinas utilizan la función RGB para crear un valor de color. Esta función
Line (-150, 0)-(150, 0)
(cuyo nombre no es más que un acrónimo de Red, Green, Blue: rojo, verde, azul
Line(0, -150)-(0, 150)
en inglés) requiere que se le pasen tres argumentos, cada uno de los cuales es un 'Dibujar el gráfico
número entero en el rango de 0 a 255. El primer argumento especifica la intensi­ ForeColor = GuardarColor
dad del color rojo, el segundo la intensidad del verde y el tercero la intensidad
del azul. Un argumento con un valor 0 indica la total ausencia del color; 255 indi­
ca la mayor intensidad. La función devuelve un entero largo que representa el va­ Figura 10.12. (continúa)
lor RGB del color. La figura 10.13 muestra una lista de algunos colores comunes y El código para emplear colores en el gráfico usando la propiedad
sus ajustes RGB. ForeColor del formulario

296 297
EL LIBRO DEL VISUAL BASIC
10 Programación gráfica

Figura 10.12 continuación claración ForeColor = ACTIVE_TITLE_BAR establece que el color de dibujo en el
formulario sea el color especificado en el Panel de control para las barras del títu­
Line (-150, 0)-(150, 0)
lo de las ventanas. El archivo CONSTANT.TXT define estas constantes globales
Line(0, -150)-(0, 150) como se muestra en la figura 10.14. (Observa que las definiciones de las constan­
'Dibujar el gráfico tes de la figura 10.14 comienzan por &H, lo que indica que los valores aparecen
ForeColor = GuardarColor en notación hexadecimal.) Usar estas constantes, en lugar de colores fijos, te ase­
CurrentX = -10 gura que tu aplicación se adaptará al mapa de colores definido por el usuario y te
CurrentY = FdeX(-10) ayudará a que tus aplicaciones tengan una apariencia más profesional.
For X = -10 To 10
Line -(X, FdeX(X))
Next X
Nombre de la constante Valor Descripción
End Sub
SCROLL_BARS &H80000000 El color de la zona gris de las
barras de desplazamiento
DESKTOP &H80000001 El color del escritorio

ACTIVE _TITLE_BAR &H80000002 El color de la barra del título de la


Color Ajuste RGB
ventana activa

Negro RGB(0, 0, 0) INACTIVE_TITLE_BAR &H80000003 El color de la barra del título de


una ventana inactiva
Rojo RGB(255, 0, 0)
MENU_BAR &H80000004 El color del fondo del menú
Verde RGB(0, 255, 0)
WINDOW_BACKGROUND &H80000005 El color del fondo de una ventana
Azul RGB(0, 0, 255)
WIN DOW_FRAME &H80000006 El color del marco de la ventana
Blanco RGB(255, 255, 255)
MENU_TEXT &H80000007 El color del texto en los menús
Amarillo RGB(255, 255, 0) El color del texto en las ventanas
WINDOW_TEXT &H80000008
Violeta RGB(255, 0, 255) TITLE_BAR_TEXT &H80000009 EL color del texto en la barra del
Cian RGB(0, 255, 255) título

ACTIVE_BORDER &H8000000A El color del borde de la ventana


Figura 10.13. activa
Ajustes RGB para algunos de los colores más habituales INACTIVE_BORDER &H8000000B El color del borde de una ventana
inactiva
Nota: Aunque la función RGB permite un máximo de 16 millones de
APPLICATION_WORKSPACE &H8000000C El color del fondo de aplicaciones
colores, tu hardware de vídeo impone ciertas restricciones. Una VGA MDI (interface de múltiples
normal, por ejemplo, sólo permite mostrar simultáneamente 16 colores. documentos)

HIGHLIGHT &H8000000D El color del elemento seleccionado


Además de ajustar la propiedad ForeColor, también se puede alterar el color del
de un control
fondo del formulario estableciendo la propiedad BackColor. Si cambias el valor
HIGHLIGHT_TEXT &H8000000E El color del texto seleccionado de
de esta propiedad durante la ejecución, se borrarán todos los gráficos que hubie­
un control
ra en el formulario.

El archivo CONSTANT.TXT también incluye constantes de colores especiales que Figura 10.14. (continúa)
corresponden a los ajustes del Panel de control de Windows. Por ejemplo, la de­ Las constantes de colores globales definidas en el archivo CONSTANT.TXT

298 299
EL LIBRO DEL VISUAL BASIC
10 Programación gráfica

Figura 10.14. continuación


Otras propiedades y métodos de dibujo
Nombre de la constante Valor Descripción La propiedad DrawWidth determina la anchura de las líneas que se dibujen. El
ajuste de esta propiedad siempre se mide en pixels. De esta forma, un ajuste de 1
BUTTO N_FACE &H8000000F El color del sombreado de la parte dibuja la línea más estrecha, con una anchura de 1 pixel. Un ajuste de 2 dibujará
delantera de un botón una línea que sea más ancha en un pixel, y así sucesivamente.
BUTTON_SHADOW &H80000010 El color del sombreado del borde
de un botón Las propiedades DrawStyle y DrawMode afectan a la manera en la que las líneas
GRAY_TEXT &H80000011 El color del texto atenuado
aparecen en la pantalla. DrawStyle es similar a la propiedad BorderStyle de un
(desactivado) (se establece en 0 si objeto. Los ajustes del 0 al 6 especifican si la línea dibujada será sólida, de pun­
el controlador de pantalla actual tos, de guiones o alguna combinación de esos estilos.
no admite el gris sólido)
La propiedad DrawMode es un poco más compleja. Sus 16 ajustes determinan
BUTTON_TEXT &H80000012 El color del texto en los botones
cómo interactúa la imagen que se está dibujando con lo que ya hay en la panta­
de comando
lla. Por ejemplo, el ajuste por omisión de DrawMode (13 - Copy Pen) dibuja la
imagen encima de cualquier gráfico existente. Con este ajuste, ejecutar la instruc­
ción Line (O, 0,5)-(2, 0.75) dos veces, una detrás de otra, produce el efecto de
que sólo se dibuja una línea, porque la segunda se dibuja directamente sobre la
primera tapándola. Sin embargo, si se utiliza el valor 6 - Invert en la propiedad
Números hexadecimales DrawMode, la primera instrucción Line dibujaría una línea en el color inverso del
El sistema de numeración hexadecimal (base 16) utiliza 16 símbolos para fondo, y la segunda lo invertiría otra vez, produciendo, esencialmente, el efecto
de que la línea desaparezca. Otros ajustes de la propiedad DrawMode combinan
representar valores numéricos: los dígitos del 0 al 9 y las letras A (equiva­
lente al 10 decimal), B, C, D, E y F (equivalente al 16 decimal). Como se los colores de maneras diferentes y permiten crear efectos especiales; consulta el
explicó en el capítulo 2 en relación con otros sistemas de numeración, el manual de referencia de Visual Basic, si necesitas más información.
valor de cada posición en un número hexadecimal (o hex) se incrementa a Las propiedades FillColor (color de relleno) y FillStyle (estilo de relleno) afectan a
razón de potencias de 16. Por ejemplo, el número hex 1A3 representa la la apariencia de los círculos y polígonos rellenos. Estas propiedades son similares
suma de lx 162(256), 10xl61(l60) y 3xl60(3); de esta manera, su equivalen­ a las propiedades del mismo nombre de los controles Shape que vimos en el ca­
te decimal es el 419. pítulo 5.
La notación hexadecimal se usa habitualmente en programación como una Hay tres métodos de Visual Basic que tienen que ver con el dibujo: PSet, que
manera compacta de representar los números binarios utilizados por el or­ pone un punto (o pixel) de un color especificado; Line, que permite dibujar lí­
denador. Como cualquiera de los 16 dígitos se puede representar en 4 bits, neas y rectángulos; y Circle, que permite crear círculos, arcos y elipses. (Tratare­
se pueden representar 2 dígitos hexadecimales (uno para cada 4 bits) en mos estos métodos con más profundidad dentro de un momento.) Además, el
uno de los bytes de 8 bits en los que se basan la memoria y los sistemas método Cls borra un formulario o un cuadro de dibujo; y el método Point, que
de almacenamiento. De esta forma, 1 byte de almacenamiento puede con­ trabaja como una función, devuelve el color de un punto determinado.
tener uno de 256 números hexadecimales diferentes (del 0 al FF).
El método Cls borra el texto y los gráficos del objeto especificado —dicho con
Puedes utilizar un valor hexadecimal en cualquier lugar donde Visual Basic más precisión, pone todos los puntos del color del fondo (el color establecido
acepte un número. Simplemente, debes anteponer el prefijo &H para indi­ mediante la propiedad BackColor). Como los otros métodos que se tratan en este
car que el valor aparece en notación hexadecimal. apartado, Cls actúa por omisión sobre el formulario actual si no se especifica un
objeto.

300 301
EL LIBRO DEL VISUAL BASIC 10 Programación gráfica

El método Point tiene la siguiente sintaxis: corresponden al punto de finalización. También puedes especificar el color de la
[objeto.]Point (x, y) línea con este método.

Devuelve el valor RGB del color del pixel situado en las coordenadas (x, y), don­ Cuando se incluye la letra B (de box, cuadrado) en la instrucción Line, se dibuja
de x es la posición con respecto al eje horizontal e y la posición con respecto al un rectángulo en lugar de una línea, en el que los dos conjuntos de coordenadas
eje vertical. Las coordenadas se miden en las unidades que se especifiquen me­ representan las esquinas opuestas del rectángulo. El rectángulo se rellenará con el
diante la propiedad ScaleMode del formulario o del cuadro de dibujo. color establecido por la propiedad FillColor y con el estilo establecido por la pro­
piedad FillStyle. Si también se incluye la letra F en la instrucción Line, el rectán­
El método PSet gulo se rellenará con el color utilizado para dibujarlo. No se puede especificar la
F, a no ser que también se incluya la B.
Para poner un solo punto de un color en particular se usa el método Pset. Este
método tiene la siguiente sintaxis: En las figuras 10.15, 10.16 y 10.17 se muestran algunos ejemplos de dibujos reali­
zados con la instrucción Une. Todos usan la declaración Scale (2, -2)-(-2, 2) y la
[objeto.]PSet [Step](x, y)[, color]
instrucción Une que se muestra en la figura. (Recuerda que utilizamos el punto
Las coordenadas (x, y) se refieren a una posición absoluta, medida en las unida­ como separador decimal.)
des especificadas por la propiedad ScaleMode del objeto en el que se está dibu­
jando. Sin embargo, si estas coordenadas están precedidas por la palabra clave El método Circle
Step , representan el desplazamiento relativo con respecto a la posición actual El método Circle es el más complejo de los métodos de dibujo. Se puede utilizar
(dada por las propiedades CurrentX y CurrentY). Por ejemplo, Step(2, 10) se re­ para dibujar círculos, elipses, arcos y "porciones de tarta". (Una porción de tarta
fiere a una posición desplazada de la posición actual en dos unidades, horizontal­ es un arco con líneas que conectan los extremos del arco en el centro.)
mente y en diez, verticalmente —en otras palabras, la posición (CurrentX + 2,
CurrentY + 10). La sintaxis completa del método Circle es el siguiente:

Puedes poner el punto de cualquier color. Si no especificas ningún color, el mé­ [object.]Circle [Step](x, y), radio[, [color][, [comienzo][, [final][, aspecto]]]]
todo PSet asignará al punto en el color establecido por la propiedad ForeColor. Siempre que se utilice el método Circle se deberán especificar las coordenadas
Este método puede ser especialmente útil para borrar un solo pixel: simplemente, del centro (x, y) del círculo; este método no utiliza por omisión la posición actual.
haz que el pixel tenga el color del fondo (el ajuste de la propiedad BackColor).

Observa que el tamaño y la apariencia del punto se ven afectados por cómo ha­
yas establecido las propiedades DrawWidth y DrawMode. Por ejemplo, cuando la
propiedad DrawWidth está establecida como 1, el método PSet cambia el color
de un solo pixel; pero cuando es mayor que 1, el punto es proporcionalmente
más grande y está centrado en las coordenadas especificadas.

El método Une
El método Line, que dibuja una línea o un rectángulo, usa esta sintaxis:

[objeto.]Line[[Step](x1, y1)]-[Step](x2, y2)[, [color][, B[F]]]

El primer conjunto de coordenadas, (x1, y1), especifica el punto de comienzo de


la línea. Si omites las coordenadas de comienzo, la línea empezará en la posición
Figura 10.15.
actual. Debes incluir el segundo grupo de coordenadas (x2, y2), que son las que
Dibujar una línea con el método Line

302 303
EL LIBRO DEL VISUAL BASIC
10 Programación gráfica

Figura 10.16.
Dibujar un rectángulo con el método Line Figura 10.18.
Dibujar una elipse "Laurel" con el método Circle

todas las comas que intervienen en la instrucción Círculo, incluso aunque no es­
pecifiques valores para todos los parámetros.

Si quieres dibujar un arco en lugar de un círculo o una elipse completa, especifi­


ca los parámetros comienzo y final en la instrucción Circle. Estos valores deberán
suministrarse en radianes (busca en el armario aquel viejo libro de geometría) y
podrán variar de 0 a 2 pi. La figura 10.20 muestra los valores en radianes de cier­
tos puntos estratégicos que hay a lo largo de un círculo.

Si te sientes más a gusto especificando grados en lugar de radianes, define la


constante PI y usa la siguiente función:

Figura 10.17.
Dibujar un rectángulo relleno con el método Line

Cuando el círculo se ha dibujado, CurrentX y CurrentY se establecen como el


punto central.

Para dibujar un círculo, simplemente especifica un origen y un radio. Para "aplas­


tar" el círculo y convertirlo en una elipse, debes cambiar el ratio del aspecto. Los
círculos tienen un ratio de aspecto de 1.0. Los valores de aspecto que son mayo­
res de 1.0 crean elipses que son altas y estrechas; los valores de aspecto que son
menores de 1.0 crean elipses que son bajas y anchas. De esta manera, un valor
de aspecto de 4.0 dibujará una elipse "Laurel", y un valor de 0.4 dibujará una elip­
Figura 10.19.
se "Hardy", como muestran las figuras 10.18 y 10.19. Observa que debes escribir
Dibujar una elipse "Hardy" con el método Circle

304
305
El LIBRO DEL VISUAL BASIC
10 Programación gráfica

Figura 10.20. Figura 10.21.


Dibujar una porción de tarta con el método Circle
Puntos a lo largo de un círculo especificados en radianes

Function GradosARadianes (Grado As Single) As Single


GradosARadianes = Grado * PI / 180.0
End Function

Ahora, todo lo que tienes que hacer es pasar a GradosARadianes un valor en gra­
dos, y la función devolverá el correspondiente valor en radianes.

Si quieres dibujar porciones de tarta debes especificar valores negativos para co­
mienzo y final en la instrucción Circle. Los valores negativos en estos parámetros
producen que Visual Basic dibuje un radio con el ángulo especificado por el
valor absoluto del parámetro. Tanto comienzo como final deben ser negativos
para que se dibujen los dos radios. Visual Basic no rellenará un arco o una por­
ción de tarta que no esté cerrada. En las figuras 10.21 y 10.22 se muestran algu­ Figura 10.22.
nos ejemplos. Dibujar un círculo menos una porción de tarta con el método Circle

El objeto Printer
hay un método Cls, así que no puedes borrar lo que hayas escrito en la impreso­
Usando muchos de los mismos métodos que se emplean para escribir en un for­
ra. Usa el método NewPage para comenzar una página nueva, y el método End-
mulario, puedes hacer que tu programa escriba directamente en una impresora.
Doc para finalizar la tarea de impresión. Puedes leer la propiedad Page (página)
Visual Basic admite métodos para el objeto Printer (impresora), que dibujan tanto
del objeto Printer para saber el número de la página actual.
texto (el método Print) como gráficos (los métodos Line, Circle y PSet). Puedes
imaginarte que escribir en una impresora es como escribir en un formulario espe­ En la figura 10.23 se ha modificado el ejemplo gráfico que se mostró por primera
cial cuyo tamaño es el del papel de la impresora. vez en la figura 10.6 para que la función se imprima en la impresora.
Como se puede aplicar el método Scale al objeto Printer, puedes trabajar con Cuando estés dibujando en un formulario o en la pantalla y termines todos los di­
cualquier sistema de coordenadas con el que te sientas a gusto. Por supuesto, no bujos necesarios, puedes llamar simplemente al método PrintForm del formulario

306 307
EL LIBRO DEL VISUAL BASIC
10 Programación gráfica

para enviar una copia del mapa de bits del formulario a la impresora. Si haces
esto no es necesario que llames a Printer.EndDoc; el método PrintForm es un O quizás podrías desarrollar un programa en un ordenador con una tarjeta de alta
proceso completo para documentos de una página. resolución. ¿Qué sucedería si el usuario tuviese un sistema de baja resolución? En
tu ordenador, el texto de 6 puntos puede quedar bien, pero en un ordenador
portátil podría no ser legible. Si tienes pensado escribir programas para distribuir­
los, es posible que quieras examinar las propiedades TwipsPerPixelX y TwipsPer-
Sub ImprimirGrafico ( )
PixelX de los objetos Screen y Printer. (El objeto Screen representa a la pantalla
Dim X As Single
entera. Un programa puede examinar las propiedades del objeto Screen para de­
Printer.Scale (-150, 150)-(150, -150) terminar asuntos como qué fuente usar y dónde poner los cuadros de diálogo.)
'Dibujar los ejes
Printer.Line (-150, 0) -( 150, 0)
Printer.Line(0, -150)-(0, 150)
'Dibujar el gráfico
Printer.CurrentX = -10
Printer.CurrentY = FdeX(-1O)
For X = -10 To 10
Printer.Line -(X, FdeX(X))
Next X
Printer.EndDoc
End Sub

Figura 10.23.
El código de un programa para representar gráficamente una ecuación en la impresora

Consideraciones sobre el hardware para los programas gráficos


Si estás interesado en escribir programas gráficos que sean realmente útiles para
otras personas, debes considerar cuidadosamente el diseño de tus programas —y,
particularmente, debes tener en cuenta el hardware sobre el que los programas
podrán funcionar. Por ejemplo, como ya se trató antes en este capítulo, la deci­
sión de usar la propiedad AutoRedraw o un procedimiento Paint para redibujar la
pantalla puede ser importante. Recuerda que la cantidad de memoria requerida
por Visual Basic para mantener copias de las imágenes de tus formularios depen­
den del hardware sobre el que el programa esté funcionando. En un caso extre­
mo, por ejemplo, podrías desarrollar un programa para un sistema monocromo,
pero el usuario podría tener una tarjeta gráfica de 1280 por 1024 puntos de 24
bits, cuyos requerimientos de memoria serían substancialmente más grandes que
los de tu sistema. Usar AutoRedraw en un caso así podría agotar fácilmente la
memoria disponible.

308
309
11
Bases de datos
y cuadrículas
El capítulo 5 te presentó las herramientas Data y Grid, y te describió brevemente
cómo se usan para obtener el acceso a bases de datos o para presentar datos.
Este capítulo describe ambas herramientas con más detalle y proporciona ejem­
plos de su uso. El capítulo también cubre conceptos más avanzados y técnicas de
programación más complejas que las que has utilizado en los capítulos previos. Si
eres nuevo en el ámbito de la programación es posible que prefieras saltarte los
dos siguientes capítulos y que quieras ir directamente al capítulo 13, "Una aplica­
ción para Windows completa".

¿Qué es una base de datos?


Dicho en pocas palabras, una base de datos es cualquier conjunto de informa­
ción. Sin embargo, en la jerga informática habitual, una base de datos es un con­
junto de información relacionada, que se almacena de manera estructurada y bien
definida. Por ejemplo, la información sobre las comadrejas copetudas alemanas
del capítulo 9 es una base de datos. Tiene columnas en las que aparecen distintas
clases de información sobre el sujeto, y filas que describen todos los atributos de
un único sujeto. Cada fila es un registro, y en este caso, cada fila describe a una
comadreja. En la terminología de las bases de datos, una tabla es un conjunto de
registros que tienen la misma estructura. Un grupo de tablas relacionadas compo­
nen la base de datos. En el capítulo 9, la base de datos estaba compuesta por una
sola tabla. La figura 1 1 . 1 ilustra la estructura de la base de datos de comadrejas.

Mantener controlada información de este tipo es una tarea tan habitual que se
han desarrollado aplicaciones conocidas como sistemas de gestión de bases de da-

311
11 Bases de datos y cuadrículas
:l libro del visual basic

Authors Publishers
Número Longitud
registro Nombre Color Peso Longitud FechaNacimiento ColorCopete Copete
Au_ID Author

1 Siegmund Marrón 18 11 03/09/93 Marrón 6

2 Sieglinde Marrón claro 14 10 10/02/94 Negro 6

3 Siegfried Marrón 12 8 13/09/94 Marrón 2

4
________

Titles
Tabla
Year
Figura 11.1.
Title Published Au_ID ISBN PublD
La estructura de la base de datos de comadrejas

tos (SGBD). Estas aplicaciones ayudan a simplificar la creación y el mantenimien­


to de las bases de datos. Algunas aplicaciones SGBD de las que es posible que
hayas oído hablar son: Microsoft Access, Microsoft Fox Pro, Borland Paradox,
Borland dBase y Claris FileMaker. Las empresas utilizan a menudo programas
SGBD para organizar y actualizar sus registros de empleados, información de nó­
minas, listas de clientes, etcétera.

En este capítulo, trabajarás con una base de datos de ejemplo que viene con Vi­ Figura 11.2.
sual Basic —BIBLIO.MDB. Es una base de datos de Microsoft Access que contie­ La base de datos BIBLIO
ne datos bibliográficos sobre libros que tienen que ver con bases de datos y con
Visual Basic (son libros editados en Estados Unidos, por lo que están en inglés).
La figura 11.2 muestra la estructura de la base de datos. La referencia de una tabla a otra mediante un campo común se denomina rela­
ción. Este término es lo que da origen a la expresión base de datos relacional. Se
La base de datos BIBLIO está compuesta por tres tablas. La tabla Authors (auto­
pueden construir tablas enteras de campos relacionales, todos los cuales se refie­
res) contiene los nombres de los autores y sus números de identificación. La tabla ren a campos reales. Los campos relacionales también se pueden referir a otros
Publishers (editoriales) es un conjunto de registros que describen a los editores,
campos relacionales, los cuales, al final, se referirán a los datos reales.
incluyendo un código de identificación, el nombre de la empresa de la que son
filial, el lugar donde radican y el número de teléfono. Las tablas Authors y Pu­ En el lenguaje de las bases de datos, una consulta es una solicitud de informa­
blishers contienen los datos de fuente reales. La tabla Titles, aunque su estructura ción que se realiza a las tablas que componen la base de datos. Cuando se con­
no parezca distinta de la estructura de las otras dos, es diferente. Contiene una sulta a una base de datos (a través del programa SGBD o a través de tu propia
lista de libros publicados —los datos de servicio— y hace referencia a las tablas aplicación) hay que definir el conjunto de datos del que se desea solicitar infor-
Authors y Publishers mediante números de identificación. Contiene algunos datos mación, estrechando de esta manera el ámbito de la solicitud.
fuente, pero también hace referencia a las otras tablas a través de campos comu­
El resultado de una consulta es siempre algo que tiene el aspecto de otra tabla.
nes, como se ilustra en la figura 11.3.
Es una tabla virtual o una vista lógica de los datos que se han solicitado. Cuando

312
313
EL LIBRO DEL VISUAL BASIC
11 Bases de datos y cuadrículas

Year Company
Title Published Au_ID ISBN Name Name

Running VB for Windows 1993 33 1556154771 MS PRESS Microsoft

Figura 11.4.
Una posible vista lógica de las tablas que componen la base de datos BIBLIO

Acceder y mostrar datos usando Visual Basic


En algún momento puede que te encuentres creando una aplicación que haga
uso de información que ya esté contenida en una base de datos. Sería posible du­
plicar la información de esa base de datos en un archivo de acceso aleatorio de
Visual Basic; sin embargo, ello sería ineficiente y potencialmente peligroso. Sería
ineficiente, porque significaría que habría varias copias de los datos ocupando es­
pacio en el disco. Sería peligroso, porque tener más de una copia significa que
los conjuntos de datos podrían dejar de estar sincronizados unos con otros. Es
Figura 11.3.
decir, la información podría ser actualizada en un lugar, pero no en los datos co­
La tabla Titles hace referencia a las tablas Autbors y Publishers, mediante los números
rrespondientes a la copia.
de identificación de los autores y de las editoriales
Una solución mucho mejor es la de mantener una sola copia de los datos de la
base de datos y hacer que tu aplicación de Visual Basic acceda a ella. Este acceso
se define el conjunto de datos, realmente se están estableciendo relaciones entre se puede configurar creando un control Data (datos) en la aplicación de Visual
las tablas de la base de datos. La vista lógica resultante no existe de esa forma en Basic. La figura 11.5 muestra el botón de la herramienta Data en la caja de herra­
la base de datos, pero se refiere a parte de los datos, algunos de los cuales pue­ mientas y un control Data como aparece en el formulario.
den ser identificados por otras relaciones que haya dentro de la base de datos,
que sí existen allí. Por tanto, son las relaciones las que permiten construir vistas Nota: Antes de utilizar la herramienta Data en Visual Basic, es necesa­
lógicas de los datos. La figura 11.4 muestra una posible vista lógica de la base de rio que actives la posibilidad de compartir archivos, a no ser que estés
datos BIBLIO. usando Windows para Trabajo en Grupo. Si esta posibilidad no está ac­
tivada en tu ordenador, debes salir de Windows e introducir el comando
Acceder a los datos y mostrarlos son dos cosas diferentes. En el siguiente aparta­
share en el indicador del MS-DOS. Luego, puedes volver a arrancar Win­
do, aprenderás a crear una base de datos en Visual Basic que realizará ambas
dows y Visual Basic. Es posible que quieras poner el comando share en el
operaciones.
archivo AUTOEXEC.BAT.

314
315
LIBRO DEL VISUAL BASIC 1 1 Bases de datos y cuadrículas

El control Data
El control Data tiene varias propiedades que describen la conexión entre la apli­
cación Visual Basic y la base de datos a la que quieres acceder. Una aplicación
puede tener más de un control Data; de hecho, es necesario un control Data por
cada conjunto de datos definido. Cada control Data accede cada vez a un solo re­ Figura 11.5.
gistro, al cual se le llama el registro actual. Después de establecer estas propieda­
des se pueden ligar otros controles de Visual Basic. Cuando se modifica el
registro actual (haciendo clic directamente en el control Data o mediante instruc­
ciones en el programa), esos controles muestran los datos que hay en el registro
actual. La versión actual de Visual Basic permite intercambiar datos con los si­
guientes SGBD:

■ Microsoft Access

■ Microsoft FoxPro Figura 11.6.


El formulario Biblio recién creado
■ Borland dBase

■ Borland Paradox En esta fase sólo has configurado la apariencia del formulario. Para hacer la cone­
xión con la base de datos, debes establecer una cuantas propiedades adicionales
Realizar la conexión del control Data. Las propiedades que se muestran a continuación se pueden es­
tablecer durante la fase de diseño o durante la ejecución del programa. Si tu apli­
Construyamos ahora una aplicación nueva que pueda acceder a la base de datos
cación siempre va a acceder a la misma base de datos, establécelas durante la
BIBLIO. La configuraremos de manera que cuando se haga clic en el control
fase de diseño; Visual Basic podrá realizar una cierta comprobación de errores
Data, se muestren a la vez el numero de identificación del autor y el título del li­
adicional si estableces las propiedades en la fase de diseño.
bro de cada registro de las base de datos. Primero, incluye un control Data en la
parte superior del formulario, y luego añade dos etiquetas y dos cuadros de texto. Selecciona el control Data (dtaBiblio) en la ventana Properties y establece las pro­
Establece las propiedades como se muestran en la tabla que viene a continua­ piedades que se definen debajo:
ción, y tu formulario deberá parecerse al que se muestra en la figura 11.6.
Connect (conexión). Esta propiedad le dice a Visual Basic en qué formato es­
tán los datos. Para este ejemplo, establece la propiedad como una cadena
Objeto Propiedad Ajuste
vacía, lo que indica que la base de datos está en el formato de Microsoft
Form1 Caption Base de datos: BIBLIO Access. Otros valores legales son "foxpro 2.5;", "paradox;", y "dbase IV;".
Name Biblio Consulta en el Manual del Programador de Visual Basic todos los formatos
Data1 Caption Base de datos de libros de bases de datos aceptados.
Name dtaBiblio
DatabaseName (nombre de la base de datos). Esta propiedad identifica al ar­
Labell Caption Autor
chivo de base de datos. Haz clic en los puntos suspensivos (...) de la ven­
Label2 Caption Título
tana Properties y elige BIBLIO.MDB. Debe estar en el mismo directorio
Text1 Name txtAutor que el programa Visual Basic.
Text [ninguno]
Text2 Name txtTitulo RecordSource (fuente del registro). Esta propiedad le dice a Visual Basic de
Text [ninguno] dónde obtener los datos. Puede ser el nombre de una tabla o puede identi-

316 317
EL LIBRO DEL VISUAL BASIC 11 Bases de datos y cuadrículas

ficar una vista lógica. Por ahora, establece RecordSource como "Titles" para Por ejemplo, la aplicación actual es de alguna manera menos útil de lo que debe­
obtener los datos de la tabla Titles (títulos). ría, porque muestra el número de identificación del autor del libro en lugar de
mostrar su nombre. Podemos solucionar este problema modificando el conjunto
de registros para que se apoye en una vista relacional de la base de datos. Detén
Ligar controles de visualización con el control Data
la aplicación y establece en la ventana Properties la propiedad RecordSource del
Tu aplicación Visual Basic ya tiene suficiente información para recuperar datos de control Data de esta manera:
la base de datos. Con un pequeño añadido, la aplicación también mostrará los
select Author, Title from Authors, Titles where
datos en la pantalla. Los controles Check Box, Image, Label, Picture Box y Text
Authors.Au_ID = Titles.Au_ID
Box se pueden enlazar directamente con los campos de la tabla a la que accede
el control Data. Los controles Image y Picture Box se pueden usar para mostrar Esto es una instrucción SQL que crea una nueva vista de la base de datos (y defi­
las imágenes almacenadas en la base de datos; un control Check Box muestra va­ ne un nuevo conjunto de registros) combinando las tablas Authors y Titles me­
lores booleanos; y los controles Label y Text Box pueden utilizarse para presentar diante la relación Au_ID y seleccionando dos columnas: Author y Title. Debes
información numérica o de texto. En todos estos controles, las propiedad Data- modificar la propiedad DataField del cuadro de texto txtAutor a Author, porque la
Source los conecta con un control Data, y la propiedad DataField (campo) identi­ vista recién creada no tiene un campo llamado Au_ID. (Puedes aprender más so­
fica el nombre del campo de la tabla al que hay que ligar el control. bre SQL en el manual de tu SGBD, o puedes recorrer la base de datos para des­
cubrir algunos de los libros que se han publicado sobre el tema.)
Haz clic en el cuadro de texto txtAutor y establece su propiedad DataSource
como dtaBiblio. Establece la propiedad DataField como Au_ID. Luego, haz clic en Ahora ejecuta la aplicación de nuevo. Verás que en este caso obtienes el nombre
el cuadro de texto txtTitulo y establece sus propiedades DataSource como dtaBi­ del autor en lugar de su número de identificación (Au_ID). Cuando accedas a
blio y DataField como Title. Ejecuta la aplicación. A medida que hagas clic en el una serie de datos en los que el conjunto de registros esté definido por una con­
control Data, los registros de la base de datos aparecerán en los campos de texto, sulta en lugar de estarlo por una tabla completa, puede que no se te permita ac-
¡y tú no has tenido que escribir ni una sola línea de código! tualizar los datos.

También se pueden editar los datos desde la aplicación de Visual Basic, y los re­
sultados se escribirán en la base de datos original. Control mediante el programa
Nota: Es importante no modificar datos que no te "pertenecen". Si estás Además de seleccionar un registro usando el control Data, puedes usar métodos
creando una aplicación para acceder a las bases de datos de la empresa, que logran los mismos objetivos desde el programa. De hecho, se puede estable­
asegúrate de que permites el acceso sólo a aquellos usuarios que tienen cer la propiedad Visible del control Data como False y ejecutar toda la manipula­
permiso para modificar la tabla. Consulta el Manual del Programador ción de los datos bajo el control del programa. Los siguientes métodos tienen
de Visual Basic si necesitas información sobre las propiedades Exclusive efecto sobre el control Data:
(exclusivo), Options (opciones)y ReadOnly (sólo lectura).
Refresh (refrescar). La base de datos se abre para ser utilizada, o se cierra y
se vuelve a abrir si ya estaba abierta.
Definir el conjunto de registros MoveFirst (mover
al primero). Se establece que el registro actual sea el pri­
El término conjunto de registros se refiere a los registros que están seleccionados mero del conjunto de registros.
para acceder a ellos. Se define por la propiedad RecordSource del control Data.
MoveNext (mover al siguiente). El registro actual pasa a ser el siguiente del
En este ejemplo, el conjunto de registros es la tabla Titles. Sin embargo, con bas­
conjunto de registros.
tante frecuencia desearás que tu aplicación acceda solamente a un subconjunto
de los registros de una base de datos o a una vista de la base de datos que se ex­ NlovePrevious (mover al anterior). El registro actual pasa a ser el anterior del
tiende más allá de una sola tabla. conjunto de registros.

318 319
EL LIBRO DEL VISUAL BASIC 11 Bases de datos y cuadrículas

MoveLast (mover al último). Se establece que el registro actual sea el último Do While Not dtaBibli o.Recorset.NoMatch
del conjunto de registros. Debug.Print dtaBiblio.Recorset.Fi elds("Title").Value
dtaBiblio.Recorset.FindNext Criterio
AddNew (añadir nuevo). Se añade un registro nuevo al conjunto de regis­ Loop
tros. (Sólo es válido cuando el conjunto de registros es una tabla o una
dynaset: hoja de respuestas dinámica).
Este fragmento de programa también te muestra la manera de utilizar la propie­
dad NoMatch después de una operación Find y cómo acceder mediante el pro­
Update (actualizar). Se escriben todos los campos editados en la base de da­ grama a un campo del conjunto de registros. Si la operación Find falla (y la
tos. (Sólo es válido cuando el conjunto de registros es una tabla o una propiedad NoMatch es True), el registro actual no cambiará.
dynaset: hoja de respuestas dinámica).

Delete (borrar). Se elimina el registro actual. Este método sólo es válido Crear una aplicación del tipo agenda de direcciones
cuando el conjunto de registros es una tabla o una hoja de respuestas diná­ Pongamos junto todo lo que hemos tratado en este capítulo y ampliemos la apli­
mica (dynaset) y debe de estar seguido, inmediatamente, por uno de los cación para que se mueva por la base de datos a partir del nombre del autor.
métodos Move, ya que el registro actual deja de ser válido después de una Aprovecharemos el hecho de que la base de datos está ordenada alfabéticamente
operación de borrado. por autores.

Cuando te estés moviendo por la base de datos mediante un programa, querrás, Amplía el formulario de la aplicación para poner un pequeño botón de comando
comprobar las propiedades BOF (beginning of file: comienzo del archivo) y EOF en el extremo inferior izquierdo, como muestra la figura 11.7. La propiedad Cap­
(end of file: final del archivo) del control Data. La propiedad BOF es True cuando tion del botón se ha establecido como "A" en la figura, y la propiedad Name es
el registro actual está situado delante de todos los datos. Esto ocurre, normalmen­ cmdLetra.
te, cuando se borra el primer registro. La propiedad EOF es True cuando el regis­
tro actual está situado detrás del final de los datos. Si cualquiera de las dos
propiedades es True, el registro actual no es válido. Si ambas propiedades son
True, entonces no hay ningún dato en el conjunto de registros.

Buscar registros específicos


Además de avanzar secuencialmente a través del conjunto de registros, puedes
establecer criterios de coincidencia y mostrar sólo los registros que cumplan di­
chos criterios. Los métodos FindFirst (buscar el primero), FindNext (buscar el si­ Figura 11.7.

guiente), FindPrevious (buscar el anterior) y FindLast (buscar el último) funcionan Ampliar la aplicación
de manera muy similar a los métodos Move descritos antes. Las diferencias estri­
ban en que los métodos Find funcionan sobre el componente del conjunto de re­
gistros del control Data, y que toman un parámetro de cadena que expresa el Para que tuviera completamente el aspecto de una agenda de direcciones, habría
criterio de búsqueda como una expresión booleana. que poner una fila de botones de la A a la Z en lugar de un solo botón. Sin em­
bargo, dibujarlos todos y hacer que todos sean del mismo tamaño sería verdade­
Por ejemplo, para recorrer todos los libros cuyos títulos empiecen por la letra "T" ramente pesado, así que dejaremos que Visual Basic haga el trabajo durante la
en la aplicación que estamos viendo, puedes escribir un código como éste: ejecución del programa haciendo que el botón de comando sea una matriz de
Dim Criterio As String controles. Haz que el botón sea una matriz de controles estableciendo su propie­
Criterio = "Title >= ’T’ And Title < ’U’" dad Index en 0. Introduce el código siguiente en el procedimiento Load del for­
dtaBiblio.Recorset.FindFirst Criterio mulario:

320 321
EL LIBRO DEL VISUAL BASIC 11 Bases de datos y cuadrículas

Sub Form_Load ( )
Dim I As Integer
Acceder dinámicamente a una base de datos
En los ejemplos anteriores, el conjunto de registros era ya conocido en la fase de
For I = 1 To 25 diseño. Por tanto, podíamos crear controles enlazados que mostrasen automática­
Load cmdLetra(I) 'Crear un nuevo control mente los campos de ese conjunto de registros. Es posible que quieras escribir
'Situarlo directamente a la izquierda del anterior aplicaciones que abran bases de datos desconocidas, que sean seleccionadas por
cmdLetra (I).Left = cmdLetra(I - 1).Left + CmdLetra(I - 1).Width el usuario de la aplicación. En tal caso, tendrás que determinar dinámicamente
'Calcular su Caption a partir de su posición (A, B, C, D , . . . )
los campos de la base de datos —esto es, durante la ejecución del programa. Este
cmdLetra(I).Caption = Chr$(Asc("A") + I)
apartado te muestra cómo crear una aplicación que abra cualquier base de datos,
cmdLetra(I).Visible = True
Next I presente al usuario una lista de sus tablas y, cuando se seleccione una tabla, se
End Sub muestre en un formulario cuadriculado.

Cuando este procedimiento se ejecute al arrancar el programa, se crearán 25 nue­ Además de la propiedad Recorset del control Data, Visual Basic dispone de obje­
vos miembros de la matriz de controles de botones de comando, cada uno al tos que describen la base de datos. A estos objetos se accede a través de las pro­
lado del otro, y cada uno con la siguiente letra del alfabeto como título. Ahora piedades del control Data. Por ejemplo, la propiedad Database del control Data
todo lo que tienes que hacer es ejecutar un método Find cuando se pulse un bo­ accede al objeto descriptor de la base de datos. Este objeto puede, además, tener
tón. Usaremos la propiedad Caption del botón como criterio de búsqueda. Es de­ propiedades propias. Hasta este momento, la mayoría de los objetos que has usa­
cir, si se elige el botón "N", el criterio será Author >= 'N'. Introduce el siguiente do tenían propiedades de tipos simples; por ejemplo, el objeto Command Button
procedimiento como procedimiento Click de la matriz de controles de botones de tiene propiedades como Caption y Height, cuyos valores son cadenas o números
comando. enteros. No cuesta trabajo imaginar una propiedad que devuelva algo más com­
plejo que una cadena de caracteres o que un número entero, como, por ejemplo,
Sub cmdLetra_Click (Index As Integer)
dtaBiblio.RecordSet.FindFirst "Author >= ’" + una colección, las cuales se describirán a continuación. Para acceder a una pro­
cmdLetra(Index).Caption + " ' " piedad de un objeto que es en sí mismo la propiedad de otro objeto, simplemen­
End Sub te hay que añadir otro punto (.) y el nombre de la propiedad a la expresión
original. De esta manera, la expresión X.Y.Z se referiría a la propiedad Z del ob­
Cada vez que hagas clic en uno de los botones, el registro actual se situará de
jeto al que se conoce por ser la propiedad Y de X.
acuerdo con el criterio de búsqueda. Como la tabla está ordenada alfabéticamen­
te, al pulsar las flechas Siguiente y Anterior del control Data avanzará al siguiente
autor. Cuando ejecutes la aplicación, ésta debe parecerse a la de la figura 11.8 Colecciones
(hemos pulsado el botón N). Una colección es como un cruce entre un cuadro de lista y una matriz. Como ma­
triz es dependiente totalmente de un programa, y no tiene representación gráfica.
Sin embargo, como cuadro de lista, una colección es un objeto con sus propias
propiedades. Cada colección tiene una propiedad Count que dice cuántos objetos
están contenidos en ella. A los objetos contenidos se puede acceder mediante un
índice numérico (de 0 a Count-D o por el nombre del objeto contenido. En el
bucle de ejemplo de la página 321 accedimos a la colección Fields del objeto Re­
corset con la instrucción:
D e b u g . P r i n t d t a B i b l io . R e c o r s e t . F i e l d s ( " T i t l e " ) . V a l u e

Figura 11.8.
En la instrucción anterior, se utiliza el nombre "Title" para extraer el campo de­
La versión 'agenda de direcciones' de la aplicación Biblia seado.

322 323
EL LIBRO DEL VISUAL BASIC 11 Bases de datos y cuadrículas

Expresiones de ejemplo base de datos u hoja de cálculo. El icono del control Grid en la caja de herra­
Aquí tienes algunas expresiones que proporcionan información sobre las bases mientas se muestra en la figura 11.9. Este control no aparecerá en la caja de he­
de datos conectadas a través de un control Data de Visual Basic. Se presupone el rramientas a no ser que se añada el archivo GRID.VBX a la ventana Project.
uso del control dtaBiblio del ejemplo anterior.

Expresión Valor

dtaBiblio El propio control Data


dtaBiblio.Database El objeto descriptor de la base
de datos Figura 11.9.
dtaBiblio.Database.Name El nombre de la base de datos El icono de la herramienta Grid
dtaBiblio.Database.TableDefs.Count El número de tablas en la base
de datos
Se muestran dos controles Grid de ejemplo en la figura 11.10. El Grid de la iz­
dtaBiblio.Database.TableDefs(O).Name El nombre de la primera tabla
quierda muestra celdas grises a lo largo de la fila superior y de la columna
de la base de datos
izquierda, y tiene barras de desplazamiento verticales y horizontales. El Grid de la
dtaBiblio.Database.TableDefs(0).Fi elds.Count El número de campos en la derecha no tiene ninguna columna de celdas grises y no tiene barras de desplaza­
primera tabla miento. Estas posibilidades de presentación se controlan mediante las siguientes
dtaBiblio.Database.TableDefs(0).Fields(0).NameEl nombre del primer campo en propiedades del control Grid:
la base de datos
Rows (filas). El número total de filas del Grid. Si hay más filas de las que
dtaBiblio.Recordset El conjunto de registros al que
caben en el espacio asignado para el Grid en el formulario, aparecerá una
se está accediendo actualmente
barra de desplazamiento vertical.
mediante el control
dtaBiblio.Recordset.Fields.Count El número de campos en el Columns (columnas). El número total de columnas en el Grid. Aparecerá una

conjunto de registros barra de desplazamiento horizontal si el número de columnas es demasia­


dtaBiblio.Recordset.Fields(0).Name El nombre del primer campo en do grande para el tamaño del Grid.
el conjunto de registros FixedRows (filas fijas). El número de filas, empezando desde arriba, que tie­
dtaBiblio.Recordset.Fields(0).Value El valor del primer campo del nen una posición fija. Las filas fijas no se desplazan y tienen el fondo de
conjunto de registros color gris. Se usan normalmente para los títulos.

Una vez que conoces cómo consultar a la base de datos, se puede crear dinámi­
camente una pantalla para mostrar la información. Sin embargo, en lugar de crear
cuadros de texto separados para cada campo, puede ser más interesante utilizar
el control Grid.

El control Grid
Un grid (rejilla o cuadrícula) es una matriz de dos dimensiones de cuadros de vi-
f ig u r a 1 1 .1 0 .
sualización, o celdas, especialmente indicada para mostrar información del tipo
Dos controles Grid de ejemplo

324 325
EL LIBRO DEL VISUAL BASIC 11 Bases de datos y cuadrículas

FixedColumns (columnas fijas). El número de columnas, empezando por la iz­


quierda, que tienen una posición fija. Como las filas fijas, son utilizadas
normalmente para incluir las cabeceras, no se desplazan con el resto de las
columnas y son de color gris.

ColWidth (anchura de la columna). La anchura de una columna concreta,


medida en mips (1/20 de punto).

RowHeight (altura de la fila). La altura de una columna concreta, también


medida en twips.
Figura 11.11.
El diseño inicial del formulario
Una aplicación para revisar los datos
Con lo que has aprendido hasta ahora sobre el control de un Grid puedes crear
una aplicación que abra cualquier base de datos, presente al usuario una lista de El control Data se establece como invisible porque todo el acceso a la base de
las tablas que contiene y, cuando se seleccione una tabla, ésta se muestre en el datos se hará mediante el programa. La propiedad FixedCols del Grid se estable­
Grid. Empieza por crear una aplicación nueva. Si tu ventana Project no contiene ce en 0 porque no hay filas de cabecera —solamente cabeceras de columnas en
GRID.VBX, selecciona el comando Add File del menú File y cárgalo en tu proyec­ una fila fija en la parte superior del Grid.
to. GRID.VBX debe estar en el directorio SYSTEM de Windows. Como necesitarás Añade la primera línea de las que aparecen a continuación a la sección de decla­
una manera de elegir el archivo de base de datos que quieres examinar, añade raciones generales del formulario. Luego define el procedimiento Click para el
CMDIALOG.VBX al proyecto de la misma manera. botón de comando como se muestra. (La definición de la constante OFN_FILE-
Inserta un botón de comando, un cuadro combinado, un control Data, un control MUSTEXIST viene del archivo CONSTANT.TXT.)
Common Dialog y un control Grid en el formulario. Después, distribuyelos y Const OFN_FILEMUSTEXIST = &H1000&
cámbiales el tamaño para que aparezcan como se muestra en el figura 11.11. Por
último, establece las propiedades de los controles como se detalla en la tabla que Sub cmdAbrir_Click ( )
aparece a continuación. cboTablas.Clear 'Vaciar el cuadro de lista combinado
diogo.DefaultExt = "MDB" 'Extensión de las bases de datos
Objeto Propiedad Ajuste
'de Microsoft Access
dlogo.Filename = " "
Form1 Caption Examinar base de datos dlogo.Filter = "Bases de datos (*.MDB|*.MDB|Todos los archivos
(*.* ) | *.* "
Name Grid1
dlogo.Flags = OFN_FILEMUSTEXIST
CMDialog1 Name dlogo dlogo.Action = 1 'Abrir el cuadro de diálogo
Data1 Name dtaTabla If dlogo.FileName = " " Then Exit Sub
Visible False abrirArchivoDeDatos dlogo.Filename
Command1 Caption Abrir base de datos End Sub

Name cmdAbrir Cuando hagas clic en el botón de comando, el programa presentará el cuadro de
Combo1 Name cboTablas diálogo Abrir archivo y permitirá al usuario seleccionar un archivo de base de da­
Text [ninguno] tos. Este programa está configurado para gestionar archivos del formato de Micro­
Grid1 FixedCols 0 soft Access que tengan la extensión MDB. Cuando se selecciona un archivo, el
Name grdDatos programa llama a una rutina llamada AbrirArchivoDeDatos, pasándole el nombre

326 327
11 Bases de datos y cuadrículas
EL LIBRO DEL VISUAL BASIC

For I = 0 To dtaTabla.Database(NombreDeLaTabla).Fields.Count - 1
del archivo de base de datos. El código de esta rutina se muestra en la parte su­ grdDatos.Col = I
perior de la página siguiente. grdDatos.Text = dtaTabla.Database(NombreDeLaTabla). Fields(I).Name
grdDatos.ColWidth(I) = TextWidth(grdDatos.Text) + 100
Sub AbrirArchivoDeDatos (ByVal ArchivoDeDatos As String)
Next I
Dim I As Integer
dtaTabla.Refresh
dtaTabla.Connect = "" 'Formato de Access
dtaTabla.DatabaseName = ArchivoDeDatos
'Determinar el número de registros y establecer el tamaño del Grid
dtaTabla.ReadOnly = True 'Para un acceso más rápido
dtaTabla.Recordset.MoveLast
dtaTabla.Exclusive = True 'Para un acceso más rápido
grdDatos.Rows = dtaTabla.Recordset.RecordCount + 1
dtaTabla.Refresh 'Cargar la base de datos

'Rellenar el Grid comenzando por el primer registro


For I = 0 To dtaTabla.Database.TableDefs.Count - 1
dtaTabla.Recordset.MoveFirst
'Poner el nombre de todas las tablas en el cuadro combinado
grdDatos.Row = 0
cboTablas.AddItem dtaTabla.Database.TableDefs(I).Name
Next I
Do While Not dtaTabla.Recordset.EOF
cboTablas.Text = "(ninguna)" 'Nada seleccionado ahora
grdDatos.Row = grdDatos.Row + 1
End Sub
For I = 0 To dtaTabla.Database(NombreDeLaTabla).Fields.Count - 1
La rutina AbrirArchivoDeDatos inicializa el control Data y luego consulta en el grdDatos.Col = I
objeto Database el nombre de todas las tablas de la base de datos. Estos nombres
son insertados en la lista del cuadro combinado. El código que controla el cuadro 'Almacenar un blanco si el dato del campo es nulo
combinado es bastante simple; llama a una rutina que rellena el Grid. Establece el If IsNull(dtaTabla.Recordset(I).Value) Then
procedimiento Click del cuadro combinado como sigue: grdDatos.Text = ""
Else
Sub cboTablas_Click ( )
grdDatos.Text = dtaTabla.Recordset(I).Value
RellenarGrid cboTablas.Text
End If
End Sub

Todo lo que queda por hacer es escribir la rutina que rellene el Grid, la cual se 'Asegurarse de que todos los datos se ven
muestra a continuación. Esta rutina tomará como parámetro el nombre de la tabla AnchoDeCelda = TextWidth(grdDatos.Text) + 100
seleccionada, consultará la base de datos para obtener los nombres de los cam­ If AnchoDeCelda > grdDatos.ColWidth(I) Then
pos, y pondrá esos nombres en la fila fija del Grid. Luego irá recorriendo la tabla, grdDatos.ColWidth(I) = AnchoDeCelda
obteniendo los valores de todos los registros y poniéndolos en las filas y colum­ End If
nas adecuadas del Grid. Next I

Sub RellenarGrid (ByVal NombreDeLaTabla As String) dtaTabla.Recordset.MoveNext


Dim I As Integer, AnchoDeCelda As Integer Loop

'Inicializar el conjunto de registros End Sub


dtaTabla.RecordSource = NombreDeLaTabla
Nota: Esta aplicación presupone que todos los registros de una tabla
'Establecer las cabeceras de las columnas concreta cabrán en la memoria. Algunas bases de datos tienen tablas
grdDatos.Cols = dtaTabla.Database(NombreDeLaTabla).Fields.Count con cientos de miles de registros. Para hacer que esta aplicación fuera
grdDatos.Row = 0 realmente general se podría hacer que leyese sólo 100 registros aproxi-

328 329
EL LIBRO DEL VISUAL BASIC

mudamente cada vez y que, una vez que el usuario hubiera pasado los
100 primeros, leyese el siguiente grupo de 100, y así sucesivamente. Si
trabajas con grandes bases de datos es posible que quieras mejorar esta
12
aplicación.

Hay dos cosas que resaltar en el procedimiento RellenarGrid: para determinar el

Enlace e incrustación
número de filas que el Grid debe tener, el procedimiento salta al final de la tabla
(el método MoveLast) y comprueba la propiedad RecordCount del último registro.
Entonces ajusta el tamaño del Grid y comienza a cargar los datos desde el co­
mienzo de la tabla. Cuando se está cargando la base de datos, el procedimiento
comprueba los campos que no contienen información llamando a la función Is-
Null. Si la función IsNull encuentra un campo nulo, se pone un espacio en blanco
en el Grid. A medida que el Grid se va rellenando, el procedimiento también es­
de objetos
tablece la anchura de las columnas (ColWidth) que necesitan ser más anchas para
mostrar todos los datos. Para determinar lo ancha que debe ser la columna el
procedimiento llama al método TextWidtb. Observa que llamar a TextWidth pre­ Este capítulo introduce el concepto de enlace e incrustación de objetos (OLE) y
supone que la información de la fuente es la misma que la del Grid; si no fuera describe los métodos necesarios para usar OLE en las aplicaciones de Visual Ba­
así, el método TextWidth devolvería un valor incorrecto. sic. Los conceptos y las técnicas de programación presentadas en este capítulo
Después de que la aplicación esté completa puedes ejecutarla. La figura 11.12 son algo más complejos que los de los capítulos anteriores. Si eres nuevo en el
muestra la aplicación después de que el usuario haya abierto la base de datos BI- mundo de la programación, quizás prefieras pasar al capítulo 13-
BLIO.MBD y haya seleccionado la tabla Publishers.
OLE en Visual Basic
En el capítulo 11 viste cómo Visual Basic puede aprovechar los datos creados, or­
denados y mantenidos por una aplicación SGBD. Aunque el control Data es parte
de Visual Basic, depende del trabajo del programa de gestión de la base de datos.
Mediante OLE, se pueden aprovechar otras aplicaciones de la misma manera.

OLE permite la cooperación entre aplicaciones Windows. Usando OLE, tus aplica­
ciones Visual Basic pueden mostrar y controlar datos procedentes de otras apli­
caciones. La manera de usar OLE en Visual Basic es el control OLE. Este control
permite que el usuario muestre en pantalla datos de otra aplicación y que edite
Figura 11.12. los datos en la misma aplicación donde fueron creados. La figura 12.1 muestra la
La aplicación Grid herramienta OLE en la caja de herramientas de Visual Basic.

Nota: El control OLE no aparecerá en la caja de herramientas a no ser


que hayas cargado el archivo MSOLE2.VBX en la ventana Project. Si mo­
dificaste tu archivo AUTOLOAD. MAK, tendrás que seleccionar el coman­
do Add File del menú File de Visual Basic y buscar MSOLE2..VBX. Estará
en el subdirectorio SYSTEM de Windows.

331
330
EL LIBRO DEL VISUAL BASIC
12 Enlace e incrustación de objetos

Aplicación contenedor
(container). Una aplicación contenedor contiene el objeto que
es creado por otra aplicación. Por ejemplo, una aplicación de Visual Basic que
contiene un gráfico incrustado de un programa de dibujo es una aplicación
contenedor.
Figura 12.1.
La herramienta OLE Aplicación fuente.
Una aplicación fuente es la aplicación original que crea un objeto.
Por ejemplo, un programa de dibujo que crea un objeto gráfico es una aplica­
Antes de que puedas comprender plenamente el control OLE necesitarás familia­ ción fuente.
rizarte con algunos de los términos concretos relacionados con el enlace y la in­
crustación de objetos.
Un ejemplo de OLE: incrustar un objeto en la fase de diseño
Algunos términos OLE Supon que quisieras que tu base de datos Comadrejas tocase "La cabalgata de las
Objeto OLE. Un objeto es una entidad discreta de datos. Los objetos pueden ser tex­ Valkirias" cada vez que la arranques. Como Visual Basic no tiene posibilidades
to, hojas de cálculo, algunas celdas de una hoja de cálculo, gráficos, sonido, sonoras que vayan más allá del comando Beep, podrías pensar que tienes que
segmentos de vídeo o cualquier otra cosa que pueda ser mostrada o contro­ aprender las llamadas directas a Windows y crear declaraciones DLL de la misma
lada por una aplicación. Un control OLE puede contener solamente un objeto manera que con las funciones Perfil del capítulo 9. Pero, ¿por qué tendrías que
cada vez. aburrirte aprendiendo todo eso cuando hay una aplicación que puede producir el
sonido que tú quieres? La aplicación Grabadora de sonidos de Windows puede
Objeto enlazado. Los datos de un objeto OLE se pueden enlazar con una aplicación. interpretar cualquier sonido almacenado como un archivo WAV. Aquí es donde
Cuando se enlaza un objeto, en realidad se inserta un "reflejo", y no los datos OLE entra en juego, porque tú puedes incrustar el archivo con el sonido en un
reales, del objeto enlazado en el control OLE de la aplicación. Así, cuando se control OLE. Luego, podrás configurar la aplicación de manera que lo interprete
enlaza un gráfico (por ejemplo, un logotipo), en una aplicación Visual Basic, cuando arranque.
el usuario puede seleccionar el objeto enlazado y la aplicación enlazada arran­
cará automáticamente. El usuario podrá entonces editar el gráfico usando la Haz clic en la herramienta OLE de la caja de herramientas y añade un control a
aplicación asociada. Se pueden establecer otros enlaces con el mismo objeto, un formulario vacío. Tan pronto como hayas puesto el control en el formulario
y cuando el gráfico se modifique en la aplicación fuente, también cambiará en aparecerá el cuadro de diálogo Insert Object (insertar objeto) que puedes ver re­
todas, las aplicaciones a las cuales esté enlazada. presentado en la figura 12.2. El contenido del cuadro de diálogo puede variar de
un ordenador a otro, dependiendo de las aplicaciones que tengas y de cuántas
Objeto incrustado.Los datos de un objeto OLE pueden incrustarse en una aplica­ admitan OLE.
ción. Cuando se incrusta un objeto, se insertan los datos reales del objeto in­
crustado en el control OLE de la aplicación. Así, cuando se incrusta un gráfico Desplázate por la lista hasta que encuentres la entrada Sonido. Selecciónala y haz
(por ejemplo, un logotipo), en una aplicación de Visual Basic, todos los datos clic en el botón OK. Aparecerá un icono representativo de la Grabadora de soni­
contenidos con él están asociados en el control OLE. Mientras se use la aplica­ do en el área del control OLE, y se ejecutará en primer plano la aplicación Graba­
ción de Visual Basic, el usuario podrá seleccionar el objeto incrustado y la dora de sonidos de Windows, como se ilustra en la figura 12.3.
aplicación arrancará automáticamente. El usuario podrá entonces editar el grá­
En la Grabadora de sonidos selecciona el comando Insertar archivo del menú
fico usando la aplicación asociada. Cuando el usuario salga de la aplicación
Edición. Aparecerá el cuadro de diálogo Insertar el archivo que te preguntará por
asociada, el objeto se actualizará automáticamente, y los nuevos datos se al­
el lugar del cuál seleccionar el archivo de sonido. Como probablemente no ten­
macenarán en el control OLE. Al contrario que ocurre con los objetos enlaza­
gas una grabación de la "Cabalgata de las Walquirias" en tu ordenador, y como
dos, cuando un objeto se incrusta en una aplicación, ninguna otra aplicación
yo no voy a distribuir la mía, tendrá que bastarte, por ahora, con uno de los soni­
tendrá acceso a los datos del objeto incrustado.
dos del sistema de Windows. Selecciona CHIMES.WAV de tu directorio Windows.

332
333
EL LIBRO DEL VISUAL BASIC
12 Enlace e incrustación de objetos

Finalmente, haz que el procedimiento Load del formulario contenga la siguiente


rutina, de manera que toque el sonido cuando se abra la aplicación:
Sub Form_Load ( )
OLE1.Action = OLE_ACTIVATE
End Sub

Pulsa la tecla F5 para ejecutar la aplicación. Cuando aparezca el formulario debes


oír el sonido de campanas, una atención especial de la aplicación Grabadora de
sonidos.

Figura 12.2. Enlace frente a incrustación


El cuadro de diálogo Insert Object Acabas de crear un objeto incrustado; es decir, una copia de los datos del sonido
se almacenan directamente en tu aplicación. También podrías haber enlazado el
archivo de sonido, en cuyo caso se habría almacenado un puntero a los datos (en
este caso al archivo CHIMES.WAV), en lugar de los datos reales. La figura 12.4
ilustra la diferencia entre enlazar e incrustar.

La principal ventaja del enlace de objetos es que ocupa menos espacio al existir
solamente una copia de los datos. Tiene la desventaja de la potencial pérdida del
vínculo si se mueve la copia original de los datos o si la aplicación se ejecuta en
otro ordenador. Con la incrustación de objetos nunca tendrás que preocuparte de
la pérdida de datos, pero algunos objetos pueden ocupar mucho espacio. Sólo 10
segundos de sonido pueden ocupar más de 100 Kb, dependiendo de la calidad
deseada.

Evidentemente, el enlace es la mejor opción cuando es seguro. Si enlazas objetos


Figura 12.3.
con el servidor de una red o ejecutas una aplicación que siempre residirá en tu
Un control OLE y la aplicación Grabadora de sonidos
ordenador, puedes atreverte con el enlace de objetos. Sin embargo, si vas a distri­
buir la aplicación o si la fuente puede ser modificada y quieres conservar los da­
tos originales, debes incrustar objetos. En nuestro ejemplo, hemos incrustado el
El sonido se cargará en la Grabadora; puedes reproducirlo, si quieres oír primero
sonido CHIMES, lo que significa que podríamos distribuir esta aplicación sin tener
como suena. Luego, selecciona el comando Salir del menú Archivo. La grabadora
que incluir un archivo WAV separado.
de sonido te preguntará si quieres actualizar el objeto incrustado antes de salir,
Haz clic en Sí.
¿Qué está disponible para enlazar e incrustar?
Selecciona el control OLE en el formulario y a continuación cambia a la ventana
Siempre que se instala una aplicación en Microsoft Windows, si esa aplicación ad­
Properties y establece la propiedad Visible como False. Como queremos que el
mite OLE se añade una entrada al registro OLE. Cuando se crea un control OLE
sonido se oiga al arrancar, no es necesario que muestres el control OLE. Haz do­
se puede ver una lista de los objetos que se pueden usar en el cuadro de diálogo
ble clic en el formulario para que aparezca la ventana de código. Define esta
Insert Object. Dependiento de las aplicaciones de las que dispongas podrás in­
constante en la sección de declaraciones generales como se muestra aquí:
cluir texto con formato, gráficos, hojas de cálculo, vídeo clips y muchas otras co­
Const OLE_ACTIVATE = 7 sas en tus aplicaciones de Visual Basic.

334 335
LIBRO DEL VISUAL BASIC 12 Enlace e incrustación de objetos

ra que el usuario de tu aplicación pueda especificar el objeto que quiere enlazar


o incrustar. En este ejemplo uniremos el control OLE con la aplicación Graph sin
Aplicación contenedor Aplicación fuente incrustar ningún dato, y le presentaremos al usuario de la aplicación varias opcio­
Editar nes para trabajar con la información.

Objetos incrustados El control OLE opera de manera similar al control Common Dialog, en tanto que
Guardar la asignación de ciertos valores a su propiedad Action produce que se ejecuten
(actualizar) las operaciones asociadas. Por ejemplo, establecer la propiedad Action a OLE_IN-
SERT_OBJ_DLG (que tiene el valor 14) mostraría (durante la ejecución del pro­
grama) el cuadro de diálogo Insert Object, que viste cuando creaste el objeto OLE
Aplicación contenedor
(durante la fase de diseño) del ejemplo anterior. En este ejemplo, sin embargo,
Aplicación contenedor Aplicación contenedor no permitiremos que se inserte ningún objeto excepto los creados por la aplica­
ción Graph.

Abre un proyecto nuevo de Visual Basic. Selecciona el control OLE y dibuja un


cuadro bastante grande en el formulario vacío. Cuando aparezca el cuadro de
diálogo Insert Object de OLE, haz clic en el botón Cancel. El control OLE no con­
tendrá ningún dato cuando la aplicación arranque. Añade un botón de comando,
Objetos enlazados un marco con dos botones de opción en su interior, un cuadro combinado y un
control Common Dialog, como se muestra en la figura 12.5. Luego, establece las
Aplicación fuente propiedades de los controles como se muestra en la figura 12.6.
Editar
Lo primero que necesitas es la definición de las constantes que están asociadas
con el control OLE. Puedes introducir las definiciones como se muestra en la fi­
Guardar gura 12.7 o pegarlas desde el archivo CONSTANT.TXT. (Date cuenta de que en el
(actualizar)
archivo CONSTANT.TXT han sido definidas como globales. Aquí liemos quitado
la palabra clave Global.)
Figura 12.4.
Incrustar y enlazar objetos

La siguiente aplicación de ejemplo utiliza Microsoft Graph, una pequeña utilidad


que viene junto con varios programas de la empresa Microsoft, entre los que es­
tán Microsoft Word para Windows y Microsoft Access. Si no tienes la utilidad
Graph en tu ordenador, trata de adaptar el ejemplo a uno de los objetos que ad­
mita tu entorno.

Ejemplo de OLE: Manipulación del control OLE durante la ejecución


En el primer ejemplo usamos OLE para incrustar un objeto específico durante la
fase de diseño. OLE también se puede controlar mediante el programa, de mane- Figura 12.5.
El formulario OLEGRAPH
336
337
EL LIBRO DEL VISUAL BASIC 1 2 Enlace e incrustación de objetos

Figura 12.7. continuación


Control Propiedad Ajuste

Form1 Caption OLE Graph


Const OLE_INSERT_OBJ_DLG = 14
Name OLEGraph Const OLE_PASTE_SPECIAL_DLG = 15
OLE1 AutoActivate 0 - Manual Const OLE_FETCH_VERBS = 17
SizeMode 1 - Stretch Const OLE_SAVE_T0_OLE1FILE = 18
Command1 Caption Insertar gráfico
'Tipo de OLE
Name cmdInsertar
Const OLE_LINKED = 0
Frame1 Caption [ninguno] Const OLE_EMBEDDED = 1
Option1 Caption Enlazado Const OLE_NONE = 3
Name optEnlazado
Option2 Caption Incrustado 'Tipo de OLE permitido
Name Const OLE_EITHER = 2
optIncrustado
Value True
'Opciones de actualización
Combo1 Name cboVerbos Const OLE_AUTOMATIC = 0
Text [ninguno] Const OLE_FROZEN = 1
CMDialog1 Name dlogo Const OLE_MANUAL = 2

'Modos de auto activación


Figura 12.6.
Const OLE_ACTIVATE_MANUAL = 0
El ajuste de las propiedades de la aplicación OLEGRAPH
Const OLE_ACTIVATE_GETFOCUS = 1
Const OLE_ACTIVATE_DOUBLECLICK = 2

'Modos de tamaño
C o n s t O L E _ S I Z E _C L I P = 0
'Control OLE Const OLE_SIZE_STRETCH = 1
'Acciones C o n s t O L E _ S I Z E _A U T O S I Z E = 2
Const OLE_CREATE_EMBED = 0
Const OLE_CREATE_LINK = 1 'Tipos de presentación en pantalla
Const OLE_COPY = 4 Const OLE_SIZE_CLIP = 0
Const OLE_PASTE = 5 C o n s t O L E _S I Z E _ S T R E T C H = 1
Const OLE_UPDATE = 6 Const OLE_SIZE_AUT0SIZE = 2
Const OLE_ACTIVATE = 7
Const OLE_CL0SE = 9 'Tipos de presentación en pantalla
Const OLE_DELETE = 10 Const OLE_DISPLAY_CONTENT = 0
Const OLE_SAVE_T0_FILE = 11 Const OLE_DISPLAY_ICON = 1
Const OLE_READ_FROM_FILE = 12

Figura 12.7. (continúa)


(continúa)
Definición de las constantes para la aplicación OLEGRAPH

338 339
LIBRO DEL VISUAL BASIC 12 Enlace e incrustación de objetos

Figura 12.7. continuación


Sub cmdInsertar_Click ( )
OLE1.Class = "MSGraph" 'Aplicación que se va a invocar
'Constantes de eventos de actualización If optEnlazado.Value Then 'El botón Enlazado está seleccionado
Const OLE_CHANGED = 0 'Graph usa los archivos de gráficos de Excel;
Const OLE_SAVED = 1 'buscar uno para enlazar
Const OLE_CLOSED = 2 dlogo.Filter = "Gráfico (*.XLC)|*.XLC|Todos los
Const OLE_RENAMED = 3 archivos (*.*)|*.*"
dlogo.FilterIndex = 1
'Valores especiales de Verbos dlogo.Action = 1
Const VERB_PRIMARY = 0 If dlogo.Filename = "" Then
Const VERB_SHOW = -1 MsgBox "No se ha seleccionado ningún archivo"
Const VERB_OPEN = -2 Exit Sub
Const VERB_HIDE = -3 End If
'Crear el enlace OLE
'Máscaras de bits de banderas Verbo OLE1.SourceDoc = dlogo.Filename
Const VERBFLAG_GRAYED = &H1 OLE1.Action = OLE_CREATE_LINK
Const VERBFLAG_DISABLED = &H2 Else 'El botón Incrustado está seleccionado
OLE1.Action = OLE_CREATE_EMBED
Const VERBFLAG_CHECKED = &H8
End If
Const VERBFLAG_SEPARATOR = &H800
'Realizar el trabajo OLE
OLE1.Action = OLE_ACTIVATE
'Crear lista de operaciones
Cuando la aplicación se ejecute, permitirá al usuario insertar un objeto nuevo en AñadirVerbos
el espacio proporcionado. El objeto puede ser enlazado o incrustado, dependien- End Sub
do de los ajustes de los botones de opciones. El código fuente para la creación
del objeto está en el procedimiento Click del control cmdlnsertar (figura 12.8).

La última acción que lleva a cabo el procedimiento anterior es llamar al subpro­ Figura 12.8.
grama AñadirVerbos. Esta rutina crea una lista de las opciones aceptadas por el El procedimiento cmdInsertar_Click de la aplicación OLEGRAPH
objeto que se acaba de insertar. Los nombres de los verbos se pondrán en el cua­
dro combinado. El código de AñadirVerbos es el siguiente:
Después de que se han cargado los nombres de los verbos en el cuadro combi­
Sub AñadirVerbos ( ) nado (además de una entrada especial para que la seleccione el usuario cuando
D i m I As Integer no desee realizar ninguna acción), necesitarás definir la rutina Click del cuadro
'Consultar la matriz ObjectVerbs para buscar las acciones combinado como viene a continuación para llamar a cualquier acción selecciona­
'aceptadas por este objeto y ponerlas en el cuadro combinado da por el usuario.
cboVerbos.Clear
cboVerbos.AddItem "(ninguno)" Sub cboVerbos_Click ( )
For I = 1 To OLE1.ObjectVerbsCount - 1 If cboVerbos.ListIndex > 0 Then
cboVerbos.AddItem OLE1.ObjectVerbs(I) OLE1.Verb = cboVerbos.ListIndex
Next I OLE1.Action = OLE_ACTIVATE
cboVerbos.ListIndex = 0 End If
End Sub End Sub

340 341
12 Enlace e incrustación de objetos
EL LIBRO DEL VISUAL BASIC

OLE1.FileNumber = NumeroDeArchivo
Necesitas crear una rutina más que guarde los datos que el usuario cargue en el
OLE1.Action = OLE_READ_FROM_FILE
objeto OLE. Cuando se crea un objeto durante la fase de diseño, todos los datos
Close #NumeroDeArchivo
OLE se almacenan en el formulario de Visual Basic. Sin embargo, cuando el obje­ End Sub
to se crea en la fase de ejecución, los datos se deben guardar en un archivo bina­
rio. Al igual que el texto introducido en un cuadro de texto se perdería si no lo Después de que se han cargado o guardado los datos OLE, se sitúa el archivo in­
almacenases en algún sitio, lo mismo ocurriría con los datos OLE. El control OLE mediatamente detrás de los datos. Sería posible, por tanto, cargar y guardar varios
contiene los datos para los dos estilos del control: enlazado o incrustado. Aunque objetos OLE en una fila en tanto se mantenga el mismo orden al guardarlos y car­
es obvio que el estilo incrustado debe contener los datos, el estilo enlazado tam­ garlos. La figura 12.9 muestra la aplicación funcionando.
bién los contiene, aunque esto es menos evidente. El estilo enlazado debe alma­
cenar el nombre del documento enlazado y el tipo de la información. Control directo del objeto
Para guardar los datos almacenados en el control OLE debes crear una variable En el capítulo 11 pudiste obtener información sobre una base de datos y contro­
de nivel de módulo y escribir dos pequeños subprogramas, como viene a conti­ lar el acceso a la base de datos mediante unos objetos especiales, como TableDef
nuación: y Database. La última versión de OLE admite la posibilidad de que cualquier apli­
Dim HayQueEscribirlo As Integer cación defina objetos y protocolos que se puedan manipular desde fuera de la
aplicación.
Sub OLE1_Updated (Code As Integer)
Por ejemplo, un procesador de textos podría proporcionar el acceso a su correc­
HayQueEscribirlo = True
tor ortográfico como objeto, y tú podrías, desde Visual Basic, comprobar la orto-
End Sub

Sub Form_Unload (Cancel As Integer)


Dim NumeroDeArchivo As Integer

If Not HayQueEscribirlo Then Exit Sub


NumeroDeArchivo = FreeFile
Open "OLEGRAPH.DAT" For Binary As #NumeroDeArchivo
OLE1.FileNumber = NumeroDeArchivo
OLE1.Action = OLE_SAVE_T0_FILE
Close #NumeroDeArchivo
End Sub

Esto nos lleva a otro punto antes de terminar. Si guardas los datos OLE al salir,
necesitarás cargarlos de nuevo cuando arranques la aplicación. Aquí tienes la ruti­
na final para cargar los datos OLE. Debe comprobar si el archivo existe antes de
tratar de cargar los datos; si el archivo no existe se producirá un error.

Sub Form_Load ( )
Dim NumeroDeArchivo As Integer

If Dir$("OLEGRAPH.DAT") = "" Then Exit Sub


NumeroDeArchivo = FreeFile Figura 12.9.
Open "OLEGRAPH.DAT" For Binary As #NumeroDeArchivo La aplicación OLEGRAPH

342 343
EL LIBRO DEL VISUAL BASIC 12 Enlace e incrustación de objetos

grafía del texto que el usuario haya introducido en un cuadro de texto. El usuario ilustrará los principios básicos. El primer paso consiste en consultar en la docu-
nunca vería la aplicación procesador de textos porque el acceso a los objetos se mentación los objetos admitidos por DLSPCALC. Nos dice, entre otras cosas, que
hace completamente desde el programa. Esta posibilidad, denominada Automa­ DISPCALC se debe registrar en el sistema antes de usarlo y que la mites. Cada di­
tización OLE es aceptada por Visual Basic. Sin embargo, en el momento de escri­ mite un objeto denominado dispcalc.ccalc. Este objeto tiene las siguientes propie­
bir esto, esta posibilidad es tan nueva que muy pocas aplicaciones admiten la dades y métodos:
Automatización OLE.
Propiedad o método Explicación

Cada objeto es diferente Accum El acumulador de la calculadora


La programación de la Automatización OLE es muy similar a la comunicación con Opnd El operando de la calculadora
los objetos del control Data. Todas las aplicaciones que admitan Automatización Op Un código que indica la operación que va a efectuar la
OLE expondrán algunas de sus capacidades en la forma de objetos. Para obtener calculadora
el acceso a los objetos en Visual Basic, se llama a La función CreateObject, pasán­
Eval Un método que ejecuta la operación seleccionada por Op
dole el nombre del tipo de objeto como parámetro de cadena. La documentación
Display Un método que muestra el resultado del cálculo en la
de cada una de las aplicaciones que admita Automatización OLE, contendrá una
pantalla de la calculadora
lista de los objetos que se pueden crear.

Una vez creado un objeto, la comunicación con él se realiza a través de los méto­ Para registrar la aplicación, abre el Administrador de archivos en el directorio de
dos apropiados para dicho objeto. Como cada aplicación incluye características Visual Basic. Haz doble clic en el archivo DISPCALC.REG. Esto añadirá una entra­
distintas, no hay un conjunto común de métodos, ni una sintaxis estrictamente da en el registro OLE de Windows para la aplicación DISPCALC. La mayoría de
definida que pueda proporcionarte en este momento. Siento que esto suene algo las aplicaciones se registran a sí mismas en Windows como parte de su proceso
nebuloso, y de hecho lo es, pero no hay mucho más que te pueda decir en ge­ de instalación. Sin embargo, como DISPCALC es sólo una demostración requiere
neral sobre la Automatización OLE. Es tan abierta porque, esencialmente, no tiene un registro manual.
límites. Cada diseñador de aplicaciones puede crear objetos nuevos, desde celdas Crea un proyecto nuevo y añade un solo botón de comando al formulario. Para
de hojas de cálculo a correctores ortográficos; desde gráficos hasta diseños CAD. una aplicación tan simple, es lo único que tienes que hacer. Observa que no ne­
Tú eliges los que mejoran tu programa y haces uso de ellos. cesitas un control OLE para usar la Automatización OLE. El control OLE es sólo
para enlazar e incrustar objetos.
Un ejemplo de Automatización OLE: la aplicación Calculadora Abre una ventana de código e introduce el texto siguiente en la sección de decla­
Para ilustrar las posibilidades básicas de la Automatización OLE, el equipo de raciones generales:
programación de Visual Basic ha incluido una aplicación especial que la admite. Const OP_MAS = 1
Como no puedo proporcionarte información general sobre la Automatización Const OP_MENOS = 2
OLE, haremos uso de esta aplicación especial de demostración en este apartado. Const OP_MULT = 3
La demostración se llama DISPCALC, y cuando se ejecuta por sí misma funciona Const OP_DIVIDIR= 4
como una simple calculadora de mano. DLSPCALC también se puede controlar
desde un programa a través de la Automatización OLE. Exporta varios objetos y Dim Calc As Object
acciones que se pueden manipular desde Visual Basic. La calculadora efectúa las Las constantes son los códigos específicos de la aplicación que se pueden asignar
operaciones especificadas por Visual Basic. a la propiedad Op. La variable Calc contendrá el objeto una vez que haya sido
El programa que escribirás utilizará DISPCALC para multiplicar 19 por 57. Hay creado. Ahora, introduce la siguiente rutina como procedimiento Click para el bo­
que admitirlo: esto es algo que se puede hacer sin el recurso de OLE, pero que tón de comando:

344 345
EL LIBRO DEL VISUAL BASIC 1 2 Enlace e incrustación de objetos

Sub Command1_Click ( ) Calc.Op = OP_MULT


Set Calc = CreateObject("dispcalc.ccalc") Calc.Eva1
Calc.Accum = 19 Calc.Display 'Actualizar la salida
Calc.Opnd = 57 MsgBox "Los cálculos indican que 19 * 57 son" + Str$(Calc.Accum)
Calc.Op = OP_MULT Calc.Quit
Calc.Eval End Sub
MsgBox "Los cálculos indican que 19 * 57 son " + Str$(Calc.Accum)
Ahora, cuando ejecutes el programa, la salida de la calculadora coincidirá con el
Calc.Quit
End Sub
resultado que devolvió el acumulador, como se muestra en la figura 12.10.

Observa que en la línea en la que se crea el objeto se usa la instrucción Set para
asignar el objeto a la variable Calc. El tipo de asignación Set se debe utilizar con
todos los objetos, incluyendo los objetos de Visual Basic como formularios y con­
troles. Las asignaciones normales funcionan copiando; es decir, si tienes una va­
riable A a la cual le asignas la cadena "Beethoven" y luego ejecutas la declaración
B = A, ambas variables A y B tendrán copias separadas de la cadena, y si modifi­
cas una, la otra se queda sin cambios. Las asignaciones del tipo Set crean mera­
mente una referencia a la cosa que se está asignando, de manera que si ejecutas
Set A = MiForm, A se refiere sólo al objeto MiForm, y si a continuación ejecutas B
= A, la variable B también apuntará al mismo formulario y cualquier cambio he­
cho en el formulario será visible por todas las variables.
Figura 12.10.
En el programa anterior, por tanto, la primera línea le dice a Windows que bus­ Control de la aplicación DISPCALC con Automatización OLE
que la aplicación que pueda crear un objeto dispcalc.ccalc y que cree el objeto.
Entonces se almacena una referencia a ese objeto en la variable Calc de Visual
Basic. El programa establece las propiedades Accum, Opnd y Op, llama al méto­ Una nota sobre el DDE
do Eval y muestra el valor resultante de la propiedad Accum. El método Quit des­ Si te gusta la idea de hacer que otros programas trabajen para ti y no le temes a
truye el objeto. una programación algo más complicada, es posible que quieras investigar el in­
tercambio dinámico de datos (DDE). El DDE permite enviar y recibir mensajes de
Pulsa F5 para ejecutar tu programa. Cuando hagas clic en el botón de comando,
otras aplicaciones. Por ejemplo, la mayoría de los programas de instalación usan
se llamará a la aplicación DISPCALC. Observa que aparece realmente en la panta­
el DDE para decirle al Administrador de programas Windows que cree nuevos
lla. Esto no es típico de las aplicaciones con Automatización OLE, pero se ha he­
grupos de programas e iconos.
cho aquí para ilustrar los efectos de la programación OLE. Si miras atentamente a
la pantalla de la calculadora, verás que pone 0 antes de cerrar el cuadro de men­ Microsoft Word y Microsoft Excel pueden crear enlaces DDE con tus programas
sajes, aunque el acumulador devuelva el valor correcto. Esto se debe a que la de Visual Basic, y tú puedes pasar información a través del enlace. La programa­
salida de la calculadora es controlada por el método Display, que no ha sido lla­ ción de DDE no es simple —normalmente, se deben programar los dos lados de
mado. Sal del programa y modifica el procedimiento Click para que quede así: la conversación. Por ejemplo, necesitarás una macro en WordBasic para abrir un
vínculo con tu aplicación y para solicitar datos, y también tendrás que programar
Sub Command1_Click ( )
tu aplicación en Visual Basic para recibir la solicitud y enviar la información pedi­
Set Calc = CreateObject("dispcalc.ccalc")
da. Consulta los manuales de referencia de tus aplicaciones para ver las posibili­
Calc.Accum =19
Calc.Opnd =57 dades de DDE que admiten.

346 347
13
Una aplicación para
Windows completa
Has subido montañas y atravesado mares tormentosos —o, al menos, has apren­
dido lo suficiente sobre Visual Basic para solucionar algunos de tus problemas de
programación. Pero antes de que te puedas relajar y dormirte en los laureles, de­
berías intentar juntar todo lo que has visto.

Este capítulo te ayudará a construir una aplicación que incluya muchas de las po­
sibilidades y capacidades que se han tratado en los capítulos anteriores: varios
formularios, controles, archivos, menús e incluso algunos gráficos. También nece­
sitarás los procedimientos ObtenerIni y EstablecerIni que se desarrollaron en el
capítulo 9.

Diseño general
Para describirla con sencillez, esta aplicación, a la que llamaremos Cronómetro de
Proyectos, es un programa que calcula el tiempo dedicado a cada proyecto. Así
es como funciona: mientras que estás trabajando con el ordenador le dices al pro­
grama con qué proyecto estás trabajando. Cuando cambias a otro proyecto, te vas
a comer o terminas el trabajo del día, haces que el programa lo sepa. Al final de
la semana (o del mes), el programa puede mostrar un cálculo del empleo que le
has dado a tu tiempo. Puedes, también, configurar Windows para que cargue au­
tomáticamente el programa cuando lo arranques.

Todos los datos de los tiempos de tus proyectos se almacenarán en un archivo y


se podrán actualizar acumulativamente. Las estadísticas obtenidas de los datos po­
drán ser mostradas en la pantalla o imprimirse en papel. El nombre del archivo

349
1 3 Una aplicación para Windows completa
EL LIBRO DEL VISUAL BASIC

del proyecto se almacenará en una variable de iniciación en tu archivo WIN.INI;


así, no tendrás que especificar el archivo de proyecto cada vez que ejecutes la
aplicación.

La figura 13.1 muestra el plan general de acción para el proceso inicial. Después
de la inicialización, el programa es controlado por las acciones del usuario: selec­
cionar una opción de un menú, hacer clic en un botón, salir del programa. En la
figura 13.2 se han definido un conjunto de acciones para cada uno de esos posi­
bles eventos.

Te darás cuenta de que trazar diagramas como estos antes de diseñar un progra­
ma es extremadamente útil, incluso cuando los recuadros de las tareas son de un
nivel muy alto (es decir, no detallados), como los que se usan en las figuras 13.1
y 13.2. Poner un plan sobre el papel ayuda a cristalizar las ideas vagas en pasos
concretos. También es más fácil identificar zonas que se han pasado por alto o
que están incompletas, y a menudo se pueden encontrar procesos comunes que
pueden compartir código. Si el diseño es de un nivel lo suficientemente alto, pue-

Figura 13.2.
Un plan de la parte más utilizada de la aplicación Cronómetro de Proyectos

des implementar cada recuadro como procedimientos que no hagan nada, e im­
plementar los detalles una vez que la estructura del programa principal se haya
definido, como estás haciendo en este capítulo.

Diseño del menú


Comencemos la implementación programando el sistema de menús. Necesitarás
Figuro 13.1.
dos menús, a los cuales llamaremos Archivo y Proyecto, para darle al usuario el
Un plan para el proceso inicial del la aplicación Cronómetro de Proyectos

350 351
EL LIBRO DEL VISUAL BASIC 13 Una aplicación para Windows completa

control básico sobre la aplicación. En el menú Archivo, el comando Nuevo permi­ usuario trabajar con el archivo de proyectos abierto actualmente, con el objetivo
tirá al usuario crear un archivo de proyecto nuevo, y el comando Abrir permitirá de añadir o eliminar proyectos, para poner a cero las estadísticas y para mostrar
que el usuario abra un archivo ya existente para volver a usarlo. El comando Im­ éstas. La figura 13.3 esquematiza el proceso que llevarán a cabo algunos de estos
primir del menú Archivo escribirá las estadísticas actuales en la impresora, y el comandos.
comando Salir terminará el programa. El menú Proyecto, por su parte, permitirá al
Trabajar en la estructura general del programa antes de empezar a escribir el
código te permitirá, a menudo, ahorrar tiempo, ya que te darás cuenta de qué
procedimientos se utilizan en más de una ocasión a lo largo del programa. Por
ejemplo, observa que aparece un recuadro etiquetado como Reinicializar contro­
les en la figura 13.3 y que también aparece otro recuadro similar denominado Ini­
cializar controles en el diagrama de la figura 13.1. Como sabes que se va a dar un
proceso similar en ambos casos, puedes escribir un solo procedimiento en lugar
de dos separados.

Comienza un proyecto nuevo en Visual Basic y abre la ventana de diseño de me­


nús. La figura 13.4 muestra el diseño de la jerarquía del menú después de que se
han introducido los títulos. Ten en cuenta los guiones que se han introducido en
la lista para crear barras separadoras en el menú Archivo. Escribe el nombre de
cada menú en el cuadro Name de la ventana Menu Design, de la forma que se
indica en la figura 13.5.

Figura 13.4.
Figura 13.3.
El diseño de la jerarquía del menú de la aplicación Cronómetro de Proyectos
Un plan para las opciones del menú de la aplicación Cronómetro de Proyectos

352 353
1 3 Una aplicación para Windows completa

comando. Cuando hayas terminado de añadir estos controles al formulario (utili­


Caption Name
zando la figura 13.6 como modelo), establece las propiedades del formulario y de
los controles como se muestra en la figura 13.7.
&Archivo mnuArchivo
&Nuevo mnuAchNuevo
&Abrir mnuAchAbrir Objeto Propiedad Ajuste

- mnuAchNULL1 3 - Fixed Double


Form1 BorderStyle
&Imprimir mnuAchImprimir Caption Cronómetro de Proyectos
- mnuAchNULL2 Name RelojPrincipal
&Salir mnuAchSalir Label1 Caption [ninguna]
&Proyecto mnuProyecto Name lblFechaHora
&Añadir mnuProAñadir Label2 Alignment 1 - Right Justify
&Eliminar mnuProEliminar Caption Proyecto:
&Poner a cero mnuProPonerACero Combo1 Name cboListaProyectos
&Mostrar todo mnuProMostrarTodo Style 2 - Dropdown List
Label3 Alignment 1 - Right Justify
Figura 13.5. Caption Inicio:
Los nombres de los elementos del menú de la aplicación Cronómetro de Proyectos Label4 BorderStyle 1 - Fixed Single
Caption [ninguna]

Diseño del formulario Name lblInicio


Label5 Alignment 1 - Right Justify
El formulario principal de la aplicación es relativamente simple. Como se muestra Caption Fin:
en la figura 13.6, contiene 10 etiquetas, un cuadro combinado, un control cuadro Label6 BorderStyle 1 - Fixed Single
de dibujo, un reloj (un control del tipo Timer), un diálogo estándar y un botón de Caption [ninguna]
Name lblFin
Label7 Alignment 1 - Right Justify
Caption Transcurrido:
Label8 BorderStyle 1 - Fixed Single
Caption [ninguna]
Name lblTranscurrido
Label9 Alignment 1 - Right Justify
Caption Total del proyecto:
Label10 BorderStyle 1 - Fixed Single
Caption [ninguna]
Name lblTiempoTotal

Figura 13.6.
El diseño inicial del formulario principal de la aplicación Cronómetro de Proyectos Figura 13.7. (continúa)
El ajuste de las propiedades de la aplicación Cronómetro de Proyectos

354
355
El libro del visual basic
13 Una aplicación para Windows completa

Figura 13.7. continuación


Declaraciones globales
Objeto Propiedad Ajuste
Selecciona el comando New Module del menú File de Visual Basic y añade el có­
Picture1 FillStyle 0 - Solid digo que se muestra en la figura 13 9. Este módulo de código contiene las decla­
Name picEstado raciones globales y las rutinas compartidas por los distintos formularios que
ScaleHeight -2 compondrán la aplicación.
ScaleLeft -1
ScaleMode 0 - User
ScaleTop 1 Global Const PI = 3.1415926
ScaleWidth 2 Global Const WIN_ICONIZED = 1

Command1 Caption Inicio


'Parámetros de MsgBox
Name btnControl Global Const MB_OK = 0 ’Sólo el botón Aceptar
Timer1 Name tmrTic Global Const MB_OKCANCEL = 1 'Los botones Aceptar y Cancelar
CMDialogl Name Dlogo Global Const MB_ABORTRETRYIGNORE = 2 'Los botones Abortar,
'Reintentar e Ignorar
Global Const MB_YESNOCANCEL = 3 'Los botones Si, No y Cancelar
Después de que hayas establecido las propiedades, tu formulario debe parecerse Global Const MB_YESNO = 4 'Los botones Si y No
al que se muestra en la figura 13.8. Global Const MB_RETRYCANCEL =5 'Los botones Reintentar y Cancelar
Global Const MB_ICONSTOP = 16 'Mensaje critico
El usuario podrá seleccionar un proyecto de la lista desplegable del cuadro com­
binado Proyectos. Los cálculos de la hora de inicio, de finalización y el tiempo 'Banderas del cuadro de diálogo Abrir/Guardar
transcurrido serán similares a los que usamos en la aplicación Cronómetro del ca­ Global Const OFN_0VERWRITEPROMPT = &H2&
pítulo 1. Un solo botón de comando iniciará y detendrá la cuenta del tiempo, y el Global Const OFN_PATHMUSTEXIST = &H800&
título del botón cambiará según corresponda. Finalmente, el control timer y el
cuadro de dibujo ayudarán a mejorar un poco el aspecto de la aplicación. 'Valores devueltos por MsgBox
Global Const ID_OK = 1 'Se ha pulsado el botón Aceptar
Global Const ID_CANCEL = 2 'Se ha pulsado el botón Cancelar
Global Const ID_ABORT = 3 'Se ha pulsado el botón Abortar
Global Const ID_RETRY = 4 'Se ha pulsado el botón Reintentar
Global Const ID_IGNORE = 5 'Se ha pulsado el botón Ignorar
Global Const ID_YES = 6 'Se ha pulsado el botón Si
Global Const ID_NO = 7 'Se ha pulsado el botón No

'Tipos específicos de la aplicación


Type RegProy
Nombre As String * 30
TiempoTotal As Double
End Type

Figura 13.8.
El diseño completo del formulario principal de la aplicación Cronómetro de Proyectos Figura 13.9. (continúa)
Las declaraciones globales de la aplicación Cronómetro de Proyectos
356
357
EL libro del visual basic
13 Una aplicación para Windows completa

Figura 13.9. continuación grande como para contener una pregunta simple (en una etiqueta) y una respues­
ta simple (en un cuadro de texto).

Global Const TAMAÑO_REG_PROY = 38 Crea este formulario seleccionando el comando New Form del menú File de Vi­
sual Basic o haciendo clic en el botón New Form de la barra de herramientas.
'Variables globales de la aplicación Dibuja la etiqueta, el cuadro de diagramas comunes de comando, y establece las
propiedades del formulario y de los objetos como se indica en la figura 13.10. La
Global ListaProyectos( ) As RegProy 'Matriz con la información figura 13.11 muestra el formulario terminado.
'de los proyectos
Global NumProyectos As Integer 'Número de proyectos
Global NombreArchivoProyecto As String 'Archivo de datos de
Objeto Propiedad Ajuste
'proyectos
Global CRLF As String 'Constante multicarácter Form2 BorderStyle 1 - Fixed Single
Caption Proyecto
Global RelojFuncionando As Integer 'Estado del timer
ControlBox False
Global HoraInicio As Double, HoraFin As Double
Global SumaTiempoDeProyectos As Double
Name Consulta
Label1 Caption [ninguna]
Name lblConsulta
Text1 Name txtConsulta
incluye un nombre y la cantidad de tiempo registrado para cada proyecto. La
Text [ninguna]
constante TAMAÑO_REG_PROY define el número de bytes de cada registro de
Command1 Caption Aceptar
proyecto.
Default True
Finalmente, el código declara las variables que usará el programa. ListaProyectos Name btnAceptar
es una matriz dinámica que contendrá los registros de proyecto. NumProyectos Command2 Cancel True
contendrá el número de proyectos que la aplicación está controlando en la actua­ Caption Cancelar
lidad. CRLF se usará como una constante de cadena para almacenar los caracteres Name btnCancelar
de retorno de carro y avance de línea. Reloj Funcionando contendrá un valor
booleano que indicará si el programa está actualmente contando tiempo para un Figura 13.10.
proyecto. HoraInicio y HoraFin contendrán los valores actuales del control timer, El ajuste de las propiedades del formulario Consulta y de sus controles
y la variable SumaTiempoDeproyectos contendrá la suma acumulativa de todo el
tiempo cargado a todos los proyectos. Para controlar este formulario debes escribir una función que lo muestre en pan­
talla y que devuelva cualquier información que el usuario escriba en él. Para que
sea accesible para toda la aplicación, esta función debe estar en un módulo; pon-
Formularios auxiliares la en el módulo que contiene las constantes globales:

Esta aplicación requiere, además del formulario principal que hemos creado, otros Function TextoDeConsulta (S As String) As String
dos formularios adicionales, ambos muy simples. EL primero, llamado Consulta, Consulta.lblConsulta.Caption = S
servirá como alternativa a la función InputBox de Visual Basic, que tiene tenden­ Consulta.txtConsulta.Text = ""
cia a crear unos cuadros de diálogo bastante desaliñados (impropios de personas Consulta.Show 1
detallistas como nosotros). El formulario Consulta debe ser lo suficientemente TextoDeConsulta = Consulta.txtConsulta.Text
End Function

358
359
EL LIBRO DEL VISUAL BASIC 13 Una aplicación para Windows completa

ben establecerse como muestra la figura 13.12. El formulario terminado aparece


en la figura 13.13.

Objeto Propiedad Ajuste

Figura 13.11. Form3 Caption Estadísticas del cronómetro de proyectos


El diseño completo del formulario Consulta Name ProyStat
Text1 MultiLine True
La función acepta un parámetro de cadena, que inserta en la etiqueta del formu­ Name txtStats
lario. Entonces, borra el cuadro de texto del formulario y muestra el formulario ScrollsBars 2 - Vertical
usando el método Show. El parámetro 1 indica que el método Show debe mostrar Text [ninguno]
el formulario de manera modal —es decir, la función TextoDeConsulta se deten­
drá hasta que el usuario cierre el formulario Consulta. Cuando se haya cerrado el Figura 13.12.
formulario Consulta, la función devolverá el texto que el usuario haya introducido El ajuste de las propiedades del formulario ProyStat y de su control
en el cuadro de texto.

Aunque esta función es suficiente para mostrar el formulario y devolver un valor,


el propio formulario debe gestionar los botones Aceptar y Cancelar. Haz doble
clic en el botón Aceptar y añade este procedimiento:

Sub btnAceptar_Click
Hide
End Sub

Cuando el usuario haga clic en el botón Aceptar, el método Hide cerrará el for­
mulario Consulta, y el control será devuelto a la función TextoDeConsulta. Un
procedimiento similar se necesitará para el botón Cancelar:
Sub btnCancelar_Click ( ) Figura 13.13.
txtConsulta.Text = "" El diseño terminado del formulario ProyStat
Hide
End Sub
El formulario ProyStat no es modal —es decir, el usuario puede volver al formula­
El código del botón Cancelar realiza un paso adicional consistente en borrar el rio principal sin cerrar la ventana de estadísticas— y, por tanto, no requiere una
contenido del cuadro de texto. Esto asegura que la función TextoDeConsulta rutina especial de control. Sin embargo, puedes definir una rutina que haga más
siempre devolverá una cadena vacía cuando se haga clic en el botón Cancelar.
fácil que el programa ponga datos en el cuadro de texto. Este procedimiento, que
(Observa que esta implementación no distingue entre si el usuario no introduce
se debe situar en el módulo de código, permite que el programa envíe las líneas
texto pero hace clic en el botón Aceptar o si introduce texto y hace clic en el bo-
al cuadro de texto de una en una, en lugar de tener que enviar toda la informa­
tón Cancelar.)
ción a la vez:
El segundo formulario auxiliar, que hemos llamado ProyStat, proporciona un lu­
Sub AñadírLineaStat (L As String)
gar donde mostrar las estadísticas de todos los proyectos. Su único control es un ProyStat.txtStats.Text = ProyStat.txtStats.Text + L + CRLF
simple cuadro de texto. Las propiedades del formulario y del cuadro de texto de­ End Sub

360 361
EL LIBRO DEL VISUAL BASIC 13 Una aplicación para Windows completa

El procedimiento AñadirLineaStat añade una línea al texto ya existente en el cua­ inicialización desde los tres lugares —y por ello se llama a un procedimiento de
dro de texto y luego, añade un retorno de carro/avance de línea para pasar a la inicialización separado.
siguiente línea.
También necesitarás indicar a Visual Basic que comience la aplicación ejecutando
Si quieres mejorar el aspecto de este formulario te puedes asegurar de que el cua­ el procedimiento Main. Selecciona el comando Proyect del menú Options y esta­
dro de texto siempre tenga el mismo tamaño que el formulario, sin que haya es­ blece la opción Start Up Form (formulario inicial) a Sub Main.
pacio libre entre uno y el otro. Para ello, haz doble clic en el formulario para que
aparezca la ventana de código e introduce el siguiente procedimiento para el La estructura de eventos
evento Resize.
El código de programa que se muestra en la figura 13.14 implementa las fun­
Sub Form_Resize ( ) ciones básicas de cada uno de los eventos de usuario que pueden ocurrir en el
txtStats.Left = ScaleLeft formulario principal. Este código implementa los eventos como llamadas a proce­
txtStats.Top = ScaleTop dimientos de alto nivel, dejando el trabajo de detalle para más tarde.
txtStats.Width = ScaleWidth
txtStats.Height = ScaleHeight Observa cómo se utilizan los procedimientos Form_Load y Form_Unload en la
End Sub figura 13.14. En este programa, el procedimiento Main recibe el control inicial­
Siempre que se cambie el tamaño del formulario (incluyendo la primera vez que mente y no se carga ningún formulario de manera automática. El procedimiento
aparece en pantalla), este procedimiento establecerá el tamaño del cuadro de tex­ Form_Load puede, por tanto, servir como procedimiento de inicialización del
to para que se adapte a las dimensiones internas del formulario.

EI procedimiento Main Sub btnControl_Click ( )


If RelojFuncionando Then
En un proyecto que contenga muchos formularios o en un proyecto en el que se DetenerReloj
deba producir una inicialización antes de que se muestre un formulario en panta­ Else
lla, a menudo resulta útil hacer que el programa de Visual Basic comience ejecu­ IniciarReloj
tando un procedimiento específico, en lugar de mostrar simplemente el primer End If
formulario. Si eliges este camino deberás dar al procedimiento el nombre Main End Sub
(Principal) y ponerlo en un módulo. Abre la ventana del módulo de código e in­
troduce este procedimiento: Sub Form_Load ()
Dim I As Integer
Sub Main ( )
CRLF = Chr$(13) + Chr$(10) 'Cargar el cuadro de lista con los nombres de los proyectos
NombreArchivoProyecto = BuscarArchivoDeProyectos( ) For I = 0 To NumProyectos - 1
IniciarProyecto cboListaProyectos.AddItem RTrim$(ListaProyectos(I).Nombre)
End Sub cboListaProyectos.ItemData(cboListaProyectos.NewIndex) = I
Es este caso el procedimiento Main inicializa la variable de cadena CRLF, llama a Next I
cboListaProyectos.Enabled = True
una función para buscar el archivo de datos del proyecto y luego sigue con el
End Sub
procedimiento IniciarProyecto (que todavía no hemos escrito). ¿Recuerdas los dia­
gramas de flujo de las figuras 13.1 y 13.3? Mostraban que esta inicialización debía
ser común tanto para los comandos Nuevo y Abrir del menú como para el código
Figura 13.14. (continúa)
de arranque del programa; así que lo mejor será que puedas acceder al código de
Procedimientos de eventos de la aplicación Cronómetro de Proyectos

362
363
13 Una aplicación para Windows completa
EL LIBRO DEL VISUAL BASIC

Figura 13.14. continuación


Figura 13.14. continuación

Sub mnuProMostrarTodo_Click ( )
Sub Form_Unload (Cancel As Integer)
MostrarEstadisticas False
If RelojFuncionando Then DetenerReloj
End Sub
Unload Consulta
Unload ProyStat
Sub mnuProPonerACero
EscribirArchivoDeProyectos NombreArchivoProyecto
PonerACeroTotalesProyecto
End Sub
End Sub
Sub mnuAchSalir_Click ( )
Sub cboListaProyecto_Click ( )
Unload RelojPrincipal
lblInicio.Caption = ""
End
lblFin.Caption = ""
End Sub
lblTranscurrido.Caption = ""
'No olvides introducir las lineas siguientes en la misma linea
Sub mnuAchNuevo_Click ( )
lblTiempoTotal.Caption =
Unload RelojPrincipal
TimeStr(ListaProyectos(cboListaProyectos.ItemData
NombreArchivoProyecto = NuevoArchivoDeProyectos( )
(cboListaProyectos.ListIndex)).TiempoTotal )
IniciarProyecto
End Sub
End Sub

Sub mnuAchAbrir_Click ( )
Unload RelojPrincipal
NombreArchivoProyecto = BuscarArchivoDeProyectos( ) cuadro de lista, y Form_Unload se utiliza para asegurarnos de que todos los datos
IniciarProyecto se escriben en el disco.
End Sub
El trabajo que queda consiste en definir los procedimientos que implementan to­
Sub mnuAchImprimir_Click ( ) dos los detalles del programa. Estos procedimientos se pueden dividir en dos gru­
MostrarEstadisticas True pos: los que tratan fundamentalmente con el formulario principal y los que
End Sub tratan con la gestión de los datos. Los procedimietos que interactúan con el for­
mulario principal, los cuales se muestran en la figura 13.15, deben introducirse en
Sub mnuProAñadir_Click ( )
la sección general del código del formulario.
Dim NombreNuevo As String
En la figura 13.16 encontrarás las rutinas finales necesarias para hacer que la apli­
NombreNuevo = TextoDeConsulta("Nombre del proyecto:") cación funcione. Introdúcelas en el módulo de código del procedimiento Main.
If NombreNuevo <> "" Then AñadirProyecto NombreNuevo
End Sub Antes de que puedas ejecutar el programa Cronómetro de Proyectos debes incluir
las rutinas ObtenerIni y EstablecerIni que escribiste en el capítulo 9. Selecciona el
S u b m n u P r o E l i m i n a r _C l i c k ( ) comando Add File del menú Archivo de Visual Basic y carga el módulo de codigo
If cboListaProyectos.Text <> "" Then EliminarProyecto en el que guardaste estos procedimientos.
End Sub
Como puedes ver en el código de la figura 13.16, la función BuscarArcbivoDe-
Proyectos usa la función ObtenerIni para conseguir el nombre de tu archivo de
(continúa)

365
364
LIBRO DEL VISUAL BASIC
13 Una aplicación para Windows completa

Sub AñadirProyecto (NombreDelProyecto As String) Figura 13.15. continuación


'Añadir un nombre al cuadro de lista
cboListaProyectos.AddItem NombreDelProyecto
cboListaProyectos.ItemData(cboListaProyectos.NewIndex) = Sub DetenerReloj ( )
NumProyectos Dim TiempoTranscurrido As Double
'Añadir el registro a los totales del proyecto
ListaProyectos(NumProyectos).Nombre = NombreDelProyecto HoraFin = Now
NumProyectos = NumProyectos + 1 RelojFuncionando = False
'Seleccionar un proyecto nuevo 'Actualizar la información mostrada
cboListaProyectos.ListIndex = cboListaProyectos.NewIndex Caption = "Reloj del proyecto"
End Sub btnControl.Caption = "Inicio"
lblFin.Caption = TimeStr(HoraFin)
Sub EliminarProyecto ( )
TiempoTranscurrido = HoraFin - HoraInicio
Dim Respuesta As Integer
lblTranscurrido.Caption = TimeStr(TiempoTranscurrido)
'Actualizar estructuras de datos
Respuesta = MsgBox("¿Eliminar el proyecto " +
ListaProyectos(cboListaProyectos.ListIndex).TiempoTotal =
cboListaProyectos.Text + "?", MB_YESN0, "Proyecto")
ListaProyectos(cboListaProyectos.ListIndex).TiempoTotal +
If Respuesta = ID_YES Then
TiempoTranscurrido
cboListaProyectos.RemoveItem cboListaProyectos.ListIndex
lblTiempoTotal.Caption =
End If
TimeStr(ListaProyectos(cboListaProyectos.ListIndex).TiempoTotal )
End Sub
SumaTiempoDeProyectos = SumaTiempoDeProyectos + TiempoTranscurrido
Sub IniciarReloj ( ) 'Activar objetos del formulario
If cboListaProyectos.Text = "" Then cboListaProyectos.Enabled = True
MsgBox "No se ha seleccionado ningún proyecto", MB_ICONSTOP mnuArchivo.Enabled = True
Exit Sub mnuProyecto.Enabled = True
End if End Sub
HoraInicio = Now
RelojFuncionando = True
'Actualizar la información mostrada Sub PonerACeroTotalesProyecto ( )
Caption = "Reloj del proyecto (funcionando)" Dim Respuesta As Integer, I As Integer
btnControl.Caption = "Stop"
lblInicio.Caption = TimeStr(HoraInicio) Respuesta = MsgBox("¿Poner a cero los totales de los proyectos?",
lblFin.Caption = " - funcionando - " MB_OKCANCEL, "Proyecto")
lblTranscurrido.Caption = "" If Respuesta = ID_OK Then
'Desactivar objetos del formulario For I = 0 To NumProyectos - 1
cboListaProyectos.Enabled = False ListaProyecto(I).TiempoTotal = 0
mnuArchivo.Enabled = False Next I
mnuProyecto.Enabled = False SumaTiempoDeProyectos = 0
End Sub cboListaProyectos_Click
End If
End Sub
Figura 13.15. (continúa)
Los procedimientos generales del formulario principal de Cronómetro de Proyectos

366
367
EL LIBRO DEL VISUAL BASIC
13 Una aplicación para Windows completa

Figura 13.16. continuación


Function BuscarArchivoDeProyectos ( ) As String
Dim F As String, Respuesta As Integer

F = ObtenerIni("Cronometro de Proyectos", "Proyectos") 'Empezar con el filtro .DAT


If F = "" Then RelojPrincipal.Dlogo.FIags = OFN_OVERWRITEPROMPT Or
Respuesta = MsgBox("No se ha especificado ningún archivo OFN_PATHMUSTEXIST
de proyecto. ¿Crear uno?", MB_OKCANCEL, "Proyectos") On Error Goto AtraparError 'Gestión de Cancelar
'No se puede continuar sin un archivo de proyecto RelojPrincipal.Dlogo.Action = 2 'Mostrar el cuadro de diálogo
If Respuesta <> ID_OK Then End On Error Goto 0 'Restaurar el gestor de errores por omisión
F = NuevoArchivoDeProyectos( ) F = RelojPrincipal.Dlogo.FileName
Else EstablecerIni "Cronometro de Proyectos", "Proyectos", F
If Dir$(F) = " " Then NuevoArchivoDeProyectos = F
Respuesta = MsgBox("No se puede encontrar " + F, MB_OK, Exit Function
"Proyectos")
F = NuevoArchivoDeProyectos( ) AtraparError:
End If MsgBox "No se ha seleccionado ningún archivo. Fin el programa."
End If End
BuscarArchivoDeProyectos = F
End Function End Function

Sub IniciarProyecto ( ) Sub LeerArchivoDeProyecto (NombreArchivo As String)


LeerArchivoDeProyecto NombreArchivoProyecto Dim Ix As Integer
Reloj Funcionando = False
Open NombreArchivo For Random As #1 Len = TAMAÑO_REG_PR0Y
Load RelojPrincipal
RelojPrincipal.Show NumProyectos = LOF(1) / TAMAÑO_REG_PROY
ReDim ListaProyectos(NumProyectos + 100) 'Hacer sitio
End Sub
'para expandirse
Function NuevoArchivoDeProyectos ( ) As String For Ix = 0 To NumProyectos - 1
Get #1, , ListaProyectos(Ix)
Dim F As String
SumaTiempoDeProyectos = SumaTiempoDeProyectos +
ListaProyectos(Ix).TiempoTotal
RelojPrincipal.Dlogo.DialogTitle = "Nuevo archivo de proyecto"
R e l o j P r i ncipal.Dlogo.CancelError = True Next Ix
RelojPrincipal.Dlogo.DefaultExt = "DAT" 'Añadir .DAT por omisión Close #1
RelojPrincipal.Dlogo.FileName = "PROY.DAT" End Sub
'Empezar con este nombre
Sub MostrarEstadisticas (EnPapel As Integer)
RelojPrincipal.Dlogo.Filter =
Dim I As Integer, J As Integer, LineaDeSalida As String
"Archivos de datos (*.DAT)|*.DAT|Todos los archivos(*.)|*.*"
RelojPrincipal.Dlogo.FilterIndex = 1
Load ProyStat
ProyStat.txtStats.Text = " "

Figura 13.16. (continúa)


Los procedimientos generales para la gestión de datos de Cronómetro de Proyectos (continúa)

368 369
EL LIBRO DEL VISUAL BASIC 13 Una aplicación para Windows completa

Figura 13.16. continuación proyectos de WIN.INI. Si ObtenerIni no puede encontrar la información, Buscar-
ArchivoDeProyectos llamará a la función NuevoArchivoDeProyectos, la cual pedirá
un nombre para un nuevo archivo de proyectos y luego llamará a EstablecerIni
For I = 0 To RelojPrincipal.cboListaProyectos.ListCount - 1 para guardar la respuesta.
J = RelojPrincipal.cboListaProyectos.ItemData(I)
LineaDeSalida = ListaProyectos(J).Nombre + " " + El procedimiento IniciarProyecto es llamado cuando el programa empieza a fun­
TimeStr(ListaProyectos(J).TiempoTotal) cionar y luego vuelve a ser llamado cada vez que se seleccionan los comandos
If EnPapel Then Nuevo o Abrir del menú Archivo de la aplicación. Llama al procedimiento LeerAr-
Printer.Print LineaDeSalida chivoDeProyectos, el cual abre el archivo de proyectos y lee la información de to­
Else dos los proyectos guardados.
AñadirLineaStat LineaDeSalida
End If El procedimiento AñadirProyecto (que aparece en la figura 13.15) inserta el nom­
Next I bre de un nuevo proyecto en el cuadro combinado e inicializa el tiempo y el
LineaDeSalida = "Tiempo total controlado: " + nombre del proyecto en la matriz ListaDeProyectos. Usar la propiedad ItemData
TimeStr(SumaTiempoDeProyectos) del cuadro combinado permite al programa enlazar el nombre de un proyecto
If EnPapel Then con la información correspondiente en la matriz ListaDeProyectos.
Printer.Print LineaDeSalida
Printer.EndDoc Cuando se termina con un proyecto determinado, el procedimiento EliminarPro-
Else yecto (que aparece en la figura 13.15) borra el nombre y el tiempo del proyecto
Añadir LineaStat LineaDeSalida del cuadro combinado. Este procedimiento no se molesta en modificar el conteni­
ProyStat.Show
do de la matriz ListaDeProyectos porque el procedimiento EscribirArchivoDePro-
End If
yectos ignorará todos los proyectos eliminados cuando guarde en el disco la
End Sub
Function TimeStr(ByVal T As Double) As String información sobre los proyectos.
TimeStr = Format$(T, "hh:mm:ss")
Puedes ver el contenido del archivo de proyectos actual en una ventana seleccio­
End Function
nando el comando "Mostrar todos" del menú Proyecto de la aplicación, o puedes
Sub EscribirArchivoDeProyectos (NombreDeArchivo As String) imprimir la misma información seleccionando Imprimir del menú Archivo. Como
Dim I As Integer, J As Integer los procesos son muy similares, el procedimiento MostrarEstadisticas se ocupa de
ambas tareas. Si el parámetro EnPapel es True, MostrarEstadisticas enviará la in­
'Borrar el archivo antiguo y escribir los datos nuevos para formación al objeto Printer; en caso contrario, el procedimiento enviará la infor­
'evitarnos tener que trabajar con registros en blanco de mación a la pantalla.
'proyectos eliminados
Kill NombreDeArchivo Finalmente, el procedimiento EscribirArchivoDeProyectos guarda todos los datos
Open NombreDeArchivo For Random As #1 Len = TAMAÑO_REG_PROY de los proyectos en un archivo vacío, lo que nos evita el problema de tener que
For I = 0 To RelojPrincipal.cboListaProyectos.ListCount - 1
trabajar con los registros en blanco que resulten de eliminar proyectos de la lista.
J = RelojPrincipal.cboListaProyectos.ItemData(I)
EscribirArchivoDeProyectos es llamado por el procedimiento de evento Form_Un-
Put #1, , ListaProyectos(J)
load del formulario RelojPrincipal, lo cual te asegura que toda la información se
Next I
Close #1
guarde cuando salgas del programa. Además, el procedimiento de los comandos
End Sub Nuevo y Abrir del menú Archivo descargan el formulario explícitamente, guar­
dando de esta manera el archivo de proyectos actual antes de abrir un archivo
nuevo.

371
370
13 Una aplicación para Windows completa
EL LIBRO DEL VISUAL BASIC

Figura 13.17. continuación


La aplicación está ahora lista para funcionar. Sin embargo, antes de ejecutar el
programa demos un paso más.
Sub Form_Resize ( )
Un pequeño "flash" 'Asegurar que el titulo es el correcto
lblFechaHora.Caption = Format$(Now, ”dd MMMM yyyy")
Finalmente, puedes añadir un par de pequeñas rutinas que son técnicamente inne­ 'Desactivar el timer cuando el proyecto esté iconizado; no es
cesarias, pero que le dan al programa un poco de viveza. Mediante estas rutinas 'necesario gastar tiempo dibujando gráficos que no se pueden ver
el usuario verá una imagen cambiando continuamente cuando el reloj esté fun­ I f R e l o j P r i n c i p a l . W i n d o w S t a t e = W I N _ _I C O N I Z E D T h e n
cionando, lo que proporciona una confirmación visual de que el programa se tmrTic.Interval = 0
está ejecutando. La imagen será un segmento de un círculo que gira de manera Else
tmrTic.Interval = 60
muy similar a la aguja de un cronómetro.
End If
Puedes utilizar el objeto timer de Visual Basic y hacer que el gráfico recorra el cír­ End Sub
culo con cada tic. El gráfico es una "porción de tarta" de un octavo del área del
círculo. La variable QuePorcion variará de 0 a 7 (en orden inverso) para determi­
nar qué porción debe pintar a continuación. Como debe retener el dato entre lla­
madas, QuePorcion debe declararse con la palabra clave Static, como se muestra misma. Debido a la manera en que Visual Basic dibuja los radios de la porción,
en la figura 13.17. se debe desplazar la porción un valor muy pequeño (como 0,001). Para crear los
radios de una porción de tarta se debe llamar al método Circle usando números
En este código se llama al método Circle para crear la porción, con parámetros negativos. Cuando n es 0, nπ/4 también es 0; esto es, un valor no negativo. Aña­
que son siempre nπ/4 y (n+1)π/4 para que la forma de la porción sea siempre la diendo el pequeño desplazamiento nos aseguramos de que los valores de co­
mienzo y de final siempre serán negativos.

La figura 13.18 muestra en acción la aplicación Cronómetro de proyectos una vez


Sub tmrTic_Timer ( )
If ReIojFuncionando Then SiguientePorcion finalizada.
End Sub

Sub SiguientePorcion ( )
Static QuePorcion As Single

picEstado.Fill Col or = picEstado.BackColor


picEstado.Circle (0, 0), 1
picEstado.Fill Color = picEstado.ForeColor
picEstado.Circle (0, 0), 1, , PI * -(QuePorcion + .0001) / 4,
PI * -(((QuePorcion + 1) Mod 8) + .0001) / 4
QuePorcion = QuePorcion - 1
If QuePorcion < 0 Then QuePorcion = 7
End Sub

Figura 13.18.
Figura 13.17. (continúa)
ejecución de la aplicación Cronómetro de proyectos terminada
Los procedimientos "extra"para la aplicación Cronómetro de Proyectos

373
372
EI LIBRO DEL VISUAL BASIC

Una mirada hacia delante


Ya sabes todo lo que hay que saber sobre Visual Basic, ¿verdad? Pues me temo
Indice alfabético
que no todo. Aunque ahora puedes tener confianza en tu capacidad para escribir
aplicaciones con Visual Basic, este sistema de programación tiene muchas otras
características avanzadas que no se han tratado en este libro. Por ejemplo, Visual
Basic permite utilizar la potencia del DDE (intercambio dinámico de datos) para
llevar a cabo tareas como exportar un dato a una hoja de cálculo de Microsoft Ex­
cel, importar el gráfico de tarta resultante y mostrar el gráfico en tu aplicación. O Caracteres especiales A
puedes crear una aplicación MDI (interface de múltiples documentos), en la cual
! (carácter de declaración de tipo), 47, Abrir, cuadros de diálogo, 142-143.
un formulario contiene a otros formularios, de manera similar a la del Administra­ 57. abrir archivos
dor de programas o a la del Administrador de archivos de Windows. Y puedes ? (carácter comodín), 138, 142. cuadros de diálogo Abrir para,
añadirle a tus aplicaciones una Ayuda en línea para que sea más fácil de usar y ' (carácter de comentario), 49. 142-143-
de entender, como cualquier programa comercial. Solamente estás limitado por tu (especifica la precedencia de los de acceso aleatorio, 260-261.
imaginación —bueno, por eso y por el tiempo de que dispongas. operadores), 66. secuenciales, 253-254.
- (especifica la barra separadora en Access, Microsoft, 312, 316.
menús), 155. Action, propiedad
/ (operador de división en coma cuadros de diálogo estándar, 141,
flotante), 67. 143, 145, 147, 148.
- (operador de resta), 67. OLE, 337.
$ (carácter de declaración de tipo), 47. actualizar el acceso a bases de datos,
+ (operador de concatenación), 53, 319.
71-73. Actualizar, método, 320.
+ (operador de suma), 67. Add Watch, botón, 226.
* (carácter comodín), 138, 142. Add Watch, comando, 226, 230.
* (operador de multiplicación), 67. AddItem, método, 119, 122.
`^ (operador de exponenciación), 67. AddNew, método, 320.
< (operador menor que), 73- Alignment, propiedad, 104.
<= (operador menor o igual que), 74. Allen, Paul, xvi.
<> (operador distinto que), 74. Alt, tecla, atajos de menú y, 151.
= (operador de asignación), 63, 346. ámbito
= (operador igual que), 74. declaraciones de tipos por omisión
> (operador mayor que), 73. y, 57-60.
>= (operador mayor o igual que), 74. determinar, 52-54.
% (carácter de declaración de tipo), 47. la ventana Debug y, 224.
# (carácter de declaración de tipo), 47. métodos y propiedades, 97.
& (especifica tecla de acceso), 151. módulos de código y, 57.
&H(notación hexadecimal), 300. variables globales, 56-57.
@ (carácter de declaración de tipos de variables locales y de nivel de
datos), 47 módulo, 54-56.
| (símbolo de barra vertical), 142. And, operador lógico, 75.

375
374
EL LIBRO DEL VISUAL BASIC
Indice alfabético

aplicaciones OLEGRAPH, 336-343-


arrancar, con procedimientos o con Paleta de direcciones, 101-103. arrancar Visual Basic, 1-2. New Module, botón, 248.
formularios, 248. Proyecto Rejilla, 134-136. arrastrar y soltar, procedimientos de Open Project, botón, 4, 26.
Ayuda (Windows), 148-149. proyectos (Ver proyectos) evento, 214-219. Ver también Properties Window, botón, 8.
Barra de desplazamiento, 127-129. Queso, 119-120. ratón, procedimientos de evento Save Project, botón, 25.
Base de datos tipo agenda, 321-322. registro, para OLE, 335-336. 345. ASCII, caracteres, 33, 174. Single Step, botón, 230.
BIBLIO, base de datos, 312-322. Sonrisa, 94-98. asignación de memoria, 34-35. Ver Start, botón, 15.
también declaraciones Step Procedure, botón, 231.
Calculadora (DISPCALC), 344-347. TestDeArchivos, 245-252.
asistente de configuración de Toggle Breakpoint, botón, 228.
Calcular, 172-176, 178, 205. Tragaperras, 163-169.
aplicaciones, 41-61. View Code, botón, 5.
codificar (Ver codificar) ventanas estándar para, 9-11.
asistente de instalación de aplicaciones, View Form, botón, 5.
Comadrejas, base de datos, 261-279, Vuelo,122-124.
40. barras de desplazamiento
312. árbol de llamadas, 227-228.
asterisco (*) en la aplicación Barra de
compartir objetos entre (Ver enlace archivos
como carácter comodín, 134-142. desplazamiento, 127-129.
e incrustación de objetos OLE)) binarios., 244.
como operador de multiplicación, eventos, 127.
Configurador, 255-257. de acceso aleatorio procedimientos y métodos, 127.
67.
contenedor (container), 333- abrir y cerrar, 260-261. atajos de teclado, 151. propiedades, 126-127.
Conversión de temperaturas, en la aplicación Base d datos atrapar errores, 237-241. vista general, 124-125.
195-198. Comadrejas, 261-279. AUTOEXEC.BAT, archivo, 315. bases de datos. Ver también entrada y
Correo electrónico, 214-219. leer desde y escribir en, 261.. AUTOLOAD.MAK, archivo, 140, 331. salida en archivos
Cronómetro, (Ver Cronómetro, vista general, 244,. 259- AutoRedraw, propiedad, 90, 287-288, acceder, dinámicamente, 323-330.
aplicación) de configuración 308. acceder, mediante controles Data,
Cronómetro de Proyectos (Ver aplicación Memoria, 282-284. AutoSize, propiedad, 104. 139, 316-319.
Cronómetro de Proyectos, funciones del perfil de Windows avanzar acceder, mediante el programa,
aplicación) para acceder a, 281. a paso de procedimiento, 232. 319-322.
depurar (Ver depurar) MSDOS (CONFIG.SYS), 255-257. paso a paso, 231-232. actualizar acceso a, 319.
Dibujar líneas, 212-213. Windows (WIN.INI), 279-284. ayuda sensible al contexto, 4, 234-241. buscar registros específicos, 320-321.
diseñar (Ver diseñar) de extensión Ayuda, aplicación (Windows), 148-149. colecciones, 323.
EditNota, 109-110. controles Grid, 5, 6, 25, 138, Ayuda, sistema en línea, 4, 234-241. conectar, a bases de datos, 316-318.
ejecutar, 14-15, 22. 324-326. consultar, por medio de
Escapar, 208-209. cuadros de diálogo comunes, 5, B descripciones de, 324.
Examinar base de datos, 326-330. 6 , 25, 140. BackColor, propiedad definir vistas de, 319.
fuente, 333. enlace e incrustación de objetos, barra de menús, Visual Basic, 4. en la aplicación BIBLIO, 312-322.
Girar la ruleta, 223-232. 5, 6, 25, 139-140, 331. barra separadora de menús (-), 155. en la aplicación Comadreja,
Grabadora de sonidos (Windows), secuenciales barra de herramientas, 3, 4, 5. 261-279, 312.
333-335. abrir y cerrar, 253-254. Add Watch, botón, 226. en la aplicación Examinar base de
guardar, 25-27, 60. en la aplicación Configurador, Break, botón, 72. datos, 326-330.
interfaces de usuario, ( Ver 255-257. Calis, botón, 227. mostrar datos desde, 318.
interfaces de usuario) escribir en, 255. End, botón, 15, 22. relaciónales, 313-
Juego, 112-114, 115-116. leer desde, 254-255, 258. herramientas de depuración, 222. tipo agenda, aplicación, 321-322.
Memoria, 282-284. vista general, 244, 252-253. Instant Watch, botón, 225. vista general, 311-315.
Metrónomo, 130-132. arcos, 303-306. Menú Design Window, botón, 150. BASIC, lenguaje de programación,
minimizada, 3 argumentos, definidos, 84. New Form, botón, 246. xv-xix. Ver también Visual Basic

376 377
EL LIBRO DEL VISUAL BASIC
Indice alfabético

BIBLIO, aplicación de base de datos, c campos, definición, 52. code, definición, 6


312-322. Cancel, propiedad, 112. codificación. Ver también control,
bits, 29-30, 33- cadenas. Ver también caracteres
CancelError, propiedad, 141. programa; depuración; diseñar
BOF, propiedad, 320. concatenación, 53, 71-73-
Caption, propiedad, 10, 14, 91, 104. compiladores frente a intérpretes,
BorderColor, propiedad, 133- convertir a números, 176.
caracteres UNICODE, 33. 36-39-
BorderStyle, propiedad, 11, 90, 104, convertir números a, 73, 176.
Caracteres especiales datos ( Ver constantes; datos; bases
133. tipo de datos, 41-43-
caracteres. Ver también cadenas de datos; tipos de datos; entrada
BorderWidth, propiedad, 133- caja de herramientas, 3, 6-7.
ASCII, 32, 174. y salida en archivos; variables)
Borland dBase, 312, 316. Check Box, herramienta, 111. color (Ver colores) declaraciones (Ver declaraciones)
Borland Paradox, 312, 316. Combo Box, herramienta, 120. comodín, 138, 142. definición, 6, 15.
botones de comando Command Button, herramienta, contraseña, 107. expresiones (Ver expresiones)
en la aplicación Cronómetro, 11-14. 11-12, 111, 322. de comentario ('), 49- funciones (Ver funciones)
en la aplicación Juego, 112-114. Common Dialog, herramienta, 6, de declaración de tipo, 36, 57-61, 65. generalización, 199-200.
eventos, 112. 141, 255. fuentes, 91-92, 145-147. instrucciones de ordenador, 35-40.
matrices de controles de, 187, 321. Data, herramienta, 139, 315. representación de, 31-32. intérpretes frente a compiladores,
procedimientos y métodos, 112. Directory List Box, herramienta, cartesiano, sistema de coordenadas, 36-39.
propiedades, 111-112. 136, 137, 245. 292. lenguajes ( Ver lenguajes de
vista general, 110-111. Drive List Box, herramienta, 136, Cerrar, comando, 22. ordenador)
botones de opciones 137, 245. cerrar archivos módulos (Ver módulos de código)
en la aplicación Juego, 112-114. File List Box, herramienta, 137, 245. de acceso aleatorio, 260-261. palabras clave (Ver palabras clave)
eventos, 112. Frame, herramienta, 115. secuenciales, 253-254. procedimientos (Ver procedimientos
matrices de controles de, 186. Grid, herramienta, 138, 139, 325. Change, evento de eventos; procedimientos de
procedimientos y métodos, 112 Horizontal Scroll Bar, herramienta, barras de desplazamiento, 127. función; procedimientos sub)
propiedades, 111-112. 125. cuadros combinados, 122. reciclar código, 202.
vista general, 110-111. Image, herramienta, 99. cuadros de lista de directorios, códigos de control, 252-253-
Break, botón, 72. Label, herramienta, 23, 104. cuadros de lista de unidades de colecciones, 323.
Break, comando, 72. Line, herramienta, 132. disco y cuadros de lista de Color, propiedad
breakpoints, 228-229. List Box, herramienta, 117. archivos, 138. Color, cuadros de diálogo, 144.
Bring To Front, comando, 136. OLE, herramienta, 6, 140, 331 - cuadros de texto, 108. Font, cuadros de diálogo, 145
bucles Option Button, herramienta, 111. check boxes (Ver cuadros de control ) colores
definición, 170. Picture Box, herramienta, 99. Check Box, herramienta, 91-111- borde, 133-
Do, declaración (Ver Do, Pointer, herramienta, 12. Checked, propiedad, 155. constantes globales de, 299-300.
declaración) Shape, herramienta, 133. CInt, función, 197. cuadros de diálogo para la
For, declaración, 176, 183. Text Box, herramienta, 141, 107. Circle, método, 286, 303-306. selección de, 145.
infinitos, 170. Timer, herramienta, 129. Claris FileMaker, 312. de elementos del código, 19, 6l.
matrices y, 182-184. Vertical Scroll Bar, herramienta, Clear All Breakpoints, comando, 228. de formas y líneas, 133-134.
bugs, definición, 221. Ver también 124-126. Clear, método, 119, 122. fondo, 90.
depuración; errores Calcular, aplicación, 172-176, 178, 205. Click, evento, 16, 93. gráficos y, 296-300.
buscar información de ayuda, 4, Calculator, aplicación, 343-348. Close, declaración, 253-254, 261. primer plano, 92.
234-236. Calis, botón, 227. Cls, método, 94, 97, 101, 286, 301. columnas
bytes, 33. Calis, comando, 227-228. CMDIALOG.VBX, archivo, 5, 6, 25, 141, bases de datos, 311-
ByVal, palabra clave, 202. cambiar de tamaño a los objetos, 12. 140, 326. grids, 325.

378
:l libro del visual basic Indice alfabético

Columns, propiedad Command Button, herramienta, 11-13, en la aplicación Tragaperras, Main, procedimiento, 363-
controles:grid, 325. 111, 322. 163-169. refinamientos, 372-373-
cuadros de lista, 117. COMMDLG.DLL, archivo, 140. errores comunes, 164. cuadrículas, dibujar, 292-296.
ColWidth, propiedad, 326. common dialog boxes. Ver cuadros de gestión de errores y, 178. cuadro Ajustes en la ventana
corna fija, tipos de datos, 42. diálogo estándar) ramificación condicional ( Ver If, Properties, 9, 10.
Comadrejas, aplicación, 261-279, 312. Common Dialog, herramienta, 6, 141. declaración) cuadro Object en la ventana Properties,
omandos. Ver también barra de compartir archivos, 139, 315. ControlBox, propiedad, 91. 9-10.
herramientas; caja de compiladores frente a intérpretes, 36-39. controles Data cuadro Procedure en la ventana de
herramientas compilar aplicaciones ejecutables, 26, buscar registros específicos, 320-321. código, 17.
Add Watch, 226, 229-230. 39-40. conectar bases de datos a, 316-317. cuadros combinados
Break, 72. comprobación automática de la definición, 6. Ver también objetos; desplegables, 121.
Bring To Front, 136. sintáxis, 19, 60. caja de herramientas en la aplicación Vuelo, 122-124.
Calls, 227. condiciones de desbordamiento, 43. definir grupos de registros o vistas, eventos, 122.
Cerrar, 22. CONFIG.SYS, archivo, 255-257. 318-319. procedimientos y métodos, 122.
Clear All Breakpoints, 228. Configurador, aplicación, 255-257. enlazar controles de visualización a, propiedades, 120-122.
Continue, 229. conjunto de instrucciones, 25. 318. sencillos, 122.
Edit Watch, 227. Connect, propiedad, 317. métodos, 319-322. vista general, 120.
End, 15. consideraciones sobre el hardware propiedades, 317, 318, 320. cuadros de control
Environment Options, 19, 59- para los gráficos, 298, 308-309. SGBD aceptables para, 316. en la aplicación Juego
Imprimir tema, 237. Const, declaración, 47-57. vista general, 139, 315. eventos
Indice, 234. CONSTANT.TXT, archivo, 58, 143, 148, Conversión de Temperaturas, ligar a controles de datos, 318.
Instant Watch, 225. 299, 337, 358. aplicación, 195-198. procedimientos y métodos, 112.
Load Text, 58. constantes
Copies, propiedad, 147. propiedades, 111-112.
Menu Design, 150. ámbito de, 57.
Correo electrónico, aplicación, 214-219- visión general, 110-111.
New Form, 246. color, 299.
Count, propiedad, 323. cuadros de diálogo estándar
New Module, 248, 281. control OLE, 336-340.
CreateObject, función, 344. Abrir, cuadros de diálogo, 142-143.
Open Project, 26, 39, 140. creación, 45-49.
Cronómetro, aplicación Color, cuadros de diálogo, 144.
Project Options, 247-248. cuadros de diálogo estándar, 143,
codificar procedimientos de evento, directorio, unidades de disco y
Remove File, 25. 145, 146, 148.
15-22. archivos, cuadros de diálogo,
Save Project, 25, 252. globales, 58.
compilar, 39-40. 136.
Send To Back, 136. nombres, 48-49.
ejecutar, 22. Fuente, cuadros de diálogo, 145-146.
Set, 346. tipos de datos (Ver tipos de datos)
guardar, 25-27. Guardar como, cuadros de diálogo,
share (MS-DOS), 315. consultas, base de datos, 313-314.
interface de usuario, 9-15. 143-
Siempre visible, 237. container (contenedor), aplicaciones
revisar el diseño de, 23-25. Imprimir, cuadros de diálogo,
Single Step, 230. 333-
usar etiquetas, 105-106. 147-148.
Start, 15. Continue, comando, 229.
Cronómetro de Proyectos, aplicación llamar a la aplicación Ayuda de
Toggle Breakpoint, 228. control de flujo lineal en programas,
declaraciones globales, 357-358. Windows, 148-149.
combo box, herramienta, 120. 189-191.
diseño del formulario, 354-357. cuadros de diálogo. Ver cuadros de
combo boxes. Ver cuadros combinados control del programa
diseño del menú, 351-354. diálogo estándar; cuadros de
comentarios, en el código, 49. bucles ( Ver Do, declaración; For,
diseño general, 349-351. lista de directorios; cuadros de
command buttons. Ver botones de declaración)
estructura de eventos, 363-372. lista de unidades de disco;
comando en la aplicación Calcular, 172-176.
formularios auxiliares, 358-363. cuadros de lista de archivos

380
381
EL LIBRO DEL VISUAL BASIC Indice alfabético

cuadros de dibujo eventos, 108. Dim, 21, 45, 59, 180. Stop, declaraciones, 228-229.
enlazar a controles Data, 318. procedimientos y métodos, 108. Do ( Ver Do, declaración) ventana Debug, 73, 222-225.
eventos, 100. propiedades, 106-108. ejecutables, 21-22. watchpoints, 229-230.
procedimientos y métodos, 100-101. currency, tipo de datos, 41-43, 45- Exit, 184. DialogTitle, propiedad, 142.
propiedades, 99-100. For, 176-177, 183-184. Dibujar líneas, aplicación, 212-213.
vista general, 98-99- D funciones de librerías de enlace Dim, declaración, 21, 45, 59, 180.
cuadros de lista de archivos dar nombres dinámico, 280. dimensiones, matriz, 180.
en la aplicación TestDeArchivos, elementos de menú, 151-152. Function, 194. Dir$, función, 253-
245-252. objetos, 11, 13, 92. Get, 260-261. Directory List Box, herramienta, 135,
eventos, 138. procedimientos de eventos, 18. If (Ver If, declaración) 137, 245.
procedimientos y métodos, 138. procedimientos de función, 199- If Type Of, 209- discos, instalación, 40
propiedades, 137-138. variables y constantes, 48-49- Input$, 258. diseñar
vista general, 136-137, 244. Line Input #, 254. declaraciones globales en módulos,
Data, herramienta, 139, 315.
cuadros de lista de directorio Load, 249. 357-358.
DatabaseName, propiedad, 317.
en la aplicación TestDeArchivos, matrices, 179-155. formularios, 9-15, 354-357, 358-362.
DataField, propiedad, 318.
245-252. memoria y, 34-35. general, de aplicaciones, 349-351.
DataSource, propiedad, 318.
eventos, 138. On Error GoTo, 237-241. interfaces de usuario, 9-15, 23-25.
datos. Ver también constantes, bases
procedimientos y métodos, 138. Open, 253-260. menús, 149-158, 351-354.
de datos, entrada y salida en
propiedades, 137-138. Option Explicit, 59, 225. procedimientos, 199.
archivos; objetos, variables
vista general, 136-137, 245. parámetros, 193- procedimientos de eventos, 363-372.
bits, bytes y palabras, 33-34.
cuadros de lista de unidades de disco por omisión, 47, 57-61, 65. (Ver DISPCALC, aplicación, 344-347.
intercambio dinámico de datos
en la aplicación TestDeArchivos, también tipos de datos) división en coma flotante, 68, 69.
(DDE), 347, 374.
245-252. Print #, 255. división entera, 68-69-
memoria y, 34-35.
eventos, 138. procedimiento, 17-19. DLL. Ver librerías de enlace dinámico
ordenadores y, 29-35.
procedimientos y métodos, 138. Put, 260-261. (DLL)
tipos (Ver tipos de datos)
propiedades, 137-138. Randomize, 166. Do, declaración
valores de caracteres, 33-
vista general, 136-137, 245. ReDim, 185. convertir el bucle For en, 183.
valores numéricos, 30-31.
cuadros de lista. Ver también cuadros Resume, 239. en la aplicación Calcular, 172-176.
dBase, Borland, 312, 316.
combinados; cuadros de lista de Stop, 228-229. proceso repetitivo con, 170-172.
DblClick, evento, 93-
directorios; cuadros de lista de Sub, 18, 193, 194. double, tipo de datos, 42.
DDE (intercambio dinámico de datos),
unidades de disco; cuadros de variables, 19-21, 45-46. DragDrop, evento, 215.
347, 374.
lista de archivos Declare, declaración, 21, 280. DragMode, propiedad, 214-216.
Debug, ventana, 73, 222-225.
desplegables, 121. DefaultExt, propiedad, 112. DragOver, evento, 215.
declaraciones. Ver también ámbito,
en la aplicación Queso, 119-120. Delete, método, 320. DrawMode, propiedad, 301.
control, programa; expresiones;
eventos, 119- depuración. Ver también errores DrawStyle, propiedad, 301.
funciones, palabras clave
índices, 276. árbol de llamadas, 227-228. DrawWidth, propiedad, 301.
anidadas, 162.
procedimientos y métodos, 119- breakpoints, 228-229- Drive, propiedad, 137.
asignación, 63-64, 80, 346.
propiedades, 117-119. definición, 221-222. Drive List Box, herramienta, 136, 245.
Glose, 253-254, 261.
cuadros de texto compuestos, 161. estrategias, 232-234.
en la aplicación Cronómetro, 14, 23. expresiones watch, 225-227. E
Const, 47, 57.
en la aplicación EditNota, 109-110. constantes, 47. ir a paso de procedimiento, 232. ecuaciones, representación gráfica, 292.
enlazar a controles Data, 318. Declare, 21, 280. ir paso a paso, 231-232. Edit Watch, comando, 227.

382 383
EL LIBRO DEL VISUAL BASIC Indice alfabético

EditNota, aplicación, 109-110. EOF, propiedad, 320. definición, 16.. FillColor, propiedad, 134, 301.
editor de iconos, 103- Eqv, operador lógico, 75. etiquetas, 105. FillStyle, propiedad, 134, 301.
ejecutar aplicaciones, 15, 22. Err, función, 238. formularios, 16, 93. Filter, propiedad, 142.
elementos, definición, 51, 52. Error, declaración, 238. líneas y formas, 134. FilterIndex, propiedad, 143.
elipses, dibujar, 303-306. errores. Ver también depuración marcos, 115. FillColor, propiedad, 143.
Enabled, propiedad, 24, 91, 104, 115, atrapar, 237, 241. ratón, 210-213- FindFirst, método, 320.
155-157. cometidos en expresiones, 79-81. relojes, 130. FindLast, método, 320.
End, botón, 15, 22. cometidos en la declaración If, 164. teclado, 213-214. FindNext, método, 320.
End, comando, 15. de sintaxis, 19- Examinar base de datos, aplicación, FindPrevious, método, 320.
EndDoc, método, 307. desbordamiento, 43. 326-330. FixedColumns, propiedad, 326.
enlace e incrustación de objetos (OLE) en tiempo de ejecución, 237-241. Excel, Microsoft, 347, 374. FixedRows, propiedad, 325.
control directo del objeto con gestión, 178. Exclusive, propiedad, 318. Flags, propiedad
Automatización OLE, 344-347. información sobre, 234. Exit declaración, 183- cuadros de diálogo Abrir, 143.
enlazar frente a incrustar, 335-336. Escapar, aplicación, 208-209. exponenciación, 67. cuadros de diálogo Color, 145.
incrustar objetos en la fase de escribir código. Ver codificación expresiones. Ver también declaraciones cuadros de diálogo Fuente, 146.
diseño, 333-335. escribir en archivos anidadas, 66. cuadros de diálogo Imprimir, 148.
incrustar objetos en la fase de de acceso aleatorio, 261. control Data, para información flujo de control. Ver control del
ejecución, 336-342. secuenciales, 255. sobre bases de datos, 324. programa; procedimientos
registrar aplicaciones para, 335, 345. escribir procedimientos. Ver errores comunes en el uso, 79-81. FontBold, propiedad
términos, 332. procedimientos operadores aritméticos, 66-71. cuadros de diálogo Fuente, 146.
vista general, xvii, 6, 139-140, estrategias, depuración, 232-234. operadores de cadenas, 71-73- formularios, 91.
331-332. etiquetas operadores de comparación, 73-74. FontItalic, propiedad
entrada y salida en archivos. Ver en la aplicación Cronómetro, 23, operadores lógicos, 75-77, 81. cuadros de diálogo Fuente, 146.
también archivos de 105-108. precedencia de operadores, 77-79. formularios, 91.
configuración, bases de datos; enlazar a controles de datos, 318. tipos de, 65-66. FontName, propiedad
archivos de acceso aleatorio; eventos, 105. vista general, 64-65. cuadros de diálogo Fuente, 146.
archivos secuenciales procedimientos y métodos, 105. watch, 225-227. formularios, 91.
Abrir, cuadros de diálogo, 142-143- propiedades, 104. extensiones de nombres de archivos, 5, FontSize, propiedad
compartir archivos, 139, 315. eventos 144, 327. cuadros de diálogo Fuente, 146.
cuadros de diálogo estándar, 137, arrastrar y soltar, 214-219. formularios, 91.
142-143. barras de desplazamiento, 127. F FontStrikethru
cuadros de lista de directorio, botones de comando, 112. False, como constante, 73- cuadros de diálogo Fuente, 146.
cuadros de lista de unidades de botones de opción, 112. Fields, propiedad, 323- formularios, 91.
disco y cuadros de lista de cuadros combinados, 122. filas FontUnderline, propiedad
archivos, 136-138, 244-252. cuadros de control, 112. bases de datos, 311. cuadros de diálogo Fuente, 146.
Guardar como, cuadros de diálogo, cuadros de dibujo e imágenes, 100. grids, 325. formularios, 91.
143. cuadros de lista, 119. File List Box, herramienta, 136, 137, For, declaración, 176-177, 183-184.
Imprimir, cuadros de diálogo, cuadros de lista de directorio, 245. ForeColor, propiedad, 92, 296.
147-148. cuadros de lista de unidades de FileMaker, Claris, 312. Form, ventana, 6-7.
vista general, 243-244. disco y cuadros de lista de FileName, propiedad formas
Environment Options, comando, 19, 59- archivos, 138. cuadros de diálogo Abrir, 142. eventos, 134.
EOF, función, 254. cuadros de texto, 108, 271. cuadros de lista de archivos, 137. procedimientos y métodos, 134.

384 385
EL LIBRO DEL VISUAL BASIC
Indice alfabético

propiedades, 133-134. InputBox, 53, 358. gestión de la pantalla, 285-288. If, declaración
Rejilla, proyecto, 134-136. IsNull, 330. imprimir, 306-308. en la aplicación Tragaperras,
vista general, 132-133. LoadPicture, 93, 94, 99, 100. líneas y rectángulos, 212-213, 286, 163-169.
Format, función, 21, 169- LOF, 258, 266. 296, 302-303- realizar elecciones con, 159-163.
formato binario para los archivos MsgBox, 53, 358. mostrar en pantalla, 286-287. If TypeOf, declaración, 209-
guardados, 60. Now, 19, 84. porciones de tarta, 303-306. Image, herramienta, 98-99-
formato de texto para archivos perfil de Windows, 281. propiedades y métodos de dibujo, imágenes
guardados, 60. RGB, 298. 301-306. en la apliación Paleta de
formularios. Ver también interfaces de Rnd, 169. puntos, 302. direcciones, 101-103-
usuario Str$, 73, 176. redibujar pantallas, 287-288. enlazar a controles de datos, 318.
añadir objetos visualizables, 11-15. Val, 176. granularidad, 232. eventos, 100.
crear varios, 245-248, 358-363. WriteProfileString, 281. Graph, Microsoft, 336-343- procedimientos y métodos, 100-101.
definición, 6-7. Function, declaración, 194. Grid, controles propiedades, 99-100.
diseño, 9-15, 354-357, 358-363. vista general, 98-99-
en la aplicación Examinar base de
en la aplicación Sonrisa, 94-98. G
datos, 326-330. Imp, operador lógico, 75, 76-77.
especificar el de inicio, 248. Gates, Bill, xvi. Imprimir, cuadros de diálogo, 147-148.
propiedades, 325-326.
eventos, 93- generalizar el código, 199-200. Imprimir tema, comando, 237.
vista general, 138-139, 323-
inicial, especificar, 247-248. gestores, para cambiar el tamaño de GRID.VBX, archivo, 5, 6, 25, 139, 140, Index, propiedad, 186.
Me, variable, 208. los objetos, 12. 325, 326. Indice, comando, 234.
modal, 249, 360. Get, declaración, 260, 261. Grig, herramienta, 138, 139, 325. Input$, declaración, 258.
nombres de archivo por omisión, 5. GetProfileString, function, 281. Guardar como, cuadros de diálogo, 143- InputBox, función, 53, 358.
procedimientos y métodos, 84-85, gigabyte, definición, 34. guardar aplicaciones, 25-27, 60. instalación de Visual Basic, 1-2, 40.
93-94, 97, 249, 330, 359- Girar la ruleta, aplicación, 223-232. guardar archivos, 143-144. Instant Watch, botón, 225.
propiedades, 9-11, 89-93, 330. Global, 57. guión (-), especificación de la barra instrucciones, ordenador
rejillas de visualización, 100. nombres reservados, 48. separadora en menús compiladores frente a intérpretes,
FoxPro, Microsoft, 312, 316. Static, 207. GW-BASIC, xvi 36-39.
Fuente, cuadros de diálogo, 145-147. Type, 50. ejecutables, 21-22.
fuentes Variant, 20. H vista general, 35-36.
cuadros de diálogo para la Global, palabra clave, 57. integer, tipo de datos, 41-42.
hardware de vídeo, 285, 298.
selección de, 145-147. GotFocus, evento, 271. intercambio dinámico de datos (DDE),
Height, propiedad, 92, 99, 289-
formularios, 91-92. Grabadora de sonidos, aplicación 347, 374.
HelpCommand, propiedad, 148.
funciones del perfil (Windows), 281. (Windows), 333-335. interface de múltiples documentos
HelpFile, propiedad, 148.
funciones. Ver también comandos; gráficos (MDI), 374.
HelpKey, propiedad, 148.
librerías de enlace dinámico círculos, 303-306. interfaces de usuario. Ver también
herramientas, depuración, 222-232. Ver
(DLLs) colores, 296-300. también depuración comandos
CINT, 197. consideraciones sobre el hardware Hide, método, 360. cuadros de diálogo ( Ver cuadros de
CreateObject, 344. para, 308-309. Hopper, Grace Murray, 221. diálogo estándar; cuadro de lista
Dir$, 253- coordenadas de pantalla (Ver Horizontal Scroll Bar, herramienta, 126. de directorios; cuadro de lista de
EOF, 254. sistema de coordenadas) unidades de disco; cuadro de
Err, 238. elipses, 303-306. I lista de archivos)
Format, 22, 169. formularios y cuadros de dibujo, Icon, propiedad, 92. diseño, 9-15, 23-27.
GetProfileString, 281. 285-306.
iconos, 103- menús, 149-158, 351-354.

386
387
EL LIBRO DEL VISUAL BASIC Indice alfabético

objetos de visualización, 11-14. utilización en la aplicación matrices dinámicas, 185. gráficos, 212-213, 286, 293, 296,
propiedades del formulario, 9-11. Memoria, 282-284. Max, propiedad, 126. 301-306.
Interval, propiedad, 129-130. vista general, 280. MaxButton, propiedad, 92. Circle, método, 303-306.
IsNull, función, 330. Windows 3-0 y, 140. MaxLength, propiedad, 106. Cls, método, 286-302.
ItemData, propiedad, 275. Line, método, 212-213, 286, 296, mayor o igual que (>=), operador, 74. Line, método, 176-777, 212-213,
302-303. mayor que 0, operador, 73. 286, 296, 302-303.
J Line, herramienta, 132. MDB, extensión de nombre de archivo, Point, método, 286, 302.
Juego, aplicación, 112-114, 115-116. Line Input #, declaración, 254. 327. Pset, método, 286, 302.
líneas MDI (interface de múltiples vista general, 286, 301-306.
K en el proyecto Rejilla, 134-136. documentos), 374. impresora, 306-308.
KERNELL.DLL, 281. en la aplicación Dibujo líneas, Me, variable interna, 208. líneas y formas, 134.
KeyAscii, variable, 174. 212-213. megabyte, definición, 34. marcos, 115.
KeyDown, evento, 214. eventos, 134. memoria, 34-35. Ver también menús popup, 157-158.
KeyPress, evento, 214. procedimientos y métodos, 134; declaraciones relojes, 130.
KeyPress, procedimiento de evento, 302-303. de acceso aleatorio (RAM), 34-35. vista general, 84-85.
174. propiedades, 133-134, 301-302.
de vídeo, 285. Metrónomo, aplicación, 130-132.
KeyPreview, propiedad, 214. vista general, 132-133.
Memoria, aplicación, 282-284. Microsoft Access, 312-315.
KeyUp, evento, 214. List, propiedad, 117, 137.
menor o igual que (<=), operador, 74. Microsoft Excel, 347, 374.
kilobytes, definición, 34. List Box, herramienta, 117.
menor que (<), operador, 73. Microsoft FoxPro, 312-315.
ListCount, propiedad, 118.
Menú Design, comando, 150. Microsoft Graph, 336-343.
L ListIndex, propiedad, 118, 137.
Menú Design Window, botón, 150. Microsoft QuickBasic, xvi.
Label, herramienta, 23, 104. Microsoft Visual Basic. Ver Visual Basic
LargeChange, propiedad, 126.
LL menús. Ver también comandos
barra de menús, 149-158, 351-354. Microsoft Windows
leer de archivos llamadas, procedimiento, 83-84,
popup, 157-158. arrancar, 1.
de acceso aleatorio, 261. 191-193, 227-228.
métodos Ayuda, aplicación, 148-149.
secuenciales, 254. Load, declaración, 249.
ámbito, 97. cuadros de diálogo estándar y la
Left, propiedad, 93, 289. Load, evento, 93-
barras de desplazamiento, 127. versión 3.0, 140.
lenguajes de ordenador Load, procedimiento de evento, 93
botones de comando, 112. Grabadora de sonidos, aplicación,
ensamblador, 35-36. 117, 269-
botones de opciones, 112. 333-335.
fuente, definición, 36. Load Texto, comando, 58.
controles Data, 319-322. historia de, xv-xvii.
historia de, xv-xvii. LoadPicture, función, 93, 94, 99; 100
cuadros combinados, 120. programar para, xvii-xix ( Ver
máquina, 36. LOF, función, 258, 266.
cuadros de control, 112. también Visual Basic).
Microsoft Windows y, xvii-xix. long, tipo de datos, 41-42.
cuadros de dibujo e imágenes, 100. Microsoft Word, 347.
vista general, 35-36. LostFocus, evento, 108, 271.
cuadros de lista, 119. Min, propiedad, 126.
librerías de enlace dinámico (DLL)
M cuadros de lista de directorios; MinButton, propiedad, 92.
COMMDLG.DLL, 140.
cuadros de lista de unidades de Mod, operador (módulo), 69-70.
cuadros de diálogo estándar, 140. Main, procedimiento, 248, 363.
disco; cuadros de lista de módulo (operador Mod), 69-70.
funciones del perfil de Windows y, Marco, herramienta, 115.
archivos, 138. módulos de código
281. marcos
cuadros de texto, 109. ámbito de los procedimientos, 54-57
ligar controles de datos y, 316, 318. en la aplicación Juego, 115-116. de dibujo. Vet también gráficos declaraciones globales en, 357-358.
los discos de instalación de Visual vista general, 114-115.
etiquetas, 105. en la aplicación Memoria, 282-284.
Basic y VBRUN300.DLL, 40, 280. matrices de controles, 186-188, 321.
formularios, 84-85, 93, 97, 249, 360. vista general, 57.

388
389
EL LIBRO DEL VISUAL BASIC
Indice alfabético

MouseDown, evento, 211.


colecciones, 323. de división entera (\) y en coma en color, 286.
MouseMove, evento, 210.
como parámetros, 207-209. ( Ver flotante (/), 67, 68-69. gestión, 285-288.
MouseUp, evento, 211.
también parámetros) de exponenciación, 67. monocromas, 285.
Move, método, 85, 208-209.
conjuntos de registros, 318-319. definición, 64-65. mostrar gráficos, 286-287. (Ver
MoveFirst, método, 319.
creación, 11-15. de multiplicación (*), 67. también gráficos)
MoveLast, método, 320.
dar nombre, 11, 13, 92. de resta (-), 67. redibujar, 287-288.
MoveNext, método, 319.
definición, 6. de suma (+), 67. Visual Basic, 3-9.
MovePrevious, método, 319.
enlazados, 332, 335-336. Ver errores comunes en el uso de, 79-81. Paradox, Borland, 312, 316.
mover objetos, 12.
también enlace e incrustación lógicos, 75-77, 81. parámetros
MsgBox, función, 53, 358. de objetos (OLE) Mod (módulo), 67, 69. objetos como, 207-209.
MSOLE3.VBX, archivo, 5, 6, 25, 140. incrustados, 332, 335-336. Ver reglas de precedencia, 66, 70-71, pasar por referencia, 200-202.
MultiLine, propiedad, 107. también enlace e incrustación 77-79. pasar por valor, 202-204.
múltiples formularios, 246-248, 359-363. de objetos (OLE) relacionales, 73-74. paso de matrices, 204-205.
MultiSelect, propiedad, 118. matrices de controles, 186-188. Option Button, herramienta, 111. vista general, 174, 191-193.
mover, 12. Option Explicit, declaración, 59, 225. paréntesis, 66, 84.
N OLE, 331 ( Ver también enlace e Options, propiedad, 318. PasswordChar, propiedad, 107.
Name, propiedad, 11, 14, 92. incrustación de objetos (OLE)). Or, operador lógico, 75, 76. Path, propiedad, 137.
New Form, botón, 246. Printer, 306-308, 309. orden de precedencia de operadores, PathChange, evento, 138.
New Module, botón, 248. propiedades, 8, 9 (Ver también 66, 70-71, 77-79- Pattern, propiedad, 138, 249.
New Module, comando, 248, 281. propiedades) orden Z de los objetos, 136. petabyte, definición, 34.
NewPage, método, 307. Screen (Ver pantallas) ordenadores Picture, propiedad, 92.
no igual que (<>), operador, 74. seleccionar, 12. consideraciones sobre el hardware Picture Box, herramienta, 98-99.
NoMatch, propiedad, 321. vista general, 87-89. para los gráficos, 308-309. pixels, definición, 285.
Not, operador lógico, 75. y eventos ( Ver eventos) datos y, 29-35. planificación. Ver diseño
notación y métodos ( Ver métodos) instrucciones y, 35-40. Point, método, 286, 301.
hexadecimal, 300. y procedimientos de eventos ( Ver pantallas, 285. Pointer, herramienta, 12.
sintaxis, 45, 88-89. procedimientos de eventos) PopupMenu, método, 157-158.
OLE, herramienta, 6, 140, 331. P
Now, función, 19, 84. porciones de tarta, 303-306.
números OLE. Ver enlace e incrustación de Page, propiedad, 307. posicionamiento del tabulador, 60.
binarios, 30. objetos (OLE) Paint, procedimiento de evento, precisión de los números, 44-45.
convertir, a cadenas, 73, 176 OLEGRAPH, aplicación, 336-343. 286-287, 308. Print, método, 84-85, 94, 100-101, 286,
convertir cadenas a, 176. On Error G0T0, declaración, 237-241. palabras clave 306.
en coma flotante, 42, 44-45. opciones. Ver If, declaración ByVal, 202. Print #, declaración, 255.
hexadecimales, 300. Open, declaración, 253, 260. colores y, 19. Printer, objeto, 306-308, 309.
reales, 42, 44-45. Open Project, botón, 4, 26. definición, 20. PrintForm, método, 307.
sistemas de numeración, 30-31- Open Project, comando, 26, 39, 140. palabras y tamaño de palabra, procedimientos de función. Ver
operadores definición, 34. también prcredimiente>s
0 aritméticos, 66-71. Paleta de direcciones, aplicación, dar nombre a, 199.
objetos. booleanos, 73-77. 101-103- definición, 19-20, 82, 194.
base de datos ( Ver base de datos) de asignación, 63. pantallas. Ver también ventanas internos, 83.
caja de herramientas y, 6-7, 12. de comparación, 73-74. coordenadas ( Ver sistemas de librerías de enlace dinámico, 280.
cambiar de tamaño, 12. de concatenación ( + ), 53, 71. coordenadas) parámetros ( Ver parámetros)

390 3
EL LIBRO DEL VISUAL BASIC Indice alfabético

procedimientos sub frente a, 195. ratón, 210-213. gráficos, 288-292, 296-301, 308. reglas de precedencia para operadore
( Ver también procedimientos teclado, 213-214. líneas y formas, 133-134. 66, 70-71, 77-79.
sub) ventana, 3, 4-6, 11. marcos, 115. Rejilla, proyecto, 134-136.
sintaxis, 82-84, 194-195. vista general, 16-17, 21-22. objetos, 186, 317. relaciones, bases de datos, 313-
vista general, 81-82, 194-195. Project Optiones, comando, 247. pantalla e impresora, 308-309. relojes
procedimientos sub. Ver también Properties, lista, 9. relojes, 130. en la aplicación Metrónomo,
procedimientos de evento; Properties, ventana, 3, 5, 8-9. proyectos 130-132.
métodos; procedimientos Properties Window, botón, 8. archivos de extensión ( Ver archivos eventos, 130.
de eventos del ratón, 210-213- propiedades de extensión) procedimientos y métodos, 130.
diseñar, 199. acceder, 52. creación, 4-6. propiedades, 130.
escribir, 195-200. ámbito, 97. guardar, 25-27. vista general, 129-130.
Rejilla, 134-136.
frente a procedimientos de función, Ayuda de Windows, aplicación, Remove File, comando, 25.
Pset, método, 286, 302. RemoveItem, método, 119, 122.
195. (Vertambién 148, 149.
Put, declaración, 260-261. Resize, evento, 16.
procedimientos de función) barras de desplazamiento, 126-127
Resume, declaración, 239-
Main, 362. bases de datos, 323, 330. Q RGB, función, 296-298.
parámetros (Ver parámetros) botones de comando, 111-112.
Queso, aplicación, 119-120. Rnd, función, 169.
sintaxis, 17, 82-84, 193, 194. botones de opciones, 111-112.
QuickBasic, Microsoft, xvi. Row, propiedad, 325.
procedimientos. Ver también métodos controles Data, 317, 318.
RowHeight, propiedad, 326.
de evento frente a generales, 189. controles Grid, 325. R Rows, propiedad, 325.
( Ver también procedimientos de controles OLE, 336.
ramificación condicional, 160, 189-191.
evento) cuadros combinados, 120-122.
Ver también If, declaración s
de función frente a sub, 195. (Ver cuadros de control, 111-112.
Randomize, declaración, 166. salida, archivo. Ver entrada y salida de
también procedimientos de cuadros de diálogo Abrir, 142-143-
rango archivos
función; procedimientos sub) cuadros de diálogo Color, 145.
de tipos de datos numéricos, 43. Save Project, botón, 25.
definición, 16. cuadros de diálogo estándar,
frente a precisión, 44. Save Project, comando, 25, 252.
llamadas, 84, 191-193, 227-228. 140-148.
ratio de aspecto, 304-305. Scale, método, 292, 306.
parámetros (Ver parámetros) cuadros de diálogo Fuente, 146.
Readonly, propiedad, 318. ScaleHeight, propiedad, 290-292.
vista general, 81-82, 189-193- cuadros de diálogo Guardar como,
RecordCount, propiedad, 330. ScaleLeft, propiedad, 290-292.
Procedure Step, botón, 231. 144.
Recordset, objetos, 318. ScaleTop, propiedad, 290-292.
proceso repetitivo. Ver Do, cuadros de diálogo Imprimir,
RecordSource, propiedad, 317, 318. ScaleWidth, propiedad, 290-292.
declaración; For, declaración 147-148.
redibujar pantallas, 90, 287-288. Screen, objeto, 309.
programa, definición, 35. Ver también cuadros de dibujo e imágenes,
ReDim, declaración, 185. Scroll, evento, 127.
aplicaciones; codificación; 99-100.
redondear frente a truncar, 69. ScrollBars, propiedad, 107.
control del programa cuadros de lista, 117-119, 215.
referencia, pasar parámetros por, 200. sección del código de declaraciones
programación orientada a eventos, xvii. cuadros de lista de directorios;
Refresh, método, 319. generales, 20.
Ver también procedimientos de cuadros de lista de unidades de
registros. Ver también bases de datos; seleccionar archivos, 142-143.
eventos; proceclimientos disco; cuadros de lista de
entrada y salida en archivos; seleccionar objetos, 12.
arrastrar y soltar, 214-219. archivo, 137-138.
tipos de datos definidos por el Selected, propiedad, 118.
declaración de variables, 19-21. cuadros de texto, 106-108.
usuario SelLength, 107.
declaraciones, 17-19. elementos de menús, 155-157.
definición, 50, 52, 244. SelStart, 107.
definición, 16. etiquetas, 104.
de aplicaciones para OLE, 335, 345. SelText, 108.
diseño, 363-372. formularios, 9-11, 89-93-

392
EL LIBRO DEL VISUAL BASIC Indice alfabético

Send to Back, comando, 136. Style, propiedad, 120. rango de, 43. matriz
Set, comando, 346. Sub, declaración, 18, 193, 194. vista general, 41-43. bucles y, 182-184.
SetFocus, método, 108. subexpresiones, 66. vista general, 41-43. determinar el tamaño durante la
Setup, aplicación, 40, 60. Toggle Breakpoint, botón, 228. ejecución, 184-186.
Shape, herramienta, 133. T Toggle Breakpoint, comando, 228. experimentar con, 180-182.
share, comando (MS-DOS), 315. tablas Top, propiedad, 93, 99, 289. matrices de controles, 186-188,
Show, método, 249, 360. base de datos, 311. Tragaperras, aplicación, 163-169- 321.
Siempre visible, comando, 237. virtuales, 313. True, como constante, 73- parámetros, paso, 204-205.
signo igual (=) Tag, propiedad, 216. truncar frente a redondear, 69. reservar memoria para, 179-180.
como operador de asignación, 63, tamaño de una matriz en tiempo de tutorial, Visual Basic, 4. módulos de código y, 57.
346. ejecución, 184-186. twips, definición, 92, 289, 326. tipos de datos ( Ver tipos de datos)
como operador igual que, 74. tamaño en puntos, 92, 289. TwipsPerPixelX, propiedad, 309- variant, tipo de datos, 41-43.
símbolo 1, 142. teclas de acceso, 151. TwipsPerPixelY, propiedad, 309- Variant, palabra clave, 20.
single, tipo de datos, 42. Type, palabra clave, 50. VBRUN300.DLL, archivo, 40, 280.
técnica de búsqueda binaria, 232-234.
Single Step, botón, 230. VBX extensión de archivos, 5, 6.
Single Step, comando, 230.
técnicas de depuración
invasoras, 229.
u ventanas. Ver también formularios
sintaxis unidad de proceso central (CPU), 35. aplicación estándar, 9-11.
no invasoras, 229.
comprobación automática, 19, 60. unidades de disco. Ver cuadros de lista código, 16, 19, 61.
terabyte, definición, 34.
notación, 45, 88-89. de unidades de disco Debug, 73, 222-225.
TestDeArchivos, aplicación, 245-252.
procedimientos y funciones, 82-85. formulario, 6-7.
Text, propiedad
sistema de ayuda en línea, 4, 234-237. minimar, 3.
controles Grid, 325.
sistema de coordenadas Val, función, 176. pantalla de Visual Basic, 2-9.
cuadros combinados, 122.
cuadros de dibujo e imágenes, valor principal, 4.
cuadros de lista, 119.
288-296. pasar como argumento, 84. Project, 4-6.
cuadros de texto, 14, 108.
definidos por el usuario, 288-296. pasar parámetros por, 202-204. Properties, 8.
Text Box, herramienta, 14, 107.
líneas y formas, 133- Value, propiedad, 112, 127. Vertical Scroll Bar, herramienta,
texto. Ver caracteres; archivos
por omisión, 288. variables 124-126.
secuenciales; cadenas; cuadros
representación gráfica de ámbito, 52-61. View Code, botón, 5.
de texto
ecuaciones y cuadrículas, 292. caracteres de declaración de tipo, View Form, botón, 5.
TextWidth, método, 330.
vista general, 288-290. 47, 57-61, 65. Visible, propiedad, 8, 10, 93, 155, 158,
Timer, evento, 130.
sistema numérico decimal, 30. creación, 45-49. 319.
Timer, herramienta, 129.
sistemas de gestión de bases de datos dar nombre, 48-49. vistas lógicas, 313-
tipos de datos
(SGBD), 311, 316. declaraciones, 19-21. Ver también Visual Basic. Ver también aplicaciones;
caracteres de declaración de tipos,
SmallChange, propiedad, 126. declaraciones) codificación; datos; depuración;
47, 57-61, 65.
Sonrisa, aplicación, 94-98. de nivel de módulo, 54-56. objetos
coma flotante, 44-45.
Sorted, propiedad, 118. globales, 56-57, 357-358. archivos de extensión ( Ver archivos
definidos por el usuario, 49-52.
Start, botón, 15, 16. KeyAscii, 174. de extensión)
variables matriz frente a, 179-
Start, comando, 15. locales Ayuda, sistema, 4, 234-237.
ventajas de, 51.
Static, palabra clave, 207. declaración por omisión, 47, 57. características avanzadas, 374.
vista general, 49-51.
Stop, declaración, 228-229. preservar sus valores en discos de instalación, 40.
expresiones y, 64-66.
Str$, función, 73, 176. procedimientos, 205-207. Edición Profesional, 6.
numéricos
Stretch, propiedad, 100. vista general, 54-56. editor de iconos, 103-
coma flotante, 44-45.

394 39
EL LIBRO DEL VISUAL BASIC

elementos de la pantalla, 2-9 ( Ver WIN.INI, archivo


también pantallas; ventanas) en la aplicación Memoria, 282-284
historia de, xv-xviú. funciones del perfil Windows, 281
instalar y arrancar, 1-2, 40. vista general, 279-280.
interactuar de forma directa con, Windows, Microsoft. Ver Microsoft
72-73- Windows
versión 3, xviii. WindowState, propiedad, 93-
versión de MS-DOS, 60. Word, Microsoft, 347.
Vuelo, aplicación, 122-124. WriteProfileString, función, 281.

w X
watchpoints, 229-230. XI, Y1 y X2, Y2, propiedades, 133-
Width, propiedad, 92-99. Xor; operador lógico, 75-76.

396

You might also like