Documentos de Académico
Documentos de Profesional
Documentos de Cultura
INDICE
Capítulo Contenidos Página
1 Introducción
2 El ambiente de desarrollo de Visual Basic.
3 Características del lenguaje
4 Primeras aplicaciones en Visual Basic
5 Arreglos de controles.
6 Incorporando menús.
7 Explotando el ratón.
8 Jugando con el tiempo.
9 Accediendo a bases de datos.
Bibliografía
Introducción a la Programación Visual Página 3 de 168
Eventos. A continuación intentaremos hacer una sucinta descripción de los mismos y discutir su
presencia o su influencia en el lenguaje Visual Basic.
Programación Orientada a Objetos.
La programación orientada a objetos es la expresión de uno de los más avanzados paradigmas en
el campo de la programación, y es, al mismo tiempo, el resultado de la evolución experimentada
por los paradigmas anteriores. Evolución motivada por la insuficiencia de los mismos para resolver
de forma segura y eficiente las cada vez más complejas tareas de la programación.
La Programación Orientada a Objetos surgió en tiempos de la “crisis del software” de finales de
los años 60, casi al mismo tiempo que la Programación Estructurada, aunque con menos fortuna
que esta última, que fue aceptada en aquel momento como la metodología de programación
llamada a resolver la severa crisis. En ese ámbito, la programación orientada a objetos pasó
inadvertida en el concierto de los lenguajes y las técnicas de programación. Sin embargo, la
persistencia a través de los años 70 y 80 de problemas similares a los que desataron la ya
mencionada “crisis del software”, obligó a que se retomaran las ideas originales de la programación
orientada a objetos, siendo hoy de amplio consenso que se trata del mejor paradigma disponible,
en estos momentos, para enrumbar los más complejos proyectos de programación. A diferencia de
otros paradigmas de programación, que intentan, al abordar un problema, representarlo o
modelarlo empleando entidades cercanas a la computadora (arreglos, subrrutinas, módulos) la
programación orientada a objetos se propone emplear entidades lo más cercanas posibles a la
realidad. O sea, en vez de intentar acercar el problema a la computadora, se trata de acercar la
computadora al problema. Para lograr esto se modela la realidad a través de entidades
independientes, capaces de interactuar entre si, que representan los diferentes elementos que
intervienen, en la vida real, en el problema planteado. A estas entidades se les denomina Objetos
Para resolver un problema bajo el paradigma de la programación orientada a objetos basta con
determinar y caracterizar los diferentes objetos que intervienen en el problema, definir sus
propiedades y sus acciones y ponerlos a interactuar entre si. Así de sencillo.
Los conceptos fundamentales en programación orientada a objetos son los conceptos de Objeto y
Clase, intentaremos a continuación definirlos de la forma más asequible.
El Objeto, tal y como ocurre en la vida real, es un ente que posee un conjunto de propiedades
que permiten definirlo individualmente, diferenciándolo de cualquier otro, y un conjunto de
acciones que es capaz de realizar. Por ejemplo, un camión se define por la marca del fabricante,
el modelo, el número de serie del motor, el tonelaje de la carga que puede transportar, el número
de la matrícula, el color etc. y es capaz de realizar un conjunto de acciones como moverse,
estacionarse, descargar, encender las luces, apagar el motor etc.
Introducción a la Programación Visual Página 5 de 168
La Clase, por su parte, debe verse como un ente abstracto que permite declarar el conjunto de
propiedades que definirán al objeto y el conjunto de acciones que estará en capacidad de realizar.
Las propiedades del camión que enumeramos en el párrafo anterior, son propiedades generales,
propiedades que tienen todos los camiones. Lo que hicimos allí fue, en realidad, definir la Clase
‘camión’. O sea, para nuestro programa, un camión será, de forma genérica, un ente que posea
esas propiedades y sea capaz de realizar ese conjunto de acciones.
Pero para poder hablar de un camión en particular, tenemos que asignar valores a esas
propiedades. Podremos hablar, por ejemplo, de un camión Kamaz, modelo 6824, de color verde,
cuya matrícula es HB 51248, el número de serie de su motor es 456-12-782 y es capaz de
transportar 18 toneladas de carga. Podemos hablar de otro camión, marca Ford, modelo de 1994,
de color rojo, con matrícula HB 11674, con número de serie del motor 718-F315 y con una
capacidad de carga de 10 toneladas. Esos dos entes concretos, que se definen como instancias
individuales de la clase ‘camión’ serán Objetos.
La implementación computacional de los objetos hace que estos sean módulos, donde se
encapsulan los datos que sirven para representar los valores de sus propiedades, y las
instrucciones de los procedimientos, que representan y ejecutan las acciones que es capaz de
realizar el objeto. Esta capacidad de agrupar los datos y los procedimientos que operan con ellos
hace que los objetos sean entidades sumamente fáciles de transportar y de mantener. En esto se
diferencia radicalmente de los esquemas de programación tradicional, donde los datos se definen
en un área y los procedimientos en otra, haciendo muy difícil conservar la integridad y privacidad
de los datos.
Un lenguaje de programación orientada a objetos debe permitir al programador realizar
definiciones de clases, y construir objetos a partir de esas clases. Visual Basic nos permite hacer
esto, pero también facilita nuestro trabajo al proporcionar un conjunto de objetos ya elaborados,
con los que podemos construir el interfaz gráfico que el programa mostrará a sus usuarios. El
programador tiene la posibilidad de operar libremente con estos objetos, asignando valores a sus
propiedades y ejecutando sus métodos de acuerdo a las necesidades del programa que esta
elaborando.
La programación conducida por eventos.
El planteamiento de la programación conducida por eventos resulta diametralmente opuesto al de
la programación tradicional, donde normalmente encontramos bloques monolíticos de instrucciones
y donde la secuencia de ejecución de los distintos procedimientos resulta por lo general bien clara.
La programación conducida por eventos propone la fragmentación del código del programa, en
Introducción a la Programación Visual Página 6 de 168
pequeños módulos, que se ejecutan únicamente cuando tiene lugar el evento (normalmente
producido por el usuario del programa) que desencadena su ejecución.
Un evento es un hecho concreto que afecta la ejecución del programa, pero que el instante de su
ocurrencia no puede ser previsto con exactitud por el diseñador del programa. Nadie puede, por
ejemplo, prever en que momento el usuario del programa va a oprimir un botón, o va a accionar
sobre una barra de desplazamiento. Puede pasar, inclusive, que el usuario
nunca oprima el botón. Y no se debe tratar de controlar por la fuerza estas situaciones. Un
programa para Windows debe ofrecer un interfaz abierto, donde el usuario pueda actuar
libremente. El programa debe esperar a que tenga lugar el evento y, cuando esto suceda,
reaccionar en consecuencia.
La programación conducida por eventos puede implementarse en algunos lenguajes de
programación tradicionales. Por ejemplo en Quick Basic (y en general en casi todas las versiones
de Basic) se dispone de instrucciones del tipo ON KEY GOSUB y ON INTERVAL GOSUB, que
permiten la detección de eventos del tipo opresión de tecla o transcurso de un lapso de tiempo.
Con esas herramientas se puede diseñar un programa que funcione bajo el principio de la
conducción por eventos. Pero evidentemente la programación orientada a objetos es el sustrato
ideal para desarrollar la programación conducida por eventos. La idea de la fragmentación del
código resulta natural en este medio, ya que cada objeto contiene las instrucciones necesarias
para realizar sus propias tareas. Ahora bien, para poder desarrollar programación conducida por
eventos, los objetos deben tener un tercer ingrediente, que se adiciona a las propiedades (o
atributos)
y a los métodos (o procedimientos). El objeto debe ser capaz de detectar o reconocer eventos, y
cuando eso suceda debe desencadenar la ejecución de un procedimiento o método de atención al
evento. De esta forma, para caracterizar genéricamente al Objeto, en la definición de su Clase será
necesario indicar:
· Los atributos o propiedades que individualizarán al objeto.
· Los eventos que el objeto será capaz de detectar.
· Los métodos o procedimientos que el objeto será capaz de ejecutar.
Estos métodos se dividirán en:
1. Métodos generales, o independientes de eventos.
2. Métodos de atención a eventos.
Visual Basic resulta un excelente lenguaje para desarrollar programación conducida por eventos.
Todos los objetos con que opera son sensibles a eventos. Programar en Visual Basic no es más
que construir un interfaz con los objetos de pantalla que el lenguaje nos suministra, determinar
Introducción a la Programación Visual Página 7 de 168
ante que eventos deben reaccionar esos objetos y escribir los correspondientes procedimientos de
atención al evento. Así de sencillo.
Introducción a la Programación Visual Página 8 de 168
Por supuesto, esa respuesta no encierra toda la verdad. En realidad el ambiente no nos ofrece
directamente ningún lugar donde escribir instrucciones, porque en Visual Basic antes de escribir la
primera línea del programa debemos realizar el diseño del interfaz que ese programa mostrará a
sus usuarios. Para cumplimentar esa tarea Visual Basic nos suministra de forma inmediata todas
las herramientas necesarias.
Como se aprecia en la figura 2-1, el ambiente (o entorno) de desarrollo de Visual Basic está
integrado por cinc o ventanas. De acuerdo al número con que las hemos marcado, estas ventanas
serán:
1. Ventana principal de Visual Basic.
2. Ventana del primer formulario.
3. Ventana de la Caja de Herramientas.
4. Ventana de Propiedades.
5. Ventana del Proyecto.
Ventana principal: A partir de esta ventana se controla todo el ambiente de desarrollo de Visual
Basic. Posee además de la barra de título, una barra de menú y una barra de herramientas, con
botones que permiten acceder con rapidez a las principales opciones del entorno. La barra de
herramientas se detalla en la siguiente figura:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Figura 2-2. El panel de botones de la ventana principal
La función de los botones será, de acuerdo a la numeración que les hemos dado:
1. Crear un nuevo formulario.
2. Crear un nuevo módulo.
3. Abrir un proyecto o programa.
4. Salvar un proyecto o programa.
5. Fijar la posición de los controles sobre el formulario.
6. Mostrar la ventana de diseño de menú.
7. Mostrar la ventana de propiedades.
8. Mostrar la ventana del examinador de objetos.
9. Mostrar la ventana del proyecto.
10. Ejecutar el programa. (Run)
11. Detener la ejecución del programa. (Pause).
12. Finalizar la ejecución del programa. (Stop).
Introducción a la Programación Visual Página 10 de 168
Una vez terminado el diseño se puede comenzar a escribir el código del programa. Para ello Visual
Basic dispone de las Ventanas de edición de código. Cada formulario y cada módulo tiene su
propia ventana de código. Para acceder a ella basta realizar un doble clic sobre el formulario o el
control para el que se desea escribir código. También se puede acceder con la opción de mostrar
código de la Ventana del proyecto.
Cómo resolver un problema empleando un Lenguaje de Programación Visual.
En la programación tradicional resulta frecuente ver, como los programadores se concentran, a la
hora de resolver un problema, en las complicaciones algorítmicas del mismo, dejando para más
adelante, cuando ya hubiesen salido a flote de esas complicaciones, la implementación de la salida
en pantalla del programa. En muchas ocasiones se prepara una salida en pantalla elemental para
poder ir probando el comportamiento del programa, y sólo al final, esa salida elemental era
sustituida por el interfaz definitivo, el que debe ser mostrado a los usuarios.
Esta forma de organizar el trabajo del programador funcionaba aceptablemente en los viejos
buenos tiempos de la programación estructurada, cuando al terminar el diseño del programa
resultaba bastante clara la secuencia de ejecución de las instrucciones, los puntos claves de
bifurcación, etc., y sólo se permitía al usuario interactuar con el programa en determinados
procedimientos del mismo, y bajo un control sumamente riguroso. En un diseño realizado bajo
esos principios sólo se atendía al interfaz de pantalla cuando ello resultaba estrictamente
necesario.
Sin embargo, para escribir un programa con el propósito de ejecutarlo en un ambiente gráfico
como Windows, ese estilo de trabajo resulta inaplicable.
La razón es sencilla: el programador que pretenda escribir aplicaciones en estos momentos, y
tenga la natural pretensión de lograr que esas aplicaciones se ejecuten sobre el interfaz gráfico de
Windows, debe proponerse diseñarlas de forma tal que resulten consecuentes con los principios de
trabajo del ambiente gráfico. Para lograr eso es imprescindible que la ejecución de esas
aplicaciones sea conducida por eventos. Y la casi totalidad de los eventos se producen,
precisamente en la interfaz de la aplicación. Por esta razón si la interfaz no esta correcta y
completamente diseñada no resultará posible determinar con exactitud, desde un primer momento,
la totalidad de los eventos que pueden intervenir y resultar significativos para el buen
funcionamiento de nuestros programas, y esto redundará en un diseño deficiente, que obligará al
programador a realizar continuas retroalimentaciones, cada vez que se haga evidente la falta de un
elemento (objeto), en el diseño original del interfaz, y que para colocarlo y atender a su posible
interacción con los restantes objetos del interfaz, sea necesario generar nuevo código, modificar el
que ya se había escrito, o hacer ambas cosas.
Introducción a la Programación Visual Página 12 de 168
En principio a nadie se le ocurriría cerrar contrato con un arquitecto para la construcción de una
casa, y dejarlo que comience a mover la tierra y levantar las estructuras, sin antes haber revisado
los planos y quedar convencido de que el aspecto de la futura casa realmente le agrada.
Cuando se ejecuta una aplicación desarrollada para Windows, la misma se presenta y queda a la
espera de las acciones del usuario. Cada una de las posibles acciones del usuario (oprimir un
botón, desplegar un menú, etc.) produce un evento; entonces la aplicación realiza determinadas
acciones, (esto es, se ejecuta el subprograma de atención al evento) y cuando termina de
realizarlas vuelve a quedar a la espera de la próxima acción del usuario.
Esto responde al esquema de la programación conducida por eventos y así deben estar
concebidas todas las aplicaciones que desarrollemos con Visual Basic para ser ejecutadas sobre
Windows. Por esto es tan importante la etapa del diseño, porque es necesario tener el interfaz
completamente diseñado para poder realizar la segundo etapa en la solución del problema:
Determinar cuales serán las acciones que el usuario podrá realizar sobre ese interfaz, y como debe
reaccionar nuestro programa ante cada una de esas acciones. Es evidente que el usuario puede
realizar un sinnúmero de acciones sobre el interfaz, algunas de ellas tendrán importancia en la
solución del problema que estemos analizando y otras no. Al hacer este análisis debemos
identificar las acciones que resulten significativas para nuestro programa, y determinar los
Eventos que se producirán como consecuencia de estas acciones.
La determinación de los eventos significativos nos permitirá establecer, en un primer paso de
refinamiento, las tareas que tendrán los diferentes Procedimientos de atención a eventos. Los
posteriores pasos de refinamiento nos permitirán comprender si es necesario dividir alguna de
estas tareas y escribir para ello los procedimientos que resulte necesario.
Estos procedimientos serán denominados Procedimientos generales, o independientes de
eventos, y su ejecución se invoca desde otro procedimiento, tal y como sucede en la programación
procedural convencional.
Los anteriores argumentos nos permiten comprender la importancia que reviste disponer de un
interfaz completamente diseñado desde las etapas tempranas del diseño del programa, un interfaz
que permita determinar, con facilidad, el conjunto de eventos que resultarán significativos para la
conducción del programa que se pretende diseñar y poner a punto. Nos encontramos ya en
condiciones de conformar el esquema de las etapas para la solución de un problema con
computadoras empleando un lenguaje de programación visual.
Etapas para la solución de un problema empleando un Lenguaje de Programación Visual
1. Realizar el análisis y la interpretación del problema.
2. Realizar el diseño del interfaz visual del problema.
Introducción a la Programación Visual Página 13 de 168
con el caso contrario, propiedades cuyos valores no pueden ser definidos durante el diseño,
debiendo esperarse a que comience la ejecución del programa para actuar sobre ellas.
Esta ventana contiene un listado con los nombres de los archivos donde se guardan los distintos
elementos que componen el proyecto. Entre ellos encontramos a los ya mencionados formularios y
módulos de código.
También pueden aparecer formando parte de nuestro proyecto los archivos de que se emplean
para incorporar nuevos controles a Visual Basic. Estos archivos se identifican por la extensión
.VBX en Visual Basic 3.0 y con .OCX en Visual Basic 4.0. y 5.0
Para acceder a un componente en particular basta con seleccionarlo y oprimir alguno de los
botones que contiene la ventana del proyecto en su parte superior. El primero de ellos nos permite
ver el interfaz visual del componente (sólo esta disponible si se selecciona un formulario), y el
segundo permite abrir la ventana de código del componente seleccionado (formularios o módulos
de código).
Esta ventana también nos ayuda a eliminar componentes que estén de más en un proyecto. Para
hacerlo, debe seleccionarse en ella el componenteque sobra, y entonces solicitar la opción
Eliminar Archivo del menú Archivo de la ventana principal, en la versión 4.0 (Remove File en el
menú File en la versión 3.0).
Clases y objetos del interfaz de Windows disponibles en Visual Basic.
Como hemos venido insistiendo, el primer paso en la elaboración de un programa para la solución
de un problema empleando Visual Basic, es el diseño del interfaz que el programa mostrará a sus
usuarios. Pero, para poder diseñar correctamente dicho interfaz, resulta imprescindible conocer
con profundidad las funciones y características de los diferentes elementos que Visual Basic pone
a nuestra disposición para conformar el interfaz.
Visual Basic nos permite emplear en el diseño de nuestros programas los objetos que
habitualmente encontramos en el interfaz visual de Windows (botones, casillas de selección, etc.).
Por las limitaciones de espacio, en este libro no podremos describir todas las características de
todos los objetos que nos proporciona Visual Basic. Nos limitaremos a los que nos han parecido
ser los más importantes para comenzar a trabajar. Y aún en el estudio de estos objetos no
resultará posible detallar la totalidad de sus propiedades ni de sus eventos, por lo que nos
restringiremos a los que resultan de uso más frecuente. El lector podrá encontrar la
informaciónrestante consultando la ayuda del propio Visual Basic o la bibliografía que
referenciamos en este libro. Una vez más nos disculpamos.
El interfaz gráfico de Visual Basic nos proporciona dos grandes clases de objetos: los formularios
y los controles. Los formularios no son otra cosa que las ventanas donde se ejecutan nuestros
programas, mientras los controles son todos aquellos elementos que aparecen dentro de esas
ventanas o formularios.
Introducción a la Programación Visual Página 17 de 168
Formularios.
La clase de los formularios, como todas las clases es una definición abstracta, y por tanto general.
Cuando creamos un formulario nuevo, estamos creando un objeto, que es una instancia particular
de esa clase.
Estos objetos expresan su individualidad por los valores específicos que asignamos a las
propiedades que los caracterizan. Para crear un formulario debemos emplear la opción Formulario
en el menú Insertar de Visual Basic, o pulsar el botón correspondiente a esta opción en la barra de
tareas de la ventana principal.
Principales propiedades de los Formularios.
NAME Nombre con que se identifica al formulario dentro del proyecto.
Visual Basic genera automáticamente nombres para los formularios y los controles, en el momento
en que estos son creados. Los nombres están compuestos por el identificador genérico de la clase
y por un número entero que se genera consecutivamente para cada clase. Por ejemplo, el primer
formulario generado recibe el nombre Form1, el segundo Form2 etc. Estos nombres pueden ser
cambiados a conveniencia del programador para que resulten más mnemotécnicos. Los nombres
que seleccionemos para los formularios y/o controles deben cumplir con las características
habituales de los identificadores en BASIC: comenzar en un carácter alfabético y no tener más de
40 caracteres. La propiedad Name sólo puede ser modificada durante la etapa de diseño,
accediendo a la caja de las propiedades. Nunca durante la ejecución del programa. Para acceder a
las propiedades de un formulario (o de un control) debe emplearse un identificador compuesto por
el nombre del formulario, un punto, y el nombre de la propiedad.
TOP Define a que distancia se encuentra nuestro formulario del borde superior de la pantalla. La
distancia se expresa en TWIPS (1 Twip=1/567 cm) a no ser que se especifique otra unidad de
medida mediante la propiedad Scalemode.
LEFT Complemento de la anterior. Define a que distancia se encuentra nuestro formulario del
borde izquierdo de la pantalla.
WIDTH Define el ancho que tendrá el formulario. El ancho se expresa en TWIPS a no ser que se
especifique otra unidad de medida mediante la propiedad Scalemode.
HEIGHT Complemento del anterior. Define la altura que tendrá el formulario.
SCALEMODE Permite definir las unidades de medida que se emplearán en el formulario (1-Twips,
3-Pixels, 5-Pulgadas, 7-Centimetros etc.).
Introducción a la Programación Visual Página 18 de 168
CAPTION Permite modificar el título del formulario que se muestra en la barra de título de la
ventana.
FORECOLOR Permite establecer el color de los elementos (textos o gráficos) que se dibujen sobre
el fondo del formulario por métodos como Print, Line etc.
BACKCOLOR Permite establecer el color del fondo del formulario.
FONTNAME Permite establecer la fuente de la tipografía con que escribirá en el fondo del
formulario el método Print.
FONTSIZE Permite establecer el tamaño de las letras para la salida del método Print.
CURRENTX y CURRENTY Definen la posición dentro del formulario a partir de la cual se realizará
la escritura de textos (vienen a sustituir al antiguo Locate) y el trazado de gráficos (punto de
referencia).
PICTURE Permite colocar un dibujo previamente elaborado en el fondo de un formulario. Esto
puede hacerse directamente en tiempo de diseño o durante la ejecución.
VISIBLE Permite mostrar u ocultar un formulario, en dependencia del valor (True o False) que
reciba esta propiedad.
ENABLED Habilita o inhabilita al formulario para percibir los eventos. Toma los valores True o
False. Capacitado
Principales Métodos de los Formularios:
SHOW Permite mostrar un formulario que ha sido previamente ocultado, ya sea por la
manipulación de su propiedad Visible, o por el empleo del método Hide.
HIDE Permite ocultar un formulario sin descargarlo de la memoria.
SETFOCUS Sitúa el foco sobre el formulario. La ventana que tiene el foco es la única sensible a
los eventos generados por el teclado o por el ratón.
PRINTFORM Imprime el contenido de un formulario.
LINE, CIRCLE, PSET, POINT, CLS, PRINT Permiten colocar sobre el fondo del formulario dibujos
o textos con una sintaxis similar a la empleada en otras versiones de Basic.
Principales Eventos de los Formularios:
Clasificaremos los eventos de acuerdo a los elementos que los provocan en tres grupos: los
eventos provocados por el ratón, los eventos provocados por el teclado y los eventos generales.
· Eventos del Ratón
CLICK Tiene lugar cuando se realiza un clic simple (oprimir y liberar el botón principal del ratón)
sobre el formulario.
DBLCLICK Tiene lugar cuando se realizan dos clics con rapidez.
MOUSEDOWN Tiene lugar cuando se oprime cualquiera de los botones del Ratón.
Introducción a la Programación Visual Página 19 de 168
MOUSEUP Tiene lugar cuando se libera cualquiera de los botones del Ratón que se encuentre
oprimido.
MOUSEMOVE Tiene lugar cuando el ratón se muevo sobre áreas libres del formulario. O sea,
áreas donde no se encuentren ubicados controles.
DRAGOVER Tiene lugar cuando un control es arrastrado con el ratón sobre el formulario.
DRAGDROP Tiene lugar cuando el objeto que esta siendo arrastrado sobre el formulario es
liberado.
· Eventos del Teclado
KEYDOWN Tiene lugar cuando se oprime una tecla. Permite identificar todas las teclas del
teclado. Si hemos colocado controles sobre el formulario, serán éstos, y no el formulario, quienes
detecten la opresión de las teclas. r
KEYUP Tiene lugar cuando se libera una tecla. Opera en forma similar al anterior.
KEYPRESS Tiene lugar cuando se oprime una tecla que devuelve un carácter ANSI. (El código
ANSI es un conjunto de 256 caracteres, empleado por Windows, cuya primera mitad coincide con
el código ASCII.
· Eventos generales de la Ventana
LOAD Tiene lugar cuando el formulario es cargado en memoria. Aunque no necesariamente sea
exhibido en la pantalla. Es muy útil para inicializar las variables privadas del formulario.
UNLOAD Tiene lugar cuando el formulario es descargado de la memoria. En ese momento se
destruyen las variables privadas del formulario, por lo tanto, si le interesa conservar la información
de alguna, esta es la última oportunidad.
GOTFOCUS Tiene lugar cuando el formulario recibe el foco.
LOSTFOCUS Tiene lugar cuando el formulario esta perdiendo el foco.
RESIZE Tiene lugar cuando la forma del formulario es alterada por el usuario.
Controles.
Los controles son los objetos que se colocan sobre los formularios. Tienen las funciones de facilitar
las entradas y salidas del programa, así como servir para que el usuario produzca eventos que
serán empleados para la conducción de la ejecución del programa. Existe un conjunto de controles
standard que forma parte de Visual Basic, y otro conjunto, los controles personalizados, que se
suministran en archivos independientes y para poder utilizarlos deben ser adicionados a la lista de
la ventana del proyecto.
Control LABEL (Etiqueta) Este control se emplea para colocar sobre el formularios textos
que el usuario no puede modificar accediendo a ellos con el ratón. Resulta más cómodo
emplear Etiquetas que escribir directamente en el formulario con el método Print, ya que las
Introducción a la Programación Visual Página 20 de 168
Etiquetas las podemos ubicar con gran facilidad durante el diseño del interfaz, mientras que ubicar
correctamente las salidas del método Print mediante las propiedades CurrentX y CurrentY resulta
mucho más complicado.
Propiedades de las Etiquetas.
Muchas de las propiedades, métodos y eventos que encontraremos en los controles, también se
encuentran en los formularios y ya han sido descritas.
En esos casos nos limitaremos a mencionarlos, y sólo profundizaremos en sus características
cuando presenten diferencias apreciables con lo ya descrito.
TOP, LEFT Describen la distancia a que se encuentra el control etiqueta (y en general el control)
del borde superior y del borde izquierdo del formulario que lo contiene.
WIDTH, HEIGHT Describen el ancho y la altura de la etiqueta (y en general del control).
CAPTION En esta propiedad se coloca el texto que la etiqueta mostrará sobre el formulario.
FORECOLOR, BACKCOLOR Color de los textos y del fondo de la etiqueta.
BORDERSTYLE Determina si la etiqueta tendrá o no un borde negro a su alrededor.
BACKSTILE Determina si el fondo de la etiqueta resulta transparente, o si se muestra del color
establecido por la propiedad BackColor.
ALIGNMENT Permite establecer la alineación del texto de la etiqueta (a la derecha, a la izquierda
o centrado).
PARENT Permite conocer el identificador (propiedad NAME ) del objeto sobre el que se encuentra
colocado el control.
También están presentes las propiedades NAME, FONTSIZE, FONTNAME, ENABLED, VISIBLE y
otras.
Eventos de las Etiquetas.
Las etiquetas son capaces de reconocer los eventos generados por el ratón que describimos para
los formularios.
Control TEXTBOX (Caja de Texto) Este control permite colocar sobre el formulario un
cuadro que muestra en su interior un texto. Este texto puede ser cambiado por el usuario,
accediendo a él con el ratón. Es especialmente útil para permitir que el usuario proporcione
información al programa, (viene a sustituir de cierta forma a la vieja y bastante problemática
instrucción INPUT). En esa función es posible colocar en la Caja de Texto un valor
predeterminado para la entrada, que el usuario puede sustituir a voluntad, o se puede emplear la
caja de texto en blanco, para que el usuario escriba en ella. Se puede emplear también para
exhibir información, pero no es recomendable ya que no se garantiza la integridad de la misma.
Introducción a la Programación Visual Página 21 de 168
Control COMMAND BUTTON (Botón de Órdenes) Es uno de los controles de uso más
frecuente. Nos proporciona los botones que se emplean para impartir la mayor parte de las
órdenes en el interfaz gráfico de W indows.
Propiedades de los Botones de Órdenes.
CAPTION En esta propiedad se coloca el texto que se mostrará en el Botón de Órdenes.
DEFAULT El Botón que tenga esta en esta propiedad el valor True, será el Botón por defecto (o
botón implícito). Esto significa que para oprimirlo se puede emplear indistintamente el ratón o la
tecla Enter. Sólo un Botón dentro de un formulario puede tener asignado el valor True en esta
propiedad. Normalmente se realiza esta asociación en los botones que se emplean para aceptar o
terminar positivamente una tarea.
Introducción a la Programación Visual Página 22 de 168
Control PICTURE BOX (Caja de Imágenes) Este control tiene dos importantes tareas en el
interfaz de Windows. En primer lugar permite incorporar elementos gráficos en el diseño de
nuestras aplicaciones, y en segundo lugar sirve como contenedor para otros controles. En efecto,
los controles que se colocan sobre una Caja de Imágenes, radican en su interior y no sobre el
fondo del formulario. Esto resulta muy conveniente, ya que nos permitirá agrupar controles que
tengan una determinada interrelación funcional, e incluso moverlos de conjunto, si esto fuera
necesario.
Propiedades de las Cajas de Imágenes.
PICTURE Similar a la propiedad de igual nombre estudiada para los formularios. Permite colocar
una imagen previamente elaborada en el fondo de la Caja de Imágenes. Esto se puede hacer en
tiempo de diseño, operando con la caja de propiedades, o en tiempo de ejecución, con la
instrucción LoadPicture
AUTOREDRAW Permite seleccionar, mediante un valor True o False si la Caja de Imágenes,
además de mostrarse en la pantalla, es copiada en memoria en una imagen persistente. Esa
copia permite que los elementos que se escriban o dibujen sobre la Caja de Imágenes, sean
restaurados y no se pierdan cuando la propia Caja es ocultada total o parcialmente por cualquier
causa, bien sea por un formulario que se superpone al que la contiene, bien porque el usuario
modifique (en tiempo de ejecución) las dimensiones del formulario, o por el efecto de un
resguardador de pantalla.
Esta propiedad también esta presente en los formularios.
AUTOSIZE También almacena un valor lógico (True o False) Si el valor es True, las dimensiones
del control se ajustarán a las de la imagen asociada con su propiedad Picture. En caso contrario
(valor False) se mostrará aquella parte de la imagen que quepa dentro del área ocupada por el
control.
Introducción a la Programación Visual Página 23 de 168
Control TIMER (Temporizador) Este control recibe también el apodo de ‘El control invisible’
y con mucha razón. Nadie, que sepamos, ha logrado ver el tiempo, y el tiempo es
precisamente la ocupación de este importantísimo control, que nos permite aprovechar a esa
implacable magnitud física para beneficio de nuestros programas. Bromas aparte, el control
Temporizador recibe esa denominación porque aunque lo colocamos y lo vemos sobre el
formulario durante el diseño, en tiempo de ejecución no resulta visible (ni es necesario que lo sea).
El control Temporizador se ocupa de generar un pulso de reloj de forma periódica, cada vez que
transcurre un determinado intervalo de tiempo que se fija en sus propiedades. Este pulso es
causante de un evento, que puede ser detectado y aprovechado para producir efectos en nuestros
programas.
Propiedades de los Temporizadores.
INTERVAL Determina el intervalo de tiempo que será usado como período para la generación de
los pulsos del Temporizador. Se expresa en milisegundos.
Introducción a la Programación Visual Página 24 de 168
ENABLED Habilita o inhabilita la actividad del Temporizador, y por tanto la detección del evento
asociado.
Eventos de los Temporizadores.
TIMER Es el único evento de los temporizadores. Cuando la propiedad Enabled toma el valor
True, el Temporizador genera este evento en forma periódica, cada vez que transcurre el intervalo
de tiempo fijado por la propiedad Interval. Si Enabled toma el valor False se suspende la
generación del evento TIMER, hasta tanto se restablezca el valor True en Enabled.
Control LIST (Lista) Este control permite colocar y administrar una lista de datos (en forma
de cadenas de caracteres), en nuestro interfaz.
Introducción a la Programación Visual Página 25 de 168
Control VERTICAL SCROLL BAR (Barra de Desplazamiento Vertical) Este control nos
permite desplazar un indicador a lo largo de una barra vertical.
Este movimiento produce la modificación proporcional de un valor numérico en un rango
predefinido. El valor puede modificarse arrastrando el indicador, pulsando los botones con flechas
que ocupan los extremos de la barra, o pinchando con el ratón en la superficie de la barra.
Propiedades de las Barras de Desplazamiento.
MIN Representa el extremo inferior del rango en que se moverá el valor numérico asociado al
desplazamiento del indicador.
MAX Representa el extremo superior del rango.
SMALLCHANGE Es el cambio que sufrirá el valor numérico cuando se pulsen los botones de los
extremos de la barra.
LARGECHANGE Es el cambio que sufrirá el valor numérico cuando se golpee con el ratón sobre
la superficie de la barra.
Introducción a la Programación Visual Página 26 de 168
VALUE Esta propiedad contiene el valor que es modificado por el usuario al actuar sobre la barra
de desplazamiento.
También están presentan las propiedades:
TOP, LEFT, WIDTH, HEIGHT, NAME, ENABLED, VISIBLE, PARENT, que ya hemos estudiado.
Eventos de las Barras de Desplazamiento.
CHANGE Tiene lugar cuando el valor asociado a la barra de desplazamiento es modificado de
cualquier forma.
SCROLL Tiene lugar cuando el usuario arrastra el indicador a lo largo de la barra de
desplazamiento.
Control SPIN (Botón de Conteo) Este control permite incrementar o decrementar el valor de
una variable con características de contador. Este control se emplea normalmente en asociación
con otros (cajas de textos o etiquetas, en los que se muestra el valor de la variable que se
modifica.
Para Visual Basic 5.0 este control se oresenta con el nombre UPDOWN
Propiedades de los Botones de Conteo.
SPINORIENTATION Permite orientar el Botón de Conteo es sentido vertical (valor 0, implícito) o en
sentido horizontal (valor 1).
También presenta las propiedades TOP, LEFT, WIDTH, HEIGHT, NAME, ENABLED, VISIBLE,
PARENT, que ya hemos estudiado.
Eventos de los Botones de Conteo.
SPINUP Tiene lugar cuando el usuario oprime el botón superior (si la orientación es vertical) o el
botón derecho (si la orientación es horizontal)
Este evento se aprovecha para incrementar la variable contadora que se esté utilizando.
SPINDOWN Tiene lugar cuando el usuario oprime el botón inferior (si la orientación es vertical) o el
botón izquierdo (si la orientación es horizontal)
Este evento se aprovecha para decrementar la variable contadora que se esté utilizando.
Control DIÁLOGOS COMUNES (Common Dialog) Este control permite utilizar desde
nuestros programas las cinco cajas de diálogos estandar deWindows, o sea Abrir Archivo,
Guardar Archivo Seleccionar Fuente de Letras,
Seleccionar Color e Imprimir. También permite ejecutar el programa Ayuda de Windows, que es
el manejador de hipertexto empleado por Windows para mostrar sus archivos de ayuda. Si
nosotros elaboramos archivos con el mismo formato que los archivos de ayuda de Windows
podremos mostrarlos desde nuestros programas empleando este control. Durante la ejecución el
Introducción a la Programación Visual Página 27 de 168
control resulta invisible, al igual que el temporizador. Se actúa sobre él modificando sus
propiedades desde el código de nuestros programas.
Introducción a la Programación Visual Página 28 de 168
Visual Basic introduce el tipo de datos Variant, que tiene la propiedad de adaptarse aceptar
valores de cualquier tipo, adaptándose a las características del dato que contiene. Una variable de
tipo variant, tiene la capacidad de cambiar de tipo en la medida en que recibe datos de tipos
diferentes. Por ejemplo:
A= 25 ‘Aquí la variable A se comporta como entera.
A= “Casa” ‘Aquí se comporta como cadena de caracteres.
A= 19.758 ‘Aquí se comporta como real de simple presición.
A diferencia de Quick Basic, el tipo de datos implícito en Visual Basic va a ser precisamente el
Variant, lo que tiene el inconveniente de ser el que mayor cantidad de memoria ocupa.
Introducción a la Programación Visual Página 29 de 168
También se introducen los datos de tipo object, que sirven para declarar variables como
referencias a objetos. Como ya se explicó más arriba, Visual Basic pone a disposición del
programador, un conjunto de objetos del interfaz gráfico de Windows, para permitirle desarrollar el
interfaz particular de su programa. Estos objetos se dividen en dos grandes clases: los formularios
o ventanas y los controles.
Dim A as Form ‘La variable A se comportará como una referencia a un objeto de la clase
formulario.
Dim B as Control ‘La variable B se comportará como una referencia a un objeto de la clase
control.
Dim C as Label ‘La variable C se comportará como una referencia a un objeto de la clase etiqueta
Para asociar estas referencias a un objeto se emplea la instrucción SET.
Set A As Form1 ‘La variable A hace referencia al objeto Form1, de la clase formulario.
Set B As Label1 ‘La variable B hace referencia al objeto Label1, de la clase control etiqueta
Set C As Label2 ‘La variable C hace referencia al objeto Label2, de la clase control etiqueta
La clase Control es una clase general, las clases de todos los controles particulares se derivan de
ella. Por eso a la variable B se le puede asignar la referencia de un objeto de cualquier clase de
control, mientras C sólo puede recibir referencias a controles de la clase etiqueta.
Una vez asignada la referencia las propiedades de los objetos pueden ser accedidas
indistintamente por su identificador o por la variable asociada.
Por ejemplo:
Form1.BackColor = QbColor(15) es equivalente a: A.BackColor = QbColor (15)
Label1.Caption = “Buenos Días” es equivalente a: B.Caption = “Buenos Días”
Ámbito de las variables
Un programa en Visual Basic esta integrado por un conjunto de entidades, entre los cuales se
encuentra distribuido el código. Algunos de estas entidades son formularios, que tienen
representación directa sobre la pantalla, en forma de una ventana. Otras son módulos, que
contienen exclusivamente código, en forma de declaraciones de tipos de datos, de variables y
procedimientos (subprogramas o funciones).
El ámbito de las variables dependerá del lugar dentro del proyecto, donde han sido declaradas.
Estos lugares pueden ser:
· Dentro de un módulo, en su área de declaraciones generales. En este caso la variable será
accesible para todos los procedimientos del módulo, pero inaccesible desde los restantes módulos
y formularios que componen el proyecto. Las variables se declaran normalmente, empleando la
palabra clave Dim. Por ejemplo:
Introducción a la Programación Visual Página 30 de 168
Dim A As Integer
Dim B (50) As Double
Sin embargo las variables que se declaran en el área general de los módulos pueden tener alcance
global para todo el proyecto si en vez de la palabra clave Dim, empleamos la palabra clave Global.
Por ejemplo:
Global C As Single,
Global N (120) As Long
· Dentro de un formulario, en su área de declaraciones generales. En este caso la variable será
accesible para todos los procedimientos del formulario, pero inaccesible desde los restantes
módulos y formularios que componen el proyecto. Para realizar esta declaración se emplea la
palabra clave Dim.
Dentro de un procedimiento. En ese caso la variable será privada de ese procedimiento, y ningún
otro procedimiento podrá tener acceso a ella.
Esta declaración puede realizarse por medio de las palabras claves Dim, ReDim o Static.
Operadores.
Visual Basic emplea los mismos operadores con que tradicionalmente hemos trabajado en Basic y
en Quick Basic, pero también introduce algunos operadores nuevos. En la siguiente tabla los
mostramos ordenados de acuerdo a su prioridad. (Los operadores relacionales tienen todos la
misma prioridad).
El operador IS se emplea para comparar las referencias contenidas por variables de tipo objeto.
Por ejemplo, después de las declaraciones:
Dim B As Control
Introducción a la Programación Visual Página 32 de 168
en dependencia del valor de una variable o de una expresión. Esto lo ilustraremos a partir de un
ejemplo:
SELECT CASE a+b
CASE 4
Bloque de instrucciones 1
CASE 8
Bloque de instrucciones 2
CASE 12
Bloque de instrucciones 3
CASE IS > 15
Bloque de instrucciones 4
CASE ELSE
Bloque de instrucciones 5
END SELECT
En este caso se analiza el valor de la expresión a+b. Si el resultado es 4 seejecuta el Bloque de
instrucciones 1; si el resultado es 8 se ejecuta el Bloque de instrucciones 2; si el resultado es
12 se ejecuta el Bloque de instrucciones 3; si el resultado (y vean que interesante) es mayor
que 15 se ejecuta el Bloque de instrucciones 4; Por último si el resultado no cae dentro de
ninguna de esas alternativas se ejecuta el Bloque de instrucciones 5.
Esta estructura de control es especialmente útil cuando nos proponemos resolver problemas donde
debemos seleccionar entre varias alternativas (más de dos). Un ejemplo de esto es el problema de
clasificar un ángulo de acuerdo a su amplitud, aquí las alternativas serán nulo, agudo, recto,
obtuso, llano, sobreobtuso y completo. Este problema se puede resolver usando la estructura IF
THEN pero es mucho más fácil si empleamos la estructura SELECT CASE.
· FOR ... NEXT
Esta clásica estructura de control (la primera con que contó el lenguaje BASIC), permite programar
algoritmos cíclicos (o repetitivos) cuando el problema nos permite conocer de antemano la cantidad
de repeticiones que se deben efectuar.
FOR <Variable> = <Valor Inicial> TO <Valor Final>
Bloque de Instrucciones
NEXT
Esta estructura emplea una variable, llamada variable de control, cuyo valor se incrementa (de
uno en uno), desde el valor inicial hasta que sobrepasa el valor final. Cada vez que la variable de
control toma un nuevo valor, se ejecutan las instrucciones incluidas dentro del Bloque de
Introducción a la Programación Visual Página 34 de 168
instrucciones se ejecutan por lo menos una vez, aún cuando la condición resulte falsa desde el
primer momento.
2. Realizando el control a la entrada. En ese caso su sintaxis será:
DO WHILE <Condicion>
Bloque de Instrucciones
LOOP
Aquí también el bloque de instrucciones se repite mientras la condición indicada se evalúe como
verdadera. Pero como la comprobación se realiza antes de la primera instrucción del bloque, si la
condición resulta falsa desde el primer momento estas instrucciones no se ejecutan ni siquiera una
vez.
La condición se expresa en términos de Mientras que... por medio de la palabra reservada
WHILE, pero también puede expresarse en términos de Hasta que... si en lugar de WHILE
empleamos la palabra reservada UNTIL En ese caso se escribiría:
DO
Bloque de Instrucciones
LOOP UNTIL <Condicion>
o DO UNTIL <Condicion>
Bloque de Instrucciones
LOOP
En ese caso las instrucciones del ciclo se ejecutarán hasta que lacondición se evalúe como
verdadera.
Algo que no podemos pasar por alto al di scutir esta estructura decontrol es el peligro de caer en
un ciclo infinito, es decir que la estructura no se detenga nunca. Esto puede ocurrir si no
seleccionamos bien la condición de parada, o si no programamos correctamente. Para ayudarnos
en esta tarea disponemos de la instrucción EXIT DO que nos permite detener un ciclo DO LOOP
desde cualquier lugar de su bloque de instrucciones
DO
Instrucciones.........
IF <Condición1> THEN EXIT DO
......... Instrucciones
LOOP WHILE <Condicion2>
La condición a partir de la cual ejecutamos la instrucción EXIT DO
Introducción a la Programación Visual Página 36 de 168
(Condicion1) puede ser la misma que se utiliza para controlar la estructura (Condicion2) pero
también puede ser diferente esto dependerá de lascaracterísticas de los problemas que tengamos
que resolver y de losalgoritmos que elaboremos para ello.
No hemos querido extendernos demasiado en este estudio teórico de las estructuras de control, su
aplicación práctica en los próximos capítulos nospermitirá comprender mucho mejor su
funcionamiento.
Instrucciones
Tal y como dijimos un poco en broma, nunca más escribiremos INPUT. Las instrucciones
habituales de entrada como INPUT, LINEINPUT e INKEY$ no aparecen en Visual Basic, ya que la
entrada de información se realiza a través de controles. La instrucción de salida PRINT sobrevive
como método en los formularios, pero tampoco se recomienda su uso, prefiriéndose los controles
etiqueta para exhibir información.
Introducción a la Programación Visual Página 37 de 168
Es evidente que esos no son los títulos que nos interesa ver en los controles cuando nuestro
programa se ejecute. La etiqueta no debe mostrar nada mientras no se oprima ningún botón, y los
títulos de los botones ya se mencionaron. Al formulario le pondremos por título “Mi primera
aplicación”.
Para colocar estos títulos en los controles debemos seleccionar cada control pinchándolo con el
puntero del ratón (es fácil reconocer cuándo un control esta seleccionado, en ese caso el control
aparece rodeado por unos cuadrados negros, esos cuadrados son a su vez puntos elásticos que
sirven para modificar las dimensiones del control) una vez seleccionado el control accedemos a la
ventana de propiedades (que muestra las propiedades del control que se encuentra seleccionado),
en la lista de propiedades seleccionamos la que deseamos modificar (en nuestro caso la propiedad
Caption) y escribimos su nuevo valor.
Pero no son estas las únicas propiedades que tendremos que modificar. El problema nos pide que
los letreros se escriban con letras grandes. Para asegurar eso tendremos que cambiar el valor
implícito de la propiedad FontSize (que controla el tamaño de las letras) en la etiqueta Label1.
También por razones de estética procuraremos que el letrero aparezca centrado, para eso
tendremos que actuar sobre la propiedad Alignment de la etiqueta. Por último, para garantizar que
la etiqueta no se destaque del fondo del formulario asignaremos un valor 0 en su propiedad
BorderStyle.
A continuación presentamos una tabla con las propiedades a las que es necesario asignar valores
como parte del diseño de nuestro formulario:
Objeto Propiedad Valor asignado Comentario
Form1 Caption “Mi primera aplicación”
Título de la aplicación.
Label1 Caption “” (cadena vacía) Al principio no esta escrito nada.
FontSize 24 Se agranda la letra para que los letreros se aprecien mejor.
Alignment 2 (Centrado) Asegura que los letreros queden centrados dentro de la etiqueta.
BorderStyl e
0 (Ninguno) Impide que aparezca un borde negro alrededor de la etiqueta.
Command 1
Caption “Saludar”
Command 2
Caption “Despedirse”
Command 3
Caption “Terminar”
Introducción a la Programación Visual Página 39 de 168
También es sencillo determinar las acciones a desarrollar por los distintos controles del formulario,
los dos primeros botones deben escribir letreros en la etiqueta y el tercer botón debe finalizar el
programa.
Estas acciones se deben ejecutar cuando se opriman los botones. El evento que se produce
cuando el usuario oprime un botón es el evento Click. Por tanto tendremos que escribir código
para los procedimientos de atención a los eventos Click de cada uno de los botones. El nombre
del procedimiento de atención a evento de un control (o de un formulario) está compuesto por el
identificador del control y el nombre del evento, separados por un carácter “_”. Por ejemplo, el
procedimiento de atención al evento Click del botón de órdenes Command1 de denomina
Command1_Click.
Para escribir las instrucciones de nuestros procedimientos, o las declaraciones de las variables que
emplearán nuestros programas debemos abrir la Ventana de Código de nuestro formulario. Cada
formulario posee su propia ventana de código y los procedimientos y las declaraciones (de
variables o de tipos) que en ella se escriban serán locales a ese formulario. Para abrir la ventana
de código de un formulario debemos seleccionar el mismo en la lista de objetos de la Ventana del
Proyecto y a continuación oprimir el botón View Code, de esa misma ventana. Otra forma de
hacerlo es realizando un doble click sobre el propio formulario.
La ventana de código, como la que se muestra en la figura 4-2, se encuentra dividida en dos
partes. En su parte superior encontramos dos listas desplegables, a la izquierda la lista de los
objetos y a la derecha la lista de los procedimientos asociados a los objetos. La parte inferior de la
ventana contiene un editor, que nos permite escribir nuestras instrucciones.
En la lista de los objetos encontraremos todos los objetos que forman parte del formulario, es decir,
el propio formulario y todos los controles que hayamos colocado sobre él. Cuando seleccionamos
un objeto, la lista de los procedimientos nos mostrará todos los posibles eventos que ese objeto
puede reconocer. Cuando seleccionamos un evento el editor nos proporciona el encabezamiento
del procedimiento de atención a ese evento, de forma tal que sólo tenemos que escribir las
instrucciones del procedimiento. También encontraremos en la lista de los objetos un elemento
denominado (general). Este no es propiamente un objeto del formulario, sino que identifica la zona
de declaraciones del formulario. Allí podemos declarar tipos, variables y procedimientos, que serán
de acceso local (o privado) para todos los objetos del formulario. Para el elemento (general) la lista
de procedimientos nos mostrará tan sólo un elemento nombrado (declarations), este identifica el
área de declaraciones de tipos y variables. En la medida en que vayamos escribiendo
procedimientos generales, o independientes de eventos, los mismos se irán incorporando a la lista
de procedimientos del elemento (general).
Introducción a la Programación Visual Página 40 de 168
En nuestro programa necesitamos escribir código para el evento Click del objeto Command1.
Para hacerlo abriremos la ventana de código, seleccionaremos en la lista Object: el objeto
Command1 y en la lista Proc: seleccionaremos el evento Click.
Cuando se oprima el botón de órdenes Command1 debemos escribir en pantalla el letrero "Hola,
que tal." en color rojo. Veamos como hacerlo:
Figura 4-2. La ventana de código
Para escribir un texto en la etiqueta hay que asignar una cadena de caracteres que contenga el
texto en la propiedad Caption de la etiqueta. El identificador de una propiedad esta formado por el
nombre del objeto y el nombre de la propiedad, separados por un punto. En este caso la etiqueta
recibe el nombre de Label1. Así, escribiendo Label1.Caption = “Hola, que tal.”estaremos
colocando el letrero en la propiedad Caption de la etiqueta, y por tanto el letrero se hará visible
sobre el formulario.
Para cambiar el color del texto de una etiqueta tenemos que modificar el valor de la propiedad
ForeColor de esa etiqueta, asignándole el valor correspondiente al color que deseamos. Para
proporcionarle a la propiedad ForeColor el valor que necesitamos podemos emplear dos recursos:
las funciones QBColor y RGB. La función RGB tiene tres parámetros, cada uno de los cuales
contiene un valor entre 0 y 255 que definen la intensidad de los tres colores básicos, Rojo, Verde y
Azul. Combinando convenientemente los tres parámetros de RGB se puede generar toda la rica
gama de colores que admiten las tarjetas de video Super VGA. En nuestro caso, para obtener el
color rojo tendríamos que escribir Label1.ForeColor=RGB(255,0,0). La función QBColor es mas
modesta, nos permite emplear el mismo conjunto de colores , del 0 al 15 que se empleaba en
Quick Basic. Nos decidimos por esta última función, empleando el parámetro 12 (rojo brillante), de
esta forma escribiremos Label1.ForeColor= QBColor (12).
De esta forma el procedimiento de atención al evento Click del botón Command1 quedará así:
Sub Command1_Click ()
Label1.ForeColor = QBColor(12)
Label1.Caption = "Hola, que tal."
End Sub
Nota. Est a es la sintaxis de Visual Basic 3.0. En las versiónes 4.0 y 5.0 se coloca la palabra
reservada Private, delante de Sub. El encabezamiento de este procedimiento sería en Visual
Basic 4.0: Private Sub Command1_Click ().
Cuando el usuario oprima el botón de órdenes Command2 debemos escribir en pantalla el letrero
"Hasta luego." en color azul. Pare ello seleccionaremos en la lista de objetos de la ventana de
código el control Command2 y en la lista de Procedimientos el elemento Click. El procedimiento
Introducción a la Programación Visual Página 41 de 168
de atención a este evento es muy similar al anterior, sólo cambia el texto del letrero y el color.
Veamos como queda:
Sub Command2_Click ()
Label1.ForeColor = QBColor(9)
Label1.Caption = "Hasta luego."
End Sub
Por último, cuando se oprima el botón de órdenes Command3 debe concluir el programa. Al igual
que en Quick Basic esto se hace con la instrucción End.
El procedimiento de atención al evento Click del botón de órdenes Command3 será simplemente
así:
Sub Command3_Click ()
End
End Sub
De esta forma hemos concluido nuestra primera aplicación en Visual Basic, y estamos en
condiciones de ejecutarla para comprobar su funcionamiento.
Para ejecutarla podemos emplear el botón ejecutar en la barra de herramientas de la ventana
principal de Visual Basic, o seleccionar la opción Iniciar en el menú Ejecutar.
Un programa un poco más complejo.
Nuestro primer problema no presentaba ninguna complicación algorítmica. Ahora les propongo
enfrentar una tarea algo más complicada: elaboraremos un programa que nos permita entrar dos
números enteros y sea capaz de mostrarnos el resultado de la suma de ambos cuando lo
solicitemos.
La solución de este problema en un lenguaje de programación tradicional resulta sumamente
sencilla, bastaría con entrar los dos números y esperar por la opresión de una determinada tecla (o
del ratón) para realizar e imprimir la suma. Programando en Quick Basic la solución podría ser algo
así:
INPUT A
INPUT B
DO
A$=INPUT$(1)
IF A$=“F” T HEN END
IF A$=“+” THEN EXIT DO
LOOP
PRINT A+B
Introducción a la Programación Visual Página 42 de 168
En este caso la tecla con del símbolo ‘+’ esta prevista pare realizar la suma y la tecla ‘F’ para
finalizar el programa. Las cosas se complicarían un poco si quisiésemos permitir al usuario operar
con varios juegos de datos, o si quisiéramos hacer más agradable la presentación de la
información en la pantalla, lo que nos obligaría a recurrir a instrucciones como LOCATE, PRINT
USING, etc. Más complicado aún, sería tratar de controlar la entrada de datos para evitar que el
usuario incluya caracteres ilegales (como signos o letras) dentro de los números.
Trabajar con Visual Basic hace que muchos de estos problemas, especialmente el lograr una
presentación agradable, resulten extremadamente sencillos. De acuerdo a lo que planteábamos
sobre la programación visual, el diseño general de nuestro programa debe comenzar por un diseño
claro de la interfaz, que permita determinar con facilidad a que controles y eventos es necesario
asociar código. Por ejemplo para nuestro problema resultaría agradable y conveniente una
presentación como la siguiente:
Evidentemente las dos primeras casillas blancas están destinadas a contener los dos números
suministrados por el usuario y por tanto este debe tener oportunidad de escribir en ellas. La tercera
casilla se destina a colocar el resultado y por tanto el usuario no debe poder alterar su contenido
libremente. Los dos botones muestran explícitamente su función y los símbolos ‘+’ e ‘=‘ sirven para
esclar ecer el sentido de la operación que se pretende realizar.
Ahora bien ¿qué recursos emplear para construir este interfaz? Para las dos primeras casillas,
donde el usuario puede escribir, el recurso apropiado es el control Caja de Texto (TextBox),
mientras para la casilla de la respuesta debemos emplear un control Etiqueta (Label) cuyo
contenido no puede ser modificado libremente. Para escribir los símbolos ‘+’ e ‘=‘también
emplearemos controles Etiqueta, a los que asignaremos un fondo transparente, para que no
resalten sobre el fondo del formulario.
Figura 4-3.
Para los botones empleamos el control Botón de Órdenes (CommandButton) .
Una vez determinados los controles necesarios podemos ir seleccionándolos uno por uno,
arrastrándolos desde la caja de controles hasta el formulario y acomodándolos allí, ajustando
convenientemente su tamaño, hasta conformar el interfaz deseado, tal y como se ve a
continuación:
Una vez colocados los controles necesarios sobre el formulario, y ajustados sus tamaños, tanto del
formulario como de los controles, debemos pasar a modificar sus restantes propiedades. En
nuestro caso las propiedades a modificar son las siguientes:
Objeto Propiedad Valor asignado
Comentario
Introducción a la Programación Visual Página 43 de 168
operando con los controles Text (más adelante nos ocuparemos de validar los datos que el usuario
entra) por tanto la única acción a realizar es la suma, que debe efectuarse cuando el usuario
oprima el Botón de Ordenes 1, que muestra el símbolo ‘+’.
Para asociar código a ese control debemos acceder a la ventana de código del formulario, como
hicimos en el problema anterior. Una vez abierta la ventana de código seleccionemos en la lista
Object: el objeto
Command1 y en la lista Proc: el evento Click, y escribamos lo siguiente:
Sub Command1_Click( )
Label3.Caption=Format$( Val( Text1.Text )+Val( Text2.Text ) )
End Sub
De esta forma queda conformado el procedimiento que se ejecutará cuando el control Command1
identifique la ocurrencia del evento Click.
Simplemente se sumarán los contenidos de los dos controles Text (previamente convertidos a
valor numérico) y el resultado, convertido a cadena se coloca en el control Label3. Para realizar
esta última conversión empleamos la función Format$. Esta función es una novedad de Visual
Basic, que integra la posibilidad de realizar transformaciones de tipo, con facilidades para
establecer formatos de salida muy superiores a las de la antigua instrucción PRINT USING.
El otro código que debemos escribir es el del control Command2, que deseamos emplear para
terminar el programa. Basta con seleccionar en la lista Object: el objeto Command2 y en la lista
Proc: el evento Click, y escribir:
Sub Command2_Click( )
End
End Sub
Con esto hemos terminado una primera solución (un tanto burda) de nuestro problema. Para que la
solución sea completamente aceptable debe ser capaz de verificar los datos suministrados por el
usuario, y también permitirle operar con varios juegos de datos. Comenzaremos por implementar la
verificación de la entrada. Para esto es necesario poder advertir cuando el usuario oprime una
tecla dentro de alguno de los controles TextBox. La opresión de una tecla debe representar, de
acuerdo con la filosofía del interfaz de Windows, la ocurrencia de un evento. Si revisamos el
conjunto de eventos notables de los controles Caja de Texto, encontraremos los eventos
KeyDown y KeyPress, que tienen lugar cuando una tecla es oprimida. La diferencia entre ambos
es que el primero se produce cuando se oprime cualquier tecla, mientras el segundo sólo ocurre
cuando la tecla oprimida genera un carácter ANSI. Por esta razón preferiremos el evento
KeyPress, escribiendo para él el siguiente código:
Introducción a la Programación Visual Página 45 de 168
Solución 2: Borrar el resultado cuando se alteren los valores de los sumandos. Para poder hacer
esto debemos averiguar si es posible reconocer la ocurrencia de un cambio o modificación en el
contenido de una Caja de Texto. Esta situación ocurre de manera imprevista, cuando el usuario
decide acceder a la Caja de Texto. Por tanto nuestra única posibilidad radica en determinar si la
modificación del contenido de una Caja de Texto (o alguna de las acciones necesarias para
realizar esa modificación) genera un evento que podamos aprovechar para colocar en su rutina de
tratamiento nuestro código. Si revisamos la lista de los principales eventos identificables sobre una
Caja de Texto, encontraremos el evento Change, que precisamente tiene lugar cuando se
producen modificaciones en el contenido de la Caja de Textos. No queda sino escribir código para
anular el contenido del control Label3 cuando tenga lugar este evento en cualquiera de las dos
cajas de textos:
Sub Text1_Change ( )
Label3.Caption = "" ‘ Borra el contenido de la propiedad ‘ Caption del control Label3
End Sub
Lo mismo se escribiría en el subprograma Sub Text2_Change ( )
Sub Text2_Change ( )
Label3.Caption = "" ‘ Borra el contenido de la propiedad ‘ Caption del control Label3
End Sub
Figura 4-5.
De esta forma queda resuelto totalmente nuestro problema, disponemos de una sumadora
elemental que funciona de manera eficiente. Sin embargo cualquiera puede ver que no es difícil
extenderla a las tres restantes operaciones aritméticas. ¿Por qué no hacerlo? Para ello debemos
preguntarnos ¿Qué haría falta para que nuestra sumadora realizara las tres operaciones
aritméticas restantes? Pues adicionarle tres nuevos controles botones de órdenes para representar
los operadores “-”, “*” y “/” y escribir código para cada uno de ellos. Por la enumeración automática
de Visual Basic a estos controles les corresponderían los identificadores Command3, Command4
y Command5. El interfaz modificado se muestra en la figura 4 -6.
En la siguiente tabla representamos las propiedades que necesitan ser modificadas en los nuevos
controles que se incorporan a nuestro formulario.
Objeto Propiedad
Valor
Asignado Comentario
Form1 Caption “Calculadora Debemos cambiar el título de la Elemental” aplicación.
Introducción a la Programación Visual Página 47 de 168
Sub Command5_Click ()
If Val(Text2.Text) = 0 Then
Label3.Caption = "Error"
Else
Label3.Caption = Format$(Val(Text1.Text) / Val(Text2.Text))
End If
Label1.Caption = "/"
End Sub
Con esta modificación que convierte nuestra sumadora elemental en una calculadora elemental
damos por terminado este capítulo, en que hemos pretendido mostrar los principios de la
programación para Windows con Visual Basic mediante la solución de dos problemas simples. En
el próximo capítulo estudiaremos nuevos recursos de este lenguaje que nos permitirán enfrentar
tareas de programación de mayor grado de complejidad.
Introducción a la Programación Visual Página 49 de 168
mostrará una ventana de confirmación, advirtiéndonos de la existencia de otro control con ese
nombre, y preguntándonos si deseamos formar un arreglo de controles.
Al recibir nuestra respuesta afirmativa, Visual Basic conforma el arreglo de controles, activando la
propiedad INDEX de los controles. Esta propiedad, a la que aún no habíamos hecho referencia,
esta disponible en todos los controles que nos ofrece Visual Basic, y sólo se utiliza para establecer
el orden de los elementos que integran el arreglo de controles. Normalmente Visual Basic indexa
los controles en el mismo orden en que vamos incorporándolos al arreglo, pero podemos
perfectamente modificar los valores de los La propiedad INDEX es de sólo lectura, o sea, los
índices de los controles de un arreglo no pueden ser alterados por software, durante la ejecución
del programa.
Un arreglo de controles tiene una serie de características que lo diferencia de los arreglos
ordinarios y que resulta conveniente puntualizar.
· A pesar de ser arreglos, no se declaran en el código del programa con la instrucción DIM.
· El límite inferior de los índices es el cero.
· El límite superior no esta definido.
· Son exclusivamente unidimensionales.
Cuando trabajamos con arreglos de controles, los subprogramas de tratamiento de eventos
incorporan como primer parámetro el índice del arreglo. Por ejemplo, el procedimiento:
Figura 5-1. Ventana de confirmación para la creación de un arreglo de controles
Sub Text1_Change ()
Text1.ForeColor = QBColor(12) ‘ QBColor(12) Rojo brillante
End Sub
Preparado para operar con el control simple Text1, y que es capaz de cambiar el color del texto de
la caja cuando ese texto es modificado, se convierte en:
Sub Text1_Change (Index As Integer)
Text1(Index).ForeColor = QBColor(12)
End Sub
Este procedimiento cambia el color del texto de cualquiera de los controles Caja de Texto que
integran el arreglo, Text1 cuando la información que contiene ese control integrante del arreglo es
alterada.
Para ilustrar las posibilidades que nos brinda el empleo de arreglos de controles resolveremos a
continuación dos problemas donde el empleo de arreglos de controles simplifica
extraordinariamente la tarea del programador, y que ejemplifican las dos situaciones en que, como
señalábamos son especialmente necesarios los arreglos de controles. El primero de ellos se refiere
Introducción a la Programación Visual Página 51 de 168
al uso de arreglos de controles para representar los valores de listas de datos, mientras el
segundo ejemplifica el empleo de arreglos de controles para explotar el tratamiento de eventos
comunes a grupos de controles.
El primer problema nos propone elaborar un programa que muestre en pantalla una lista de
5 números seleccionados al azar entre el 1 y el 50 y sea capaz de ordenarla a petición del
usuario. El programa debe ser capaz de renovar a petición del usuario los números de la
lista, y también debe permitir establecer el sentido en que se efectuará el ordenamiento
(ascendente o descendente).
Los algoritmos para ordenar una lista son suficientemente conocidos para que debamos
detenernos a explicarlos. En la solución de esta problema emplearemos el algoritmo de máximos
o mínimos sucesivos. Trabajando en Quick Basic la lista se representa sobre un arreglo y la
solución sería algo así:
DIM A(5)
GENERADATOS A()
ORDENA A()
SUB GENERADATOS( A() )
FOR I= 1 TO 5
A(I)= INT(RND()*50)+1
NEXT
END SUB
SUB ORDENA (A() )
FOR I=1 TO 4
M=I
FOR J=I+1 TO 5
IF A(I)> A(M) THEN M=I
NEXT
SWAP A(I),A(M)
NEXT
END SUB
quedando de parte del usuario la colocación de la lista original en pantalla, y su actualización al
producirse el ordenamiento. Para resolver este problema en Visual Basic, comenzaremos, de
acuerdo al método de solución que proponemos, por realizar el diseño del interfaz. Allí debemos
colocar los cinco datos, ubicándolos de forma tal que permita comprender el carácter de lista de los
mismos, y que permita además, apreciar el ordenamiento de la lista cuando tenga lugar. Debemos
Introducción a la Programación Visual Página 52 de 168
colocar también botones que permitan impartir las órdenes para que el programa genere los
valores de la lista, para que los ordene y por supuesto, para que finalice la ejecución. También
debemos colocar un indicador para seleccionar el sentido del ordenamiento. El aspecto de nuestro
interfaz podría ser así:
Para los números de la lista proponemos emplear cinco controles Etiquetas, para la selección del
sentido de ordenamiento dos controles Botón de Opciones y para las tareas del programa tres
controles Botón de Órdenes. Las etiquetas las colocamos en columna y empleamos colores de
fondo en progresión de tonos azules, para apoyar la idea de lista, y de lista ordenada.
Nuestro arreglo de controles estará integrado por los cinco controles etiqueta, que inicialmente
tienen por nombre en sus propiedades Name los identificadores Label1, Label2, Label3, Label4 y
Label5. Para convertirlos en un arreglo de controles modificaremos esa propiedad. Para hacerlo
seleccionemos el primer control, identificado como Label1, pasemos a su ventana de Propiedades
y alteremos la propiedad Name escribiendo el identificador ‘Datos’. Ese será el nombre de nuestro
arreglo de controles. Una vez modificada esta etiqueta, seleccionamos la siguiente identificada
como Label2 y repetimos la operación. Al asignar a la propiedad Name el valor ‘Datos’ Visual
Basic mostrará una ventana de confirmación como la que se muestra en la figura 1. Al contestar
afirmativamente, la primera etiqueta pasa a identificarse como Datos(0) y la segunda como
Datos(1), quedando conformado el arreglo de controles. Luego se repite la operación para las
etiquetas Label3, Label4 y Label5 transformándolas en Datos(2), Datos(3) y Datos(4). Para que
los objetos del interfaz el interfaz adquieran la apariencia que se muestra en la figura 2, debemos
modificar los valores implícitos de sus propiedades, asignándoles los que se muestran en la tabla
1.
Objeto Propiedad
Valor asignado
Comentario
Form1 Caption “Ordenamient o de Datos”
Título de la aplicación.
Datos( 0 ) Caption “” No hay valores preestablecidos.
FontSize 12 Se agranda la letra para que el dato de la lista se aprecie mejor.
Alignment
2 (Centrado) Se colocan los números en el
centro de la etiqueta.
Figura 5-2. Interfaz para ordenar una lista.
60 Introducción a la Programación Visual
Introducción a la Programación Visual Página 53 de 168
ForeColo
r
&H00FF0000 Azul.
BackColo
r
&H00FFFFC0 Azul muy claro.
Datos( 1 ) Caption ““
FontSize 12 Lo mismo que para Datos(0).
Alignmen
t
2
ForeColo
r
&H00FF0000 Azul.
BackColo
r
&H00FFFF00 Azul claro.
Datos( 2 ) ForeColo
r
&H00FFFF00 Azul claro.
BackColo
r
&H00FF0000 Azul.
Datos( 3 ) ForeColo
r
&H00FF0000 Azul claro.
BackColo
r
&H00C00000 Azul oscuro
Datos( 4 ) ForeColo
r
&H00FF0000 Azul claro.
BackColo
r
Introducción a la Programación Visual Página 54 de 168
Next
End Sub
Los procedimientos generales se ubican dentro de la ventana de código de
un formulario en el mismo lugar que las declaraciones generales de datos,
es decir en el área identificada como (general) en la lista desplegable de
objetos. Para incorporar un nuevo subprograma tenemos dos caminos:
· Activar la ventana de código y escribir en cualquier lugar dentro de ella
el encabezamiento del subprograma (las palabras Sub o Function y el
nombre). Al pulsar Enter se creará un área de edición para el nuevo
subprograma general como se muestra en la figura 4.
· Seleccionar la opción Procedimiento dentro del menú Insertar e indicar
el nombre y tipo del procedimiento en la ventana que aparecerá a
continuación.
Como los subprogramas generales se encuentran en el área identificada
como (general) en la ventana de código, para acceder a alguno de ellos
basta con seleccionar esa área y desplegar la lista de procedimientos
(identificada como Proc :) en esa lista a continuación del ítem (declarations)
se encuentra el listado de los procedimientos generales del formulario.
Continuando con la solución de nuestro problema, habíamos dicho que
cuando el formulario se carga debe generarse un juego de datos para el
arreglo de controles, esto se consigue invocando al procedimiento general
Generar_Datos desde el procedimiento de atención al evento Load.
Sub Form_Load ( )
Figura 5-4 Escribiendo un subprograma
general en la ventana
Introducción a la Programación Visual 63
Generar_Datos A( )
End Sub
Realmente no es estrictamente necesario transferir al procedimiento el
arreglo A(), ya que el mismo tiene alcance dentro del formulario y por tanto
cualquier entidad de código del formulario puede utilizarlo. Preferimos sin
embargo colocarlo como parámetro para poder mostrar la declaración
de un subprograma en su forma completa:
SUB Nombre_del_Procedimiento (Parámetros).
Introducción a la Programación Visual Página 57 de 168
El Juego del 15 es bien conocido; data del siglo pasado, cuando fue tan
popular como el cubo de Rubik o los Tamagoshis. Se trata de un tablero de 4
filas y 4 columnas, que contiene 15 fichas numeradas consecutivamente y
un espacio vacío. Las únicas fichas que el jugador puede mover son las que
ocupan posiciones contiguas al espacio vacío, para que ocupen
precisamente ese espacio. Para comenzar a jugar, se mueven las fichas
hasta dejarlas en desorden y luego el jugador debe regresarlas a su posición
original. Para preparar una interfaz en Visual Basic para este juego, lo más
conveniente será contar con un formulario de forma lo más cuadrada
posible, que represente el tablero, y sobre él, colocar 15 controles que
representen las fichas. Estos controles deben mostrar los números del 1 al 15,
para realizar esta función podemos emplear etiquetas o botones de
órdenes. Nos decidimos por estos últimos.
Las tareas de los controles
resultan bastante claras: si el
jugador marca con el ratón
sobre una ficha, esa ficha debe
comprobar si el espacio vacío
colinda con ella, y de ser así,
moverse al espacio vacío. De lo
contrario la ficha permanece en
su lugar.
Es evidente que las fichas reúnen todas las condiciones para constituir un
arreglo de controles: son representadas por controles de la misma clase, en
nuestro caso botones de órdenes, todas reconocen el mismo evento y
realizan la misma acción. Agruparemos entonces, a los quince botones de
órdenes en un arreglo, al que llamaremos ‘Ficha‘. A continuación se
muestra la tabla de las propiedades de los objetos que intervienen en el
interfaz.
Objeto Propiedad Valor
asignado
Comentario
Form1 Caption “Juego
del 15”
Introducción a la Programación Visual Página 61 de 168
Título de la aplicación.
Height 3330 Se ajusta el tamaño del formulario
Figura 5-5. Juego del 15.
Fichas
Espacio
Vacío
Introducción a la Programación Visual 67
al
Width 2550 que tendrán las fichas. La diferencia
entre el alto y el ancho representa
el alto de la barra de títulos.
BorderStyl
e
1 (Borde
simple
Fijo)
Se coloca el borde fijo porque no es
conveniente que el jugador
modifique la forma cuadrada del
tablero
Ficha( 0 ) Caption “1” Número de la ficha.
FontSize 18 Se agranda la letra para que el
número de la ficha se aprecie
mejor.
Top 0 Primera fila
Left 0 Primera columna
Height 600
(pixels)
Se garantiza que la ficha sea un
Width 600 cuadrado
Ficha( 1 ) Caption “2” Número de la ficha.
Top 0 Primera fila
Left 600 Segunda columna
Ficha( 2 ) Caption “3”
Introducción a la Programación Visual Página 62 de 168
Ficha( 12
)
Caption “13”
Top 1800 Cuarta fila
Left 0 Primera columna
Ficha( 13
)
Caption “14”
Top 1800 Cuarta fila
Left 600 Segunda columna
Ficha( 14
)
Caption “15”
Top 1800 Cuarta fila
Left 1200 Tercera columna
Las propiedades FontSize, Height y Width tienen el mismo valor para
todas las Fichas
Normalmente para resolver un problema como este se emplea un arreglo
bidimensional, de 4 por 4, con el que se representa la posición de las fichas
sobre el tablero. Nosotros trataremos de resolver el problema empleando
solamente recursos de carácter visual. En el tablero tenemos 15 elementos
bastante regulares: las fichas, y uno muy singular: el espacio vacío. No es
difícil comprender que es precisamente éste último el gran protagonista del
juego, y por tanto es imprescindible conocer dónde se encuentra en cada
momento. Mientras las fichas son objetos que poseen propiedades Top y
Left, que permiten conocer su posición, el espacio vacío no se representa
por ningún objeto. Por tanto nuestras entidades de datos fundamentales
serán dos variables enteras que representarán la fila y la columna del
tablero en que se encuentra ubicado el espacio vacío. La singularidad de
este ejemplo esta en la correspondencia que es necesario establecer entre
Introducción a la Programación Visual 69
la distribución bidimensional de las fichas el arreglo de controles que
necesariamente tiene que ser unidimensional.
Cuando una ficha recibe el evento Click debe comprobar si puede
Introducción a la Programación Visual Página 64 de 168
Sub Form_Load ()
X_Vacio = 3 ‘ Columna que ocupa el espacio vacío
Y_Vacio = 3 ‘ Fila que ocupa el espacio vacío
End Sub
Los procedimientos que se ocupen de mover las fichas tendrán también la
responsabilidad de actualizar estas dos variables.
La tarea de determinar si la ficha tocada por el usuario puede ser movida se
puede descomponer en cuatro tareas secundarias: comprobar si la ficha
tiene el espacio vacío a su derecha, a su izquierda, arriba o abajo. De igual
forma, la tarea de mover una ficha desde su posición actual hasta el
espacio vacío se puede descomponer en cuatro tareas secundarias: mover
la ficha hacia la derecha, moverla hacia la izquierda, moverla hacia abajo y
moverla hacia arriba.
El procedimiento de atención al evento Click de un control Ficha quedaría
entonces así:
Sub Ficha_Click ( Index As Integer )
Dim X As Integer, Y As Integer
X = Ficha(Index).Left \ Ficha(Index).Width ‘ Columna que ocupa la
ficha
Y = Ficha(Index).Top \ Ficha(Index).Height ‘ Fila que ocupa la ficha
I f Vacio_Izquierda( X, Y ) Then
Mover_Izquierda Index
ElseIf Vacio_Derecha( X, Y ) Then
Mover_Derecha Index
ElseIf Vacio_Arriba( X, Y ) Then
Mover_Arriba Index
ElseIf Vacio_Abajo( X, Y ) Then
Mover_Abajo Index
End If
End Sub
Donde Vacio_Izquierda, Vacio_Derecha, Vacio_Arriba y Vacio_Abajo son
funciones generales que resuelven las cuatro subtereas en que
descompusimos la determinación de la vecindad con el espacio vacío.
Introducción a la Programación Visual 71
Introducción a la Programación Visual Página 66 de 168
aparecería lo siguiente:
Introducción a la Programación Visual 75
Precisamente esto es una caja
de diálogos, o de mensajes: un
formulario con un mensaje
adecuado, un elemento
gráfico que sirve para resaltar
el contenido del mensaje y un
conjunto de botones que
permitan al usuario expresar su conformidad con el mensaje o seleccionar
alguna de las opciones que se le ofrecen.
Visual Basic nos permite emplear con gran facilidad cajas de mensajes en
nuestros programas. Por ejemplo, para mostrar una caja de mensajes
idéntica a la que aparece en la figura 5-6 tan solo es necesario escribir la
siguiente línea de programa:
A = MsgBox ("¿Desea guardar los cambios he chos a LIBROVB.DOC? ", 35,
"Microsoft Word")
La función MsgBox es en efecto la encargada de exhibir en pantalla la caja
de mensajes. El primer parámetro de la función MsgBox es una cadena de
caracteres que contiene el mensaje que será exhibido dentro de la caja de
diálogos. El tercer parámetro también es una cadena de caracteres, y su
contenido se colocará en la barra de título del formulario que contiene la
caja de diálogos. El segundo parámetro es el más complejo de todos: es un
número que se forma sumando varios componentes.
El primer sumando es un número del 0 al 5 que representa las seis
combinaciones de botones que se pueden colocar en la caja de diálogos.
El valor 0 indica que en la caja de mensajes aparecerá el botón “Aceptar”
(“OK” en la versión inglesa de Visual Basic). El valor 1 indica que aparecerán
los botones “Aceptar” y “Cancelar” (“OK” y “Cancel”). El 2, los botones
“Anular”, “Reintentar” e “Ignorar” (“Abort”, “Retry” “Ignore”). El 3, los botones
“Si”, “No” y “Cancelar”. El 4, los botones “Si” y “No”, y el valor 5, los botones
“Reintentar” y “Cancelar”.
El segundo sumando es un número del conjunto 16, 32, 48, 64, y sirve para
indicar el icono que se colocará para reforzar el mensaje. El 16 representa el
Introducción a la Programación Visual Página 71 de 168
aplicación.
Height 3645
Width 5055
Text1 Text “”
MultiLine True Para que la caja de
texto muestre el
mensaje en formato
multilineal.
ScrollBars 2 (Vertical) Para que la Caja de
Texto presente una
barra de
desplazamiento
Vertical.
0 - Ninguna Barra de
desplazamiento.
1 - Barra Horizontal.
2 - Barra Vertical.
3 - Ambas Barras de
desplazamiento.
Command
1
Caption “Terminar”
Debe llamar nuestra atención el hecho de que la propiedad Text de la Caja
de Texto aparezca vacía en el diseño, cuando era de esperar que en ella se
colocara el texto de la ayuda. La razón es sencilla: la longitud del texto que
se puede colocar en esa propiedad en tiempo de diseño no puede exceder
los 256 caracteres. Por esa razón preferimos dejarla vacía y colocar en ella
el texto durante la ejecución, en el momento en que se cargue la ventana
de ayuda.
Las acciones a realizar dentro de este formulario son también pocas y
sencillas. Primero la que acabamos de describir: colocar el texto de ayuda
94 Introducción a la Programación Visual
en la Caja de Texto que debe realizarse cuando se cargue el formulario y
por tanto puede asociarse al evento Load del mismo. La segunda cerrar el
Introducción a la Programación Visual Página 90 de 168
Text1.Text = A$
End Sub
Introducción a la Programación Visual 95
Cuando el formulario de ayuda es cargado en memoria se prepara el texto y
se coloca en la Caja de Texto Text1. La combinación Chr$(13) + Chr$(10)
sirve, como en la caja de mensajes para insertar un cambio de línea dentro
del texto que se muestra. Por cierto, hemos escrito la ayuda lo más breve
posible. El lector puede completarla convenientemente.
Para atender a las posibles alteraciones que realice el jugador al texto de la
ayudo proponemos una solución muy sencilla. Como conservamos en la
variable A$ el texto original de la ayuda, cada vez que el jugador lo
modifique nuestro programa la restaurará. Para esto debemos escribir:
Sub Text1_Change ( )
Text1.Text = A$
End Sub
El control de la barra de desplazamiento no es nuestra responsabilidad.
Forma parte del control Caja de Texto y se ocupa de desplazar el texto
dentro de la caja sin necesidad de nuestra intervención.
Por último debemos atender al problema de como cerrar la ventana de la
ayuda. Para esto Visual Basic proporciona la instrucción Unload que recibe
como argumento el identificador (propiedad Name) del formulario que
deseamos cerrar. El procedimiento a ejecutar cuando se oprime el botón
‘Terminar’ será así:
Sub Command1_Click ( )
Unload Form2
End Sub
Ya hemos preparado completamente el formulario de ayuda para el juego
del 15. Sólo falta escribir las instrucciones necesarias para colocarlo en la
pantalla desde el elemento ‘Cómo Jugar’ del menú de ayuda del juego.
Para ello escribiremos
Sub Como_Jugar_Click ( )
Load Form2
Form2.Show
End Sub
Introducción a la Programación Visual Página 92 de 168
evento:
Sub Form_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As
Single)
If Button = 2 Then Form1.PopupMenu Ayuda, 2
End Sub
Colocamos un 2 como segundo parámetro para permitir que la selección
dentro del menú emergente también se pueda realizar con el botón
izquierdo, ya que es así como lo hace normalmente Windows en sus menús
contextuales.
Sub Ficha_MouseDown (Index As Integer, Button As Integer, Shift As Integer, X
As Single, Y AsSingle)
If Button = 2 Then Form1.PopupMenu Ayuda, 2
100 Introducción a la Programación Visual
End Sub
También aquí la información que nos interesa se encuentra ubicada como
segundo parámetro del procedimiento, ya que al tratarse de un arreglo de
controles se adiciona el índice del arreglo como primer parámetro.
Si prefiriésemos que el menú Ayuda sólo se presente como menú emergente
y no como parte del menú del formulario debemos con abrir la ventana de
diseño de menú y quitar la marca de chequeo a la propiedad Visible del
elemento de menú Ayuda, al que se subordina el despliegue de este menú
que queremos emplear exclusivamente como Menú Emergente.
Después de estudiar este capítulo nos encontramos en condiciones de
completar el diseño de nuestras aplicaciones con la incorporación de
elementos tan importantes como son los menús, tanto en calidad de menús
de formulario como en calidad de menús emergentes.
Introducción a la Programación Visual 101
Capítulo 7. Explotando el Ratón.
El Ratón, elemento imprescindible en la interacción hombre
máquina
El puntero del ratón es en este momento y sin lugar a dudas de ninguna
clase, el principal medio de que dispone el usuario para comunicarse con su
computadora. Desde que hizo su aparición en el mundo de la informática,
en los viejos tiempos del MS-DOS ocupó un lugar destacado en la
Introducción a la Programación Visual Página 97 de 168
Label4.Visible = True
End Sub
Introducción a la Programación Visual 105
Sub Text1_MouseMove (Button As Integer, Shift As Integer, X As Single, Y As
Single)
Label4.Caption = "Aquí va el primer operando."
Label4.Visible = True
End Sub
Sub Text2_MouseMove (Button As Integer, Shift As Integer, X As Single, Y As
Single)
Label4.Caption = "Aquí va el segundo operando."
Label4.Visible = True
End Sub
Sub Label3_MouseMove (Button As Integer, Shift As Integer, X As Single, Y As
Single)
Label4.Caption = "Este es el resultado de la operación."
Label4.Visible = True
End Sub
Así garantizamos colocar la información necesaria en la etiqueta, de
acuerdo al control sobre el que se sitúe el puntero y mostrar la etiqueta,
pero... Habíamos dicho que deseábamos que la etiqueta se mantuviese
oculta cuando no fuese necesario mostrar información, o sea cuando el
puntero no se encuentre sobre ninguno de los controles que nos interesan.
Cuando comienza el programa no hay problemas, ya que la etiqueta está
oculta porque en el diseño colocamos False en su propiedad Visible, pero
cuando el puntero entra al primer control la etiqueta se hace visible, como
hemos visto. El problema es ¿cómo volverla a ocultar? Para hacerlo es
necesario determinar cuándo el puntero abandona el control sobre el que
se encontraba. Parece sencillo pero: ¿cómo saber que el puntero ya no está
sobre el control? ¿Cómo saber que el puntero ha salido de él? Realmente es
sencillo, cuando el puntero sale de cualquiera de los controles que nos
interesan pasa a encontrarse sobre el formulario y por tanto el formulario
siente a su vez el evento MouseMove. Tan sólo tenemos que escribir código
para ese evento ocultando la etiqueta; Esto sería así:
Introducción a la Programación Visual Página 102 de 168
identificador del
objeto.
BackColor &H0080FF
(anaranjado)
Casilla(0) BackColor &HFFFF00 (azul claro)
Casilla(1) BackColor &H0000FF (rojo)
Casilla(2) BackColor &H00FF00 (verde)
Casilla(3) BackColor &HFF00FF (magenta)
Camino(0)
hasta
BackColor &H0080FF
(anaranjado)
Todos los elementos del
arreglo desde el 0
hasta el 21 tienen el
mismo valor
Camino(21
)
en la propiedad
BackColor.
Picture1 Visible False
Label1 Caption “META” Para Label2 tiene el
mismo valor
Alignment 2 (Centrado)
FontSize 13.5
BackStyle 0 (Transparente)
Label2 Caption “SALIDA” Las restantes
propiedades de Label2
son iguales a las de
Label1.
Para colocar los dibujos en los controles del arreglo Ficha podemos seguir
dos caminos. Durante el diseño seleccionaremos cada control del arreglo y
entrando a la ventana de propiedades haremos doble click sobre la
propiedad Picture del control. Al hacer esto aparecerá una ventana de
Introducción a la Programación Visual Página 110 de 168
End Sub
El procedimiento para Label2 resulta idéntico. (Se podían haber tratado
como un arreglo de etiquetas, ¿verdad?)
Liberar la ficha en cualquier lugar que no sea en las casillas de la meta es
incorrecto y por tanto la ficha debe ser visualizada nuevamente en el área
Introducción a la Programación Visual 117
de salida. Esto es válido para todos los controles que intervienen en el
juego, por tanto todos deben atender al evento DragDrop de la misma
manera:
Si la ficha se libera sobre alguna de las cajas de imagen que forman parte
del arreglo Camino:
Sub Camino_DragDrop (Index As Integer, Source As Control, X As Single, Y As
Single)
Source.Visible = True
End Sub
Si la ficha se libera sobre el área de meta donde no se encuentran las
casillas:
Sub Meta_DragDrop (Source As Control, X As Single, Y As Single)
Source.Visible = True
End Sub
Si la ficha se libera sobre el área de salida:
Sub Salida_DragDrop (Source As Control, X As Single, Y As Single)
Source.Visible = True
End Sub
Si la ficha se libera sobre alguna de las fichas que aún está en el área de
salida (que aún es visibles):
Sub Ficha_DragDrop (Index As Integer, Source As Control, X As Single, Y As
Single)
Source.Visible = True
End Sub
El menú del juego tan sólo tiene, como ya se dijo dos elementos ‘Nuevo
Juego’ y ‘Terminar’. El procedimiento para la opción ‘Nuevo Juego’ debe
ocuparse de volver a su estado inicial a los objetos que hayan podido
recibir modificaciones durante el juego. Los únicos objetos que se modifican
Introducción a la Programación Visual Página 115 de 168
son: en primer lugar las fichas que desaparecen del área de salida en la
medida en que son arrastradas exitosamente hasta las casillas de la meta; y
en segundo lugar las propias casillas que reciben una X cuando se deposita
118 Introducción a la Programación Visual
en ellas la ficha que les corresponde. El procedimiento del elemento de
menú Nuevo juego debe reparar dichas modificaciones. Lo hace así:
Sub Nuevo_Juego_Click ()
For I = 0 To 3 ‘ Para cada una de las fichas (o casillas)
Ficha(I).Visible = True ‘ Visualiza las fichas en el área de salida
Casilla(I).Picture = LoadPicture("") ‘ Elimina las X de las
Next ‘ casillas que las tuviesen
End Sub
El procedimiento para la opción ‘Terminar’ contiene una sola instrucción:
End.
Una vez escrito todo este código podemos comenzar a jugar con el
Laberinto de los Colores. Claro que aún nos falta un elemento. Habíamos
dicho que se jugaba contra tiempo. Es verdad, pero de eso nos ocuparemos
en el próximo capítulo. Por ahora seguiremos arrastrando controles!
Arrastre real.
En ocasiones, el problema que debemos resolver necesita que arrastremos
objetos completos, es decir que arrastremos las imágenes de los objetos y
no sus contornos. En tales situaciones resulta en extremo complicado
intentar atacar el problema empleando únicamente los eventos DragOver y
DragDrop y tendemos que emplear de nuevo los eventos simples del ratón,
o sea MouseDown, MouseUp y MouseMove.
Ya hemos mencionado a los rompecabezas como ejemplo de problema
donde nos enfrentamos a la necesidad de realizar el arrastre real. En efecto,
para colocar las piezas en su posición, y de forma tal que guarden
correspondencia con las que ocupan las posiciones vecinas es necesario
poder ver la pieza mientras la movemos y no observar su simple silueta.
Intentaremos resolver tal problema.
Para programar un rompecabezas, lo primero que debemos preparar es el
dibujo que separaremos en piezas. Esto nos servirá para ilustrar una fase en
la programación para Windows, que muchas veces se omite en los
Introducción a la Programación Visual Página 116 de 168
(ImageBox
)
Left 10 Primera columna
Figura 7-5. Interfaz del Rompecabezas
donde se observa la Caja de Imagen
empleada para representar el tablero.
122 Introducción a la Programación Visual
Width 150
Height 100
ScaleMode 3 (pixels)
Pieza(1) Top 10 Primera fila
(ImageBox
)
Left 150 Segunda columna
Width,
Height
Todas las Piezas tienen
los
mismos valores para
Width y Height.
ScaleMode 3 También tienen el Mismo valor para
ScaleMode
Pieza(2) Top 100 Segunda fila
(ImageBox
)
Left 10 Primera columna
Pieza(3) Top 100 Segunda fila
(ImageBox
)
Left 150 Segunda columna
Pasemos a determinar las tareas a realizar por cada control. Las Piezas
deben ser capaces de moverse físicamente cuando el usuario las arrastre y
una vez que sean liberadas del arrastre deben revisar si el rompecabezas
está armado, o sea, si todas las piezas están en la posición correcta (esto es
Introducción a la Programación Visual Página 120 de 168
lo mismo que tuvimos que hacer para el ‘Juego del 15’), en tal caso se
mostrará una caja de mensajes felicitando al jugador. Para realizar estas
tareas nos valdremos de los eventos MouseDown, MouseMove y MouseUp.
En este programa introduciremos una diferencia con respecto al ‘Juego del
15’. No permitiremos que el jugador mueva las piezas desde su posición
inicial. Sólo podrá moverlas una vez que las mismas se encuentren
desordenadas (para desordenarlas debe emplear el elemento
‘Desordenar’ del menú ‘Opciones’). Esto nos obligará a disponer de una
variable de estado accesible desde todo el formulario que contendrá la
información acerca del estado de orden de las piezas.
Las acciones de los distintos elementos del menú se explican casi todas por
si solas: ‘Desordenar’ como ya dijimos coloca las piezas en posiciones
aleatorias para que comience el juego. ‘Ordenar’ le permite al jugador
llevar todas las piezas de regreso a sus posiciones, en caso que no logre
hacerlo por si mismo. ‘Terminar’ finaliza el programa. ‘Ayuda Visual’
reconstruye por un momento la imagen para que el jugador se oriente, y
acto seguido la regresa al desorden. Por último ‘Créditos’ identifica al
producto y a sus desarrolladores. Como siempre cada uno de estas
Introducción a la Programación Visual 123
acciones sera desencadenada por el evento Click del elemento de menú
correspondiente.
A continuación mostramos una tabla con las principales propiedades de los
elementos de nuestro menú:
Caption Name Index Checked
“&Desordenar” Desordena
“&Ordenar” Ordena
“&Terminar” Fin
“&Ayuda Visual” Ayuda_Visual
“&Créditos” Creditos
Podemos pasar ahora a escribir el código. En el área de declaraciones
debemos ubicar la variable que emplearemos para saber si las piezas están
en orden. La declaración será:
Dim Desordenado As Integer
Para inicializar esa variable podemos emplear el procedimiento de
Introducción a la Programación Visual Página 121 de 168
piezas si las mismas no han sido desordenadas, por tanto, aun cuando el
ratón se mueva con algún botón oprimido, si la variable Desordenado
contiene el valor False también debemos abandonar el procedimiento sin
modificar la posición de la pieza. Ambas condiciones se puede agrupar en
una misma línea mediante un operador OR. El resultado será:
If Button = 0 Or Not Desordenado Then Exit Sub
Ahora debemos pensar en como actualizar la posición de la pieza cada vez
que se produzca un evento MouseMove mientras se esté produciendo un
arrastre, o sea cuando algún botón esta oprimido (Button ¹ 0) y las piezas se
encuentran desordenadas (Desordenado = True).
Como ya dijimos, cada vez que se produzca un pequeño movimiento del
ratón sobre la pieza, se producirá un evento MouseMove. Nosotros
debemos aprovechar ese evento para modificar la posición de la pieza, de
acuerdo con la dirección en que se haya desplazado el puntero del ratón.
Para poder hacerlo necesitamos calcular cuantos pixels se movió el ratón
desde su posición anterior hasta la actual, tanto a lo largo del eje X como a
lo largo del eje Y, para con esas diferencias actualizar las propiedades Left y
Top de la pieza. Para calcular una diferencia de posición necesitamos
conocer dos posiciones: la posición actual del ratón sobre la pieza, que
podemos obtenerla de los parámetros X y Y del evento MouseMove, y la
posición anterior, que es la posición en que se encontraba el ratón sobre la
pieza en el momento de comenzar el arrastre. ¿Cómo obtener esa posición
inicial?
Introducción a la Programación Visual 127
Evidentemente MouseMove no nos informa ese valor, y evidentemente no
tiene forma de conocerlo. Sin embargo nosotros sí podemos obtener y
preservar ese valor. ¿Cómo? Muy sencillo, basta con analizar los eventos
que suceden durante nuestro programa. ¿Qué nos interesa conocer? La
posición del ratón sobre la pieza en el momento de comenzar el arrastre.
Preguntémonos entonces: ¿Cuándo comienza el arrastre? Cuando el
jugador oprime un botón del ratón sobre la pieza. ¿La pieza percibe algún
evento cuando se oprime un botón del ratón sobre ella? La repuesta es SI.
¿Cuál es ese evento? El evento MouseDown!!
La solución esta entonces al alcance de nuestras manos. En efecto el
Introducción a la Programación Visual Página 125 de 168
sustituyendo la línea:
If Pieza(I).Left = X And Pieza(I).Top = Y Then C = C + 1
por:
If Distancia((Pieza(I).Left), (Pieza(I).Top), X, Y) < 5 Then C = C + 1
De esta forma resolvemos el problema de que el jugador no tenga que ser
tan preciso en la colocación de las piezas, pero al hacerlo vamos a crear
otro: informamos que el rompecabezas esta armado cuando visualmente se
puede apreciar que las piezas no están exactamente en sus lugares.
Para resolver este segundo problema debemos corregir la posición real de
las piezas. Cuando detectemos que una pieza esté a una distancia menor
que 5 pixels de su posición correcta modificaremos las propiedades Left y
Top de la pieza para colocarla en la posición correcta.
Pero la función Armado no es un buen lugar para realizar esta corrección, ya
que en Armado se revisan (y por tanto se intentarían corregir) las posiciones
de todas las fichas, cuando la única ficha cuya posición tiene sentido tratar
de corregir es la ficha que el jugador estaba arrastrando. Para referirnos
exclusivamente a esa ficha la corrección de la posición debe realizarse en
el procedimiento de atención al evento MouseUp:
Sub Pieza_MouseUp (Index As Integer, Button As Integer, Shift As Integer, X As
Single, Y As Single)
If Button = 0 Or Not Desordenado Then Exit Sub
Coordenadas_de_Pieza Index, X, Y ‘ Se calcula la posición
correcta de la pieza
If Distancia((Pieza(Index).Left), (Pieza(Index).Top), X, Y) < 5 Then
‘ Si la distancia entre la posición
Pieza(Index).Left = ‘ real y la posición correcta es menor que 5
Pieza(Index).Top = Y ‘ se modifican las propiedades Top y Left
End If ‘ para corregir la posición de la pieza.
If Armado() Then
Introducción a la Programación Visual 131
A$ = "Felicitaciones !!!" + Chr$(13) + "Has armado el Rompecabezas"
MsgBox A$, 48, "Rompecabezas"
Desordenado = False
End If
Introducción a la Programación Visual Página 129 de 168
End Sub
Como ya hemos corregido la posición de la pieza la función Armado podría
quedar como se encontraba al principio.
El factor de corrección 5 ha sido elegido por nosotros arbitrariamente.
Nuestros lectores pueden emplear otro cualquiera. Incluso, los invitamos a
incorporar un menú con diferentes factores de corrección para que el
jugador elija el grado de dificultad del juego. Esto puede hacerse siguiendo
el modelo del menú que preparamos en el ‘Juego del 15’ para controlar la
velocidad de la animación.
Por último nos dedicaremos a los procedimientos del menú ‘Ayuda’. En el
mismo hemos colocado dos elementos de menú, ellos son ‘Ayuda Visual’ y
‘Créditos’. Sobre los créditos no nos detendremos, pueden prepararse en la
misma forma en que elaboramos los créditos del ‘Juego del 15’ o del
‘Laberinto’.
Con la Ayuda Visual nos proponemos orientar al jugador si en un
determinado momento del juego no recuerda la ubicación correcta de las
piezas. Cuando el jugador seleccione este elemento de menú las piezas se
colocarán en la posición correcta durante un breve instante
(aproximadamente un segundo) y luego regresarán a su posición anterior.
Para poder hacer esto necesitaremos guardar las posiciones actuales de las
piezas en un arreglo, invocar el procedimiento Ordenar, esperar un segundo
y restaurar las piezas en sus posiciones.
Sub Ayuda_Visual_Click ()
For I = 0 To 3 ‘ Para cada una de las piezas
Pos(I).X = Pieza(I).Left ‘ almacenamos su posición, es
decir
Pos(I).Y = Pieza(I).Top ‘ los valores de sus propiedades
Left y
Next ‘ Top en el arreglo Pos
132 Introducción a la Programación Visual
Ordena_Click ‘ Para ordenar las piezas
aprovechamos
‘ este procedimiento
For K = 1 To 150000: Next ‘ Realizamos una espera
Introducción a la Programación Visual Página 130 de 168
Sub Timer1_Timer ()
T+1
End Sub
De esta forma mientras el temporizador este activado se realizará un
conteo en la variable T cada vez que transcurra un segundo.
Para informar sobre el tiempo empleado por el jugador para recorrer el
laberinto emplearemos la misma caja de mensajes con que lo felicitamos
en el procedimiento de atención al evento DragDrop de las casillas.
Debemos calcular primero la cantidad de minutos y la cantidad de
segundos transcurrida.
Los minutos transcurridos pueden calcularse así: Min = T \ 60, y los segundos
restantes Seg = T Mod 60. El procedimiento Casilla_DragDrop quedará
definitivamente así:
Sub Casilla_DragDrop (Index As Integer, Source As Control, X As Single, Y As
Single)
If Source.Index = Index Then
Casilla(Index).Picture = Picture1.Picture
If Gano() Then
Min = T \ 60
Seg = T Mod 60
A$ = "¡¡Felicitaciones, has terminado!!" + Chr$(13) + Chr$(13)
A$ = A$ + "Tiempo: " + Format$(Min, "#0") + " min. " + Format$(Seg, "#0")
+ " seg."
MsgBox A$, 48, "El laberinto de los colores"
Timer1.Enabled = False
End If
140 Introducción a la Programación Visual
Else
Source.Visible = True
End If
End Sub
La cadena de formato "#0" empleada en la función Format$ garantiza que si
el valor de las variables Min o Seg fuera 0, se escriba el ‘0’, de no emplearse
esta cadena de formato el valor 0 se convertiría en una cadena vacía.
Introducción a la Programación Visual Página 138 de 168
Mensajes”
BackColor &H00C0C0C0 (gris)
Figura 8-2. Interfaz del ‘Monitor de
Mensajes’ Formulario principal.
144 Introducción a la Programación Visual
MaxButton False Para que el usuario no
pueda modificar
BorderStyl
e
1 (Borde simple fijo) las dimensiones del
formulario.
Label1 Caption “Lista de Mensajes”
List1 Sorted True Los elementos de la lista se
ordenan de forma
automática. Como el
mensaje comienza con la
hora, esto hará que queden
ordenados de acuerdo a la
hora.
Timer1 Enabled False No nos interesa controlar el
tiempo desde el comienzo
del programa.
Interval 60000 Se controlará cada minuto.
También presentamos la tabla con las principales propiedades de los
elementos del menú:
Caption Name Index Checked
“&Incorporar Mensajer” Incorporar
“&Modificar
Mensaje/Hora”
Modificar
“&Eliminar Mensaje” Eliminar
“&Terminar” Fin
Las tareas a desarrollar en este formulario son las que están asociadas a los
elementos de menú y la que debe realizar el temporizador: chequear cada
Introducción a la Programación Visual Página 143 de 168
Hor = Val(Text2.Text)
‘ Se transforma la cadena con la hora a valor numérico
If Hor > 23 Then ‘ Si esta fuera del intervalo permitido (de 0 a 23)
MsgBox "Elvalor de las 'horas' no es válido", 16, "Problemas" ‘ Se
emite un mensaje de advertencia
Text2.SetFocus ‘ y se devuelve el foco a la caja de texto
Text2.SelStart = 0
‘ Además, se presenta el contenido de la caja de texto como
Text2.SelLength = Len(Text2.Text) ‘ texto seleccionado
Else ‘ De lo contrario, si el valor esta en el intervalo permitido
Text2.Text = Format$(Hor, "0#")
‘ se ajusta la longitud de la hora a dos caracteres
End If
End Sub
Como señalan los comentarios, si el valor de la hora excede el límite
máximo del intervalo se muestra una caja de mensajes con una
advertencia y a continuación se regresa el foco a la caja de texto
ejecutando su método SetFocus. Para hacer las cosas mas fáciles al usuario
vamos, además, a mostrar el texto como texto seleccionado. Para ello nos
valdremos de las propiedades SelStart y SelLength de la caja de textos.
SelStart indica la posición en que comienza el texto seleccionado, le
asignaremos el valor 0, es decir el inicio del texto. SelLenhgt indica la
longitud del texto seleccionado y le asignaremos la longitud de todo el
texto que esta en la caja. No nos preocupamos por controlar el límite
inferior porque el usuario no puede escribir números negativos, ya que el
procedimiento de atención al evento KeyPress impide la entrada del signo
“-”.
152 Introducción a la Programación Visual
Para la caja de texto Text3 el tratamiento resulta similar:
Sub Text3_LostFocus ()
Min = Val(Text3.Text)
If Min > 59 Then
MsgBox "El valor de los 'minutos' no es válido", 16, "Problemas"
Text3.SetFocus
Introducción a la Programación Visual Página 151 de 168
Text3.SelStart = 0
Text3.SelLength = Len(Text3.Text)
Else
Text3.Text = Format$(Min, "0#")
End If
End Sub
Nos corresponde por último atender a los eventos Click de los botones de
órdenes. La tarea que debe realizar el botón de órdenes Command2
(“Cancelar”) es muy simple: cerrar la ventana del formulario sin incorporar el
mensaje a la lista. En consecuencia su procedimiento de atención será:
Sub Command2_Click ()
Unload Form2
End Sub
La tarea del botón de órdenes Command1 es algo más compleja, ya que
antes de cerrar la ventana del formulario debe componer el mensaje e
incorporarlo a la lista. Para componer el mensaje concatenaremos los
contenidos de las cajas de texto Text2, Text3 y Text1, en ese orden, para
formar una cadena de caracteres con el formato “hh:mm mensaje” es decir
los dos primeros caracteres contendrán la hora, el tercer carácter el
símbolo “:” los caracteres cuarto y quinto contendrán los minutos, el sexto
un espacio en blanco, y a continuación se colocará el texto del mensaje.
Sub Command1_Click ()
Mensaje = Text2.Text & ":" & Text3.Text & " " & Text1.Text ‘ Se
compone el mensaje
Form1!List1.AddItem Mensaje ‘ Se adiciona a la lista
Unload Form2 ‘ y se cierra la ventana
End Sub
Para incorporar el mensaje a la lista empleamos el método AddItem del
control lista List1, pero como ese control se encuentra en el formulario Form1
y este procedimiento se encuentra en el procedimiento Form2, debemos
incluir el nombre del formulario en la invocación. Cuando un control es
Introducción a la Programación Visual 153
invocado desde otro formulario debe emplearse como separador entre el
nombre del formulario y el nombre del control un signo de admiración “!”.
Introducción a la Programación Visual Página 152 de 168
registro activo de la tabla (bien sea pulsando los botones del control Datos,
o empleando los métodos MoveFirst, MoveNext etc.) la información de las
etiquetas y las cajas de texto asociadas se actualizará automáticamente
con los datos correspondientes al nuevo registro activo, sin necesidad de
que escribamos instrucciones para realizar esa actualización.
Como ya se señaló, un control Datos sólo puede estar asociado con una
tabla de una base de datos, de tal forma si nuestra base de datos estuviese
integrada por varias tablas, y nos interesara mostrar en un mismo formulario
información procedente de varias tablas, tendremos que colocar en ese
formulario tantos controles Datos como tablas de la base de datos nos
interese acceder a la vez.. Luego tendremos que colocar en el formulario
nuestras etiquetas y/o cajas de textos e irlas asociando con los distintos
controles Datos.
Con estos elementos ya nos encontramos en condiciones de escribir un
sencillo programa que nos permita mostrar en pantalla el contenido de una
base de datos.
Mostrando el contenido de una tabla.
Supongamos que tenemos a mano una base de datos elemental para una
biblioteca, creada empleando Microsoft Access. Nuestra base de datos
esta formada por una sola tabla, a la que hemos denominado Libro, en esa
160 Introducción a la Programación Visual
tabla definimos los campos Título, Autor, Editorial y Año de publicación. El
contenido de esa tabla podría ser el que se muestra a continuación:
Título Autor Editorial Año
El siglo de las luces
Alejo Carpentier Letras Cubanas 1974
La guerra y la paz León Tolstoi Arte y Literatura 1974
La arboleda perdida Rafael Alberti Arte y Literatura 1975
Las corrientes del
espacio
Isaac Asimov Martínez Roca 1992
Los negros curros Fernando Ortiz Ciencias Sociales 1986
Supongamos ahora que se nos pide preparar un programa en Visual Basic
que permita a los usuarios de la biblioteca consultar la información de esa
Introducción a la Programación Visual Página 159 de 168
Publicación"
Label5 Caption "" Inicialmente la etiqueta
está vacía.
DataSource Data1 Se asocia la etiqueta al
control Data1
DataField Título Se asocia la etiqueta al
campo Título
Label6 Caption "" Inicialmente la etiqueta
está vacía.
DataSource Data1 Se asocia la etiqueta al
control Data1
DataField Autor Se asocia la etiqueta al
campo Autor
Label7 Caption "" Inicialmente la etiqueta
está vacía.
DataSource Data1 Se asocia la etiqueta al
control Data1
DataField Editorial Se asocia la etiqueta al
campo Editorial
Label8 Caption "" Inicialmente la etiqueta
está vacía.
DataSource Data1 Se asocia la etiqueta al
control Data1
DataField Año de
Publicación
Se asocia la etiqueta al
campo Año de …
El menú "Opciones" tiene un solo elemento, denominado "Terminar", cuya
función será la de concluir la ejecución del programa.
Una vez diseñado el interfaz, corresponde determinar las acciones que
deben realizar los distintos controles, para, a partir de esa determinación
establecer para que eventos de esos controles tendremos que escribir
código, y por último proceder a escribir el código para esos eventos.
162 Introducción a la Programación Visual
Introducción a la Programación Visual Página 161 de 168
invocarlos desde nuestro control Datos tendremos que escribir, por ejemplo:
Figura 9-2.
Introducción a la Programación Visual 163
Data1.Recordset.FindFirst Criterio
Donde Criterio es una cadena de caracteres, bastante similar a la cláusula
WHERE de una instrucción SQL (aquí se omite la palabra WHERE), que
contiene el criterio de búsqueda. Este criterio se expresa en forma de
relaciones entre los campos y determinados valores. Por ejemplo la
instrucción:
Data1.Recordset.FindFirst " [Título] = 'La guerra y la paz' "
busca el primer registro para el cual el se cumpla que el valor del campo
Título sea "La guerra y la paz". Nótese que en la cadena de búsqueda el
nombre de los campos de escribe entre corchetes [ ] y que las expresiones
de caracteres se escriben empleando 'apóstrofes simples', en vez de
"comillas" .
Para realizar una búsqueda debe ejecutarse en primer lugar el método
FindFirst, para que encuentre al primer registro que cumpla con la criterio de
búsqueda establecido. Una vez encontrado el primer registro podemos ir
ejecutando el método FindNext para ir buscando los siguientes registros que
cumplan con el mismo criterio. Puede ocurrir que ningún registro cumpla
con el criterio de búsqueda. Nuestro programa puede detectar esa
situación consultando el valor de la propiedad NoMatch del objeto
Recordset. Esta propiedad contiene un valor lógico, que se actualiza
después de la ejecución de cada método FindFirst, FindNext, etc. Si no se
encuentra ningún registro que cumpla con el criterio de búsqueda, NoMatch
recibe el valor True , si se encuentra algún registro que cumpla, recibe el
valor False. El código para chequear NoMatch podría escribirse así:
Data1.Recordset.FindFirst " [Título] = 'El viejo y el mar' "
If Data1.Recordset.NoMatch Then ……. ' No se encontró ningún
‘ registro que cumpla con el criterio.
En los procesos de búsqueda resulta especialmente útil el operador Like,
una de las novedades de Visual Basic a las que nos referíamos en el capítulo
3. Las facilidades que brinda este operador para la comparación de
cadenas nos permiten desarrollar búsquedas muy eficaces, por ejemplo:
Introducción a la Programación Visual Página 163 de 168
Por su parte los elementos del submenú tendrán las siguientes propiedades:
Caption Name Index Checked
“&Buscar” Busca
“&Terminar” Fin
“por &Autor” Por_Autor
“por &Título” Por_Titulo
“por &Editorial” Por_Editorial
Cuando el usuario seleccione alguno de los elementos del submenú nuestro
programa debe almacenar en la variable Campo el nombre del campo que
corresponde con la selección del usuario y hacer visible la caja de
imágenes Picture1 (y con ella a todo su contenido). Veamos el
procedimiento que atiende a la selección del elemento de menú "por
Título":
Introducción a la Programación Visual 167
Sub Por_Titulo_Click( )
Campo = "[Título]" ‘ Almacena el nombre del campo ‘
‘ en el formato requerido para poder
‘ formar mas tarde el criterio de búsqueda
‘ [el nombre entre corchetes]
Picture1.Visible = True ' Hace visible la caja de imágenes Picture1
End Sub
El trabajo de los procedimientos que atienden a los otros dos elementos de
ese submenú resulta muy similar:
Sub Por_Autor_Click()
Campo = "[Autor]"
Picture1.Visible = True
End Sub
Sub Por_Editorial_Click()
Campo = "[Editorial]"
Picture1.Visible = True
End Sub
Cuando el usuario termina de escribir el patrón de búsqueda y oprime el
botón "Iniciar la búsqueda", es el momento de concluir la construcción del
criterio de búsqueda, ligando el valor almacenado en la variable Campo
Introducción a la Programación Visual Página 167 de 168
con el patrón que el usuario ha escrito en la caja de texto Text1. Una vez
hecho esto se debe ejecutar el método FindFirst para localizar el primer
registro que responda al criterio de búsqueda y, si esa búsqueda inicial
resulta exitosa podemos habilitar los botones "Próximo" y "Anterior" para
intentar el recorrido de la tabla por los restantes registros que cumplan con
el criterio de búsqueda..
Sub Command1_Click( )
Criterio = Campo & " Like '" & Text1.Text & "'"
' Se termina de elaborar el criterio de búsqueda
Data1.Recordset.FindFirst Criterio
' Se busca el primer registro que responda al
criterio
If Not Data1.Recordset.NoMatch Then
' Si existe ese primer registro
Command1.Enabled = True
' se habilitan los botones para buscar el próximo
Command2.Enabled = True ' y el anterior registro.
End If
168 Introducción a la Programación Visual
End Sub
La tarea de los botones Anterior y Próximo es sencilla:
Sub Command3_Click( )
Data1.Recordset.FindPrevious Criterio
' Busca el anterior registro que cumpla con el criterio de búsqueda.
End Sub
Sub Command4_Click()
Data1.Recordset.FindNext Criterio ' Busca el próximo registro que
cumpla
End Sub ' con el criterio de búsqueda.
Como ya se dijo, cuando el usuario modifica el patrón de búsqueda en la
caja de texto Text1 de deben inhabilitar los botones "Próximo" y "Anterior".
Sub Text1_Change()
Command3.Enabled = False ‘ Se inhabilita el botón "Anterior"
Command4.Enabled = False ‘ Se inhabilita el botón "Próximo"
Introducción a la Programación Visual Página 168 de 168
End Sub
Por último cuando el usuario decide finalizar la búsqueda se debe ocultar la
caja de imagen Picture1 para permitir al usuario continuar trabajando con el
control Datos. Pero al mismo tiempo se deben crear las condiciones para el
comienzo de la próxima búsqueda: inhabilitar los botones "Anterior" y
"Próximo" y borrar el patrón que se encuentra escrito en la caja de texto.
Sub Command3_Click()
Command1.Enabled = False ' Se inhabilita el botón "Anterior"
Command2.Enabled = False ' Se inhabilita el botón "Próximo"
Text1.Text = "" ' Se borra el contenido de la caja de texto
Picture1.Visible = False ' Se oculta la caja de imágenes.
End Sub
Con estas modificaciones nuestro programa se encuentra en condiciones
de realizar búsquedas según criterio sobre los registros de nuestra tabla.
Lamentablemente las limitaciones de espacio no nos permiten extendernos
en el rico terreno del trabajo con bases de datos desde Visual Basic, y no
podemos mostrar ejemplos del trabajo simultáneo con varias tablas ni tratar
los nuevos controles especializados en el trabajo con bases de datos que se
introducen a partir de la versión 4.0 de Visual Basic.
Introducción a la Programación Visual 169
Bibliografía.
1. Ceballos Sierra, Francisco. Enciclopedia de Visual Basic. Editorial RA-MA.
España 1994.
2. Mc Kinney, Bruce. Hard Core Visual Basic. Microsoft Press. 1995
3. CESOFTE. Curso de Visual Basic. La Habana. 1994.
4. MICROSOFT Corporation. Visual Basic 3.0 Manual del Programador. .
Microsoft Press. 1993.
5. MICROSOFT Corporation. Visual Basic 4.0 Manual del Programador. .
Microsoft Press. 1996.
6. MICROSOFT Corporation. Visual Basic 5.0 Manual del Programador. .
Microsoft Press. 1997.
7. Golden, J.T. Fortran VI Programación y Cálculo. Ediciones
Revolucionarias. La Habana 1973.