Professional Documents
Culture Documents
2 Datos e instrucciones 2 9
3 Variables y constantes 4 1
9 Archivos 2 4 3
10 Programación gráfica 2 8 5
Agradecimientos xiii
Introducción xv
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
ix
Indice
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
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
¿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.
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.
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.
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
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.
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
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.
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)
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
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.
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:
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
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.
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
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
Cronómetro
Hora de inicio:
Inicio
Hora de parada:
Parada
Tiempo transcurrido:
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
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
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
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).
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.
34 35
EL LIBRO DEL VISUAL BASIC 2 Datos e instrucciones
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
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
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
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
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.
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
46 47
EL LIBRO DEL VISUAL BASIC 3 Variables y constantes
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
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.
56 57
EL LIBRO DEL VISUAL BASIC 3 Variables y constantes
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
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
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
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
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
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
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
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.
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
Figura 4.8.
Operadores de comparación
73
72
EL LIBRO DEL VISUAL BASIC
4 Declaraciones, expresiones y procedimientos
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
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
^ 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
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.
83
82
EL LIBRO DEL VISUAL BASIC
4 Declaraciones, expresiones y procedimientos
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.
87
EL LIBRO DEL VISUAL BASIC
5 El uso de formularios y herramientas de Visual Basic
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.
90 91
EL LIBRO DEL VISUAL BASIC
5 El uso de formularios y herramientas de Visual Basic
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:
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.
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
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
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
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.
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
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]
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)
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.
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.
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
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.
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:
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
Sub List2_DblClick ( )
List1.Addltem List2.Text
List2.RemoveItem List2.ListIndex
End Sub
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
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
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.
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í:
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 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:
130
131
EL LIBRO DEL VISUAL BASIC
5 El uso de formularios y herramientas de Visual Basic
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)
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)
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.
134 135
5 El uso de formularios y herramientas de Visual Basic
EL LIBRO DEL VISUAL BASIC
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.
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)
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.
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
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.
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
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.
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.
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
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
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
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
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
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
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.
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.
'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
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
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
Salida
Figura 6.10. 1
5
Ejecución de la aplicación Calcular
9
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
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
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.
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.
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
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.
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
192 193
EL LIBRO DEL VISUAL BASIC
7 El uso de procedimientos y funciones
194
195
EL LIBRO DEL VISUAL BASIC 7 El uso de procedimientos y funciones
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.
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
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:
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:
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.
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
'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.
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.
216 217
EL LIBRO DEL VISUAL BASIC 7 El uso de procedimientos y funciones
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.
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
Figura 8.6.
La ventana Debug con expresiones watch
226
227
EL LIBRO DEL VISUAL BASIC 8 Depuración y gestión de errores
BreakContador = BreakContador + 1
If BreakContador > 10 And A < 0 Then
Stop
End If
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.
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.
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.
■ 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
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
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.
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
Doc$ = "C:\WWATCH1\BANZAI.DOC"
Open Doc$ For Input As #2
Datos mostrados en pantalla
Open "RESULTAD.TXT" For Output As #15
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$:
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
254 255
L LIBRO DEL VISUAL BASIC 9 Archivos
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:
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.
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
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:
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.
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
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.
268 269
EL LIBRO DEL VISUAL BASIC 9 Archivos
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
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)
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
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
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
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
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
283
282
EL LIBRO DEL VISUAL BASIC
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
288
289
EL LIBRO DEL VISUAL BASIC
10 Programación gráfica
Ajuste de Unidad de
ScaleMode medida
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.
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.
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
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
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
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:
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.
Figura 10.17.
Dibujar un rectángulo relleno con el método Line
304
305
El LIBRO DEL VISUAL BASIC
10 Programación gráfica
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
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".
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
4
________
Titles
Tabla
Year
Figura 11.1.
Title Published Au_ID ISBN PublD
La estructura de la base de datos de comadrejas
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
Figura 11.4.
Una posible vista lógica de las tablas que componen la base de datos BIBLIO
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
■ 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.
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
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
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
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
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.
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.
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
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.
334 335
LIBRO DEL VISUAL BASIC 12 Enlace e incrustación de objetos
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.
'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
338 339
LIBRO DEL VISUAL BASIC 12 Enlace e incrustación de objetos
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
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
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
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
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.
349
1 3 Una aplicación para Windows completa
EL LIBRO DEL VISUAL BASIC
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.
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.
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
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.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
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.
362
363
13 Una aplicación para Windows completa
EL LIBRO DEL VISUAL BASIC
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
366
367
EL LIBRO DEL VISUAL BASIC
13 Una aplicación para Windows completa
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
Sub SiguientePorcion ( )
Static QuePorcion As Single
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
375
374
EL LIBRO DEL VISUAL BASIC
Indice alfabético
376 377
EL LIBRO DEL VISUAL BASIC
Indice alfabético
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
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
w X
watchpoints, 229-230. XI, Y1 y X2, Y2, propiedades, 133-
Width, propiedad, 92-99. Xor; operador lógico, 75-76.
396