Visual Basic 6 (Curso Paso A Paso)
Visual Basic 6 (Curso Paso A Paso)
Visual Basic 6 (Curso Paso A Paso)
ÍNDICE
1. Introducción 1
1.1 Programas secuenciales, interactivos y orientados a eventos 1
1.2 Programas para el entorno Windows 2
1.2.1 Modo de Diseño y Modo de Ejecución 2
1.2.2 Formularios y Controles 2
1.2.3 Objetos y Propiedades 2
1.2.4 Nombres de objetos 3
1.2.5 Eventos 4
1.2.6 Métodos 4
1.2.7 Proyectos y ficheros 4
1.3 El entorno de programación Visual Basic 6.0 5
1.4 El Help de Visual Basic 6.0 6
1.5 Ejemplos 6
1.5.1 Ejemplo 1.1: Sencillo programa de colores y posiciones 6
1.5.2 Ejemplo 1.2: Minicalculadora elemental 8
1.5.3 Ejemplo 1.3: Transformación de unidades de temperatura 9
1.5.4 Ejemplo 1.4: Colores RGB 11
2. Entorno de programación Visual Basic 6.0 14
2.1 Introducción: ¿Qué es Visual Basic 6.0? 14
2.2 El entorno de Visual Basic 6.0 14
2.2.1 La barra de menús y las barras de herramientas 14
2.2.2 Las herramientas (toolbox) 16
2.3 Formularios (forms) y módulos 16
2.4 La ventana de proyecto (project) 17
2.5 La ventana de propiedades (Properties) 17
2.6 Creación de programas ejecutables 18
2.7 Cómo utilizar el Help 19
2.8 Utilización del Code Editor 19
2.9 Utilización del Debugger 21
2.9.1 Ejecución controlada de un programa 21
2.9.2 Ventanas Immediate, Locals y Watches 22
2.9.3 Otras posibilidades del Debugger 23
3. Lenguaje BASIC 24
3.1 Introducción 24
3.2 Comentarios y otras utilidades en la programación con visual basic 24
3.3 Proyectos y módulos 25
3.3.1 Ámbito de las variables y los procedimientos 25
3.3.1.1 Variables y funciones de ámbito local 25
3.3.1.2 Variables y funciones de ámbito global 26
3.4 Variables 27
3.4.1 Identificadores 27
3.4.2 Variables y constantes 28
3.4.3 Nombres de variables 28
3.4.4 Tipos de datos 29
3.4.5 Elección del tipo de una variable 30
3.4.6 Declaración explícita de variables 30
3.5 Operadores 31
3.6 Sentencias de control 31
3.6.1 Sentencia IF ... THEN ... ELSE ... 32
3.6.2 Sentencia SELECT CASE 33
3.6.3 Sentencia FOR ... NEXT 34
3.6.4 Sentencia DO ... LOOP 34
3.6.5 Sentencia WHILE … WEND 35
3.6.6 Sentencia FOR EACH ... NEXT 35
3.7 Algoritmos 36
3.7.1 Introducción 36
3.7.2 Representación de algoritmos 36
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página ii
1. INTRODUCCIÓN
Visual Basic 6.0 es uno de los lenguajes de programación que más entusiasmo despiertan entre los
programadores de PCs, tanto expertos como novatos. En el caso de los programadores expertos por
la facilidad con la que desarrollan aplicaciones complejas en poquísimo tiempo (comparado con lo
que cuesta programar en Visual C++, por ejemplo). En el caso de los programadores novatos por el
hecho de ver de lo que son capaces a los pocos minutos de empezar su aprendizaje. El precio que
hay que pagar por utilizar Visual Basic 6.0 es una menor velocidad o eficiencia en las aplicaciones.
Visual Basic 6.0 es un lenguaje de programación visual, también llamado lenguaje de 4ª
generación. Esto quiere decir que un gran número de tareas se realizan sin escribir código,
simplemente con operaciones gráficas realizadas con el ratón sobre la pantalla.
Visual Basic 6.0 es también un programa basado en objetos, aunque no orientado a objetos
como C++ o Java. La diferencia está en que Visual Basic 6.0 utiliza objetos con propiedades y
métodos, pero carece de los mecanismos de herencia y polimorfismo propios de los verdaderos
lenguajes orientados a objetos como Java y C++.
En este primer capítulo se presentarán las características generales de Visual Basic 6.0, junto
con algunos ejemplos sencillos que den idea de la potencia del lenguaje y del modo en que se
utiliza.
Existen distintos tipos de programas. En los primeros tiempos de los ordenadores los programas
eran de tipo secuencial (también llamados tipo batch) Un programa secuencial es un programa que
se arranca, lee los datos que necesita, realiza los cálculos e imprime o guarda en el disco los
resultados. De ordinario, mientras un programa secuencial está ejecutándose no necesita ninguna
intervención del usuario. A este tipo de programas se les llama también programas basados u
orientados a procedimientos o a algoritmos (procedural languages). Este tipo de programas siguen
utilizándose ampliamente en la actualidad, pero la difusión de los PCs ha puesto de actualidad otros
tipos de programación.
Los programas interactivos exigen la intervención del usuario en tiempo de ejecución, bien
para suministrar datos, bien para indicar al programa lo que debe hacer por medio de menús. Los
programas interactivos limitan y orientan la acción del usuario. Un ejemplo de programa interactivo
podría ser Matlab.
Por su parte los programas orientados a eventos son los programas típicos de Windows, tales
como Netscape, Word, Excel y PowerPoint. Cuando uno de estos programas ha arrancado, lo único
que hace es quedarse a la espera de las acciones del usuario, que en este caso son llamadas eventos.
El usuario dice si quiere abrir y modificar un fichero existente, o bien comenzar a crear un fichero
desde el principio. Estos programas pasan la mayor parte de su tiempo esperando las acciones del
usuario (eventos) y respondiendo a ellas. Las acciones que el usuario puede realizar en un momento
determinado son variadísimas, y exigen un tipo especial de programación: la programación
orientada a eventos. Este tipo de programación es sensiblemente más complicada que la secuencial
y la interactiva, pero Visual Basic 6.0 la hace especialmente sencilla y agradable.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 2
Visual Basic 6.0 está orientado a la realización de programas para Windows, pudiendo incorporar
todos los elementos de este entorno informático: ventanas, botones, cajas de diálogo y de texto,
botones de opción y de selección, barras de desplazamiento, gráficos, menús, etc.
Prácticamente todos los elementos de interacción con el usuario de los que dispone Windows
95/98/NT pueden ser programados en Visual Basic 6.0 de un modo muy sencillo. En ocasiones
bastan unas pocas operaciones con el ratón y la introducción a través del teclado de algunas
sentencias para disponer de aplicaciones con todas las características de Windows 95/98/NT. En los
siguientes apartados se introducirán algunos conceptos de este tipo de programación.
varios botones, cada uno de los cuales es un objeto del tipo de control command button, que sería la
clase.
Cada formulario y cada tipo de control tienen un conjunto de propiedades que definen su
aspecto gráfico (tamaño, color, posición en la ventana, tipo y tamaño de letra, etc.) y su forma de
responder a las acciones del usuario (si está activo o no, por ejemplo). Cada propiedad tiene un
nombre que viene ya definido por el lenguaje.
Por lo general, las propiedades de un objeto son datos que tienen valores lógicos (True, False)
o numéricos concretos, propios de ese objeto y distintos de las de otros objetos de su clase. Así
pues, cada clase, tipo de objeto o control tiene su conjunto de propiedades, y cada objeto o control
concreto tiene unos valores determinados para las propiedades de su clase.
Casi todas las propiedades de los objetos pueden establecerse en tiempo de diseño y también
-casi siempre- en tiempo de ejecución. En este segundo caso se accede a sus valores por medio de
las sentencias del programa, en forma análoga a como se accede a cualquier variable en un lenguaje
de programación. Para ciertas propiedades ésta es la única forma de acceder a ellas. Por supuesto
Visual Basic 6.0 permite crear distintos tipos de variables, como más adelante se verá.
Se puede acceder a una propiedad de un objeto por medio del nombre del objeto a que
pertenece, seguido de un punto y el nombre de la propiedad, como por ejemplo optColor.objName.
En el siguiente apartado se estudiarán las reglas para dar nombres a los objetos.
1.2.5 Eventos
Ya se ha dicho que las acciones del usuario sobre el programa se llaman eventos. Son eventos
típicos el clicar sobre un botón, el hacer doble clic sobre el nombre de un fichero para abrirlo, el
arrastrar un icono, el pulsar una tecla o combinación de teclas, el elegir una opción de un menú, el
escribir en una caja de texto, o simplemente mover el ratón. Más adelante se verán los distintos
tipos de eventos reconocidos por Windows 95/98/NT y por Visual Basic 6.0.
Cada vez que se produce un evento sobre un determinado tipo de control, Visual Basic 6.0
arranca una determinada función o procedimiento que realiza la acción programada por el usuario
para ese evento concreto. Estos procedimientos se llaman con un nombre que se forma a partir del
nombre del objeto y el nombre del evento, separados por el carácter (_), como por ejemplo
txtBox_click, que es el nombre del procedimiento que se ocupará de responder al evento click en el
objeto txtBox.
1.2.6 Métodos
Los métodos son funciones que también son llamadas desde programa, pero a diferencia de los
procedimientos no son programadas por el usuario, sino que vienen ya pre-programadas con el
lenguaje. Los métodos realizan tareas típicas, previsibles y comunes para todas las aplicaciones. De
ahí que vengan con el lenguaje y que se libere al usuario de la tarea de programarlos. Cada tipo de
objeto o de control tiene sus propios métodos.
Por ejemplo, los controles gráficos tienen un método llamado Line que se encarga de dibujar
líneas rectas. De la misma forma existe un método llamado Circle que dibuja circunferencias y
arcos de circunferencia Es obvio que el dibujar líneas rectas o circunferencias es una tarea común
para todos los programadores y que Visual Basic 6.0 da ya resuelta.
adecuado y con el nombre adecuado. Existe siempre un fichero con extensión *.vbp (Visual Basic
Project) que se crea con el comando File/Save Project As. El fichero del proyecto contiene toda la
información de conjunto. Además hay que crear un fichero por cada formulario y por cada módulo
que tenga el proyecto. Los ficheros de los formularios se crean con File/Save Filename As teniendo
como extensión *.frm. Los ficheros de código o módulos se guardan también con el comando
File/Save Filename As y tienen como extensión *.bas si se trata de un módulo estándar o *.cls si
se trata de un módulo de clase (class module).
Clicando en el botón Save en la barra de herramientas se actualizan todos los ficheros del
proyecto. Si no se habían guardado todavía en el disco, Visual Basic 6.0 abre cajas de diálogo Save
As por cada uno de los ficheros que hay que guardar.
El Help de Visual Basic 6.0 es de los mejores que existen. Además de que se puede buscar
cualquier tipo de información con la función Index, basta seleccionar una propiedad cualquiera en
la ventana de propiedades o un control cualquiera en el formulario (o el propio formulario), para que
pulsando la tecla <F1> aparezca una ventana de ayuda muy completa. De cada control de muestran
las propiedades, métodos y eventos que soporta, así como ejemplos de aplicación. También se
muestra información similar o relacionada.
Existe además un breve pero interesante curso introductorio sobre Visual Basic 6.0 que se
activa con la opción Help/Contents, seleccionando luego MSDN Contents/Visual Basic Documen-
tation/Visual Basic Start Page/Getting Started.
1.5 EJEMPLOS
El entorno de programación de Visual Basic 6.0 ofrece muchas posibilidades de adaptación a los
gustos, deseos y preferencias del usuario. Los usuarios expertos tienen siempre una forma propia de
hacer las cosas, pero para los usuarios noveles conviene ofrecer unas ciertas orientaciones al
respecto. Por eso, antes de realizar los ejemplos que siguen se recomienda modificar la
configuración de Visual Basic 6.0 de la siguiente forma:
1. En el menú Tools elegir el comando Options; se abre un cuadro de diálogo con 6 solapas.
2. En la solapa Environment elegir “Promp to Save Changes” en “When a Program Starts” para
que pregunte antes de cada ejecución si se desean guardar los cambios realizados. En la solada
Editor elegir también “Require Variable Declaration” en “Code Settings” para evitar errores al
teclear los nombres de las variables.
3. En la solapa Editor, en Code Settings, dar a “Tab Width” un valor de 4 y elegir la opción “Auto
Indent” (para que ayude a mantener el código legible y ordenado). En Windows Settings elegir
“Default to Full Module View” (para ver todo el código de un formulario en una misma
ventana) y “Procedure Separator” (para que separe cada función de las demás mediante una
línea horizontal).
Sobre este primer programa en Visual Basic 6.0 se pueden hacer algunos comentarios:
1. El comando Option Explicit sirve para obligar a declarar todas las variables que se utilicen.
Esto impide el cometer errores en los nombres de las variables (confundir masa con mesa, por
ejemplo). En este ejemplo esto no tiene ninguna importancia, pero es conveniente
acostumbrarse a incluir esta opción. Declarar una variable es crearla con un nombre y de un
tipo determinado antes de utilizarla.
2. Cada una de las partes de código que empieza con un Private Sub y termina con un End Sub
es un procedimiento, esto es, una parte de código independiente y reutilizable. El nombre de
uno de estos procedimientos, por ejemplo optAzul_Click(), es típico de Visual Basic. La
primera parte es el nombre de un objeto (control); después va un separador que es el carácter
de subrayado (_); a continuación el nombre de un evento -click, en este caso-, y finalmente
unos paréntesis entre los que irían los argumentos, en caso de que los hubiera.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 8
En este ejemplo se ha utilizado repetidamente la función Val() de Visual Basic. Esta función
convierte una serie de caracteres numéricos (un texto formado por cifras) en el número entero o de
punto flotante correspondiente. Sin la llamada a la función Val() el operador + aplicado a cadenas
de caracteres las concatena, y como resultado, por ejemplo, “3+4” daría “34”. No es lo mismo los
caracteres “1” y “2” formando la cadena o string “12” que el número 12; la función val() convierte
cadenas de caracteres numéricos –con los que no se pueden realizar operaciones aritméticas- en los
números correspondientes –con los que sí se puede operar matemáticamente-. Visual Basic 6.0
transforma de modo automático números en cadenas de caracteres y viceversa, pero este es un caso
en el que dicha transformación no funciona porque el operador “+” tiene sentido tanto con números
como con cadenas.
Por otra parte, el código con el que este programa responde a los eventos es el contenido en
los siguientes procedimientos:
Option Explicit
Una característica importante de este ejemplo es que se han utilizado vectores (arrays) de
controles. Las tres barras se llaman hsbColor y se diferencian por la propiedad Index, que toma los
valores 0, 1 y 2. También las tres cajas de texto, las tres labels y los dos botones de opción son
arrays de controles. Para crear un array de controles basta crear el primero de ellos y luego hacer
Copy y Paste tantas veces como se desee, respondiendo afirmativamente al cuadro de diálogo que
pregunta si desea crear un array.
El procedimiento Sub que contiene el código que gestiona un evento de un array es único para
todo el array, y recibe como argumento la propiedad Index. De este modo que se puede saber
exactamente en qué control del array se ha producido el evento. Así pues, una ventaja de los arrays
de controles es que pueden compartir el código de los eventos y permitir un tratamiento conjunto
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 12
por medio de bucles for. A continuación se muestra el código correspondiente a los procedimientos
que tratan los eventos de este ejemplo.
Option Explicit
Public Brojo, Bverde, Bazul As Integer
Public Frojo, Fverde, Fazul As Integer
El código de este ejemplo es un poco más complicado que el de los ejemplos anteriores y
requiere unas ciertas explicaciones adicionales adelantando cuestiones que se verán posteriormente:
1. La función RGB() crea un código de color a partir de sus argumentos: las componentes RGB
(Red, Green and Blue). Estas componentes, cuyo valor se almacena en un byte y puede oscilar
entre 0 y 255, se determinan por medio de las tres barras de desplazamiento.
Capítulo 1: Introducción página 13
2. El color blanco se obtiene con los tres colores fundamentales a su máxima intensidad. El
color negro se obtiene con los tres colores RGB a cero. También se pueden introducir con las
constantes predefinidas vbWhite y vbBlack, respectivamente.
3. Es importante disponer de unas variables globales que almacenen los colores del fondo y del
texto, y que permitan tanto guardar los valores anteriores de las barras como cambiar éstas a
sus nuevos valores cuando se clica en los botones de opción. Las variables globales, definidas
en la parte de definiciones generales del código, fuera de cualquier procedimiento, son
visibles desde cualquier parte del programa. Las variables definidas dentro de una función o
procedimiento sólo son visibles desde dentro de dicha función o procedimiento (variables
locales).
4. La función hsbColor_Change(Index As Integer) se activa cada vez que se cambia el valor en
una cualquiera de las barras de desplazamiento. El argumento Index, que Visual Basic define
automáticamente, indica cuál de las barras del array es la que ha cambiado de valor (la 0, la 1
ó la 2). En este ejemplo dicho argumento no se ha utilizado, pero está disponible por si se
hubiera querido utilizar en el código.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 14
Visual Basic 6.0 es una excelente herramienta de programación que permite crear aplicaciones
propias (programas) para Windows 95/98 o Windows NT. Con ella se puede crear desde una simple
calculadora hasta una hoja de cálculo de la talla de Excel (en sus primeras versiones...), pasando por
un procesador de textos o cualquier otra aplicación que se le ocurra al programador. Sus
aplicaciones en Ingeniería son casi ilimitadas: representación de movimientos mecánicos o de
funciones matemáticas, gráficas termodinámicas, simulación de circuitos, etc.
Este programa permite crear ventanas, botones, menús y cualquier otro elemento de Windows
de una forma fácil e intuitiva. El lenguaje de programación que se utilizará será el Basic, que se
describirá en el siguiente capítulo.
A continuación se presentarán algunos aspectos del entorno de trabajo de Visual Basic 6.0:
menús, opciones, herramientas, propiedades, etc.
Visual Basic 6.0 tiene todos los elementos que caracterizan a los programas de Windows e incluso
alguno menos habitual. En cualquier caso, el entorno de Visual Basic 6.0 es muy lógico y natural, y
además se puede obtener una descripción de la mayoría de los elementos clicando en ellos para
seleccionarlos y pulsando luego la tecla <F1>.
alguno de los menús. Son importantes los botones que permiten arrancar y/o parar la
ejecución de un proyecto, pasando de modo diseño a modo de ejecución y viceversa.
El menú File tiene pocas novedades. Lo más importante es la distinción entre proyectos y
todos los demás ficheros. Como ya se ha dicho, un proyecto reúne y organiza todos los ficheros que
componen el programa o aplicación (hace la función de una carpeta que contuviera apuntes). Estos
ficheros pueden ser formularios, módulos, clases, recursos, etc. Visual Basic 6.0 permite tener más
de un proyecto abierto simultáneamente, lo cual puede ser útil en ocasiones. Con el comando
AddProject se añade un nuevo proyecto en la ventana Project Manager. Con los comandos Open
Project o New Project se abre o se crea un nuevo proyecto, pero cerrando el o los proyectos que
estuvieran abiertos previamente. En este menú está el comando Make ProjectName.exe, que
permite crear ejecutables de los proyectos.
Tampoco el menú Edit aporta cambios importantes sobre lo que es habitual. Por el contrario
el menú View, generalmente de poca utilidad, es bastante propio de Visual Basic 6.0. Este menú
permite hacer aparecer en pantalla las distintas ventanas del entorno de desarrollo, así como acceder
a un formulario o al código relacionado con un control (que también aparece si se clica dos veces en
dicho control), y manejar funciones y procedimientos.
El menú Project permite añadir distintos tipos de elementos a un proyecto (formularios,
módulos, etc.). Con Project/Properties se puede elegir el tipo de proyecto y determinar el
formulario con el que se arrancará la aplicación (Startup Object). Con el comando Components se
pueden añadir nuevos controles a la Toolbox que aparece a la izquierda de la pantalla.
El menú Format contiene opciones para controlar el aspecto de la aplicación (alinear
controles, espaciarlos uniformemente, etc.). Los menús Debug y Run permiten controlar la
ejecución de las aplicaciones. Con Debug se puede ver en detalle cómo funcionan, ejecutando paso
a paso, yendo hasta una línea de código determinada, etc. Esto es especialmente útil cuando haya
que encontrar algunos errores ejecutando paso a paso, o viendo resultados intermedios.
En el menú Tools se encuentran los comandos para arrancar el Menu Editor (para crear
menús, como se verá en el Apartado 5, a partir de la página 64, dedicado a los Menús) y para
establecer las opciones del programa. En Tools/Options se encuentran las opciones relativas al
proyecto en el que se trabaja. La lengüeta Environment determina las propiedades del entorno del
proyecto, como las opciones para actualizar o no los ficheros antes de cada ejecución; en General
se establece lo referente a la retícula o grid que aparece en el formulario; Editor permite establecer
la necesidad de declarar todas las variables junto con otras opciones de edición, como si se quieren
ver o no todos los procedimientos juntos en la misma ventana, y si se quiere ver una línea
separadora entre procedimientos; Editor Format permite seleccionar el tipo de letra y los códigos
de color con los que aparecen los distintos elementos del código. La opción Advanced hace
referencia entre otras cosas a la opción de utilizar Visual Basic 6.0 en dos formatos SDI (Single
Document Interface) y MDI (Multiple Document Interface descritos en el Apartado 4.5, en la
página 61).
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 16
Resumiendo, cuando se vaya a crear un programa en Visual Basic 6.0 habrá que dar dos
pasos:
1. Diseñar y preparar la parte gráfica (formularios, botones, menús, etc.)
2. Realizar la programación que gestione la respuesta del programa ante los distintos eventos.
barra de herramientas o pulsando <F4>). Esta ventana tiene dos lengüetas, que permiten ordenar las
propiedades alfabéticamente o por categorías. Utilizando la forma que sea más cómoda se
localizará con ayuda de la barra de desplazamiento la propiedad que se quiera modificar. Al clicar
sobre ella puede activarse un menú desplegable con las distintas opciones, o bien puede modificarse
directamente el valor de la propiedad. Si esta propiedad tiene sólo unos valores fijos (por ejemplo,
los colores), puede abrirse un cuadro de diálogo para elegir un color, o el tamaño y tipo de letra que
se desee si se trata de una propiedad Font.
La Figura 2.7 muestra la ventana FormLayout, que permite determinar la posición en la que
el formulario aparecerá sobre la pantalla cuando se haga visible al ejecutar la aplicación.
Una vez finalizada la programación de la nueva aplicación, la siguiente tarea suele consistir en la
creación de un programa ejecutable para su distribución e instalación en cuantos ordenadores se
desee, incluso aunque en ellos no esté instalado Visual Basic 6.0.
Para crear un programa ejecutable se utiliza el comando Make nombreProyecto.exe … en el
menú File. De esta manera se generará un fichero cuya extensión será *.exe. Para que este programa
funcione en un ordenador solamente se necesita que el fichero MSVBVM60.DLL esté instalado en
el directorio c:\Windows\System o c:\Winnt\System32. En el caso de proyectos más complejos en
los que se utilicen muchos controles pueden ser necesarios más ficheros, la mayoría de ellos con
extensiones *.ocx, *.vbx o *.dll. Para saber en cada caso cuáles son los ficheros necesarios se puede
consultar el fichero *.vbp que contiene la descripción completa del proyecto. Casi todos esos
ficheros necesarios se instalan automáticamente al instalar el compilador de Visual Basic 6.0 en el
ordenador.
En el caso de el programa se vaya a utilizar en un ordenador en el que no esté instalado Visual
Basic o de que en el proyecto se hayan utilizado controles comerciales (como los Crystal Reports
para la creación de informes, los Sheridan Data Widgets o los True DBGrid de Apex para la
gestión de bases de datos, etc.), puede resultar interesante construir unos disquetes de instalación
que simplifiquen la tarea de instalar el programa en cualquier ordenador sin tener que ver en cada
caso cuáles son los ficheros que faltan. Visual Basic 6.0 dispone de un Asistente (Wizard) que,
interactivamente, simplifica enormemente la tarea de creación de disquetes de instalación. Este
Asistente está en el mismo grupo de programas que Visual Basic 6.0 y se llama Package and
Deployement Wizard.
Capítulo 2: El entorno de programación Visual Basic 6.0 página 19
El editor de código o Code Editor de Visual Basic 6.0 es la ventana en la cual se escriben las
sentencias del programa. Esta ventana presenta algunas características muy interesantes que
conviene conocer para sacar el máximo partido a la aplicación.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 20
Para abrir la ventana del editor de código se elige Code en el menú View. También se abre
clicando en el botón View Code de la Project Window, o clicando dos veces en el formulario o en
cualquiera de sus controles. Cada formulario, cada módulo de clase y cada módulo estándar tienen
su propia ventana de código. La Figura 2.10 muestra un aspecto típico de la ventana de código.
Aunque el aspecto de dicha ventana no tiene nada de particular, el Code Editor de Visual Basic 6.0
ofrece muchas ayudas al usuario que requieren una explicación más detenida.
En primer lugar, el Code Editor utiliza un
código de colores (accesible y modificable en
Tools/Options/Editor Format) para destacar
cada elemento del programa. Así, el código
escrito por el usuario aparece en negro, las
palabras clave de Basic en azul, los comentarios
en verde, los errores en rojo, etc. Esta simple
ayuda visual permite detectar y corregir
problemas con más facilidad.
En la parte superior de esta ventana apare-
cen dos listas desplegables. La de la izquierda
corresponde a los distintos elementos del
formulario (la parte General, que es común a
todo el formulario; el propio formulario y los Figura 2.10. Ventana del Code Editor.
distintos controles que están incluidos en él). La
lista desplegable de la derecha muestra los distintos procedimientos que se corresponden con el
elemento seleccionado en la lista de la izquierda. Por ejemplo, si en la izquierda está seleccionado
un botón de comando, en la lista de la derecha aparecerá la lista de todos los posibles
procedimientos Sub que pueden generar sus posibles eventos. Estas dos listas permiten localizar
fácilmente el código que se desee programar o modificar.
El código mostrado en la Figura 2.10 contiene en la parte superior una serie de declaraciones
de variables y la opción de no permitir utilizar variables no declaradas (Option Explicit). Ésta es la
parte General de código del formulario. En esta parte también se pueden definir funciones y
procedimientos Sub no relacionados con ningún evento o control en particular. A continuación
aparecen dos procedimientos Sub (el segundo de ellos incompleto) que se corresponden con el
evento Click del botón cmdSalir y con el evento Load del formulario. Estos procedimientos están
separados por una línea, que se activa con Procedure Separator en Tools/Options/Editor.
Para ver todos los procedimientos del formulario y de sus controles simultáneamente en la
misma ventana (con o sin separador) o ver sólo un procedimiento (el seleccionado en las listas
desplegables) se pueden utilizar los dos pequeños botones que aparecen en la parte inferior
izquierda de la ventana. El primero de ellos es el Procedure View y el segundo el Full Module
View. Esta opción está también accesible en Tools/Options/Editor.
Otra opción muy interesante es la de completar automáticamente el código (Automatic
Completion Code). La Figura 2.11 muestra cómo al teclear el punto (o alguna letra inicial de una
propiedad después del punto) detrás del nombre de un objeto, automáticamente se abre una lista con
las propiedades de ese objeto. Pulsando la tecla Tab se introduce el nombre completo de la
propiedad seleccionada. A esta característica se le conoce como AutoListMembers.
Por otra parte, la opción AutoQuickInfo hace que al comenzar a teclear el nombre de una
función aparezca información sobre esa función: nombre, argumentos y valor de retorno (ver Figura
Capítulo 2: El entorno de programación Visual Basic 6.0 página 21
Figura 2.11. Inserción automática de propiedades. Figura 2.12. Ayuda para inserción de funciones.
Cualquier programador con un mínimo de experiencia sabe que una parte muy importante (muchas
veces la mayor parte) del tiempo destinado a la elaboración de un programa se destina a la detección
y corrección de errores. Casi todos los entornos de desarrollo disponen hoy en día de potentes
herramientas que facilitan la depuración de los programas realizados. La herramienta más utilizada
para ello es el Depurador o Debugger. La característica principal del Debugger es que permite
ejecutar parcialmente el programa, deteniendo la ejecución en el punto deseado y estudiando en
cada momento el valor de cada una de las variables. De esta manera se facilita enormemente el
descubrimiento de las fuentes de errores.
3. LENGUAJE BASIC
3.1 INTRODUCCIÓN
En este capítulo se explican los fundamentos del lenguaje de programación Basic utilizado en el
sistema de desarrollo para Visual Basic 6.0 de Microsoft. En este manual se supone que el lector no
tiene conocimientos previos de programación.
Un programa –en sentido informático– está constituido en un sentido general por variables
que contienen los datos con los que se trabaja y por algoritmos que son las sentencias que operan
sobre estos datos. Estos datos y algoritmos suelen estar incluidos dentro de funciones o
procedimientos.
Un procesador digital únicamente es capaz de entender aquello que está constituido por
conjuntos de unos y ceros. A esto se le llama lenguaje de máquina o binario, y es muy difícil de
manejar. Por ello, desde casi los primeros años de los ordenadores, se comenzaron a desarrollar los
llamados lenguajes de alto nivel (tales como el Fortran, el Cobol, etc.), que están mucho más cerca
del lenguaje natural. Estos lenguajes están basados en el uso de identificadores, tanto para los datos
como para las componentes elementales del programa, que en algunos lenguajes se llaman rutinas,
procedimientos, o funciones. Además, cada lenguaje dispone de una sintaxis o conjunto de reglas
con las que se indica de modo inequívoco las operaciones que se quiere realizar.
Los lenguajes de alto nivel son más o menos comprensibles para el usuario, pero no para el
procesador. Para que éste pueda ejecutarlos es necesario traducirlos a su propio lenguaje de
máquina. Al paso del lenguaje de alto nivel al lenguaje de máquina se le denomina compilación. En
Visual Basic esta etapa no se aprecia tanto como en otros lenguajes donde el programador tiene que
indicar al ordenador explícitamente que realice dicha compilación. Los programas de Visual Basic
se dice que son interpretados y no compilados ya que el código no se convierte a código máquina
sino que hay otro programa que durante la ejecución “interpreta” las líneas de código que ha escrito
el programador. En general durante la ejecución de cualquier programa, el código es cargado por el
sistema operativo en la memoria RAM.
Visual Basic 6.0 interpreta que todo lo que está a la derecha del carácter (') en una línea cualquiera
del programa es un comentario y no lo tiene en cuenta para nada. El comentario puede empezar al
comienzo de la línea o a continuación de una instrucción que debe ser ejecutada, por ejemplo:
’ Esto es un comentario
A = B*x+3.4 ' también esto es un comentario
Los comentarios son tremendamente útiles para poder entender el código utilizado, facilitando
de ese modo futuras revisiones y correcciones. En programas que no contengan muchas líneas de
código puede no parecer demasiado importante, pero cuando se trata de proyectos realmente
complejos, o desarrollados por varias personas su importancia es tremenda. En el caso de que el
código no esté comentado este trabajo de actualización y revisión puede resultar complicadísimo.
Otro aspecto práctico en la programación es la posibilidad de escribir una sentencia en más
de una línea. En el caso de sentencias bastante largas es conveniente cortar la línea para que entre
en la pantalla. En otro caso la lectura del código se hace mucho más pesada. Para ello es necesario
dejar un espacio en blanco al final de la línea y escribir el carácter (_) tal y como se muestra en el
siguiente ejemplo:
Capítulo 3: Lenguaje BASIC página 25
Una limitación a los comentarios en el código es que no se pueden introducir en una línea en
la que se ha introducido el carácter de continuación (_).
La sintaxis de Visual Basic 6.0 permite también incluir varias sentencias en una misma
línea. Para ello las sentencias deben ir separadas por el carácter dos puntos (:). Por ejemplo:
m = a : n = b : resto = m Mod n ' Tres sentencias en una línea
Un proyecto realizado en Visual Basic 6.0 es el conjunto de todos los ficheros o módulos
necesarios para que un programa funcione. La información referente a esos ficheros se almacena en
un fichero del tipo ProjectName.vbp. La extensión *.vbp del fichero hace referencia a Visual Basic
Project.
Si se edita este fichero con cualquier editor de texto se comprueba que la información que
almacena es la localización en los discos de los módulos que conforman ese proyecto, los controles
utilizados (ficheros con extensión .ocx), etc. En el caso más simple un proyecto está formado por un
único formulario y constará de dos ficheros: el que define el proyecto (*.vbp) y el que define el
formulario (*.frm).
Los módulos que forman parte de un proyecto pueden ser de varios tipos: aquellos que están
asociados a un formulario (*.frm), los que contienen únicamente líneas de código Basic (*.bas)
llamados módulos estándar y los que definen agrupaciones de código y datos denominadas clases
(*.cls), llamados módulos de clase.
Un módulo *.frm está constituido por un formulario y toda la información referente a los
controles (y a sus propiedades) en él contenidos, además de todo el código programado en los
eventos de esos controles y, en el caso de que existan, las funciones y procedimientos propios de
ese formulario. En general se llama función a una porción de código independiente que realiza una
determinada actividad. En Visual Basic existen dos tipos de funciones: las llamadas function, que
se caracterizan por tener valor de retorno, y los procedimientos o procedures, que no lo tienen. En
otros lenguajes, como C/C++/Java, las function realizan los dos papeles.
Un módulo de código estándar *.bas contendrá una o varias funciones y/o procedimientos,
además de las variables que se desee, a los que se podrá acceder desde cualquiera de los módulos
que forman el proyecto.
Para utilizar una variable Public o llamar a una función Public definidas en un formulario
desde otro módulo se debe preceder el nombre de la variable o procedimiento con el nombre del
formulario al que pertenece, como por ejemplo:
Modulo1.Variable1
Call Modulo1.Procedimiento1(Parametro1, …)
Retorno = Modulo1.Funcion1(Parametro1, …)
De esta forma se podrá acceder a las variables var1_global, var2_global desde todos los
formularios. La Tabla 3.1 muestra la accesibilidad de las variable en función de dónde y cómo se
hayan declarado1.
La diferencia entre las variables y/o procedimientos Public de los formularios y de los
módulos estándar está en que las de los procedimientos deben ser cualificadas (precedidas) por el
nombre del formulario cuando se llaman desde otro módulo distinto, mientras que las de un módulo
estándar (*.bas) sólo necesitan ser cualificadas si hay colisión o coincidencia de nombres.
1
Las palabras Global y Dim proceden de versiones antiguas de Visual Basic y debe preferirse la utilización de las
palabras clave Public y Private, que expresan mejor su significado.
Capítulo 3: Lenguaje BASIC página 27
3.4 VARIABLES
3.4.1 Identificadores
La memoria de un computador consta de un conjunto enorme de bits (1 y 0), en la que se almacenan
datos y programas. Las necesidades de memoria de cada tipo de dato no son homogéneas (por
ejemplo, un carácter alfanumérico ocupa un byte (8 bits), mientras que un número real con 16 cifras
ocupa 8 bytes), y tampoco lo son las de los programas. Además, el uso de la memoria cambia a lo
largo del tiempo dentro incluso de una misma sesión de trabajo, ya que el sistema reserva o libera
memoria a medida que la va necesitando.
Cada posición de memoria en la que un dato está almacenado (ocupando un conjunto de bits)
puede identificarse mediante un número o una dirección, y éste es el modo más básico de referirse a
una determinada información. No es, sin embargo, un sistema cómodo o práctico, por la nula
relación nemotécnica que una dirección de memoria suele tener con el dato contenido, y porque –
como se ha dicho antes– la dirección física de un dato cambia de ejecución a ejecución, o incluso en
el transcurso de una misma ejecución del programa. Lo mismo ocurre con partes concretas de un
programa determinado.
Dadas las citadas dificultades para referirse a un dato por medio de su dirección en memoria,
se ha hecho habitual el uso de identificadores. Un identificador es un nombre simbólico que se
refiere a un dato o programa determinado. Es muy fácil elegir identificadores cuyo nombre guarde
estrecha relación con el sentido físico, matemático o real del dato que representan. Así por ejemplo,
es lógico utilizar un identificador llamado salario_bruto o salarioBruto para representar el coste
anual de un empleado. El usuario no tiene nunca que preocuparse de direcciones físicas de
memoria: el sistema se preocupa por él por medio de una tabla, en la que se relaciona cada
identificador con el tipo de dato que representa y la posición de memoria en la que está almacenado.
Visual Basic 6.0, como todos los demás lenguajes de programación, tiene sus propias reglas
para elegir los identificadores. Los usuarios pueden elegir con gran libertad los nombres de sus
variables y funciones, teniendo siempre cuidado de respetar las reglas del lenguaje y de no utilizar
un conjunto de palabras reservadas (keywords), que son utilizadas por el propio lenguaje. En el
Apartado 3.4.3, en la página 28, se explicarán las reglas para elegir nombres y cuáles son las
palabras reservadas del lenguaje Visual Basic 6.0.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 28
Visual Basic 6.0 tiene sus propias constantes, muy útiles por cierto. Algunas ya se han visto al
hablar de los colores. En general estas constantes empiezan por ciertos caracteres como vb (u otros
similares que indican a que grupo pertenecen) y van seguidas de una o más palabras que indican su
significado. Para ver las constantes disponibles se puede utilizar el comando View/Object Browser,
tal como se muestra en la Figura 3.1.
En el lenguaje Visual Basic 6.0 existen dos formas de agrupar varios valores bajo un mismo
nombre. La primera de ellas son los arrays (vectores y matrices), que agrupan datos de tipo
homogéneo. La segunda son las estructuras, que agrupan información heterogénea o de distinto
tipo. En Visual Basic 6.0 las estructuras son verdaderos tipos de datos definibles por el usuario.
Para declarar las variables se utiliza la sentencia siguiente:
Dim NombreVariable As TipoVariable
pues contra lo que podría parecer a simple vista no se crean dos variables Integer, sino una Integer
(j) y otra Variant (i).
En Visual Basic 6.0 no es estrictamente necesario declarar todas las variables que se van a
utilizar (a no ser que se elija la opción Option Explicit que hace obligatorio el declararlas), y hay
otra forma de declarar las variables anteriores, utilizando los caracteres especiales vistos
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 30
anteriormente. Así por ejemplo, el tipo de las variables del ejemplo anterior se puede declarar al
utilizarlas en las distintas expresiones, poniéndoles a continuación el carácter que ya se indicó en la
Tabla 3.2, en la forma:
Radio# doble precisión
Nombre$ cadena de caracteres
Francos@ unidades monetarias
Longitud& entero largo
Esta forma de indicar el tipo de dato no es la más conveniente. Se mantiene en las sucesivas
versiones de Visual Basic por la compatibilidad con códigos anteriores. Es preferible utilizar la
notación donde se escribe directamente el tipo de dato.
3.5 OPERADORES
La Tabla 3.3 presenta el conjunto de operadores que soporta Visual Basic 6.0.
donde la variable Respuesta será True si la Cadena1 coincide con la Cadena2, False si no
coinciden y Null si Cadena1 y/o Cadena2 son Null.
Para obtener más información se puede consultar el Help de Visual Basic.
Las sentencias de control, denominadas también estructuras de control, permiten tomar decisiones
y realizar un proceso repetidas veces. Son los denominados bifurcaciones y bucles. Este tipo de
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 32
True
condición 1
False False
condición Bloque 1
True
condición 2
True
False
Bloque 1 de Bloque 2 de Bloque 2
sentencias sentencias
Bloque 3
Por ejemplo,
Numero = 53 ’ Se inicializa la variable.
If Numero < 10 Then
Digitos = 1
ElseIf Numero < 100 Then
' En este caso la condición se cumple (True) luego se ejecuta lo siguiente.
Digitos = 2
Else 'En el caso en que no se cumplan los dos anteriores se asigna 3
Digitos = 3
End If
donde expresion es una expresión numérica o alfanumérica, y etiq1, etiq2, ... pueden adoptar las
formas siguientes:
1. expresion
2. expresion To expresion
3. Is operador-de-relación expresion
4. combinación de las anteriores separadas por comas
Por ejemplo,
Numero = 8 ’ Se inicializan las variable.
Select Case Numero ’ Se va a evaluar la variable Numero.
Case 1 To 5 ' Numero está entre 1 y 5.
Resultado = "Se encuentra entre 1 y 5"
' Lo siguiente se ejecuta si es True la expresión.
Case 6, 7, 8 ' Numero es uno de los tres valores.
Resultado = "Se encuentra entre 6 y 8"
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 34
Cuando se utiliza la forma expresion To expresion, el valor más pequeño debe aparecer en
primer lugar.
Cuando se ejecuta una sentencia Select Case, Visual Basic evalúa la expresion y el control
del programa se transfiere a la sentencia cuya etiqueta tenga el mismo valor que la expresión
evaluada, ejecutando a continuación el correspondiente bloque de sentencias. Si no existe un valor
igual a la expresion entonces se ejecutan las sentencias a continuación de Case Else.
Cuando se ejecuta una sentencia For, primero se asigna el valor de la expresion1 a la variable
y se comprueba si su valor es mayor o menor que la expresion2. En caso de ser menor se ejecutan
las sentencias, y en caso de ser mayor el control del programa salta a las líneas a continuación de
Next. Todo esto sucede en caso de ser la expresion3 positiva. En caso contrario se ejecutarán las
sentencias cuando la variable sea mayor que expresion2. Una vez ejecutadas las sentencias, la
variable se incrementa en el valor de la expresion3, o en 1 si Step no se especifica, volviéndose a
efectuar la comparación entre la variable y la expresion2, y así sucesivamente.
La sentencia Exit For es opcional y permite salir de un bucle For ... Next antes de que éste
finalice. Por ejemplo,
MyString="Informática "
For Words = 3 To 1 Step -1 ' 3 veces decrementando de 1 en 1.
For Chars = Words To Words+4 '5 veces.
MyString = MyString & Chars ' Se añade el número Chars al string.
Next Chars ' Se incrementa el contador
MyString = MyString & " " ' Se añade un espacio.
Next Words
'El valor de MyString es: Informática 34567 23456 12345
’ Formato 2:
Do
[sentencias]
[Exit Do]
[sentencias]
Loop [{While/Until}condicion]
La sentencia opcional Exit Do permite salir de una bucle Do ... Loop antes de que finalice
éste. Por ejemplo,
Check = True ’ Se inicializan las variables.
Counts = 0
Do ' Empieza sin comprobar ninguna condición.
Do While Counts < 20 ' Bucle que acaba si Counts>=20 o con Exit Do.
Counts = Counts + 1 ' Se incrementa Counts.
If Counts = 10 Then ' Si Counts es 10.
Check = False ' Se asigna a Check el valor False.
Exit Do ' Se acaba el segundo Do.
End If
Loop
Loop Until Check = False ' Salir del "loop" si Check es False.
En el ejemplo mostrado, se sale de los bucles siempre con Counts = 10. Es necesario fijarse
que si se inicializa Counts con un número mayor o igual a 10 se entraría en un bucle infinito (el
primer bucle acabaría con Counts = 20 pero el segundo no finalizaría nunca, bloqueándose el
programa y a veces el ordenador).
Por ejemplo,
Counts = 0 ’ Se inicializa la variable.
While Counts < 20 ’ Se comprueba el valor de Counts.
Counts = Counts + 1 ’ Se incrementa el valor de Counts.
Wend ’ Se acaba el bucle cuando Counts > 19.
Con arrays variable tiene que ser de tipo Variant. Con colecciones variable puede ser Variant
o una variable de tipo Object. Esta construcción es muy útil cuando no se sabe el número de
elementos que tiene el array o la colección de objetos.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 36
3.7 ALGORITMOS
3.7.1 Introducción
Un algoritmo es en un sentido amplio una “secuencia de pasos o etapas que conducen a la
realización de una tarea”. Los primeros algoritmos nacieron para resolver problemas matemáticos.
Antes de escribir un programa de ordenador, hay que tener muy claro el algoritmo, es decir, cómo se
va a resolver el problema considerado. Es importante desarrollar buenos algoritmos (correctos y
eficientes). Una vez que el algoritmo está desarrollado, el problema se puede resolver incluso sin
entenderlo.
Ejemplo: Algoritmo de Euclides para calcular el m.c.d. de dos números enteros A y B
1. Asignar a M el valor de A, y a N el valor de B.
2. Dividir M por N, y llamar R al resto.
3. Si R distinto de 0, asignar a M el valor de N, asignar a N el valor de R,volver a comenzar
la etapa 2.
4. Si R = 0, N es el m.c.d. de los números originales
Es muy fácil pasar a Visual Basic este algoritmo:
Dim a, b As Integer
a = 45: b = 63 ’ Estos son los valores M y N
If a < b Then ’ Se permutan a y b
temp = a : a = b : b = temp
End If
Si son necesarios, deben existir criterios de terminación claros (por ejemplo, para calcular
seno(x) por desarrollo en serie se deberá indicar el número de términos de la serie). No puede haber
etapas imposibles (por ejemplo: "imprimir el conjunto de todos los números enteros").
instrucciones, sin necesidad de devolver ningún valor al mismo (puede dar resultados modificando
los argumentos), mientras que una función siempre tendrá un valor de retorno.
Los nombres de los procedimientos tienen reglas de visibilidad parecidas a las de las
variables. Para llamar desde un formulario a un procedimiento Public definido en otro formulario es
necesario preceder su nombre por el del formulario en que está definido. Sin embargo, si se desea
llamar a un procedimiento definido en un módulo estándar (*.bas) no es necesario precederlo del
nombre del módulo más que si hay coincidencia de nombre con otro procedimiento de otro módulo
estándar.
donde nombre es el nombre de la función. Será de un tipo u otro dependiendo del dato que
devuelva. Para especificar el tipo se utiliza la cláusula As Tipo (Integer, Long, Single, Double,
Currency, String o Variant). parámetros son los argumentos que son pasados cuando se llama a la
función. Visual Basic asigna el valor de cada argumento en la llamada al parámetro que ocupa su
misma posición. Si no se indica un tipo determinado los argumentos son Variant por defecto. Como
se verá en un apartado posterior, los argumentos pueden ser pasados por referencia o por valor.
El nombre de la función, que es el valor de retorno, actúa como una variable dentro del
cuerpo de la función. El valor de la variable expresion es almacenado en el propio nombre de la
función. Si no se efectúa esta asignación, el resultado devuelto será 0 si la función es numérica, nulo
("") si la función es de caracteres, o Empty si la función es Variant.
Exit Function permite salir de una función antes de que ésta finalice y devolver así el control
del programa a la sentencia inmediatamente a continuación de la que efectuó la llamada a la
función.
La sentencia End Function marca el final del código de la función y, al igual que la Exit
Function, devuelve el control del programa a la sentencia siguiente a la que efectuó la llamada,
pero lógicamente una vez finalizada la función.
La llamada a una función se hace de diversas formas. Por ejemplo, una de las más usuales es
la siguiente:
variable = nombre([argumentos])
donde argumentos son un lista de constantes, variables o expresiones separadas por comas que son
pasadas a la función. En principio, el número de argumentos debe ser igual al número de parámetros
de la función. Los tipos de los argumentos deben coincidir con los tipos de sus correspondientes
parámetros, de lo contrario puede haber fallos importantes en la ejecución del programa. Esta regla
no rige si los argumentos se pasan por valor (concepto que se verá más adelante).
En cada llamada a una función hay que incluir los paréntesis, aunque ésta no tenga
argumentos.
Capítulo 3: Lenguaje BASIC página 39
El siguiente ejemplo corresponde a una función que devuelve como resultado la raíz cuadrada
de un número N:
Function Raiz (N As Double) As Double
If N < 0 Then
Exit Function
Else
Raiz = Sqr(N)
End Function
o bien, sin pasar los argumentos entre paréntesis, sino poniéndolos a continuación del nombre
simplemente separados por comas:
nombre [argumentos]
A diferencia de una función, un procedimiento Sub no puede ser utilizado en una expresión
pues no devuelve ningún valor. Por supuesto una función puede ser llamada al modo de un
procedimiento Sub, pero en esta caso no se hace nada con el valor devuelto por la función.
El siguiente ejemplo corresponde a un procedimiento Sub que devuelve una variable F que es
la raíz cuadrada de un número N.
Sub Raiz (N As Double, F As Double)
If N < 0 Then
Exit Sub 'Se mandaría un mensaje de error
Else
F = Sqr(N)
End If
End Sub
La llamada a este procedimiento Sub puede ser de cualquiera de las dos formas siguientes:
Raiz N, F
Call Raiz(N, F)
El argumento Num es pasado por valor. Significa que lo que se pasa es una copia de Num. Si
el procedimiento cambia ese valor, el cambio afecta sólo a la copia y no a la propia variable Num.
Otra forma de especificar que un argumento será siempre pasado por valor es anteponiendo la
palabra ByVal a la declaración del parámetro en la cabecera del procedimiento (Sub o Function).
Por ejemplo,
Function Raiz (ByVal N As Double)
Sub Raiz (ByVal N As Double, F As Double)
Pasar argumentos por valor evita modificaciones accidentales, pero tiene un coste en tiempo y
memoria que puede ser significativo cuando se pasan grandes volúmenes de información, como
sucede con vectores, matrices y estructuras.
2
Pasar un argumento por referencia implica que en realidad se pasa a la función la variable original, de modo que la
función puede modificar su valor. Pasar por valor implica crear una nueva variable dentro de la función y pasarle
una copia del valor de la variable externa. Si se modifica el valor de la variable copia, la variable original queda
inalterada. Cuando en la llamada a una función se ponen como argumentos constantes numéricas o expresiones los
valores se pasan por valor.
Capítulo 3: Lenguaje BASIC página 41
No todas las funciones que se pueden llamar en Visual Basic 6.0 admiten argumentos con
nombre. Con AutoQuickInfo puede obtenerse más información al respecto.
3.9 ARRAYS
Un array permite referirse a una serie de elementos del mismo tipo con un mismo nombre, y hace
referencia un único elemento de la serie utilizando uno o más índices, como un vector o una matriz
en Álgebra.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 42
Visual Basic 6.0 permite definir arrays de variables de una o más dimensiones (hasta 60) y de
cualquier tipo de datos (tipos fundamentales y definidos por el usuario). Pero además Visual Basic
introduce una nueva clase de arrays, los arrays de controles (esto es, arrays de botones, de etiquetas,
de paneles, etc.) que permiten una programación más breve y clara. En este apartado sólo se tratarán
los arrays de variables.
Todos los elementos de un array deben ser del mismo tipo y están almacenados de forma
contigua en la memoria. Por supuesto, si el array es de tipo Variant cada elemento puede contener
un dato de tipo diferente, e incluso puede contener otro array.
Entre los arrays de variables cabe distinguir dos tipos fundamentales, dependiendo de que
número de elementos sea constante o pueda variar durante la ejecución del programa.
1. Arrays estáticos, cuya dimensión es siempre la misma.
2. Arrays dinámicos, cuya dimensión se puede modificar durante la ejecución del
programa.
Este ejemplo declara un array de una dimensión, llamado vector, con veinte elementos,
vector(0), vector(1), ... , vector(19), cada uno de los cuales permite almacenar un Double. Salvo que
se indique otra cosa, los índices se empiezan a contar en cero.
Dim matriz(3, 1 To 6) As Integer
Este ejemplo declara un array de dos dimensiones, llamado matriz, con 4x6 elementos,
matriz(0,1), ... matriz(3,6), de tipo entero.
Public cadena(1 To 12) As String
El ejemplo anterior declara un array de una dimensión, cadena, con doce elementos,
caract(1), ... , caract(12), cada uno de los cuáles permite almacenar una cadena de caracteres.
La declaración de los arrays estáticos es bastante cómoda. Se declaran una vez. Sin embargo
tienen el inconveniente que en la mayoría de los casos están sobredimensionados y utilizan más
memoria de la que realmente necesitan. Esto implica que se está malgastando memoria. Para
solucionar este problema se utilizan los arrays dinámicos.
y más tarde, un procedimiento Calculo puede asignar espacio para el array, como se indica a
continuación:
Sub Calculo( )
...
ReDim Matriz(F, C)
...
End Sub
Cada vez que se ejecuta la sentencia ReDim, todos los valores almacenados en el array se
pierden (si son Variant se ponen a Empty; si son numéricos a cero y si son cadenas de caracteres a
la cadena vacía). Cuando interese cambiar el tamaño del array conservando los valores del array,
hay que ejecutar ReDim con la palabra clave Preserve. Por ejemplo, supóngase un array A de dos
dimensiones. La sentencia,
ReDim Preserve A(D1, UBound(A, 2) + 2)
incrementa el tamaño del array en dos columnas más. Cuando se utiliza la palabra Preserve no
puede cambiarse el índice inferior del array (sí el superior). La función UBound utilizada en este
ejemplo es una función que devuelve el valor más alto de la segunda dimensión de la matriz (ver el
Help para más información).
Una estructura (según la nomenclatura típica del lenguaje C) es un nuevo tipo de datos, un tipo
definido por el usuario, que puede ser manipulado de la misma forma que los tipos predefinidos
(Int, Double, String, ...). Una estructura puede definirse como una colección o agrupación de datos
de diferentes tipos evidentemente relacionados entre sí.
Para crear una estructura con Visual Basic 6.0 hay que utilizar la sentencia Type ... End Type.
Esta sentencia solamente puede aparecer en la sección General o de declaraciones de un módulo.
Pueden crearse como Public o como Private en un módulo estándar o de clase y sólo como Private
en un formulario. Dim equivale a Public. Véase el siguiente ejemplo,
Public Type Alumno
Nombre As String
Direccion As String *40
Telefono As Long
DNI As Long
End Type
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 44
Este ejemplo declara un tipo de datos denominado Alumno que consta de cuatro miembros o
campos, denominados Nombre, Direccion, Telefono y DNI.
Una vez definido un nuevo tipo de datos, en un módulo estándar o de clase se pueden declarar
variables Public o Private de ese tipo (en un formulario sólo Private), como por ejemplo:
Public Mikel as Alumno
A su vez, un miembro de una estructura puede ser otra estructura, es decir un tipo definido por
el usuario. Por ejemplo,
Type Fecha
Dia As Integer
Mes As Integer
Anio As Integer
End Type
Type Alumno
Alta As Fecha
Nombre As String
Direccion As String * 40
Telefono AS Long
DNI As Long
End Type
Dentro de una estructura puede haber arrays tanto estáticos como dinámicos.
En Visual Basic 6.0 se pueden definir arrays de estructuras. La declaración de un array de
estructuras se hará con la palabra Public, Private o Static, dependiendo de su ámbito. La forma de
hacerlo es la siguiente:
Public grupoA (1 To 100) As Alumno
Private grupoB (1 To 100) As Alumno
Static grupoC (1 To 100) As Alumno
En Visual Basic 6.0, a la hora de declarar arrays de estructuras, sucede lo mismo que al
declarar arrays de cualquier tipo de variables. Con GrupoA(1 To 100), se crea un vector de
estructuras de 100 elementos de tipo Alumno (grupoA(1), grupoA(2), ..., grupoA(100)). Con
grupoB(100), se crearía un vector de estructuras de 101 elementos (grupoB(0), grupoB(1), ...
grupoB(100)).
Es posible asignar una estructura a otra del mismo tipo. En este caso se realiza una copia
miembro a miembro. Véase el siguiente ejemplo:
GrupoA(1) = delegado
Las estructuras pueden ser también argumentos en las llamadas a funciones y procedimientos
Sub. Siempre son pasados por referencia, lo cual implica que pueden ser modificados dentro del
procedimiento y esas modificaciones permenecen en el entorno de llamada al procedimiento. En el
caso de las funciones, las estructuras pueden ser también valores de retorno.
Capítulo 3: Lenguaje BASIC página 45
Existen varias funciones útiles para el manejo de cadenas de caracteres (Strings). Estas funciones
se utilizan para la evaluación, manipulación o conversión de cadenas de caracteres. Algunas de ellas
se muestran en la Tabla 3.4.
Es necesario tener presente que cuando se quieren comparar dos cadenas de caracteres, dicha
comparación se realiza por defecto en función del código ASCII asociado a cada letra (ver Anexo
8.1). Esto significa que por ejemplo caña es posterior a casa debido a que la letra ñ tiene un código
ASCII asociado superior a la letra s (ñ es el 164; s es el 115). Esto mismo ocurre con las vocales
acentuadas. Si se desea conseguir una comparación alfabética lógica es necesario incluir al
comienzo del fichero de código la sentencia Option Compare Text (frente a Option Compare
Binary establecida por defecto). La función strComp() admite un tercer argumento que permite
especificar el tipo de comparación (constantes vbBinaryCompare o vbTextCompare).
Ejemplos:
MyDouble = 437.324 ’ MyDouble es un Double.
MyString = CStr(MyDouble) ’ MyString contiene "437.324".
MyValue = Val("2457") ’ Devuelve 2457.
MyValue = Val(" 2 45 7") ’ Devuelve 2457.
MyValue = Val("24 and 57") ’ Devuelve 24.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 46
El operador Like permite comparar dos cadenas de caracteres. Si son iguales devuelve True
y si no lo son, False. Téngase en cuenta que Like es un operador, no una función.
Existe además el operador de concatenación & que puede ser utilizado con cadenas de
caracteres. Se utiliza para poner una cadena a continuación de otra. Por ejemplo:
str1 = "My first string" ’Se inicializan los strings
str2 = "My second string"
TextoFinal = str1 & str2 ’TextoFinal vale "My first stringMy second string"
El operador "+" opera de forma análoga, pero su uso se desaconseja pues en ciertas
ocasiones convierte las cadenas en números y realiza la suma.
Para obtener más información sobre cada una de las funciones buscar Strings en el Help de
Visual Basic 6.0.
Al igual que las funciones vistas para el manejo de cadenas de caracteres, existe una serie de
funciones matemáticas las cuales permiten realizar cálculos dentro de un programa de Visual Basic.
Dichas funciones se muestran en la Tabla 3.5:
Ejemplos:
MyNumber = Abs(50.3) ’ Devuelve 50.3.
MyNumber = Abs(-50.3) ’ Devuelve 50.3.
MyAngle = 1.3 ' El ángulo debe estar en radianes.
MySecant = 1 / Cos(MyAngle) ' Calcula la secante.
MySqr = Sqr(4) ' Devuelve 2.
MySqr = Sqr(23) ' Devuelve 4.79583152331272.
MyVar1 = 12: MyVar2 = -2.4: MyVar3 = 0 'Declaración de las variables
MySign = Sgn(MyVar1) ' Devuelve 1.
MySign = Sgn(MyVar2) ' Devuelve -1.
MySign = Sgn(MyVar3) ' Devuelve 0.
Capítulo 3: Lenguaje BASIC página 47
Las funciones trigonométricas de Visual Basic utilizan radianes para medir los ángulos.
Con el fin de completar estas funciones, se ofrece a continuación una relación de funciones
que son derivadas de las anteriores. El alumno podría programar dichas funciones en un fichero
*.bas y así poderlas utilizar posteriormente en cualquier programa. Dichas funciones se muestran en
la Tabla 3.6:
En este capítulo se pretende recoger de una manera más sistemática y general los eventos y
controles más habituales de Visual Basic 6.0. Hay que señalar que en ningún momento se pretende
abandonar el carácter introductorio de este manual, y que Visual Basic 6.0 tiene muchas más
posibilidades de las que aquí se muestran. Por ejemplo, muchos de los controles y eventos de Visual
Basic 6.0 están relacionados con el acceso a bases de datos. Estos aspectos no se citarán en estos
apuntes. Para una información más detallada se puede acudir a un buen libro de referencia o al Help
del programa.
La programación en Visual Basic 6.0 (al menos para ejemplos sencillos) suele proceder del
siguiente modo:
1. Se definen interactivamente sobre el
formulario los controles que van a
constituir la aplicación.
2. Se define para cada control el código
con el que se va a responder a cada
uno de los eventos. Para ello basta
clicar dos veces sobre el control y se
abre una ventana de código como la
mostrada en la Figura 4.1. En ella Figura 4.1. Código que gestionará el evento Click sobre
Visual Basic 6.0 ha preparado ya el el control de nombre cmbSalir.
inicio y el final de la función con la
que se va a responder al evento. El nombre del evento forma parte del nombre de la
función, junto al nombre del control. En el ejemplo del la Figura 4.1 está preparada la
función para escribir el código que se ejecutará al producirse el evento Click sobre el
control cmbSalir.
En el resto de este capítulo se verán con un cierto detalle los eventos, controles y propiedades
más habituales en Visual Basic 6.0.
4.1 EVENTOS
A continuación se presentan brevemente los eventos más normales que reconoce Visual Basic 6.0.
Es importante tener una visión general de los eventos que existen en Windows 95/98/NT porque
cada control de los que se verán más adelante tiene su propio conjunto de eventos que reconoce, y
otros que no reconoce. Cualquier usuario de las aplicaciones escritas para Windows 95/98/NT hace
uso continuo e intuitivo de los eventos, pero es posible que nunca se haya detenido a pensar en ello.
Para saber qué eventos puede recibir un control determinado basta seleccionarlo y pulsar
<F1>. De esta forma se abre una ventana del Help que explica el control y permite acceder a los
eventos que soporta.
estos eventos se puede aprovechar para realizar ciertas operaciones por medio de la función
correspondiente.
Al ocultar, cerrar o eliminar un formulario se producen otra serie de eventos: Deactivate,
QueryUnload, Unload y Terminate que se verán en un próximo ejemplo.
Para inicializar las variables definidas a nivel de módulo se suele utilizar el evento Initialize,
que tiene lugar antes que el Load. El evento Load se activa al cargar un formulario. Con el
formulario principal esto sucede al arrancar la ejecución de un programa; con el resto de los
formularios al mandarlos cargar desde cualquier procedimiento o al hacer referencia a alguna
propiedad o control de un formulario que no esté cargado. Al descargar un formulario se produce el
evento Unload. Si se detiene el programa desde el botón Stop de Visual Basic 6.0 (o del menú
correspondiente) o con un End, no se pasa por el evento Unload. Para pasar por el evento Unload
es necesario cerrar la ventana con el botón de cerrar o llamarlo explícitamente. El evento
QueryUnload se produce antes del evento Unload y permite por ejemplo enviar un mensaje de
confirmación.
El evento Load de un formulario se suele utilizar para ejecutar una función que dé valor a sus
propiedades y a las de los controles que dependen de dicho formulario. No se puede utilizar para
dibujar o imprimir sobre el formulario, pues en el momento en que se produce este evento el
formulario todavía no está disponible para dichas operaciones. Por ejemplo, si en el formulario debe
aparecer la salida del método Print o de los métodos gráficos Pset, Line y Circle (que se estudian en
el Capítulo 6 de este manual) puede utilizarse el evento Paint u otro posterior (por ejemplo, el
evento GotFocus del primer control) pero no puede utilizarse el evento Load.
Se puede ocultar un formulario sin descargarlo con el método Hide o haciendo la propiedad
Visible = False. Esto hace que el formulario desaparezca de la ventana, aunque sus variables y
propiedades sigan estando accesibles y conservando sus valores. Para hacer visible un formulario
oculto pero ya cargado se utiliza el método Show, que equivale a hacer la propiedad Visible = True,
y que genera los eventos Activate y Paint. Si el formulario no había sido cargado previamente, el
método Show genera los cuatro eventos mencionados.
Cuando un formulario pasa a ser la ventana activa se produce el evento Activate y al dejar de
serlo el evento Deactivate. En el caso de que el formulario que va a ser activo no estuviera cargado
ya, primero sucederían los eventos Initialize, Load y luego los eventos Activate y Paint.
Todo esto se puede ver y entender con un simple ejemplo, mostrado en la Figura 4.2. Se han
de crear dos formularios (frmPrincipal y frmSecundario). El primero de ellos contendrá dos
botones (cmdVerSec y cmdSalir) y el segundo tres (cmdHide, cmdUnload y cmdTerminate). El
formulario principal será el primero que aparece, y sólo se verá el segundo si se clica en el botón
Cargar Formulario. Cuando así se haga, a medida que los eventos antes mencionados se vayan
sucediendo, irán apareciendo en pantalla unas cajas de mensajes que tendrán como texto el nombre
del evento que se acaba de producir. Según con cual de los tres botones se haga desaparecer el
segundo formulario, al volverlo a ver se producirán unos eventos u otros, según se puede ver por los
mensajes que van apareciendo con cada evento.
' código del form. principal
Private Sub cmdCargar_Click()
frmSecundario.Show
End Sub
Es muy interesante realizar este ejemplo y seguir la secuencia de eventos que se producen al
hacer aparecer y desaparecer los formularios.
4.1.1.2 Paint
El evento Paint sucede cuando hay que redibujar un formulario o PictureBox. Esto sucede cuando
esos objetos se hacen visibles por primera vez y también cuando vuelven a ser visibles después de
haber estado tapados por otros, tras haber sido movidos o tras haber sido modificados de tamaño.
• Pulsar la tecla Esc cuando en un formulario hay un botón que tiene su propiedad Cancel =
True.
• Pulsar una combinación de teclas aceleradoras (Alt + otra tecla, como por ejemplo cuando
de despliega el menú File de Word con Alt+F) definidas para activar un determinado
control de un formulario.
También se puede activar el evento Click desde código realizando una de las siguientes
operaciones:
• Hacer que la propiedad Value de un botón de comando valga True.
• Hacer que la propiedad Value de un botón de opción valga True
• Modificar la propiedad Value de un botón de selección.
El evento DblClick sucede al clicar dos veces seguidas sobre un control o formulario con el
botón izquierdo del ratón.
Con estos valores se aplica la aritmética booleana, lo cual quiere decir que si se pulsan
simultáneamente los botones izquierdo y derecho del ratón el argumento Button valdrá 3 (1+2) y si
se pulsan las tres teclas shift, ctrl y alt simultáneamente el argumento Shift valdrá 7 (1+2+4). Con
esta forma de combinar los valores se resuelven todas las indeterminaciones posibles.
Los argumentos de este evento son Source que contiene el objeto que está siendo arrastrado,
X e Y que indican la posición del objeto arrastrado dentro del sistema de coordenadas del objeto
sobre el que se está arrastrando y State (que es propio del DragOver, pero no aparece en el
DragDrop) que vale 0, 1 ó 2 según se esté entrando, saliendo o permaneciendo dentro del mismo
objeto, respectivamente. Es importante señalar que el evento DragOver pertenece al objeto sobre el
que se arrastra, no al objeto que es arrastrado.
En el Help se puede encontrar información sobre la propiedad DragMode, que puede tomar
dos valores (vbManual y vbAutomatic). Esta constante determina cómo comienza una oparación de
arrastre de un objeto. En modo manual se debe comenzar llamando al método Drag para el objeto a
arrastrar. En modo automático basta clicar sobre el objeto a arrastrar, pero puede que en esta caso
dicho objeto no responda del modo habitual a otros eventos.
Hay algunas propiedades que son comunes a muchos controles. A continuación se hace una lista con
las utilizadas más habitualmente:
• Appearance: Establece si un objeto tiene un aspecto plano (valor 0) o tridimensional (valor
1).
• BackColor: Establece el color de fondo de un objeto.
• Caption: Establece el texto que aparece dentro o junto al objeto. Tiene el papel de un
título.
• Enabled: Establece si un objeto es accesible y modificable o no.
• Font: Establece las características del tipo de letra del objeto.
• ForeColor: Establece el color del texto y/o gráficos de un objeto.
• Height y Width: Establecen la altura y achura de un objeto.
• Left y Top: Establecen la distancia horizontal y vertical entre el origen del control y el
origen del objeto que lo contiene, que puede ser un formulario, un marco (frame), etc.
• MousePointer: Establece la forma que adoptará el puntero del ratón al posicionarse sobre
el objeto. Esta forma puede elegirse dentro de una lista en las que aparecen las habituales
del puntero del ratón o creando iconos propios. Algunas constantes de significado
inmediato que definen la forma del cursor son las siguientes: vbDefault, vbArrow,
vbCrosshair, vbIbeam, vbSizePointer, vbUpArrow, vbHourglass, etc. Para más informa-
ción puede consultarse el Help de MousePointer.
• Name: Nombre del objeto. Todos los objetos incluidos en un formulario deben tener un
nombre con el que poder referirse a él a la hora de programar la forma en que debe actuar.
Existen unas reglas para definir los nombre de los controles, que ya se vieron en el
Capítulo 1.
• Visible: Establece si el objeto es visible o invisible.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 54
En la Figura 4.3 se muestran algunos de los controles más habituales en Visual Basic 6.0. Estos
controles se explican a continuación con más detalle.
Roman, etc.), FontSize es un tipo Short que contiene el tamaño de la letra, y FontBold, FontItalic,
FontUnderline y FontStrikethrough son propiedades tipo Boolean que indican si el texto va a
tener esa característica o no.
donde posicion es un argumento opcional que permite especificar la posición en que se debe añadir.
Si se omite el registro se añade al final de la lista. Lo anterior es válido si la propiedad Sorted está a
False; si está a True el nuevo registro se añade en la posición ordenada que le corresponde. Para
eliminar un registro,
lstName.RemoveItem Posición_del_registro_en_la_lista
En el caso de que se quiera vaciar completamente el contenido de una lista se puede utilizar el
método Clear.
Dos propiedades interesantes de las listas son ListCount y ListIndex. La primera contiene el
número total de registros incluidos en la lista. La segunda permite acceder a una posición concreta
de la lista para añadir un registro nuevo en esa posición, borrar uno ya existente, seleccionarlo, etc.
Hay que recordar una vez más que los elementos de la lista se empiezan a numerar por cero. El
valor de propiedad ListIndex en cada momento coincide con el registro seleccionado y en el caso de
no haber ninguno seleccionado esta propiedad vale -1.
Es interesante saber que al seleccionar uno de los registros de la lista se activa el evento Click
de dicha lista.
Las listas permiten selecionar más de un elemento poniendo la propiedad MultiSelect a valor
1-Simple o 2-Extended. En el primer caso los elementos se seleccionan o se elimina la selección
simplemente clicando sobre ellos. En el segundo caso la forma de hacer selecciones múltiples es la
típica de Windows, utilizando las teclas Ctrl y Shift. Con selección múltile la propiedad SelCount
indica el número de elementos seleccionados, mientras que la propiedad Selected() es un array de
valores boolean que indica si cada uno de los elementos de la lista está seleccionado o no.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 58
El control de cuadro de diálogo estándar de Windows 95/NT (Common Dialog) ofrece una forma
sencilla y eficiente de realizar algunas de las tareas más comunes de un programa, tales como la
Capítulo 4: Eventos, Propiedades y Controles página 59
En la Figura 4.4 se pueden observar distintos tipos de control Common Dialog. Por ejemplo,
si se desea visualizar un cuadro de diálogo para abrir un fichero, habrá que escribir:
dlgAbrir.ShowOpen
Por ejemplo:
"Texto (*.txt)|*.txt|Imágenes(*.bmp;*.ico)|*.bmp;*.ico"
• FilterIndex: Indica el índice (con respecto a la lista de tipos) del filtro por defecto. Se
empiezan a numerar por "1".
• InitDir: Contiene el nombre del directorio por defecto. Si no se especifica, se utiliza el
directorio actual.
• Flags: Esta propiedad puede tomar muchos valores con objeto de fijar los detalles
concretos de este control (por ejemplo, abrir un fichero en modo read only, avisar antes de
escribir sobre un fichero ya existente, etc.). Estos valores están definidos por constantes de
Visual Basic 6.0 cuyos nombres empiezan con las letras cdl. Para más información en el
Help de Common Dialog Control buscar Properties, Flags Properties (Open, Save As
Dialogs). Por ejemplo, el valor definido por la constante cdlOFNOverwritePrompt hace
que antes de escribir en un fichero ya existente se pida confirmación al usuario. Para
establecer varias opciones a la vez se le asigna a Flags la suma de las constantes
correspondientes. Las distintas constantes disponibles se pueden encontrar en el Help
buscando Constants/CommonDialog Control.
el propio formulario que lo llama. Para eliminar completamente un formulario se puede utilizar el
comando:
Set frmName = NOTHING
que llama al evento Terminate (hay que utilizar también los métodos Hide o Unload para que
desaparezca de la pantalla).
Para referirse desde un formulario a los objetos y variables de otro formulario se utiliza el
operador punto (frmName.Object.Property).
o bien,
frmName.Show vbModal
estuvieran abiertos. Los formularios Child se minimizan y maximizan dentro de los límites del
formulario MDI. Cuando están maximizados, su Caption aparece junto al Caption del formulario
MDI. Los formularios Child no tienen menús propios, sino que sus menús aparecen en la barra de
menús del formulario MDI.
En una aplicación con un formulario MDI y uno o más formularios Child, puede haber otros
formularios que no sean Child y que se abren fuera de los límites del formulario MDI cuando son
requeridos.
Un array de controles esta formado por controles del mismo tipo que comparten el nombre y los
procedimientos o funciones para gestionar los eventos. Para identificar a cada uno de los controles
pertenecientes al array se utiliza Index o índice, que es una propiedad más de cada control.
Suponiendo que el sistema tenga memoria suficiente un array en Windows 95/98/NT podría llegar a
tener hasta 32767 elementos.
La utilidad principal de los arrays se presenta en aquellos casos en los que el programa debe
responder de forma semejante a un mismo evento sobre varios controles del mismo tipo. Los
ejemplos más claros son los botones de opción y los menús. En estos casos el programa responde de
manera semejante independientemente de cuál es la opción seleccionada. Los arrays de controles
comparten código, lo cual quiere decir que sólo hay que programar una función para responder a un
evento de un determinado tipo sobre cualquier control del array. Las funciones que gestionan los
eventos de un array tienen siempre u argumento adicional del tipo Index As Integer que indica qué
control del array ha recibido el evento.
Una opción avanzada de Visual Basic 6.0 permite crear objetos en tiempo de ejecución,
siempre que sean elementos de un array ya existente, con la instrucción Load. De forma análoga se
pueden destruir con Unload.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 64
5. MENÚS
5. También se observa que el ítem Comments aparece en gris claro. Esto quiere decir que en este
momento no está activo y por tanto no es seleccionable.
6. Otros items como Toolbars están seguidos por un pequeño triángulo. Eso quiere decir que
existe un menú secundario con más opciones. Otros items como Zoom aparecen seguidos por
puntos suspensivos (...). Este es un convenio utilizado para indicar que eligiendo esa opción se
abrirá un cuadro de diálogo en el que habrá que tomar otras decisiones.
Por lo que respecta al menú de Excel 97 que aparece en la Figura 5.3 la característica más
importante es que tiene sub-menús (señalados mediante un pequeño triángulo a su derecha), que se
abren al colocar el cursor sobre el ítem correspondiente. Estos menús se suelen llamar menús en
cascada, y son muy frecuentes en Windows 95/98/NT.
Otra característica de los menús, que no aparece en la Figura 5.2 ni en la Figura 5.3, es la
posibilidad de definir combinaciones de teclas que realizan la misma función que una opción del
menú. Por ejemplo, en muchas aplicaciones Ctrl+C equivale a Edit/Copy y Ctrl+V a Edit/Paste.
Estas combinaciones de teclas se llaman accesos rápidos (shortcut) y hay que distinguirlas de
acceder a los menús mediante la tecla Alt y las letras subrayadas de los nombres.
Los items de los menús admiten un único evento: el evento click, que consiste en ser seleccionados
por medio del ratón o del teclado. Para añadir el código correspondiente basta elegir en el menú,
estando en modo diseño, el ítem correspondiente para que se abra la ventana de código en el
procedimiento ligado a ese evento. También puede buscarse directamente el objeto y el evento
correspondiente en las listas desplegables de la ventana de código.
En ocasiones habrá que cambiar las propiedades checked, active y visible desde los
procedimientos. A estas propiedades se accede del modo habitual, con el nombre del ítem y el
operador punto (.)
De la misma manera que pueden definirse arrays de controles, también pueden definirse arrays de
items (y de títulos) en un menú. La ventaja de definir arrays de items es que basta definir un único
procedimiento que se haga cargo del evento click de todos los items del array. Este procedimiento
Capítulo 5: Menús página 67
recibe como parámetro la variable entera Index, que indica que ítem del array ha sido seleccionado
por el usuario. Dentro de este procedimiento se podrá utilizar por ejemplo la sentencia Select Case
para tratar de forma adecuada cada uno de los casos.
Los menús contextuales aparecen cuando el usuario clica con el botón derecho sobre un elemento
de la aplicación. El programa debe reconocer el evento MouseUp o MouseDown, ver si el usuario
ha clicado con el botón derecho (argumento Button igual a 2) y llamar al método PopupMenu, que
tiene la siguiente forma general:
PopupMenu menuName [,flags[,x[,y]]]
donde menuName ee el nombre de un menú (con al menos un elemento), x e y son las coordenadas
base para hacer aparecer el menú contextual, y flags son unas constantes que determinan más en
concreto dónde y cómo se muestra el menú. Las constantes que determinan dónde aparece el menú
son: vbPopupMenuLeftAlign (default), vbPopupMenuCenterAlign y vbPopupMenuRightAlign. Por
otra parte vbPopupMenuLeftButton (default) y vbPopupMenuRightButton determinan si el comando
se activa con el botón izquierdo o con cualquiera de los dos botones. Las constantes se combina con
el operador Or. El nombre del menú que aparece en el método PopupMenu debe haber sido creado
con el Menu Editor, aunque puede tener la propiedad Visible a False, si no se desea que se vea.
Capítulo 6: Gráficos en Visual Basic 6.0 página 69
Visual Basic 6.0, además de hacer fácil la construcción de interfaces gráficas de usuario, tiene
también grandes posibilidades gráficas en lo que se refiere a dibujo de líneas y formas geométricas,
así como en lo referente a la introducción de gráficos y figuras realizados con otras aplicaciones. En
este capítulo se presentarán brevemente las posibilidades gráficas más importantes de Visual Basic
6.0.
Antes de ver cómo se dibuja en Visual Basic 6.0 se verá cómo se definen los colores. Al igual que
en tantas aplicaciones informáticas, los colores de Visual Basic se definen por medio de las
componentes fundamentales RGB (Red, Green and Blue). La intensidad de cada color fundamental
se define con un byte, es decir con un número entero entre 0 y 255. Se utilizan pues tres bytes para
definir los tres colores. Visual Basic 6.0 utiliza un entero long (32 bits, 4 bytes) para guardar un
color, lo cual quiere decir que existe un byte adicional donde se podrá guardar alguna otra
información (ver Apartado 6.1.2).
Si alguno de los argumentos tiene un valor mayor que 255, se toma como 255.
representar, con la función RGB por ejemplo. Si la tarjeta gráfica soporta sólo 256 colores se utiliza
el dithering, que consiste en mezclar pixels de distintos colores con objeto de obtener un efecto lo
más parecido posible al color solicitado.
Una vez añadidos los colores a la paleta, al clicar en el pequeño
triángulo que aparece en cualquier propiedad de color en la ventana
Properties aparecerán una ventana donde es posible elegir entre los
colores de la paleta y los denominados colores del sistema (Figura
6.3).
El Ejemplo 1.5.4 (Colores RGB), mostrado en la página 11 de
este manual, es un buen ejemplo de la utilización de los colores en
Visual Basic 6.0.
Figura 6.3. Colores de sistema
6.2 FORMATOS GRÁFICOS
En un formulario de Visual Basic 6.0 -y en los controles Image y PictureBox- es posible insertar
gráficos, tanto de tipo bitmap (los producidos por aplicaciones como Paint, Paintbrush, Paint Shop
Pro, etc.), como de tipo vectorial (los producidos por las herramientas gráficas de Word y
PowerPoint).
Visual Basic 6.0 admite varios formatos de ficheros gráficos: los ficheros *.bmp y *.ico para
los gráficos de tipo bitmap, los ficheros *.wmf (Windows Meta File) y *.emf (Enhanced Meta File)
para los gráficos de tipo vectorial y *.jpg (JPEG o Joint Photographic Experts Group) y *.gif
(Graphic Interchange Format). Los ficheros *.ico son ficheros bitmap de pequeño tamaño (32 por
32) destinados a contener iconos. Los ficheros JPEG y GIF son formatos gráficos comprimidos que
soportan respectivamente color de 24 bit (~16 millones de colores) y 8 bit (256 colores). Ambos
formatos son los utilizados en Internet para mostrar imágenes.
Si se desea insertar ficheros gráficos que estén en otros formatos, habrá que convertirlos
previamente a uno de estos formatos usando el programa adecuado.
Visual Basic 6.0 dispone de varios controles con los que insertar gráficos en un formulario.
Algunos tienen más posibilidades que otros y es necesario conocerlos bien. A continuación se verán
los controles Line, Shape, Image y PictureBox.
Por el contrario, si dicha propiedad está en True el gráfico que proviene del fichero se adapta al
tamaño de control.
Se puede tratar de modificar el tamaño del gráfico en modo de diseño (con el ratón o
cambiando las propiedades de tamaño del control). Si el gráfico es un bitmap y la propiedad Stretch
está en False, el tamaño de la imagen no cambia aunque cambie el del control (quedando en la
esquina superior izquierda si el control se hace más grande, o quedando parcialmente oculta si
alguna de las dimensiones del control se hace más pequeña que la del bitmap. Si la propiedad
Stretch está en True, el bitmap se adapta al tamaño del control y su tamaño se cambia con el de
éste. Los gráficos metafile siempre se pueden cambiar de tamaño en modo de diseño, tanto si
Stretch está en True como si está en False.
Existen otras formas de cargar un gráfico en un control Image, además de utilizar la
propiedad Picture en modo de diseño, como se ha visto anteriormente. Una segunda forma,
utilizable también en modo de diseño, es hacer Copy y Paste a partir de un gráfico contenido en otra
aplicación como Paint Shop Pro o Excel.
En modo de ejecución se puede copiar el contenido de un control Image en otro control del
mismo tipo por medio de una sentencia de asignación en la forma:
imgCuadro.picture = imgCaja.picture
y se puede también cargar una imagen de un fichero utilizando el procedimiento LoadPicture, por
ejemplo en la forma siguiente (habrá que estar seguro de que existe el fichero):
imgCuadro.picture = LoadPicture("G:\graficos\pc.wmf")
Aunque el control Image admite algunos eventos (Click, DblClick, DragDrop, DragOver,
MouseUp, MouseDown, MouseMove), sus posibilidades son también limitadas. Por la forma en que
se dibuja, el control Image no puede estar sobre otro control, como por ejemplo un botón (ver los
layers, más adelante en este capítulo). Tampoco puede contener otros controles en su interior: sólo
puede contener gráficos. Finalmente, este control no puede obtener el focus y por tanto no puede
responder a acciones desde el teclado. El control PictureBox, que se verá a continuación, resuelve
estas limitaciones aunque presenta la desventaja de ser más lento en dibujar que el control Image.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 74
Sólo los formularios y los controles PictureBox pueden albergar otros tipos de controles. Además
es posible escribir texto y dibujar directamente sobre ellos por medio de ciertos métodos3 de Visual
Basic. Por defecto estos métodos actúan sobre el formulario activo. Si se desea que actúen sobre un
control PictureBox hay que precederlos por el nombre del control y el operador punto.
3
Los métodos son procedimientos que Visual Basic ofrece ya programados. El usuario sólo tiene que llamarlos
pasándoles los argumentos apropiados.
Capítulo 6: Gráficos en Visual Basic 6.0 página 75
donde spc(n) es opcional y sirve para insertar n caracteres en la salida; tab(n) es también opcional y
sirve para posicionar la salida en una posición absoluta determinada por n con un tabulador. Si tab
se utiliza sin argumentos lleva al comienzo de la siguiente región de salida4; expresion representa
cualquier expresión cuyo resultado sea un número o una cadena de caracteres. poschar indica dónde
se imprimirá el siguiente carácter. Si es un punto y coma (;) la impresión se hace a continuación del
último carácter impreso; si es un tab(n) o un tab tiene el efecto antes descrito; si se omite, la
impresión comienza en una nueva línea.
El color, la fuente y el tamaño del texto se toman de las correspondientes propiedades del
formulario o control PictureBox.
donde:
object es opcional y representa el objeto (form o PictureBox) en el que se va a dibujar el
punto. Si se omite, el punto se dibuja en el formulario activo (el que tiene el focus).
Step es opcional. Si se introduce las coordenadas que le siguen son relativas respecto a las
propiedades CurrentX y CurrentY de la PictureBox. Al dibujar un punto, estas
propiedades se actualizan a las coordenadas de dicho punto.
(x, y) son las coordenadas absolutas o relativas del punto a dibujar (expresiones, variables o
constantes single). Tanto las coordenadas como la coma, como los paréntesis son
obligatorios. Las unidades dependen de la propiedad ScaleMode del objeto en que se
dibuja.
Color es opcional y es un nombre de color (vbRed, vbBlue, etc.) o un long conteniendo el
código de color hexadecimal (puede ser el valor de retorno de la función RGB). Si se
omite, se utiliza la propiedad ForeColor del objeto en el que se dibuja.
El tamaño del punto viene determinado por la propiedad DrawWidth del objeto en que se
dibuja. Si el tamaño es mayor que uno, el punto se dibuja centrado en las coordenadas suministradas
a PSet. Si se desea eliminar un punto previamente dibujado es necesario volver a pintar ese punto
con el color de fondo del objeto (BackColor).
4
En Visual Basic se comienza una región de salida cada 14 caracteres, si se utiliza un tipo de letra de anchura
constante. Con otros tipos de letra esta medida es sólo aproximada.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 76
donde object, step y color tienen el mismo significado que en PSet y Line, y:
(x, y) son obligatorias, y contienen las coordenadas del centro de la circunferencia.
Radius es obligatoria y define el radio de la circunferencia.
Start, end son opcionales, y permiten definir arcos por medio del ángulo inicial (start) y final
(end). Los ángulos se miden siempre en radianes y en sentido contrario a las agujas
del reloj. Sus valores deben estar entre -2π y 2π. En principio se dibuja solamente el
arco, pero si uno o ambos valores son negativos se tratan como positivos, pero se
Capítulo 6: Gráficos en Visual Basic 6.0 página 77
dibuja una línea que une el centro de la circunferencia con el origen o el extremo del
arco.
Aspect es también opcional y se utiliza para dibujar elipses. Es la relación entre el diámetro
vertical y el horizontal. El valor por defecto es 1.0, lo que corresponde a una
circunferencia. Cuando aspect es distinto de 1.0, el parámetro radius define el mayor
de los dos diámetros.
Sólo las figuras cerradas (no los arcos sin líneas que unan los extremos con el centro) pueden
ser rellenadas con el color determinado por las propiedades FillColor y FillStyle del objeto en que
se dibuja). El grosor y estilo de las líneas se determina con las propiedades DrawWidth y
DrawStyle. Después de ejecutarse este método, las propiedades CurrentX y CurrentY tienen el
valor del centro de la circunferencia. Si se omite algún argumento (excepto los que van al final),
deben respetarse las comas de separación entre argumentos.
borra del formulario o control PictureBox todos los resultados de los métodos gráficos y del método
Print, al mismo tiempo que pone las propiedades CurrentX y CurrentY a cero. No afecta a los
gráficos introducidos en modo de diseño (por ejemplo con la propiedad Picture). Tampoco se
borran con este método el texto y gráficos que se hayan creado con la propiedad AutoRedraw en
True, si dicha propiedad se pone a False antes de llamar al método Cls. De esta forma se pueden
realizar borrados selectivos.
El método Point devuelve, como entero long, el color (RGB) del punto especificado en un
formulario o control PictureBox. Su forma general es:
object.Point(x, y)
Si se desea, el entero long devuelto por Point puede convertirse a la notación hexadecimal que
se usa para los colores utilizando la función Hex.
La Tabla 6.4 especifica los posibles valores de esta propiedad. La unidad por defecto es el twip, que
es la vigésima parte del punto o pixel.
En un formulario las propiedades relacionadas con la escala y las dimensiones, agrupadas de
cuatro en cuatro, son las siguientes: (top, left, height y width) y (scaleTop, scaleLeft, scaleHeight y
scaleWidth). Su significado de explica a continuación con ayuda de la Figura 6.7.
En esta figura se muestra la pantalla y un formulario. La posición y dimensiones del
formulario vienen dadas por las propiedades (top, left, height y width). Para un formulario, estas
propiedades se definen siempre en twips. Obsérvese que se miden a partir de la esquina superior
izquierda.
Sin embargo, el formulario puede tener su propio sistema de coordenadas interno, definido
por las propiedades (scaleTop, scaleLeft, scaleHeight y scaleWidth), para lo cual su propiedad
ScaleMode debe estar puesta a cero. Las propiedades scaleLeft y scaleTop determinan las
coordenadas de la esquina superior izquierda en el propio sistema de coordenadas, mientras que
scaleWidth y scaleHeight determinan su anchura y altura en dichas coordenadas. En realidad estas
propiedades determinan indirectamente la posición del origen de coordenadas y la escala y
orientación de los ejes. Si scaleHeight es positiva el eje de ordenadas va hacia abajo, mientras que
si es negativa estará orientado hacia arriba. El eje horizontal va hacia la derecha si scaleWidth es
positiva, y hacia la izquierda si es negativa.
El método Scale permite establecer las cuatro propiedades (scaleTop, scaleLeft, scaleHeight
y scaleWidth) conjuntamente, como se verá en el siguiente apartado. Sólo los formularios y los
controles PictureBox pueden tener las propiedades scaleTop, scaleLeft, scaleHeight y scaleWidth.
Si las propiedades (top, left,
height y width) no se aplican a un
top
scaleHeight
scaleMode del formulario o pic-
tureBox que las contiene. Cuando
estas propiedades se utilizan sin scaleWidth
anteponerles el nombre de un
objeto se aplican al formulario width
activo. Para que se apliquen a un
objeto cualquiera basta anteponer- Figura 6.7. Posición y tamaño de una caja PictureBox.
les el nombre del objeto separado
por el operador punto (.).
donde object es el nombre del control PictureBox (si se omite, el método se aplica al formulario
activo). Las coordenadas (x1, y1) son las coordenadas del vértice superior izquierdo del formulario
o PictureBox, mientras que (x2, y2) corresponden al vértice inferior derecho. Por ejemplo, el
siguiente método:
pctCaja.Scale (-100, 100) - (100, -100) (-100,100)
establece unos ejes en el centro de la PictureBox, con los
sentidos ordinarios, que varían entre -100 y 100, tal como puede (0,0) •
verse en la Figura 6.8. Este método equivale establecer las
cuatro propiedades siguientes:
(100,-100)
pctCaja.scaleTop = 100
pctCaja.scaleLeft = -100 Figura 6.8. Método Scale.
pctCaja.scaleHeight = -100
pctCaja.scaleWidth = 100
El explicar más a fondo las distintas aplicaciones de esta propiedad esta fuera del alcance de
este manual introductorio.
Por defecto, Visual Basic 6.0 redibuja siempre los controles que aparecen en un formulario.
Esto no sucede sin embargo con el resultado de los métodos gráficos y de Print. Para que la salida
de estos métodos se redibuje es necesario adoptar uno de los dos métodos siguientes:
1. Si en el form o pictureBox la propiedad AutoRedraw está en False:
• Si los métodos gráficos y Print están en el procedimiento correspondiente al evento Paint
se redibujan en el plano de fondo (los métodos vuelven a ejecutarse, por lo que el proceso
puede ser lento en ciertos casos).
• Si los métodos gráficos y Print están fuera del evento Paint no se redibujan.
2. Si en el form o pictureBox la propiedad AutoRedraw está en True:
• Si los métodos gráficos y Print están en el evento Paint se ignoran.
• Si los métodos gráficos y Print están fuera del evento Paint se redibujan guardando en
memoria una copia de la zona de pantalla a refrescar. Este es la forma más rápida de
conseguir que los gráficos y el texto se redibujen. Tiene el inconveniente de necesitar más
memoria.
La propiedad AutoRedraw de los forms y de las pictureBox es independiente, por lo que las
dos formas anteriores de conseguir que los gráficos se redibujen se pueden utilizar conjuntamente,
por ejemplo una en el formulario y otra en las pictureBox.
6.7 EJEMPLOS
A continuación se muestra dos ejemplos que hacen
uso de algunos de los controles y métodos gráficos
explicados previamente.
Todas las labels que aparecen tienen la propiedad BorderStyle igual a 1- Fixed Single.
El código del programa es el siguiente:
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 84
Option Explicit
Dim a, b, c As Double
Dim x1, x2, dis, xr, xi As Double
JGJCon Visual Basic 6.0 es fácil crear barras de herramientas constituidas por botones clicables,
al estilo de las aplicaciones de Windows. De ordinario las barras de herramientas dan acceso a las
funciones o comandos más comunes de los menús de la aplicación.
Se puede crear una barra de herramientas por medio de un PictureBox colocado en un
formulario. En este PictureBox se pueden colocar controles CommandButton o Image en los que
se programa el evento click. La propiedad Picture del control Image puede contener la dirección de
alguno de los iconos estándar que vienen con Visual Basic (extensión *.ico) o la de un icono
construido por el programador.
En el caso de los formularios MDI se puede colocar una barra de herramientas en el
MDIform, que automáticamente adquiere la anchura del formulario.
Capítulo 7: Archivos y Entrada/Salida de Datos página 87
En este capítulo se van a describir varias formas de introducir información en el programa, así como
de obtener resultados en forma impresa o mediante escritura en un fichero. Se va a presentar una
nueva forma interactiva de comunicarse con el usuario, como son las cajas de diálogo MsgBox e
InputBox. Particular interés tiene la lectura y escritura de datos en el disco, lo cual es necesario
tanto cuando el volumen de información es muy importante (la memoria RAM está siempre más
limitada que el espacio en disco), como cuando se desea que los datos no desaparezcan al terminar
la ejecución del programa. Los ficheros en disco resuelven ambos problemas.
También se verá en este capítulo cómo obtener resultados alfanuméricos y gráficos por la
impresora.
Estas cajas de diálogo son similares a las que se utilizan en muchas aplicaciones de Windows. La
caja de mensajes o MsgBox abre una ventana a través de la cual se envía un mensaje al usuario y se
le pide una respuesta, por ejemplo en forma de clicar un botón O.K./Cancel, o Yes/No. Este tipo de
mensajes son muy utilizados para confirmar acciones y para decisiones sencillas. La caja de diálogo
InputBox pide al usuario que teclee una frase, por ejemplo su nombre, un título, etc.
La forma general de la función MsgBox es la siguiente:
respuesta = MsgBox("texto para el usuario", tiposBotones, "titulo")
donde respuesta es la variable donde se almacena el valor de retorno, que es un número indicativo
del botón clicado por el usuario, de acuerdo con los valores de la Tabla 7.1. La constante simbólica
que representa el valor de retorno indica claramente el botón clicado. Los otros dos argumentos son
opcionales. El parámetro tiposBotones es un entero que indica la combinación de botones deseada
por el usuario; sus posibles valores se muestran en la Tabla 7.2. También en este caso la constante
simbólica correspondiente es suficientemente explícita. Si este argumento se omite se muestra sólo
el botón O.K. El parámetro titulo contiene un texto que aparece como título de la ventana; si se
omite, se muestra en su lugar el nombre de la aplicación.
Se puede modificar el valor de tiposBotones de modo que el botón que se activa por defecto
cuando se pulsa la tecla Intro (el botón que tiene el focus) sea cualquiera de los botones de la caja.
Para ello basta sumar a tiposBotones otra constante que puede tomar uno de los tres valores
siguientes: 0 (vbDefaulButton1, que representa el primer botón), 256 (vbDefaulButton2, que
representa el segundo botón) y 512 (vbDefaulButton3, que representa el tercer botón).
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 88
Figura 7.1. Ejemplo de caja MsgBox. Figura 7.2. Ejemplo de caja de InputBox.
donde el “2” indica que deben aparecer los botones Abort, Retry y Cancel, el “256” indica que el
botón por defecto es el segundo (Retry) y el “48” indica que debe aparecer el icono de exclamación.
Por otra parte, la forma general de la función InputBox es la siguiente:
texto = InputBox("texto para el usuario", "titulo", "default", left, top)
donde texto es la variable donde se almacena el valor de retorno, que es el texto tecleado por el
usuario. Los parámetros "texto para el usuario" y titulo tienen el mismo significado que en
MsgBox. El parámetro default es un texto por defecto que aparece en la caja de texto y que el
usuario puede aceptar, modificar o sustituir; el contenido de esta caja es lo que en definitiva esta
función devuelve como valor de retorno. Finalmente, left y top son las coordenadas de la esquina
superior izquierda de la InputBox; si se omiten, Visual Basic 6.0 dibuja esta caja centrada en
horizontal y algo por encima de la mitad de la pantalla en vertical. La Figura 7.2 muestra un ejemplo
de caja InputBox resultado de ejecutar el comando siguiente:
lblBox.Caption = InputBox("Escriba su nombre: ", _
"Caja de entrada", "Miguel Indurain")
donde el nombre que aparece por defecto es el del mejor ciclista de los últimos tiempos. Este
nombre aparece seleccionado y puede ser sustituido por otro que teclee el usuario.
Este método permite escribir texto en formularios, cajas pictureBox y en un objeto llamado Printer
que se verá un poco más adelante, en el Apartado 7.3.
Format es imprescindible, pues Print no los escribe directamente. La forma general de esta función
es la siguiente:
Format(expresion, formato)
donde expresion es una variable o expresión y formato -que es opcional- describe el formato
deseado para el resultado. El valor de retorno es una cadena de caracteres directamente utilizable en
Print. Para fechas existen formatos predefinidos tales como “General Date”, “Long Date”,
“Medium Date” y “Short Date”; para la hora los formatos predefinidos son “Long Time”,
“Medium Time” y “Short Time”. Además existe la posibilidad de que el usuario defina sus propios
formatos (ver User-Defined Date/Time Formats (Format Function), en el Help del programa). El
usuario también puede definir sus propios formatos numéricos y de cadenas de caracteres.
A diferencia de la función Str, la función Format no deja espacio en blanco para el signo de
los números positivos.
Visual Basic 6.0 permite obtener por la impresora gráficos y texto similares a los que se pueden
obtener por la pantalla, aunque con algunas diferencias de cierta importancia. Existen dos formas de
imprimir: la primera mediante el método PrintForm, y la segunda utilizando el objeto Printer, que
es un objeto similar al objeto PictureBox. Ambos métodos tienen puntos fuertes y débiles que se
comentarán a continuación.
donde pictProp indica el gráfico (coincide con la propiedad Picture de PictureBox), X e Y indican
las coordenadas de inserción y los dos últimos parámetros las dimensiones (opcionales).
La caja FileListBox tiene una propiedad llamada FileName que contiene el nombre del
fichero seleccionado por el usuario. Para tener el path completo del fichero basta anteponerle la
propiedad Path de la fileListBox, que incluye el directorio y el drive, y la barra invertida (\). Si el
usuario introduce FileName incluyendo el path, Visual Basic actualiza también de modo
automático la propiedad Path de FileListBox. El usuario se debe preocupar de utilizar el evento
Change para actualizar el Path de la caja DirListBox y la propiedad Drive de DriveListBox.
Otra propiedad importante es la propiedad Pattern, que indica los tipos de ficheros que se
mostrarán en la caja. El valor por defecto es “*.*”, lo cual hace que se muestren todos los ficheros.
Si su valor fuese “*.doc” sólo se mostrarían los ficheros con esta extensión. La propiedad Pattern
admite varias opciones separadas por untos y coma (“*.doc; *.dot”).
Tanto en Windows como en Visual Basic 6.0 existen, principalmente, dos tipos de archivos:
1. Ficheros ASCII o ficheros de texto. Contienen caracteres codificados según el código ASCII
y se pueden leer con cualquier editor de texto como Notepad. Suelen tener extensión *.txt o
*.bat, pero también otras como *.m para los programas de Matlab, *.c para los ficheros fuente
de C, *.cpp para los ficheros fuente de C++ y *.java para los de Java.
2. Ficheros binarios: Son ficheros imagen de los datos o programas tal como están en la
memoria del ordenador. No son legibles directamente por el usuario. Tienen la ventaja de que
ocupan menos espacio en disco y que no se pierde tiempo y precisión cambiándolos a formato
ASCII al escribirlos y al leerlos en el disco.
Con Visual Basic 6.0 se pueden leer tanto ficheros ASCII como ficheros binarios. Además el
acceso a un fichero puede ser de tres formas principales.
1. Acceso secuencial. Se leen y escriben los datos como si se tratara de un libro: siempre a
continuación del anterior y sin posibilidad de volver atrás o saltar datos. Si se quiere acceder a
un dato que está hacia la mitad de un fichero, habrá que pasar primero por todos los datos
anteriores. Los ficheros de texto tienen acceso secuencial.
2. Acceso aleatorio (random): Permiten acceder directamente a un dato sin tener que pasar por
todos los demás, y pueden acceder a la información en cualquier orden. Tienen la limitación
de que los datos están almacenados en unas unidades o bloques que se llaman registros, y que
todos los registros que se almacenan en un fichero deben ser del mismo tamaño. Los ficheros
de acceso aleatorio son ficheros binarios.
3. Acceso binario. Son como los de acceso aleatorio, pero el acceso no se hace por registros sino
por bytes.
Antes de poder leer o escribir en un fichero hay que abrirlo por medio de la sentencia Open.
En esta sentencia hay que especificar qué tipo de acceso se desea tener, distinguiendo también si es
para lectura (input), escritura (output) o escritura añadida (append).
Capítulo 7: Archivos y Entrada/Salida de Datos página 93
donde:
filename es el nombre del fichero a abrir. Será una variable string o un nombre entre dobles
comillas (“ ”).
modo Para acceso secuencial existen tres posibilidades: Input para leer, Output para
escribir al comienzo de un fichero y Append para escribir al final de un fichero ya
existente. Si se intenta abrir en modo Input un fichero que no existe, se produce un
error. Si se abre para escritura en modo Output un fichero que no existe se crea, y si
ya existía se borra su contenido y se comienza a escribir desde el principio. El modo
Append es similar al modo Output, pero respeta siempre el contenido previo del
fichero escribiendo a continuación de lo último que haya sido escrito anteriormente.
fileNo es un número entero (o una variable con un valor entero) que se asigna a cada fichero
que se abre. En todas las operaciones sucesivas de lectura y/o escritura se hará
referencia a este fichero por medio de este número. No puede haber dos ficheros
abiertos con el mismo número. Visual Basic dispone de una función llamada
FreeFile que devuelve un número no ocupado por ningún fichero.
A continuación puede verse un ejemplo de fichero abierto para lectura:
Open "C:\usuarios\PRUEBA1.txt" For Input as #1
Después de terminar de leer o escribir en un fichero hay que cerrarlo. Para ello, se utilizara el
comando Close, que tiene la siguiente forma:
Close # fileNo
donde el fileNo es el número que se la había asignado al abrirlo con la instrucción Open.
donde el fileNo es el número asignado al archivo al abrirlo y varName1, varName2, ... son los
nombres de las variables donde se guardarán los valores leídos en el fichero. Debe haber una
correspondencia entre el orden y los tipos de las variables en la lista, con los datos almacenados en
el fichero. No se pueden leer directamente vectores, matrices o estructuras. Si los datos del disco
han de ser escritos por el propio programa, conviene utilizar la sentencia write (mejor que Print)
para garantizar que los valores están convenientemente separados. La sentencia Write se verá
posteriormente.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 94
Conviene recordar que en los ficheros de texto se suele utilizar el carácter return (o Intro)
para delimitar las distintas líneas. Este es el carácter ASCII nº 13, que por no ser un carácter
imprimible se representa en Visual Basic 6.0 como chr(13). En muchas ocasiones (como herencia
del MS-DOS) se utiliza como delimitador de líneas una combinación de los caracteres return y
linefeed, representada en Visual Basic 6.0 como chr(13)+chr(10). En la cadena de caracteres que
devuelve Line no se incluye el carácter de terminación de la línea.
Para leer todas las líneas de un fichero se utiliza un bucle for o while. Visual Basic 6.0
dispone de la función EOF (End of File) que devuelve True cuando se ha llegado al final del
fichero. Véase el siguiente ejemplo:
Do While Not EOF(fileNo)
miLinea = Line Input #fileNo
...
Loop
También se puede utilizar la función Input, que tiene la siguiente forma general:
varString = Input(nchars, #fileNo)
donde nchars es el número de caracteres que se quieren leer y varString es la variable donde se
almacenan los caracteres leídos por la función. Esta función lee y devuelve todos los caracteres que
encuentra, incluidos los intro y linefeed. Para ayudar a utilizar esta función existe la función LOF
(fileNo), que devuelve el nº total de caracteres del fichero. Por ejemplo, para leer todo el contenido
de un fichero y escribirlo en una caja de texto se puede utilizar:
txtCaja.text = Input(LOF(fileNo), #fileNo)
donde var1, var2,... pueden ser variables, expresiones que dan un resultado numérico o
alfanumérico, o cadenas de caracteres entre dobles comillas, tales como “El valor de x es...”.
Considérese el siguiente ejemplo:
Print #1, "El valor de la variable I es: ", I
donde I es una variable con un cierto valor que se escribe a continuación de la cadena. Las reglas
para determinar el formato de la función Print # son las mismas que las del método Print visto
previamente.
Capítulo 7: Archivos y Entrada/Salida de Datos página 95
Los ficheros de acceso aleatorio se caracterizan porque en ellos se puede leer en cualquier orden.
Los ficheros de acceso aleatorio son ficheros binarios. Cuando se abre un fichero se debe escribir
For Random, al especificar el modo de apertura (si el fichero se abre For Binary el acceso es
similar, pero no por registros sino por bytes; este modo es mucho menos utilizado).
donde filename es una variable que almacena el nombre del archivo. Se recuerda que la función
FreeFile devuelve un número entero válido (esto es que no está siendo utilizado) para poder abrir
un fichero. El último parámetro informa de la longitud de los registros (todos deben tener la misma
longitud). Visual Basic 6.0 dispone de la función Len(objetoName), que permite calcular la
dimensión en bytes de cualquier objeto perteneciente a una clase o estructura.
De ordinario los ficheros de acceso directo se utilizan para leer o escribir de una vez todo un
bloque de datos. Este bloque suele ser un objeto de una estructura, con varias variables miembro.
Los ficheros abiertos para acceso directo se cierran con Close, igual que los secuenciales.
7.7.2 Leer y escribir en una archivo de acceso aleatorio. Funciones Get y Put
Se utilizan las funciones Get y Put. Su sintaxis es la siguiente:
Get #fileNo, registroNo, variableObjeto
Put #fileNo, registroNo, variableObjeto
La instrucción Get lee un registro del fichero y almacena los datos leídos en una variable, que
puede ser un objeto de una determinada clase o estructura. La instrucción Put escribe el contenido
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 96
Con este ejemplo, se ha abierto el fichero filename de la misma forma que se realizó en el
ejemplo anterior, pero ahora, además se ha leído un registro de longitud size, y más en concreto, el
tercer registro. Si se quisiera modificar el valor de este registro, no habría más que asignarle el valor
que se quisiera, para a continuación introducirlo en el fichero mediante la sentencia siguiente:
Put #fileNo, 3, size
La técnica a emplear es básicamente la misma que con los ficheros de acceso aleatorio, con la
salvedad de que en lugar de manejar registros, en los ficheros de acceso binario se trabaja con bytes.
Véase el siguiente ejemplo:
FileNo=FreeFile
Open filename for Binary as #fileNo
Get #1, 4, dato
dato = 7
Put #1, 4, dato
Close #1
En este Anexo se incluyen algunas consideraciones de interés para personas que no han programado
antes en otros lenguajes. A continuación se explican las posibilidades y la forma de almacenar los
distintos tipos de variables.
Las variables string (cadenas de caracteres) contienen un conjunto de caracteres que se almacenan
en bytes de memoria. Cada carácter es almacenado en un byte (8 bits). En un bit se pueden
almacenar dos valores (0 y 1); con dos bits se pueden almacenar 22 = 4 valores (00, 01, 10, 11 en
binario; 0, 1 2, 3 en decimal). Con 8 bits se podrán almacenar 28 = 256 valores diferentes
(normalmente entre 0 y 255; con ciertos compiladores entre -128 y 127).
En realidad, cada letra se guarda en un solo byte como un número entero, el correspondiente a
esa letra en el código ASCII (una correspondencia entre números enteros y caracteres, ampliamente
utilizada en informática), que se muestra en la Tabla 8.1 para los caracteres estándar (existe un
código ASCII extendido que utiliza los 256 valores y que contiene caracteres especiales y caracteres
específicos de los alfabetos de diversos países, como por ejemplo las vocales acentuadas y la letra ñ
para el castellano).
0 1 2 3 4 5 6 7 8 9
0 nul soh stx etx eot enq ack bel bs ht
1 nl vt np cr so si dle dc1 dc2 dc3
2 dc4 nak syn etb can em sub esc fs gs
3 rs us sp ! “ # $ % & ‘
4 ( ) * + , - . / 0 1
5 2 3 4 5 6 7 8 9 : ;
6 < = > ? @ A B C D E
7 F G H I J K L M N O
8 P Q R S T U V W X Y
9 Z [ \ ] ^ _ ` a b c
10 d e f g h i j k l m
11 n o p q r s t u v w
12 x y z { | } ~ del
Tabla 8.1. Código ASCII estándar.
Esta tabla se utiliza de la siguiente forma. La primera cifra (las dos primeras cifras, en el caso
de los números mayores o iguales que 100) del número ASCII correspondiente a un carácter
determinado figura en la primera columna de la Tabla 8.1, y la última cifra en la primera fila de
dicha Tabla. Sabiendo la fila y la columna en la que está un determinado carácter puede componerse
el número ASCII correspondiente. Por ejemplo, la letra A está en la fila 6 y la columna 5. Su
número ASCII es por tanto el 65. El carácter % está en la fila 3 y la columna 7, por lo que su
representación ASCII será el 37. Obsérvese que el código ASCII asocia números consecutivos con
las letras mayúsculas y minúsculas ordenadas alfabéticamente. Esto simplifica notablemente ciertas
operaciones de ordenación alfabética de nombres. Nótese que todas las mayúsculas tienen código
ASCII anterior a cualquier minúscula.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 98
En la Tabla 8.1 aparecen muchos caracteres no imprimibles (todos aquellos que se expresan
con 2 ó 3 letras). Por ejemplo, el ht es el tabulador horizontal, el nl es el carácter nueva línea, etc.
En realidad la Versión 6.0 de Visual Basic no utiliza para representar caracteres el código
ASCII sino el Unicode, que utiliza dos bytes por carácter, con lo cual tiene capacidad para
representar 65536 caracteres, pudiéndose adaptar a las lenguas orientales. Para los caracteres latinos
el byte más significativo coincide con el del código ASCII, mientras que el segundo byte está a cero.
En muchas aplicaciones hacen falta variables reales, capaces de representar magnitudes que
contengan una parte entera y una parte fraccionaria o decimal. Estas variables se llaman también
de punto flotante. De ordinario, en base 10 y con notación científica, estas variables se representan
por medio de la mantisa, que es un número mayor o igual que 0.1 y menor que 1.0, y un exponente
que representa la potencia de 10 por la que hay que multiplicar la mantisa para obtener el número
considerado. Por ejemplo, el número π se representa como 0.3141592654⋅101. Tanto la mantisa
como el exponente pueden ser positivos y negativos.
lo cual quiere decir que se pueden representar todos los números decimales de 6 cifras y la mayor
parte –aunque no todos– de los de 7 cifras (por ejemplo, el número 9.213.456 no se puede
representar con 23 bits). Por eso se dice que las variables tipo Single tienen entre 6 y 7 cifras
decimales equivalentes de precisión.
Respecto al exponente de dos por el que hay que multiplicar la mantisa en base 2, con 7 bits el
número más grande que se puede representar es 127. El rango vendrá definido por la potencia,
2127 = 1.7014 · 1038
lo cual indica el orden de magnitud del número más grande representable de esta forma.
En el caso de los números Single (4 bytes) el rango es: desde -3.402823E38 a -1.401298E-45
para los valores negativos y desde 1.401298E-45 a 3.402823E38 para los valores positivos.
ANEXO A: Consideraciones adicionales sobre datos y variables página 99
lo cual representa entre 15 y 16 cifras decimales equivalentes. Con respecto al rango, con un
exponente de 10 bits el número más grande que se puede representar será del orden de 2 elevado a 2
elevado a 10 (que es 1024):
21024 = 1.7977 · 10308
Si se considera el caso de los números declarados como Double (8 bytes) el rango va desde
-1.79769313486232E308 a -4.94065645841247E-324 para los valores negativos y desde
4.94065645841247E-324 a 1.79769313486232E308 para los valores positivos.