Está en la página 1de 154

MDULO III

SISTEMAS BSICOS DE INFORMACIN


SUBMDULO III
MANEJO DE UN LENGUAJE DE PROGRAMACIN ORIENTADO A OBJETOS

NDICE
1. INTRODUCCIN A VISUAL BASIC ..................................................................................... 1.1 Caractersticas de Visual Basic 1.2 Elementos que componen una aplicacin de visual Basic 1.3 Entorno de trabajo de Visual Basic 2. DISEAR UNA APLICACIN EN VISUAL BASIC ............................................................. 2.1 Comenzar un proyecto 2.2 Insertar y eliminar controles 2.3 Aadir formularios 2.4 Seleccionar controles 2.5 Borrar controles 2.6 Modificar el tamao de los controles 2.7 Mover controles 2.8 Establecer las propiedades de los objetos 2.9 Escribir el cdigo de los objetos 2.10 Guardar un proyecto 2.11 Crear un archivo ejecutable 3. COMO DISEAR UNA APLICACIN EN VISUAL BASIC ................................................ 3.1 Tipos de Datos: Variables y constantes 3.2 Funciones comunes: (Var, STRING, CHR, Date, TIME, Inputbox, MSGbox, RND) 3.3 Estructuras Variables. 4. CONTROLES, PROPIEDADES, EVENTOS Y MTODOS .................................................. 4.1 Propiedades 4.2 Propiedades Comunes 4.3 Controles: (Form, Label, Textbox, Commandbutton, Checkbox, Optionbutton, Frame, Listbox, Combobox, Timer, Image) 4.4 Arrays de Controles 4.5 Eventos (Activate, Change, Click, Dblclick, Gotfocus, Load) 4.6 Mtodos (Clear, Cls, Print, Refresh, RemoveItem, SetFocus) 5. ESTRUCTURA DE CONTROL ............................................................................................... 5.1 Sentencias de Control (Sentencia IF, Sentencia Select Case, Sentencia For next, Sentencia Do Loop, Sentencia With) 5.2 Procedimientos y funciones (Crear procedimientos, Llamadas a procedimientos, Paso de Parmetros por referencia y por Valor, Procedimientos recursivos) 5.3 Mdulos de cdigos 6. ARCHIVOS DE DATOS ............................................................................................................. 6.1 Controles de sistema de archivo (Control Drivelistbox, Control Dirlistbox, Control FileListbox, Control Commondialog) 6.2 Control de errores 6.3 Archivo de acceso secuencial (Texto) 6.4 Archivo de acceso aleatorio (Registro) 6.5 Portapapeles (Trabajar con texto seleccionado, Copiar Texto y grficos del portapapeles, Recuperar texto y grficos del portapapeles) 7. MENUS ........................................................................................................................................ 7.1 Crear un men (Mens emergentes) 7.2 Barras de herramientas (Control imagelist, Control Richtexbox) 8. BASES DE DATOS ...................................................................................................................... 8.1 Qu es una base de datos? 8.2 Controles utilizados en Bdatos (Control Data, Controles enlazados, Propiedades del control Dbgrid) 8.3 Gestin de Bdatos mediante cdigo (Movimientos, Bsquedas, Agregar registros, Modificar registros, Eliminar registros, Mtodos Refresh) ANEXO A. Consideraciones Adicionales ........................................................................................ ANEXO B. Terminologa ................................................................................................................. ANEXO C. Ejercicios Resueltos ...................................................................................................... ANEXO D. Ejercicios Propuestos ................................................................................................... 2

15

25

45

86

99

105

117

133 137 138 147


1

1. INTRODUCCIN A VISUAL BASIC


Visual Basic 6.0 es uno de los lenguajes de programacin que ms entusiasmo despiertan entre los programadores de PCs, tanto expertos como novatos. En el caso de los programadores expertos por la facilidad con la que desarrollan aplicaciones complejas en poqusimo tiempo (comparado con lo que cuesta programar en Visual C++, por ejemplo). En el caso de los programadores novatos por el hecho de ver de lo que son capaces a los pocos minutos de empezar su aprendizaje. El precio que hay que pagar por utilizar Visual Basic 6.0 es una menor velocidad o eficiencia en las aplicaciones. Visual Basic 6.0 es un lenguaje de programacin visual, tambin llamado lenguaje de 4 generacin. Esto quiere decir que un gran nmero de tareas se realizan sin escribir cdigo, simplemente con operaciones grficas realizadas con el ratn sobre la pantalla. Visual Basic 6.0 es tambin un programa basado en objetos, aunque no orientado a objetos como C++ o Java. La diferencia est en que Visual Basic 6.0 utiliza objetos con propiedades y mtodos, pero carece de los mecanismos de herencia y polimorfismo propios de los verdaderos lenguajes orientados a objetos como Java y C++. 1.1 CARACTERSTICAS DE VISUAL BASIC Visual Basic 6.0 est orientado a la realizacin de programas para Windows, pudiendo incorporar todos los elementos de este entorno informtico: ventanas, botones, cajas de dilogo y de texto, botones de opcin y de seleccin, barras de desplazamiento, grficos, mens, etc. Prcticamente todos los elementos de interaccin con el usuario de los que dispone Windows 95/98/NT/Me/2000/XP pueden ser programados en Visual Basic 6.0 de un modo muy sencillo. En ocasiones bastan unas pocas operaciones con el ratn y la introduccin a travs del teclado de algunas sentencias para disponer de aplicaciones con todas las caractersticas de Windows 95/98/NT/Me/2000/XP. La aplicacin Visual Basic de Microsoft puede trabajar de dos modos distintos: en modo de diseo y en modo de ejecucin. En modo de diseo el usuario construye interactivamente la aplicacin, colocando controles en el formulario, definiendo sus propiedades, y desarrollando funciones para gestionar los eventos. La aplicacin se prueba en modo de ejecucin. En ese caso el usuario acta sobre el programa (introduce eventos) y prueba cmo responde el programa. Hay algunas propiedades de los controles que deben establecerse en modo de diseo, pero muchas otras pueden cambiarse en tiempo de ejecucin desde el programa escrito en Visual Basic 6.0, en la forma en que ms adelante se ver. Tambin hay propiedades que slo pueden establecerse en modo de ejecucin y que no son visibles en modo de diseo. 1.2 ELEMENTOS QUE COMPONEN UNA APLICACIN DE VISUAL BASIC Formularios y Controles Cada uno de los elementos grficos que pueden formar parte de una aplicacin tpica de Windows 95/98/NT/Me/2000/XP es un tipo de control: los botones, las cajas de dilogo y de texto, las cajas de seleccin desplegables, los botones de opcin y de seleccin, las barras de desplazamiento horizontales y verticales, los grficos, los mens, y muchos otros tipos de elementos son controles para Visual Basic 6.0. Cada control debe tener un nombre a travs del cual se puede
2

hacer referencia a l en el programa. Visual Basic 6.0 proporciona nombres por defecto que el usuario puede modificar. En la terminologa de Visual Basic 6.0 se llama formulario (form) a una ventana. Un formulario puede ser considerado como una especie de contenedor para los controles. Una aplicacin puede tener varios formularios, pero un nico formulario puede ser suficiente para las aplicaciones ms sencillas. Los formularios deben tambin tener un nombre, que puede crearse siguiendo las mismas reglas que para los controles. Objetos y Propiedades Los formularios y los distintos tipos de controles son entidades genricas de las que puede haber varios ejemplares concretos en cada programa. En programacin orientada a objetos (ms bien basada en objetos, habra que decir) se llama clase a estas entidades genricas, mientras que se llama objeto a cada ejemplar de una clase determinada. Por ejemplo, en un programa puede haber varios botones, cada uno de los cuales es un objeto del tipo de control command button, que sera la clase. Cada formulario y cada tipo de control tienen un conjunto de propiedades que definen su aspecto grfico (tamao, color, posicin en la ventana, tipo y tamao de letra, etc.) y su forma de responder a las acciones del usuario (si est activo o no, por ejemplo). Cada propiedad tiene un nombre que viene ya definido por el lenguaje. Por lo general, las propiedades de un objeto son datos que tienen valores lgicos (True, False) o numricos concretos, propios de ese objeto y distintos de las de otros objetos de su clase. As pues, cada clase, tipo de objeto o control tiene su conjunto de propiedades, y cada objeto o control concreto tiene unos valores determinados para las propiedades de su clase. Casi todas las propiedades de los objetos pueden establecerse en tiempo de diseo y tambin casi siempre- en tiempo de ejecucin. En este segundo caso se accede a sus valores por medio de las sentencias del programa, en forma anloga a como se accede a cualquier variable en un lenguaje de programacin. Para ciertas propiedades sta es la nica forma de acceder a ellas. Por supuesto Visual Basic 6.0 permite crear distintos tipos de variables, como ms adelante se ver. Se puede acceder a una propiedad de un objeto por medio del nombre del objeto a que pertenece, seguido de un punto y el nombre de la propiedad, como por ejemplo optColor.objName. Nombres de objetos En principio cada objeto de Visual Basic 6.0 debe tener un nombre, por medio del cual se hace referencia a dicho objeto. El nombre puede ser el que el usuario desee, e incluso Visual Basic 6.0 proporciona nombres por defecto para los diversos controles. Estos nombres por defecto hacen referencia al tipo de control y van seguidos de un nmero que se incrementa a medida que se van introduciendo ms controles de ese tipo en el formulario (por ejemplo VScroll1, para una barra de desplazamiento -scroll bar- vertical, HScroll1, para una barra horizontal, etc.). Los nombres por defecto no son adecuados porque hacen referencia al tipo de control, pero no al uso que de dicho control est haciendo el programador. Por ejemplo, si se utiliza una barra de desplazamiento para introducir una temperatura, conviene que su nombre haga referencia a la palabra temperatura, y as cuando haya que utilizar ese nombre se sabr exactamente a qu control corresponde. Un nombre adecuado sera por ejemplo hsbTemp, donde las tres primeras letras indican que se trata de una horizontal scroll bar, y las restantes (empezando por una mayscula) que
3

servir para definir una temperatura. Existe una convencin ampliamente aceptada que es la siguiente: se utilizan siempre tres letras minsculas que indican el tipo de control, seguidas por otras letras (la primera mayscula, a modo de separacin) libremente escogidas por el usuario, que tienen que hacer referencia al uso que se va a dar a ese control. En la tabla siguiente se muestra las abreviaturas de los controles ms usuales, junto con la nomenclatura inglesa de la que derivan: Abreviatura chk cmd drv frm hsb lbl lst opt shp tmr Eventos Ya se ha dicho que las acciones del usuario sobre el programa se llaman eventos. Son eventos tpicos el hacer clic sobre un botn, el hacer doble clic sobre el nombre de un archivo para abrirlo, el arrastrar un icono, el pulsar una tecla o combinacin de teclas, el elegir una opcin de un men, el escribir en una caja de texto, o simplemente mover el ratn. Ms adelante se vern los distintos tipos de eventos reconocidos por Windows 95/98/NT/Me/2000/XP y por Visual Basic 6.0. Cada vez que se produce un evento sobre un determinado tipo de control, Visual Basic 6.0 arranca una determinada funcin o procedimiento que realiza la accin programada por el usuario para ese evento concreto. Estos procedimientos se llaman con un nombre que se forma a partir del nombre del objeto y el nombre del evento, separados por el carcter (_), como por ejemplo txtBox_click, que es el nombre del procedimiento que se ocupar de responder al evento click en el objeto txtBox. Mtodos Los mtodos son funciones que tambin son llamadas desde programa, pero a diferencia de los procedimientos no son programadas por el usuario, sino que vienen ya pre-programadas con el lenguaje. Los mtodos realizan tareas tpicas, previsibles y comunes para todas las aplicaciones. De ah que vengan con el lenguaje y que se libere al usuario de la tarea de programarlos. Cada tipo de objeto o de control tiene sus propios mtodos. Por ejemplo, los controles grficos tienen un mtodo llamado Line que se encarga de dibujar lneas rectas. De la misma forma existe un mtodo llamado Circle que dibuja circunferencias y arcos de circunferencia Es obvio que el dibujar lneas rectas o circunferencias es una tarea comn para todos los programadores y que Visual Basic 6.0 da ya resuelta. Proyectos Cada aplicacin que se empieza a desarrollar en Visual Basic 6.0 es un nuevo proyecto. Un
4

Control check box command button drive list box form horizontal scroll bar label list option button shape timer

Abreviatura cbo dir fil fra img lin mnu pct txt vsb

Control combo y drop-list box dir list box file list box frame image line menu pictureBox text Edicin box vertical scroll bar

proyecto comprende otras componentes ms sencillas, como por ejemplo los formularios (que son las ventanas de la interfase de usuario de la nueva aplicacin) y los mdulos (que son conjuntos de funciones y procedimientos sin interfase grfica de usuario). 1.3 EL ENTORNO DE PROGRAMACIN VISUAL BASIC 6.0 El Entorno Integrado de Desarrollo (IDE). Cuando se arranca Visual Basic 6.0 aparece en la pantalla una configuracin similar a la mostrada en la Figura 1.1. En ella se pueden distinguir los siguientes elemetos:
Barra de Mens y Barra de Herramientas Diseador de formularios Explorador de Proyectos

Cuadro de Herramientas

Ventana de Cdigo Ventana de Propiedades

Figura 1.1 Entorno de trabajo de Visual Basic

1. 2. 3. 4.

La barra de ttulos, la barra de mens y la barra de herramientas de Visual Basic 6.0 en modo Diseo (parte superior de la pantalla). Caja de herramientas (toolbox) con los controles disponibles (a la izquierda de la ventana). Formulario (form) en gris, en que se pueden ir situando los controles (en el centro). Est dotado de una rejilla (grid) para facilitar la alineacin de los controles. Ventana de proyecto, que muestra los formularios y otros mdulos de programas que
5

5.

6.

forman parte de la aplicacin (arriba a la derecha). Ventana de Propiedades, en la que se pueden ver las propiedades del objeto seleccionado o del propio formulario (en el centro a la derecha). Si esta ventana no aparece, se puede hacer visible con la tecla <F4>. Ventana Posicin del formulario, que permite determinar la forma en que se abrir la aplicacin cuando comience a ejecutarse (abajo a la derecha).

Existen otras ventanas para edicin de cdigo (Editor de cdigo) y para ver variables en tiempo de ejecucin con el Depurador o Debugger (ventanas Inmediato, Locales y de Inspeccin). Todo este conjunto de herramientas y de ventanas es lo que se llama un entorno integrado de desarrollo o IDE (Integrated Development Environment). Construir aplicaciones con Visual Basic 6.0 es muy sencillo: basta crear los controles en el formulario con ayuda de la Caja de herramientas y del ratn, establecer sus propiedades con ayuda de la ventana de propiedades y programar el cdigo que realice las acciones adecuadas en respuesta a los eventos o acciones que realice el usuario. La barra de mens y las barras de herramientas La barra de mens de Visual Basic 6.0 resulta similar a la de cualquier otra aplicacin de Windows, tal y como aparece en la Figura 1.3. Bajo dicha barra aparecen las barras de herramientas, con una serie de botones que permiten acceder fcilmente a las opciones ms importantes de los mens. En Visual Basic 6.0 existen cuatro barras de herramientas: Depurar, Edicin, Editor de formularios y Estndar (ver figura 1.2), por defecto slo aparece la barra Estndar, aunque en la Figura 1.3 se muestran las cuatro. Haciendo clic con el botn derecho sobre cualquiera de las barras de herramientas aparece un men contextual con el que se puede hacer aparecer y ocultar cualquiera de las barras. Al igual que en otras aplicaciones de Windows 95/98/NT/Me/2000/XP, tambin pueden modificarse las barras aadiendo o eliminando botones (opcin Personalizar).
Figura 1.2 En el men Ver podemos abrir o cerrar las barras de herramientas de Visual Basic

Figura 1.3 Barra de mens y barras de herramientas de Visual Basic 6.0.

En la barra de herramientas Standard tambin se pueden ver a la derecha dos recuadros con nmeros, que representan cuatro propiedades del formulario referentes a su posicin y tamao que se vern ms adelante: Top y Left, que indican la posicin de la esquina superior izquierda del formulario, y tambin Height y Width, que describen el
Figura 1.4 Informacin visual sobre el tamao de un control.

tamao del mismo en unas unidades llamadas twips, que se corresponden con la vigsima parte de un punto (una pulgada tiene 72
6

puntos, o lo es lo mismo: 1440 twips). Las dimensiones de un control aparecen tambin cuando con el ratn se arrastra sobre el formulario, segn se puede ver en la Figura 1.4. Los botones de la barra de herramientas Estndar responden a las funciones ms importantes: abrir y/o guardar nuevos proyectos, aadir formularios, hacer visibles las distintas ventanas del entorno de desarrollo, etc. Todos los botones tienen su correspondiente comando en alguno de los mens. Son importantes los botones que permiten arrancar y/o parar la ejecucin de un proyecto, pasando de modo diseo a modo de ejecucin y viceversa. . El men Archivo tiene pocas novedades. Lo ms importante es la distincin entre proyectos y todos los dems archivos. Como ya se ha dicho, un proyecto rene y organiza todos los archivos que componen el programa o aplicacin (hace la funcin de una carpeta que contuviera apuntes). Estos archivos pueden ser formularios, mdulos, clases, recursos, etc. Visual Basic 6.0 permite tener ms de un proyecto abierto simultneamente, lo cual puede ser til en ocasiones. Con el comando Agregar proyecto se aade un nuevo proyecto en la ventana Explorador de proyectos. Con los comandos Abrir proyecto o Nuevo proyecto se abre o se crea un nuevo proyecto, pero cerrando el o los proyectos que estuvieran abiertos previamente. Tampoco el men Edicin aporta cambios importantes sobre lo que es habitual. Por el contrario el men Ver, generalmente de poca utilidad, es bastante propio de Visual Basic 6.0. Este men permite hacer aparecer en pantalla las distintas ventanas del entorno de desarrollo, as como acceder a un formulario o al cdigo relacionado con un control (que tambin aparece si se hace clic dos veces en dicho control), y manejar funciones y procedimientos. El men Proyecto permite aadir distintos tipos de elementos a un proyecto (formularios, mdulos, etc.). Con Proyecto/Propiedades se puede elegir el tipo de proyecto y determinar el formulario con el que se arrancar la aplicacin (Objecto inicial). En el mismo men Proyecto con el comando Componentes se pueden aadir nuevos controles a la Caja de Herramientas que aparece a la izquierda de la pantalla. (ver Figura 1.5) El men Formato contiene opciones para controlar el aspecto de la aplicacin (alinear controles, espaciarlos uniformemente, etc.). Los mens Depuracin y Ejecutar permiten controlar la ejecucin de las aplicaciones. Con Figura 1.5 Ventana de Componentes del Men Proyecto. Depuracin se puede ver en detalle cmo funcionan, ejecutando paso a paso, yendo hasta una lnea de cdigo determinada, etc. Esto es especialmente til cuando haya que encontrar algunos errores ejecutando paso a paso, o viendo resultados intermedios. En el men Herramientas se encuentran los comandos para arrancar el Editor de mens y para establecer las opciones del programa. En Herramientas/Opciones se encuentran las opciones relativas al proyecto en el que se trabaja. La lengeta Entorno determina las propiedades del entorno del proyecto, como las opciones para actualizar o no los archivos antes de cada ejecucin; en
7

General se establece lo referente a la retcula o grid que aparece en el formulario; Editor permite establecer la necesidad de declarar todas las variables junto con otras opciones de edicin, como si se quieren ver o no todos los procedimientos juntos en la misma ventana, y si se quiere ver una lnea separadora entre procedimientos; Formato del editor permite seleccionar el tipo de letra y los cdigos de color con los que aparecen los distintos elementos del cdigo. La opcin Avanzado hace referencia entre otras cosas a la opcin de utilizar Visual Basic 6.0 en dos formatos SDI (Single Document Interface) y MDI. Por ltimo, la ayuda (siempre imprescindible y en el caso de Visual Basic 6.0 particularmente bien hecha) que se encuentra en el men Ayuda, se basa fundamentalmente en una clasificacin temtica ordenada de la informacin disponible (Contenido), en una clasificacin alfabtica de la informacin (ndice) y en la bsqueda de informacin sobre algn tema por el nombre (Bsqueda). Como ya se ha mencionado, la tecla <F1> permite una ayuda directa sensible al contexto, esto es dependiente de donde se haya hace clicdo con el ratn (o de lo que est seleccionado). La Caja de herramientas (Toolbox) La Figura 5 muestra la caja de herramientas, que incluye los controles con los que se puede disear la pantalla de la aplicacin. Estos controles son por ejemplo botones, etiquetas, cajas de texto, zonas grficas, etc. Para introducir un control en el formulario simplemente hay que hacer clic en el icono adecuado de la Toolbox y colocarlo en el formulario con la posicin y el tamao deseado, haciendo clic y arrastrando con el ratn. Haciendo clic dos veces sobre el icono de un control aparece ste en el centro del formulario y se puede modificar su tamao y/o trasladar con el ratn como se desee. El nmero de controles que pueden aparecer en esta ventana vara con la configuracin del sistema. Para introducir nuevos componentes se utiliza el comando Components en el men Proyecto, con lo cual se abre el cuadro de dilogo mostrado en la Figura 1.6. FORMULARIOS (FORMS) Y MDULOS Los formularios son las zonas de la pantalla sobre las que se disea el programa y sobre las que se sitan los controles o herramientas de la Toolbox. Al ejecutar el programa, el form se convertir en la ventana de la aplicacin, donde aparecern los botones, el texto, los grficos, etc.
Figura 1.6

Para lograr una mejor presentacin existe una malla o cuadrcula (grid) que Caja de Herramientas permite alinear los controles manualmente de una forma precisa (evitando tener que (Toolbox) introducir coordenadas continuamente). Esta malla slo ser visible en el proceso de diseo del programa; al ejecutarlo no se ver. De cualquier forma, se puede desactivar la malla o cambiar sus caractersticas en el men Herramientas/Opciones/General, cambiando la opcin Forzar controles a cuadrcula. Exteriormente, los formularios tienen una estructura similar a la de cualquier ventana. Sin embargo, tambin poseen un cdigo de programacin que estar escrito en Basic, y que controlar algunos aspectos del formulario, sobre todo en la forma de reaccionar ante las acciones del usuario (eventos). El formulario y los controles en l situados sern el esqueleto o la base del programa. Una aplicacin puede tener varios formularios, pero siempre habr uno con el que arrancar la
8

aplicacin; este formulario se determina a partir del men Proyecto/Propiedades, en Startup Objects. Resumiendo, cuando se vaya a crear un programa en Visual Basic 6.0 habr que dar dos pasos: 1. Disear y preparar la parte grfica (formularios, botones, mens, etc.) 2. Realizar la programacin que gestione la respuesta del programa ante los distintos eventos. LA VENTANA DE PROYECTO (PROJECT) Esta ventana, mostrada en la Figura 1.7, permite acceder a los distintos formularios y mdulos que componen el proyecto. Desde ella se puede ver el diseo grfico de dichos formularios (botn Ver Objeto ), y tambin permite editar el cdigo que contienen (botn Ver Cdigo ). Estos botones estn situados en la parte superior de la ventana, debajo de la barra de ttulos. Los mdulos estndar (archivos *.bas) contienen slo cdigo que, en general, puede ser utilizado por distintos formularios y/o controles del proyecto e incluso por varios Figura 1.7. Ventana de proyecto proyectos. Por ejemplo puede prepararse un mdulo estndar de funciones matemticas que sea de utilidad general. Normalmente contienen siempre algunas declaraciones de variables globales o Public, que sern accesibles directamente desde todos los formularios. Los mdulos de clase (archivos *.cls) contienen clases definidas por el usuario. Las clases son como formularios o controles complejos, sin interface grfica de usuario. LA VENTANA DE PROPIEDADES (PROPERTIES) Todos los objetos Visual Basic 6.0 tienen unas propiedades que los definen: su nombre (Name), su etiqueta o ttulo (Caption), el texto que contiene (Text), su tamao y posicin, su color, si est activo o no (Enabled), etc. La Figura 1.8 muestra parcialmente las propiedades de un formulario. Todas estas propiedades se almacenan dentro de cada control o formulario en forma de estructura (similar a las del lenguaje C). Por tanto, si por ejemplo en algn momento se quiere modificar el nombre de un botn basta con hacerlo en la ventana de propiedades (al disear el programa) o en el cdigo en Basic (durante la ejecucin), mediante el operador punto (.), en la forma:
Boton1.Name = "NuevoNombre"

Figura 1.8. Ventana de propiedades.

Para realizar una modificacin de las propiedades de un objeto durante el diseo del programa, se activar la ventana de propiedades (con el men, con el botn de la barra de herramientas o pulsando <F4>). Esta ventana tiene dos lengetas, que permiten ordenar las propiedades alfabticamente o por categoras. Utilizando la forma que sea ms cmoda se localizar con ayuda de la barra de desplazamiento la propiedad que se quiera modificar. Al hacer clic sobre ella puede activarse un men
9

desplegable con las distintas opciones, o bien puede modificarse directamente el valor de la propiedad. Si esta propiedad tiene slo unos valores fijos (por ejemplo, los colores), puede abrirse un cuadro de dilogo para elegir un color, o el tamao y tipo de letra que se desee si se trata de una propiedad Font. La Figura 1.9 muestra la ventana FormLayout, que permite
Figura 1.9. Posicin del formulario.

determinar la posicin en la que el formulario aparecer sobre la pantalla cuando se haga visible al ejecutar la aplicacin.

UTILIZACIN DEL CODE EDITOR El editor de cdigo o Code Editor de Visual Basic 6.0 es la ventana en la cual se escriben las sentencias del programa. Esta ventana presenta algunas caractersticas muy interesantes que conviene conocer para sacar el mximo partido a la aplicacin. Para abrir la ventana del editor de cdigo se elige Code en el men View. Tambin se abre haciendo clic en el botn View Code de la Proyecto Window, o haciendo clic dos veces en el formulario o en cualquiera de sus controles. Cada formulario, cada mdulo de clase y cada mdulo estndar tienen su propia ventana de cdigo. La Figura 1.10 muestra un Figura 1.10. Ventana del editor de cdigo aspecto tpico de la ventana de cdigo. Aunque el aspecto de dicha ventana no tiene nada de particular, el Code Editor de Visual Basic 6.0 ofrece muchas ayudas al usuario que requieren una explicacin ms detenida. En primer lugar, el Code Editor utiliza un cdigo de colores (accesible y modificable en Herramientas/Opciones/Formato del Editor) para destacar cada elemento del programa. As, el cdigo escrito por el usuario aparece en negro, las palabras clave de Basic en azul, los comentarios en verde, los errores en rojo, etc. Esta simple ayuda visual permite detectar y corregir problemas con ms facilidad. En la parte superior de esta ventana aparecen dos listas desplegables. La de la izquierda corresponde a los distintos elementos del formulario (la parte General, que es comn a todo el formulario; el propio formulario y los distintos controles que estn incluidos en l). La lista desplegable de la derecha muestra los distintos procedimientos que se corresponden con el elemento seleccionado en la lista de la izquierda. Por ejemplo, si en la izquierda est seleccionado un botn de comando, en la lista de la derecha aparecer la lista de todos los posibles procedimientos Sub que pueden generar sus posibles eventos. Estas dos listas permiten localizar fcilmente el cdigo que se desee programar o modificar. El cdigo mostrado en la Figura 1.10 contiene en la parte superior una serie de declaraciones
10

de variables y la opcin de no permitir utilizar variables no declaradas (Option Explicit). sta es la parte General de cdigo del formulario. En esta parte tambin se pueden definir funciones y procedimientos Sub no relacionados con ningn evento o control en particular. A continuacin aparecen dos procedimientos Sub (el segundo de ellos incompleto) que se corresponden con el evento Click del botn cmdSalir y con el evento Load del formulario. Estos procedimientos estn separados por una lnea, que se activa con Separador de procedimientos en Herramientas/Opciones/Editor. Para ver todos los procedimientos del formulario y de sus controles simultneamente en la misma ventana (con o sin separador) o ver slo un procedimiento (el seleccionado en las listas desplegables) se pueden utilizar los dos pequeos botones que aparecen en la parte inferior izquierda de la ventana. El primero de ellos es el Procedure View y el segundo el Full Module View. Esta opcin est tambin accesible en Herramientas/Opciones/Editor. Otra opcin muy interesante es la de completar automticamente el cdigo (Completar cdigo automticamente). La Figura 1.11 muestra cmo al teclear el punto (o alguna letra inicial de una propiedad despus del punto) detrs del nombre de un objeto, automticamente se abre una lista con las propiedades de ese objeto. Pulsando la tecla <Tab> se introduce el nombre completo de la propiedad seleccionada. A esta caracterstica se le conoce como AutoListMembers. Por otra parte, la opcin AutoQuickInfo hace que al comenzar a teclear el nombre de una funcin aparezca informacin sobre esa funcin: nombre, argumentos y valor de retorno (ver Figura 1.12). Tanto la opcin AutoListMembers como la opcin AutoQuickInfo se activan en el cuadro de dilogo que se abre con Herramientas/Opciones/Editor.

Figura 1.11. Insercin automtica de propiedades.

Figura 1.12. Ayuda para insercin de funciones.

UTILIZACIN DE LA DEPURACIN (DEBUGGER) Cualquier programador con un mnimo de experiencia sabe que una parte muy importante (muchas veces la mayor parte) del tiempo destinado a la elaboracin de un programa se destina a la deteccin y correccin de errores. Casi todos los entornos de desarrollo disponen hoy en da de potentes herramientas que facilitan la depuracin de los programas realizados. La herramienta ms utilizada para ello es el Depurador o Debugger. La caracterstica principal del Debugger es que permite ejecutar parcialmente el programa, deteniendo la ejecucin en el punto deseado y estudiando en cada momento el valor de cada una de las variables. De esta manera se facilita enormemente el descubrimiento de las fuentes de errores.

11

Ejecucin controlada de un programa Para ejecutar parcialmente un programa se pueden utilizar varias formas. Una de ellas consiste en incluir breakpoints (puntos de parada de la ejecucin) en determinadas lneas del cdigo. Los breakpoints se indican con un punto grueso en el margen y un cambio de color de la lnea, tal como se ve en la Figura 1.13. En esta figura se muestra tambin la barra de herramientas Debug. El colocar un breakpoint en una lnea de cdigo implica que la ejecucin del programa se detendr al llegar a esa lnea. Para insertar un breakpoint en una lnea del cdigo se utiliza la opcin Toggle Breakpoint del men Debug, con el botn del

Figura 1.13. Utilizacin del Debugger

mismo nombre ( ) o pulsando la tecla <F9>, estando el cursor posicionado sobre la lnea en cuestin. Para borrarlo se repite esa operacin. Cuando la ejecucin est detenida en una lnea aparece una flecha en el margen izquierdo, tal como puede verse tambin en la Figura 1.13. En ese momento se puede consultar el valor de cualquier variable que sea accesible desde ese punto en la ventana de depuracin (Debug Window). Un poco ms adelante se vern varias formas de hacer esto. En la Figura 1.13 se puede observar como la ejecucin del programa est detenida en la lnea coloreada o recuadrada, con una flecha en el margen izquierdo. Se puede observar tambin la variacin del color de fondo de la lnea anterior debido a que en ella hay un breakpoint. De todos modos no es estrictamente necesaria la utilizacin de breakpoints para la ejecucin parcial de un programa. Esto se puede hacer tambin ejecutando el programa paso a paso (o lnea a lnea). Para hacer esto hay varias opciones: pulsando la tecla <F8>, seleccionando la opcin Step Into del men Run o haciendo clic en el botn correspondiente ( ). Esta instruccin hace que se ejecute una lnea del cdigo. En el caso de que sta se trate de la llamada a un procedimiento o funcin, la ejecucin se trasladar a la primera lnea de ese procedimiento o funcin. En el caso de que se desee ejecutar toda la funcin en un nico paso (por ejemplo porque se tiene constancia de que esa funcin funciona correctamente) se puede hacer mediante la opcin Step Over, pulsando las teclas <maysculas> y <F8> simultneamente, o haciendo clic en el botn correspondiente ( ). En este caso la ejecucin se traslada a la lnea inmediatamente posterior a la llamada a la funcin. En el caso de que la lnea a ejecutar no sea la llamada a una funcin ambas opciones (Step Into y Step Over) operan idnticamente. El comando y botn Step Out ( ) hace que se salga de la funcin o procedimiento que se est ejecutando y que la ejecucin se detenga en la sentencia inmediatamente siguiente a la llamada a dicha funcin o procedimiento. La utilizacin del Debugger permite tambin otras opciones muy interesantes como la de ejecutar el programa hasta la lnea en la que se encuentre posicionado el cursor (con Step To Cursor o Ctrl+<F8>); la de continuar con la ejecucin del programa hasta el siguiente breakpoint en el caso de que lo haya o hasta el final del mismo si no hay ninguno (con Continue, botn o <F5>); y la posibilidad de volver a comenzar la ejecucin (con Restart o Maysculas + <F5>). Adems de las ya
12

mencionadas, tambin existe la posibilidad de detener momentneamente la ejecucin del programa mediante el botn Pause ( ) o la combinacin de teclas Ctrl+Pausa. Ventanas Immediate, Locals y Watches

Figura 1.14. Ventana Immediate.

Figura 1.15. Ventana Locals.

El Debugger de Visual Basic 6.0 dispone de varias formas para consultar el valor de variables y propiedades, as como para ejecutar funciones y procedimientos comprobando su correcto funcionamiento. En ello juegan un papel importante tres tipos de ventanas: Immediate, Locals y Watch. La ventana Immediate (ver Figura 1.14) permite realizar diversas acciones: 1. Imprimir el valor de cualquier variable y/o propiedad accesible la funcin o procedimiento que se est ejecutando. Esto se puede hacer utilizando el mtodo Print VarName (o su equivalente ?VarName) directamente en dicha ventana o introduciendo en el cdigo del programa sentencias del tipo Debug.Print VarName. En este ltimo caso el valor de la variable o propiedad se escribe en la ventana Immediate sin necesidad de parar la ejecucin del programa. Adems esas sentencias se guardan con el formulario y no hay que volver a escribirlas para una nueva ejecucin. Cuando se compila el programa para producir un ejecutable las sentencias Debug.Print son ignoradas. 2. Asignar valores a variables y propiedades cuando la ejecucin est detenida y proseguir la ejecucin con los nuevos valores. Sin embargo, no se pueden crear nuevas variables. 3. Ejecutar expresiones y probar funciones y procedimientos incluyendo en la ventana Immediate la llamada correspondiente. La ventana Locals, mostrada en la Figura 1.15, muestra el valor de todas las variables visibles en el procedimiento en el que est detenida la ejecucin. Otra opcin que puede resultar til es la de conocer permanentemente el valor de una variable sin tener que consultarlo cada vez. Para conocer inmediatamente el valor de una variable se puede utilizar la ventana Quick Watch, mostrada en la Figura 1.16. Para observar continuamente el valor de una variable, o expresin hay que aadirla a la Figura 1.16. Ventana Quick Watch ventana Watches. Esto se hace con la opcin Add Watch del men Debug. El valor de las variables incluidas en la ventana Watches se actualiza automticamente, indicndose tambin cuando no son accesibles desde el procedimiento que se est ejecutando (Out of Context).

13

La ventana Add Watch mostrada en la Figura 1.17 permite introducir Breaks o paradas del programa condicionales, cuando se cumple cierta condicin o cuando el valor de la variable cambia. Las capacidades de Visual Basic 6.0 para vigilar el valor de las variables pueden activarse desde el men Debug o con algunos botones en la barra de herramientas Debug ( ).

Otras posibilidades del Debugger El Debugger de Visual Basic 6.0 permite no slo saber qu sentencia va a ser la prxima en ejecutarse (con Debug/Show Next Statement), sino tambin Figura 1.17. Ventana Add Watch decidir cul va a ser dicha sentencia (con Debug/Set Next Statement), pudiendo cambiar de esta forma el curso habitual de la ejecucin: saltando sentencias, volviendo a una sentencia ya ejecutada, etc. Visual Basic 6.0 puede dar tambin informacin sobre las llamadas a funciones y procedimientos. Esto se hace con el comando View/Call Stack o con el botn correspondiente de la barra Debug ( ). De esta manera puede conocerse qu funcin ha llamado a qu funcin hasta la sentencia donde la ejecucin est detenida.

14

2. DISEAR UNA APLICACIN EN VISUAL BASIC


2.1 Comenzar un proyecto Algoritmos Un algoritmo es en un sentido amplio una secuencia de pasos o etapas que conducen a la realizacin de una tarea. Los primeros algoritmos nacieron para resolver problemas matemticos. Antes de escribir un programa de ordenador, hay que tener muy claro el algoritmo, es decir, cmo se va a resolver el problema considerado. Es importante desarrollar buenos algoritmos (correctos y eficientes). Una vez que el algoritmo est desarrollado, el problema se puede resolver incluso sin entenderlo. Ejemplo: Algoritmo de Euclides para calcular el m.c.d. de dos nmeros enteros A y B 1. Asignar a M el valor de A, y a N el valor de B. 2. Dividir M por N, y llamar R al resto. 3. Si R distinto de 0, asignar a M el valor de N, asignar a N el valor de R, volver a comenzar la etapa 2. 4. Si R = 0, N es el m.c.d. de los nmeros originales Es muy fcil pasar a Visual Basic este algoritmo:
Dim a, b As Integer a = 45: b = 63 ' Estos son los valores M y N If a < b Then ' Se permutan a y b temp = a : a = b : b = temp End If m = a : n = b : resto = m Mod n ' Mod devuelve el valor del resto While resto <> 0 ' Mientras el resto sea distinto de 0 m = n: n = resto: resto = m Mod n Wend ' La solucin es la variable n. En este caso el resultado es 9

Si son necesarios, deben existir criterios de terminacin claros (por ejemplo, para calcular seno(x) por desarrollo en serie se deber indicar el nmero de trminos de la serie). No puede haber etapas imposibles (por ejemplo: "imprimir el conjunto de todos los nmeros enteros"). Representacin de algoritmos Existen diversas formas de representar algoritmos. A continuacin se presentan algunas de ellas: Detallada: Se trata de escribir el algoritmo en un determinado lenguaje de programacin (lenguaje de mquina, ensamblador, fortran, basic, pascal, C, Matlab, Visual Basic, ...). Simblica: Las etapas son descritas con lenguaje prximo al natural, con el grado de detalle adecuado a la etapa de desarrollo del programa. Grfica: por medio de diagramas de flujo.

La sintaxis (el modo de escribir) debe representar correctamente la semntica (el contenido). La sintaxis debe ser clara, sencilla y accesible. En cualquier caso e independientemente del tipo de
15

representacin utilizada lo importante es tener muy claro el algoritmo a realizar y ponerlo por escrito en forma de esquema antes de ponerse a programarlo. Merece la pena pasar unos minutos realizando un esquema sobre papel antes de ponerse a teclear el cdigo sobre un teclado de ordenador. Proyectos y mdulos Un proyecto realizado en Visual Basic 6.0 es el conjunto de todos los archivos o mdulos necesarios para que un programa funcione. La informacin referente a esos archivos se almacena en un archivo del tipo ProjectName.vbp. La extensin *.vbp del archivo hace referencia a Visual Basic Project. Si se edita este archivo con cualquier editor de texto se comprueba que la informacin que almacena es la localizacin en los discos de los mdulos que conforman ese proyecto, los controles utilizados (archivos con extensin .ocx), etc. En el caso ms simple un proyecto est formado por un nico formulario y constar de dos archivos: el que define el proyecto (*.vbp) y el que define el formulario (*.frm). Los mdulos que forman parte de un proyecto pueden ser de varios tipos: aquellos que estn asociados a un formulario (*.frm), los que contienen nicamente lneas de cdigo Basic (*.bas) llamados mdulos estndar y los que definen agrupaciones de cdigo y datos denominadas clases (*.cls), llamados mdulos de clase. Un mdulo *.frm est constituido por un formulario y toda la informacin referente a los controles (y a sus propiedades) en l contenidos, adems de todo el cdigo programado en los eventos de esos controles y, en el caso de que existan, las funciones y procedimientos propios de ese formulario. En general se llama funcin a una porcin de cdigo independiente que realiza una determinada actividad. En Visual Basic existen dos tipos de funciones: las llamadas function, que se caracterizan por tener valor de retorno, y los procedimientos o procedures, que no lo tienen. En otros lenguajes, como C/C++/Java, las function realizan los dos papeles. Un mdulo de cdigo estndar *.bas contendr una o varias funciones y/o procedimientos, adems de las variables que se desee, a los que se podr acceder desde cualquiera de los mdulos que forman el proyecto. Qu es un proyecto? Cuando desarrolla una aplicacin, Visual Basic crea un archivo especial llamado Archivo de Proyecto para administrar todos los dems archivos de la aplicacin. El Archivo de Proyecto es simplemente una lista de todos los archivos y objetos asociados con el proyecto, as como informacin sobre las opciones del entorno. Esta informacin se actualiza cada vez que se guarda el proyecto. Todos los archivos y objetos tambin se pueden compartir con otros proyectos. Un proyecto est compuesto por los archivos que se muestran en la Tabla 2.1. Cuando ha completado todos los archivos del proyecto puede convertir el proyecto en un archivo ejecutable (.exe). Pasos para crear una aplicacin El proceso de creacin de una aplicacin Visual Basic puede descomponer en una serie de siete pasos.

16

1. Crear la interfaz de usuario. Se crea una interfaz dibujando controles y objetos sobre un formulario. A fin de hacer que su cdigo sea ms fcil de leer y depurar, debe luego asignar nombres a los objetos usando convenciones de nombres estndar. 2. Establecer las propiedades de los objetos de la interfaz. Luego de aadir objetos al formulario, se establece las propiedades de los objetos. Puede establecer valores iniciales ya sea usando la ventana de propiedades en tiempo de diseo o escribiendo cdigo para modificar las propiedades en tiempo de ejecucin. 3. Escribir cdigo para los eventos. Luego de establecer las propiedades iniciales para el formulario y cada objeto, aada el cdigo que se ejecutar en respuesta a los eventos. Los eventos ocurren cuando diferentes acciones ocurren sobre un control u objeto. Por ejemplo, clic es un evento que puede ocurrir para un botn de comando. 4. Guardar el proyecto. Cuando crea el proyecto, asegrese de darle un nombre usando el comando Guardar Proyecto como del men Archivo. Guarde su proyecto frecuentemente conforme aada cdigo. Al guardar un proyecto se guardan cada formulario y mdulo de cdigo en el proyecto. 5. Probar y depurar la aplicacin. Conforme aada cdigo al proyecto, puede usar el comando Iniciar en la Barra de Herramientas para ejecutar su aplicacin y ver su comportamiento. Tambin puede usar las herramientas de depuracin para verificar errores y modificar cdigo. 6. Crear un archivo ejecutable. Al completar su proyecto, crear un archivo ejecutable usando el comando Generar Xxxxxxx.exe del men Archivo. 7. Crear una aplicacin de instalacin. Debido a que su archivo ejecutable depende de otros archivos, tales como el archivo en tiempo de ejecucin de Visual Basic (Vbrun50032.dll), algunos archivos OCX y archivos DLL adicionales requeridos por la aplicacin o por los controles ActiveX.
Tipo de archivo Proyecto Formulario Mdulo estndar Controles Personalizados Mdulo de clase Recursos Extensin Descripcin .vbp Realiza el seguimiento de todos los componentes de la aplicacin. Incluye el formulario, los objetos sobre el formulario y el cdigo .frm .frx que se ejecuta cuando ocurre un evento en el formulario. Contiene procedimientos Sub y Function que pueden ser .bas invocados por cualquier formulario u objeto sobre el formulario. Controles adicionales a los controles estndar proporcionados por .ocx Microsoft u otras empresas. (opcional) Contiene la definicin de clase, mtodos y propiedades de un .cls nuevo tipo de objeto. Contiene informacin binaria usada por la aplicacin. Son usados .res generalmente cuando se crean programas para mltiples lenguajes.

Tabla 2.1 Archivos de los que consta un proyecto de Visual Basic

2.2 INSERTAR Y ELIMINAR CONTROLES Mtodo 1 Teniendo el cuadro de Herramientas o un Formulario visible, haga doble clic en el control que desea aadir en la Caja de Herramientas, los controles se ubican en el centro del formulario, uno encima de otro, luego hay que moverlos a la posicin deseada dentro del formulario. Mtodo 2 1. Haga clic sobre el control en la Caja de Herramientas.
17

2. Ubique el puntero del Mouse (una cruz) sobre el formulario en la esquina superior izquierda donde desea colocar el control. 3. Realice un clic sostenido mientras arrastra el puntero a la esquina superior derecha donde colocar el control. 4. Suelte el botn del Mouse. Estos cuatro pasos se repiten con cada control que desea aadir al formulario. En la figura 2.1 podemos ver ste segundo mtodo.

Figura 2.1 Insertar controles seleecionndolos del la Caja de Herramientas con el mouse.

2.3 AADIR FORMULARIOS Para aadir formulario, basta con hacer clic derecho en la ventana de Explorador de proyectos tal y como se ve en la Figura 2.2a y seleecionar Agregar/Formulario. Tambin desde el men Proyecto/Agregar fomulario. A continuacin aparece una ventana (ver Figura 2.2b) donde seleccionamos el tipo de formulario que deseemos agregar. El nuevo formulario creado ser parte del proyecto ya iniciado, es decir, una nueva ventana que ser llamado con algn control o men definido por el programador.

Figura 2.2a. Agregar un formulario haciendo clic derecho dentro de la ventana de Explorador de proyectos

Figura 2.2b. Cuadro de dilogo para agregar un nuevo formulario (izquierda).

18

Recordemos que un objeto Form es una ventana o un cuadro de dilogo que forma parte de la interfaz de usuario de una aplicacin. Forms es una coleccin cuyos elementos representan cada formulario cargado en una aplicacin. La coleccin incluye el formulario MDI, el formulario secundario MDI y formularios no MDI de la aplicacin. La coleccin Forms tiene una nica propiedad, Count, que especifica el nmero de elementos de la coleccin. Sintaxis: Form Forms(ndice)

El marcador de posicin ndice representa un entero entre 0 y Forms.Count - 1. FORMULARIOS MLTIPLES Un programa puede contener ms de un formulario. De hecho, habitualmente los programas contienen mltiples formularios. Recurdese que el formulario es la ventana de mximo nivel en la que aparecen los distintos controles. Sin embargo, un programa siempre debe tener un formulario principal, que es el que aparece al arrancar el programa. Se puede indicar cul debe ser el formulario principal en el men Project/Project Properties, en la lengeta General, en la seccin Startup Form. Por defecto, el programa considera como formulario principal el primero que se haya creado. El resto de formularios que se incluyan en el programa sern cargados en su momento, a lo largo de la ejecucin del programa. Para aadir en tiempo de diseo nuevos formularios al programa, hay que acudir al men Project/Add Form. La forma de cargar y descargar estos formularios se ha explicado con anterioridad. Es importante sin embargo recordar que conviene descargar aquellos sub-formularios que ya no sean de utilidad, ya que as se ahorran recursos al sistema. Para activar en tiempo de ejecucin un formulario distinto del inicial (o del que est activo en ese momento), se utiliza el mtodo Show (frmName.Show). El mtodo Hide oculta el formulario, pero lo deja cargado; el mtodo Activate lo vuelve a mostrar. El mtodo Unload elimina los elementos grficos del formulario, pero no las variables y el cdigo. El mtodo Unload Me descarga el propio formulario que lo llama. Para eliminar completamente un formulario se puede utilizar el comando:
Set frmName = NOTHING

que llama al evento Terminate (hay que utilizar tambin los mtodos Hide o Unload para que desaparezca de la pantalla). Para referirse desde un formulario a los objetos y variables de otro formulario se utiliza el operador punto (frmName.Object.Property). Apertura de controles en forma modal En ciertas ocasiones se desea que el programa no realice ninguna accin hasta que el usuario cierre una ventana o formulario en la que se le pregunta algo o en la que tiene que tomar alguna decisin. En esos casos, al utilizar el mtodo Show, es necesario utilizar el argumento Style con valor 1. A esto se le llama mostrar una ventana en forma modal. Esto quiere decir que no se permitir al usuario hacer activa ninguna pantalla hasta que el usuario cierre esa ventana modal. Esto se hace as:
frmName.Show 1

o bien,

frmName.Show vbModal
19

Formularios MDI (Multiple Document Interface) En algunos casos puede ser interesante establecer una jerarqua entre las ventanas o formularios que van apareciendo sucesivamente en la pantalla del ordenador, de tal manera que al cerrar una que se haya establecido como principal, se cierren tambin todas las que se han abierto desde ella y dentro de ella. De esta forma una misma aplicacin puede tener varios documentos abiertos, uno en cada ventana hija. As trabajan por ejemplo Word y Excel, que pueden tener varios documentos abiertos dentro de la ventana principal de la aplicacin. En el mundo de las Figura 2.3 Formulario MDI Windows de Microsoft a esto se llama MDI (Multiple Document Interface). La Figura 2.3 muestra un ejemplo de formulario MDI. En Visual Basic 6.0 estos formularios que tienen sub-formularios hijos se conocen como MDIForms. Los formularios MDI se crean desde el men de Visual Basic 6.0 con el comando Project/Add MDI Form. En una aplicacin slo puede haber un formulario MDI, pero ste puede tener varios hijos. Si se quiere que un formulario sea Child, debe tener su propiedad MDIChild como True. Si al iniciar una aplicacin el formulario que se carga en primer lugar es un formulario Child, el formulario MDI se carga al mismo tiempo. Al cerrar un formulario MDIForm se cierran todos sus formularios Child; por ejemplo, al cerrar Word tambin se cierran todos los documentos que estuvieran abiertos. Los formularios Child se minimizan y maximizan dentro de los lmites del formulario MDI. Cuando estn maximizados, su Caption aparece junto al Caption del formulario MDI. Los formularios Child no tienen mens propios, sino que sus mens aparecen en la barra de mens del formulario MDI. En una aplicacin con un formulario MDI y uno o ms formularios Child, puede haber otros formularios que no sean Child y que se abren fuera de los lmites del formulario MDI cuando son requeridos. 2.4 SELECCIONAR CONTROLES La seleccin de controles ya insertados es muy simple, nicamente se apuntan con el mouse y se hace clic con el botn principal, con lo que aparecen los tiradores indicando que el control ha sido seleccionado. Esto se ve en la figura 2.4. Tambin se pueden seleccionar los controles utilizando la tecla de tabulacin <Tab> para seleccionar en un sentido, y con la tecla de maysculas para seleccionar en el otro sentido <Shift> + <Tab>.

20

Figura 2.4 Seleccin de controles utilizando el mouse.

2.5 BORRAR CONTROLES Para borrar controles se utiliza el men contextual del mouse haciendo clic con el botn secundario, y seleccionando Eliminar en el men, con esto desaparece el control seleccionado y el cdigo relacionado con l. Tambin podemos seleccionar con el mouse y utilizar la tecla de suprimir <Supr>. En caso de que un control haya sido borrado por error, podemos deshacer la accin de borrar con el botn de deshacer la barra de herramientas, con la combinacin de teclas Figura 2.5 Eliminar un control. <Control> + <z>. Hay que recordar que la accin de deshacer tiene que ser realizada inmediatamente despus de haber borrado el control. En la Figura 2.5 se muestra cmo eliminar un control con el mouse y tambin cmo deshacer eliminar un control. 2.6 MODIFICAR EL TAMAO DE LOS CONTROLES Se puede cambiar el tamao de los controles simplemente usando los tiradores que aparecen en las esquinas de cada control al ser seleccionado y en los tiradores que aparecen al centro de cada lado del control, al posicionar el mouse en los tiradores, el puntero cambiar a las flechas que nos permiten cambiar el tamao de los controles. Las flechas verticales nos permiten cambiar la altura del control, Las flechas horizontales nos permiten cambiar el ancho de los controles. Y las flechas inclinadas nos permiten cambiar el ancho y el alto simultneamente. En la figura 2.6 se muestran las flechas en un control de botn de Figura 2.6 Cambiar el tamao de un control comando. Otra manera de cambiar el tamao de los controles es utilizando la tecla de maysculas en combinacin con las flechas de direccin del teclado cuando el control est seleccionado, siendo las combinaciones: <Shift> + < > ms anchura, <Shift> + < > menos anchura, <Shift> + < > menos altura, y <Shift> + < > ms altura.

21

2.7 MOVER CONTROLES Para mover un control ya insertado basta con arrastrar y soltar con el mouse para colocarlo en la posicin que se desee, tal y como se ve en la Figura 2.7, una etiqueta nos dice la posicin del control dentro del formulario, recordando que est en twips, la posicin inical es la esquina superior izquierda del formulario (coordenadas 0,0). Otra manera de mover un control es utilizando la tecla control en combinacin con las flechas de direccin del teclado, tal como sigue: <Control> + < > mueve el control a la derecha, < Control > + < > lo mueve a la izquierda, < Control > + < > lo
Figura 2.7 Mover un control con el mouse

mueve hacia arriba, y < Control > + < > lo mueve hacia abajo.

2.8 ESTABLECER LAS PROPIEDADES DE LOS OBJETOS Se establecen en la ventana de propiedades, si no aparece en pantalla podemos presionar la tecla <F4> y se abrir, o en men Ver/Ventana Propiedades. La mayora de las propiedades se establecen con el mouse, aunque algunas se capturan con el teclado, tal como la propiedad de Caption que la mayora de los controles tienen. En la figura 2.8 se muestra cmo primero hay que seleccionar el control al que le vamos a establecer las propiedades y luego en la parte de abajo se capturan. En la parte inferior de la ventana de propiedades se puede ver (Figura 2.8 a la derecha) que aparece un comentario de la propiedad seleccionada, la cual nos d una idea precisa de lo controla dicha propiedades del control. Algunas propiedades abren ventanas de dilogo, tales como la propiedad Font en la cual podemos seleccionar un tamao, tipo y Figura 2.8 Establecer las propiedades de los controles, efecto a la fuente que utiliza un control. primero seleccionado el control (izquierda) y luego
capturando las propiedades con el mouse o telcado (derecha)

2.9 ESCRIBIR EL CDIGO DE LOS OBJETOS Se escribe cdigo de los objeto haciendo doble clic en ellos directamente dentro del formulario, abrindose una ventana para introducir el cdigo que va a llevar el control seleccionado. Esto se ve claramente en al Figura 2.9. Tambin podemos introducir cdigo utlizando el men contextual haciendo clic con el botn secundario dentro del Explorador de proyectos, en la opcin que dice Ver cdigo. Se selecciona el control al cual queremos introducir cdigo y se selecciona el evento en la parte de la derecha, por default Visual Basic tiene predeterminado los eventos ms
22

comunes de acuerdo al control seleccionado, iniciando con Private sub <command1>_Click() y abajo End Sub, pudiendo insertar el cdigo que se requiera para que el programa haga lo que se tenga planeado.

Ficgura 2.9 Introducir cdigo de acuerdo al tipo de control utilizado.

2.10 GUARDAR UN PROYECTO Cmo se guarda un proyecto en el disco? Un proyecto se compone siempre de varios archivos (al menos de dos) y hay que preocuparse de guardar cada uno de ellos en el directorio adecuado y con el nombre adecuado. Existe siempre un archivo con extensin *.vbp (Visual Basic Project) que se crea con el comando Figura 2.9 Archivo/Guardar Proyecto Como. El archivo del proyecto contiene toda la Guardar un informacin de conjunto. Adems hay que crear un archivo por cada formulario y proyecto. por cada mdulo que tenga el proyecto. Los archivos de los formularios se crean con Archivo/Guardar <Form1> Como teniendo como extensin *.frm. Los archivos de cdigo o mdulos se guardan tambin con el comando Archivo/Guardar <Module1> Como y tienen como extensin *.bas si se trata de un mdulo estndar o *.cls si se trata de un mdulo de clase (class module). Haciendo clic en el botn Guardar en la barra de herramientas se actualizan todos los archivos del proyecto (Figura 2.9). Si no se haban guardado todava en el disco, Visual Basic 6.0 abre cajas de dilogo Save Como por cada uno de los archivos que hay que guardar. 2.11 CREACIN DE PROGRAMAS EJECUTABLES Una vez finalizada la programacin de la nueva aplicacin, la siguiente tarea suele consistir en la creacin de un programa ejecutable para su distribucin e instalacin en cuantos ordenadores se desee, incluso aunque en ellos no est instalado Visual Basic 6.0. Para crear un programa ejecutable se utiliza el comando Make nombreProyecto.exe en el men File. De esta manera se generar un archivo cuya extensin ser *.exe. Para que este programa funcione en un ordenador solamente se necesita que el archivo MSVBVM60.DLL est instalado en el directorio c:\Windows\System o c:\Winnt\System32. En el caso de proyectos ms complejos en los que se utilicen muchos controles pueden ser necesarios ms archivos, la mayora de ellos con extensiones *.ocx, *.vbx o *.dll. Para saber en cada caso cules son los archivos necesarios se puede consultar el archivo *.vbp que contiene la descripcin completa del proyecto. Casi todos esos archivos necesarios se instalan automticamente al instalar el compilador de Visual Basic 6.0 en el
23

ordenador. En el caso de el programa se vaya a utilizar en un ordenador en el que no est instalado Visual Basic o de que en el proyecto se hayan utilizado controles comerciales (como los Crystal Reports para la creacin de informes, los Sheridan Data Widgets o los True DBGrid de Apex para la gestin de bases de datos, etc.), puede resultar interesante construir unos disquetes de instalacin que simplifiquen la tarea de instalar el programa en cualquier ordenador sin tener que ver en cada caso cules son los archivos que faltan. Visual Basic 6.0 dispone de un Asistente (Wizard) que, interactivamente, simplifica enormemente la tarea de creacin de disquetes de instalacin. Este Asistente est en el mismo grupo de programas que Visual Basic 6.0 y se llama Package and Deployement Wizard.

24

3. COMO DISEAR UNA APLICACIN EN VISUAL BASIC


3.1 Tipos de Datos: Variable y Constantes mbito de las variables y los procedimientos Se entiende por mbito de una variable la parte de la aplicacin donde la variable es visible (accesible) y por lo tanto puede ser utilizada en cualquier expresin. Variables y funciones de mbito local Un mdulo puede contener variables y procedimientos o funciones pblicos y privados. Los pblicos son aquellos a los que se puede acceder libremente desde cualquier punto del proyecto. Para definir una variable, un procedimiento o una funcin como pblico es necesario preceder a la definicin de la palabra Public, como por ejemplo:
Public Variable1 As Integer Public Sub Procedimiento1 (Parametro1 As Integer, ) Public Function Funcion1 (Parametro1 As Integer, ) As Integer

Para utilizar una variable Public o llamar a una funcin Public definidas en un formulario desde otro mdulo se debe preceder el nombre de la variable o procedimiento con el nombre del formulario al que pertenece, como por ejemplo:
Modulo1.Variable1 Call Modulo1.Procedimiento1(Parametro1, ) Retorno = Modulo1.Funcion1(Parametro1, )

Sin embargo si el mdulo al que pertenecen la variable o el procedimiento Public es un mdulo estndar (*.bas) no es necesario poner el nombre del mdulo ms que si hay coincidencia de nombres con los de otro mdulo tambin estndar. Una variable Private, por el contrario, no es accesible desde ningn otro mdulo distinto de aqul en el que se haya declarado. Se llama variable local a una variable definida dentro de un procedimiento o funcin. Las variables locales no son accesibles ms que en el procedimiento o funcin en que estn definidas. Una variable local es reinicializada (a cero, por defecto) cada vez que se entra en el procedimiento. Es decir, una variable local no conserva su valor entre una llamada al procedimiento y la siguiente. Para hacer que el valor de la variable se conserve hay que declarar la variable como static (como por ejemplo: Static n As Integer). Visual Basic inicializa una variable esttica solamente la primera vez que se llama al procedimiento. Para declarar una variable esttica, se utiliza la palabra Static en lugar de Dim. Un poco ms adelante se ver que Dim es una palabra utilizada para crear variables. Si un procedimiento se declara Static todss sus variables locales tienen carcter Static. Variables y funciones de mbito global Se puede acceder a una variable o funcin global desde cualquier parte de la aplicacin. Para hacer que una variable sea global, hay que declararla en la parte general de un mdulo *.bas o de un formulario de la aplicacin. Para declarar una variable global se utiliza la palabra Public. Por ejemplo:
Public var1_global As Double, var2_global As String

25

De esta forma se podr acceder a las variables var1_global, var2_global desde todos los formularios. La Tabla 3.1 muestra la accesibilidad de las variables en funcin de dnde y cmo se hayan declarado. La diferencia entre las variables y/o procedimientos Public de los formularios y de los mdulos estndar est en que las de los procedimientos deben ser cualificadas (precedidas) por el nombre del formulario cuando se llaman desde otro mdulo distinto, mientras que las de un mdulo estndar (*.bas) slo necesitan ser cualificadas si hay colisin o coincidencia de nombres.
Las palabras Global y Dim proceden de versiones antiguas de Visual Basic y debe preferirse la utilizacin de las palabras clave Public y Private, que expresan mejor su significado.

Tipo de variable Global o Public Dim o Private Public Dim o Private Dim

Lugar de declaracin Declaraciones de *.bas Declaraciones de *.bas Declaraciones de *.frm Declaraciones de *.frm Cualquier procedimiento de un mdulo

Accesibilidad Desde todos los formularios Desde todas las funciones de ese mdulo Desde cualquier procedimiento del propio formulario y desde otros precedida del nombre del modulo en el que se ha declarado Desde cualquier procedimiento del propio formulario Desde el propio procedimiento

Tabla 3.1. Accesibilidad de las variables.

Identificadores La memoria de un computador consta de un conjunto enorme de bits (1 y 0), en la que se almacenan datos y programas. Las necesidades de memoria de cada tipo de dato no son homogneas (por ejemplo, un carcter alfanumrico ocupa un byte (8 bits), mientras que un nmero real con 16 cifras ocupa 8 bytes), y tampoco lo son las de los programas. Adems, el uso de la memoria cambia a lo largo del tiempo dentro incluso de una misma sesin de trabajo, ya que el sistema reserva o libera memoria a medida que la va necesitando. Cada posicin de memoria en la que un dato est almacenado (ocupando un conjunto de bits) puede identificarse mediante un nmero o una direccin, y ste es el modo ms bsico de referirse a una determinada informacin. No es, sin embargo, un sistema cmodo o prctico, por la nula relacin nemotcnica que una direccin de memoria suele tener con el dato contenido, y porque como se ha dicho antes la direccin fsica de un dato cambia de ejecucin a ejecucin, o incluso en el transcurso de una misma ejecucin del programa. Lo mismo ocurre con partes concretas de un programa determinado. Dadas las citadas dificultades para referirse a un dato por medio de su direccin en memoria, se ha hecho habitual el uso de identificadores. Un identificador es un nombre simblico que se refiere a un dato o programa determinado. Es muy fcil elegir identificadores cuyo nombre guarde estrecha relacin con el sentido fsico, matemtico o real del dato que representan. As por ejemplo, es lgico utilizar un identificador llamado salario_bruto o salarioBruto para representar el coste anual de un empleado. El usuario no tiene nunca que preocuparse de direcciones fsicas de memoria: el sistema se preocupa por l por medio de una tabla, en la que se relaciona cada identificador con el tipo de dato que representa y la posicin de memoria en la que est almacenado. Visual Basic 6.0, como todos los dems lenguajes de programacin, tiene sus propias reglas para elegir los identificadores. Los usuarios pueden elegir con gran libertad los nombres de sus variables y funciones, teniendo siempre cuidado de respetar las reglas del lenguaje y de no utilizar
26

un conjunto de palabras reservadas (keywords), que son utilizadas por el propio lenguaje. Variables y constantes Una variable es un nombre que designa a una zona de memoria (se trata por tanto de un identificador), que contiene un valor de un tipo de informacin. Tal y como su nombre indica, las variables pueden cambiar su valor a lo largo de la ejecucin de un programa. Completando a las variables existe lo que se denomina constantes las cuales son identificadores pero con la particularidad de que el valor que se encuentra en ese lugar de la memoria slo puede ser asignado una nica vez. El tratamiento y tipos de datos es igual al de las variables.
Figura 3.1 Constantes de color predefinidas Para declarar un dato como constante nicamente es necesario utilizar la palabra Const en la declaracin de la variable. Si durante la ejecucin se intenta variar su valor se producir un error.

Ejemplos:
Const MyVar = 459 ' Las constantes son privadas por defecto. Public Const MyString = "HELP" ' Declaracin de una constante pblica. Private Const MyInt As Integer = 5 ' Declaracin de un entero constante. Const Str = "Hi", PI As Double = 3.14 ' Mltiples constantes en una lnea.

Visual Basic 6.0 tiene sus propias constantes, muy tiles por cierto. Algunas ya se han visto al hablar de los colores. En general estas constantes empiezan por ciertos caracteres como vb (u otros similares que indican a que grupo pertenecen) y van seguidas de una o ms palabras que indican su significado. Para ver las constantes disponibles se puede utilizar el comando Ver/Examinador de objetos, tal como se muestra en la Figura 3.1. Nombres de variables El nombre de una variable (o de una constante) tiene que comenzar siempre por una letra y puede tener una longitud hasta 255 caracteres. No se admiten espacios o caracteres en blanco, ni puntos (.), ni otros caracteres especiales. Los caracteres pueden ser letras, dgitos, el carcter de subrayado (_) y los caracteres de declaracin del tipo de la variable (%, &, #, !, @, y $ ). El nombre de una variable no puede ser una palabra reservada del lenguaje (For, If, Loop, Next, Val, Hide, Caption, And, ...). Para saber cules son las palabras reservadas en Visual Basic 6.0 puede utilizarse el Help de dicho programa, buscando la referencia Reserved Words. De ordinario las palabras reservadas del lenguaje aparecen de color azul en el editor de cdigo, lo que hace ms fcil saber si una palabra es reservada o no. A diferencia de C, Matlab, Maple y otros lenguajes de programacin, Visual Basic 6.0 no distingue entre minsculas y maysculas. Por tanto, las variables LongitudTotal y longitudtotal son consideradas como idnticas (la misma variable). En Visual Basic 6.0 es habitual utilizar las letras maysculas para separar las distintas palabras que estn unidas en el nombre de una variable, como se ha hecho anteriormente en la variable LongitudTotal. La declaracin de una variable o la primera vez que se utiliza determnan cmo se escribe en el resto del programa.
27

Tambin es habitual entre los programadores, aunque no obligado, el utilizar nombres con todo maysculas para los nombres de las constantes simblicas, como por ejemplo PI. Tipos de datos Al igual que C y otros lenguajes de programacin, Visual Basic dispone de distintos tipos de datos, aplicables tanto para constantes como para variables. La Tabla 3.2 muestra los tipos de datos disponibles en Visual Basic.
Tipo Boolean Byte Integer Long Single Double Currency String Date Descripcin Binario Entero corto Entero (2 bytes) Entero largo (4 bytes) Real simple precisin (4 bytes ) Real doble precisin ( 8 bytes) Nmero con punto decimal fijo (8 bytes) Cadena de caracteres (4 bytes + 1 byte/car hasta 64 K) Fecha (8 bytes) Carcter de declaracin Rango True o False 0 a 255 -32768 a 32767 -2147483648 a 2147483647 -3.40E+38 a 3.40E+38 -1.79D+308 a 1.79D+308 -9.22E+14 a 9.22E+14 0 a 65500 caracteres. 1 de enero de 100 a 31 de diciembre de 9999. Indica tambin la hora, desde 0:00:00 a 23:59:59. F/h: como Date nmeros: mismo rango que el tipo de valor almacenado

% & ! # @ $

Variant

User-defined

Fecha/hora; nmeros enteros, reales, o caracteres (16 bytes + 1 byte/car. en ninguno cadenas de caracteres) Cualquier tipo de dato o estructura de datos. Se crean utilizando la sentencia ninguno Type (Ver Apartado 3.10) Tabla 3.2. Tipos de datos en Visual Basic 6.0.

En el lenguaje Visual Basic 6.0 existen dos formas de agrupar varios valores bajo un mismo nombre. La primera de ellas son los arrays (vectores y matrices), que agrupan datos de tipo homogneo. La segunda son las estructuras, que agrupan informacin heterognea o de distinto tipo. En Visual Basic 6.0 las estructuras son verdaderos tipos de datos definibles por el usuario. Para declarar las variables se utiliza la sentencia siguiente:
Dim NombreVariable As TipoVariable

cuyo empleo se muestra en los ejemplos siguientes:


Dim Radio As Double, Superficie As Single Dim Nombre As String Dim Etiqueta As String * 10 Dim Francos As Currency Dim Longitud As Long, X As Currency

Es importante evitar declaraciones del tipo:


Dim i, j As Integer

pues contra lo que podra parecer a simple vista no se crean dos variables Integer, sino una Integer (j) y otra Variant (i). En Visual Basic 6.0 no es estrictamente necesario declarar todas las
28

variables que se van a utilizar (a no ser que se elija la opcin Option Explicit que hace obligatorio el declararlas), y hay otra forma de declarar las variables anteriores, utilizando los caracteres especiales vistos anteriormente. As por ejemplo, el tipo de las variables del ejemplo anterior se puede declarar al utilizarlas en las distintas expresiones, ponindoles a continuacin el carcter que ya se indic en la Tabla 3.2, en la forma:
Radio# Nombre$ Francos@ Longitud& doble precisin cadena de caracteres unidades monetarias entero largo

Esta forma de indicar el tipo de dato no es la ms conveniente. Se mantiene en las sucesivas versiones de Visual Basic por la compatibilidad con cdigos anteriores. Es preferible utilizar la notacin donde se escribe directamente el tipo de dato. Eleccin del tipo de una variable Si en el cdigo del programa se utiliza una variable que no ha sido declarada, se considera que esta variable es de tipo Variant. Las variables de este tipo se adaptan al tipo de informacin o dato que se les asigna en cada momento. Por ejemplo, una variable tipo Variant puede contener al principio del programa un string de caracteres, despus una variable de doble precisin, y finalmente un nmero entero. Son pues variables muy flexibles, pero su uso debe restringirse porque ocupan ms memoria (almacenan el tipo de dato que contienen, adems del propio valor de dicho dato) y requieren ms tiempo de CPU que los restantes tipos de variables. En general es el tipo de dato (los valores que puede tener en la realidad) lo que determina qu tipo de variable se debe utilizar. A continuacin se muestran algunos ejemplos: Integer para numerar las filas y columnas de una matriz no muy grande Long para numerar los habitantes de una ciudad o los nmeros de telfonos Boolean para una variable con slo dos posibles valores (s o no) Single para variables fsicas con decimales que no exijan precisin Double para variables fsicas con decimales que exijan precisin Currency para cantidades grandes de dinero

Es muy importante tener en cuenta que se debe utilizar el tipo de dato ms sencillo que represente correctamente el dato real ya que en otro caso se ocupar ms memoria y la ejecucin de los programas o funciones ser ms lenta. Declaracin explcita de variables Una variable que se utiliza sin haber sido declarada toma por defecto el tipo Variant. Puede ocurrir que durante la programacin, se cometa un error y se escriba mal el nombre de una variable. Por ejemplo, se puede tener una variable " declarada como entera, y al programar referirse a ella por error como "; Visual Basic supondra que sta es una nueva variable de tipo Variant.
Figura 3.2 Cuadro de dilogo Herramientas/Opciones 29

Para evitar este tipo de errores, se puede indicar a Visual Basic que genere un mensaje de error siempre que encuentre una variable no declarada previamente. Para ello lo ms prctico es establecer una opcin por defecto, utilizando el comando Environment del men Herramientas/Opciones; en el cuadro que se abre se debe poner en la opcin Requerir declaracin de variables (Figura 3.2). Tambin se puede hacer esto escribiendo la sentencia siguiente en la seccin de declaraciones de cada formulario y de cada mdulo: Option Explicit

OPERADORES La Tabla 3.3 presenta el conjunto de operadores que soporta Visual Basic 6.0.
Tipo Aritmtico Exponenciacin Cambio de signo (operador unario) Multiplicacin, divisin Divisin entera Resto de una divisin entera Concatenacin Relacional Suma y resta Concatenar o enlazar Igual a Distinto Menor que / menor o igual que Otros Lgico Mayor que / mayor o igual que Comparar dos expresiones de caracteres Comparar dos referencias a objetos Negacin And Or inclusivo Or exclusivo Equivalencia (opuesto a Xor) Implicacin (False si el primer operando es True y el segundo operando es False) Tabla 3.3. Operadores de Visual Basic 6.0. Operacin ^ *, / \ Mod +, &+ = <> < <= > >= Like Is Not And Or Xor Eqv Imp Operador en Vbasic

Cuando en una expresin aritmtica intervienen operandos de diferentes tipos, el resultado se expresa, generalmente, en la misma precisin que la del operando que la tiene ms alta. El orden, de menor a mayor, segn la precisin es Integer, Long, Single, Double y Currency. Los operadores relacionales, tambin conocidos como operadores de comparacin, comparan dos expresiones dando un resultado True (verdadero), False (falso) o Null (no vlido). El operador & realiza la concatenacin de dos operandos. Para el caso particular de que ambos operandos sean cadenas de caracteres, puede utilizarse tambin el operador +. No obstante, para evitar ambigedades (sobre todo con variables de tipo Variant) es mejor utilizar &. El operador Like sirve para comparar dos cadenas de caracteres. La sintaxis para este operador
30

es la siguiente:
Respuesta = Cadena1 Like Cadena2

donde la variable Respuesta ser True si la Cadena1 coincide con la Cadena2, False si no coinciden y Null si Cadena1 y/o Cadena2 son Null. Para obtener ms informacin se puede consultar el Help de Visual Basic. Comentarios y otras utilidades en la programacin Visual Basic 6.0 interpreta que todo lo que est a la derecha del carcter (') en una lnea cualquiera del programa es un comentario y no lo tiene en cuenta para nada. El comentario puede empezar al comienzo de la lnea o a continuacin de una instruccin que debe ser ejecutada, por ejemplo:
' Esto es un comentario A = B*x+3.4 ' tambin esto es un comentario

Los comentarios son tremendamente tiles para poder entender el cdigo utilizado, facilitando de ese modo futuras revisiones y correcciones. En programas que no contengan muchas lneas de cdigo puede no parecer demasiado importante, pero cuando se trata de proyectos realmente complejos, o desarrollados por varias personas su importancia es tremenda. En el caso de que el cdigo no est comentado este trabajo de actualizacin y revisin puede resultar complicadsimo. Otro aspecto prctico en la programacin es la posibilidad de escribir una sentencia en ms de una lnea. En el caso de sentencias bastante largas es conveniente cortar la lnea para que entre en la pantalla. En otro caso la lectura del cdigo se hace mucho ms pesada. Para ello es necesario dejar un espacio en blanco al final de la lnea y escribir el carcter (_) tal y como se muestra en el siguiente ejemplo:
str1 = "Londres" : str2 = "Pars" 'Se inicializan las variables Frase = "Me gustara mucho viajar a " & _ str1 & " y a " & str2 'El contenido de Frase sera: "Me gustara mucho viajar a Londres y a Pars

Una limitacin a los comentarios en el cdigo es que no se pueden introducir en una lnea en la que se ha introducido el carcter de continuacin (_). La sintaxis de Visual Basic 6.0 permite tambin incluir varias sentencias en una misma lnea. Para ello las sentencias deben ir separadas por el carcter dos puntos (:). Por ejemplo:
m = a : n = b : resto = m Mod n ' Tres sentencias en una lnea

3.2 FUNCIONES COMUNES (Val, STRING, CHR, Date, TIME, Inputbox, MSGbox, RND) Funcin Val Da como resultado el valor numrico de una cadena de caracteres. Su sintaxis es:
Nombre_variable = Val (expresin_de_cadena)

donde expresin_de_cadena es una expresin de caracteres y nmero es una variable numrica. La funcin Val ignora los espacios en blanco, tabuladores y saltos de lnea que puedan estar presentes al principio de la expresin_de_cadena. Si el primer carcter distino de espacio de la expresin_de_cadena no es numrico (excepto el signo -), Val da como resultado un cero. Los
31

caracteres no numricos que siguen a los nmeros se ignoran. Por ejemplo:


Dim n As Integer Dim CadenaA As String, CadenaB As String CadenaA = 123 CadenaB = 1000 Pts n = Val (CadenaA) n =123 Print n, Val (CadenaB) escribe: 123 1000

La funcin Val solo reconoce el punto(.) como separador decimal vlido. Cuando el separador decimal pueda ser de otro tipo (por ejemplo, en aplicaciones internacionales), se debe utilizar CDbl para convertir una cadena a un nmero. CadenaA = 1.230,5
Print CDbl (CadenaA)

Visual Basic convierte implcitamente cadenas de caracteres a valores numricos y viceversa, siempre que el contenido de la cadena represente un valor numrico. Por ejemplo:
Dim N As Double Dim CadenaA As String CadenaA = 1230.5 + 10 conversin implcita a cadena N = CadenaA conversin implcita a Double Print N escribe 1240.5

Funcin String Da como resultado una cadena de caracteres igual a uno dado. Su sintaxis es:
Cadena = String (n, carcter)

donde n es el nmero de caracteres de la cadena resultante y carcter es el cdigo ANSI (valor entre 0 y 255) del carcter que genera la cadena o el primer carcter de una expresin de cadena. Por ejemplo:
CadenaA = * CadenaB = String (12, CadenaA) Print CadenaB; INFORME ALUMNOS; CadenaB Print String (44, *)

El resultado que se produce, suponiendo que la fuente elegida es no proporcional, es el siguiente:


************INFORME ALUMNOS************ *******************************************

Procedimientos para cadenas de caracteres Una cadena de caracteres es sinnimo de constante de caracteres (se denomina tambin literal) y es simplemente una secuencia de caracteres encerradas entre comillas. Por ejemplo:
Introducir valor

Una cadena de caracteres puede ser manipulada directamente o a travs de una variable de caracteres o variable alfanumrica en la que se haya almacenado previamente. Por ejemplo:
Dim Etiqueta As String Etiqueta = InputBox (Etiqueta) Etiqueta = etiqueta & 01
32

Utilizando el operador de concatenacin y los procedimientos de cadenas de caracteres, podemos agrupas las variables y las constantes de caracteres para formar un expresin de caracteres. Asimismo, utilizando los operadores de relacin podemos comparar cadenas de caracteres. Por ejemplo:
Dim cad1 As String, cad2 As String . . . . If cad1 > cad2 Then . . .

Decir que una cadena es menor, igual o mayor que otra, significa indicar si est antes por orden alfabtico, si tienen exactamente los mismos caracteres o si est despus por orden alfabtico, respectivamente. Estudiemos a continuacin los procedimientos existentes para manipular cadenas de caracteres de uso ms frecuente. Funcin Len Da como resultado el nmero de caracteres en una variable de caracteres. Su sintaxis es:
nombre_variable = Len (Expresin_de_cadena)

donde expresin_de_cadena es cualquier expresin de caracteres y nombre_variable es una variable numrica en la que se obtiene el resultado. En el nmero de caracteres se contabilizan los caracteres no imprimibles y los espacios en blanco. Por ejemplo:
Dim LongA As Integer, LongB As Integer, LongT As Integer Dim CadenaA As String, CadenaB As String, CadenaC As String CadenaA = Francisco CadenaB = 25/08/82 CadenaC = LongA = Len (CadenaA) LongB = Len (CadenaB) LongT = Len (CadenaA & CadenaB & CadenaC) Print LongA, LongB, LongT escribe 9 8 17 El valor de LongT es 17 puesto que la longitud de CadenaC es 0.

Funcin Left Da como resultado los n caracteres de la expresin_de_cadena situados ms a la izquierda. Su sintaxis es:
nombre_variable = Left (expresin_de_cadena, n)

donde expresin_de_cadena es cualquier expresin de caracteres y n es una expresin numrica. Si n es mayor que Len (expresin_de_cadena), el resultado es la cadena de caracteres completa. Si n es igual a 0, el resultado es una cadena de longitud cero. Por ejemplo:
CadenaA = Programa Visual Basic CadenaB = Left (CadenaA, 8) Print CadenaB escribe: Programa Cadena A = Francisco For K = 1 To 9 Print Left (CadenaA, K) escribe: F, Fr, . . . Next K

33

Funcin Right Da como resultado los n caracteres de expresin_de_cadena situados ms a la derecha. Su sintaxis es:
nombre_variable = Right ( expresin_de_cadena, n)

La explicacin es idntica a la dada para Left, con la diferencia de que ahora se trata de los caracteres de la derecha. Funcin Mid Da como resultado una subcadena de una cadena de caracteres. Su sintaxis es:
Nombre_variable = Mid (expresin_de_cadena, n [,m])

donde expresin_de_cadena es cualquier expresin de caracteres y n y m son expresiones enteras. La funcin Mid obtiene una subcadena de m caracteres de longitud, empezando por el nsimo carcter, de la expresin_de_cadena.. Si se omite m o si hay menos caracteres que m a la derecha del carcter n-simo, se obtiene la totalidad de caracteres que hay a la derecha de ste. Si m es igual a 0 o si n es mayor que Len (expresin_de_cadena), Mid da como resultado una cadena de longitud cero. Por ejemplo:
CadenaA = Francisco 25/08/82 CadenaB = Mid (CadenaA, 14, 2) Print CadenaB escribe 08 Print Mid (CadenaA, 11) escribe 25/08/82

Sentencia Mid Sustituye una subcadena de una cadena de caracteres por otra subcadena de caracteres. Su sintaxis es:
Mid (nombre_variable, n [,m]) = cadena

donde nombre_variable es una variable de caracteres en la cual se va a reemplazar un nmero de ellos, n y m son expresiones enteras y cadena es una expresin de caracteres que reemplaza parte de nombre_variable. Los caracteres en nombre_variable que comienzan en la posicin n son sustituidos por los caracteres en cadena; m, que es opcional, indica el nmero de caracteres de cadena que van a utilizarse en la sustitucin. Si m se omite, se utilizan todos los caracteres de cadena. La longitud de nombre_variable, independientemente de si m es utilizado o no, no se modifica en el cambio. Por ejemplo:
CadenaA = 15/09/99 CadenaB = - Mid (CadenaA, 3) = CadenaB Mid (CadenaA, 6) = CadenaB Print CadenaA escribe: 15-09-99

Funcin Instr Da como resultado la posicin del primer carcter de una subcadena en una cadena. Su sintaxis es:
pos = Instr ([n,] cadena, cadena_buscada)
34

donde n es una expresin numrica (su valor predeterminado es 1) y cadena y cadena_buscada son expresiones de caracteres. Instr da como resultado la posicin del primer carcter de cadena_buscada en cadena, si cadena_buscada est contenida en cadena; el argumento n especifica la posicin en cadena donde debe empezar la bsqueda. Si cadena_buscada no se encuentra en cadena, se devuelve como resultado 0. Si cadena_buscada es una cadena de longitud cero, Instr retorna 1 o n si es que n fue especificado. Por ejemplo:
CadenaA = Programa ejemplo CadenaB = gram Print Instr (CadenaA, CadenaB), Instr (6, CadenaA, CadenaB) La lnea anterior escribe: 4 o 0

Funcin Str Convierte una expresin numrica en una expresin de caracteres. Su sintaxis es:
Nombre_variable = Str (nmero)

donde nmero es cualquier expresin numrica vlida y Nombre_variable es una variable de caracteres. Si nmero es positivo, el signo (+), est presento o no, es sustituido durante la conversin por un espacio en blanco. El signo menos (-) queda tal cual. Por ejemplo:
A = 20 B= 30 Print Str (A) + Str (B) escribe: 20 30 Print Str (A B) escribe 10

La funcin Str slo reconoce el punto (.) como separador decimal vlido. Caundo el separador pueda ser otro, se debe sutilizar CStr para convertir un nmero a una cadena. Funcin MsgBox() Los cuadros de mensaje ofrecen un modo simple y rpido de consultar a los usuarios por informacin simple o para permitirles tomar decisiones sobre el camino que su programa debe tomar. Puede usar esta funcin para mostrar diferentes tipos de mensaje y botones con los cuales el usuario da una respuesta.
Rpta = MsgBox("Est seguro de eliminar a este cliente?", _ vbQuestion + vbYesNo, "Confirmacin")

Formato:
MsgBox( prompt [, buttons] [, title ] [, helpfile, context] )

EL formato de la funcin MsgBox consta de los siguientes argumentos:


Parte Prompt Descripcin Requerido. Expresin de cadena que representa el mensaje en el cuadro de dilogo. La longitud mxima de prompt es de aproximadamente 1024 de caracteres, segn el ancho de los caracteres utilizados. Si prompt consta de ms de una lnea, puede separarlos utilizando un carcter de retorno de carro (Chr(13) ) o un carcter de avance de lnea (Chr(10) ), o una combinacin de caracteres de retorno de carro - avance de lnea (Chr(13 y Chr(10) ) entre cada lnea y la siguiente. Opcional. Expresin numrica que corresponde a la suma de los valores que especifican el nmero y el tipo de los botones que se pretenden mostrar, el estilo de icono que se va a utilizar, la identidad del botn predeterminado y la modalidad del cuadro de mensajes. Si
35

Buttons

Title Helpfile

Context

se omite este argumento, el valor predeterminado para buttons es 0. Opcional. Expresin de cadena que se muestra en la barra de ttulo del cuadro de dilogo. Si se omite title, en la barra de ttulo se coloca el nombre de la aplicacin. Opcional. Expresin de cadena que identifica el archivo de Ayuda que se utiliza para proporcionar ayuda interactiva en el cuadro de dilogo. Si se especifica helpfile, tambin se debe especificar context. Opcional. Expresin numrica que es igual al nmero de contexto de Ayuda asignado por el autor al tema de Ayuda correspondiente. Si se especifica context, tambin se debe especificar helpfile.

El argumento buttons puede asumir los siguientes valores:


Constante VbOKOnly VbOKCancel VbAbortRetryIgnore VbYesNoCancel VbYesNo VbRetryCancel VbCritical VbQuestion VbExclamation VbInformation VbDefaultButton1 VbDefaultButton2 VbDefaultButton3 VbDefaultButton4 VbApplicationModal Valor 0 1 2 3 4 5 16 32 48 64 0 256 512 768 0 Descripcin Muestra solamente el botn Aceptar. Muestra los botones Aceptar y Cancelar. Muestra los botones Anular, Reintentar e Ignorar. Muestra los botones S, No y Cancelar. Muestra los botones S y No. Muestra los botones Reintentar y Cancelar. Muestra el icono de mensaje crtico. Muestra el icono de pregunta de advertencia. Muestra el icono de mensaje de advertencia. Muestra el icono de mensaje de informacin. El primer botn es el predeterminado. El segundo botn es el predeterminado. El tercer botn es el predeterminado. El cuarto botn es el predeterminado. Aplicacin modal; el usuario debe responder al cuadro de mensajes antes de poder seguir trabajando en la aplicacin actual. Sistema modal; se suspenden todas las aplicaciones hasta que el usuario responda al cuadro de mensajes.

VbSystemModal

4096

El primer grupo de valores (0 a 5) describe el nmero y el tipo de los botones mostrados en el cuadro de dilogo; el segundo grupo (16, 32, 48, 64) describe el estilo del icono, el tercer grupo (0, 256, 512, 768) determina el botn predeterminado y el cuarto grupo (0, 4096) determina la modalidad del cuadro de mensajes. Cuando se suman nmeros para obtener el valor final del argumento buttons, se utiliza solamente un nmero de cada grupo.
Constante VbOk VbCancel VbAbort VbRetry VbIgnore VbYes VbNo Valor 1 2 3 4 5 6 7 Descripcin Aceptar Cancelar Anular Reintentar Ignorar S No

Nota: Si desea omitir algn argumento, debe incluir el delimitador de coma correspondiente o utilizar argumentos con nombre.

36

Ejemplo 1
StrMsg = "Desea continuar?" Estilo = vbYesNo + vbExclamation + vbDefaultButton2 StrTitulo = "Responda" Rpta = MsgBox(strMsg, Estilo, StrTitulo ) If Rpta= vbYes Then --------------------Else --------------------End If

Ejemplo 2
StrMsg = "Desea continuar?" iEstilo = vbYesNo + vbExclamation + vbDefaultButton2 StrTitulo = "Responda" iRpta = MsgBox( Prompt:=strMsg, Title:= StrTitulo, Buttons:= iEstilo ) If iRpta= vbYes Then --------------------Else --------------------End If

Funcin InpuBox() La funcin InputBox muestra un mensaje en un cuadro de dilogo, espera que el usuario escriba un texto o haga clic en un botn y devuelve un tipo String con el contenido del cuadro de texto, tal y como se muestra en la Figura 3.3. El cdigo se escribe de la siguiente manera:

Figura 3.3 Funcin InputBox()

strCodigo = InputBox("Ingrese el cdigo del cliente a buscar:", _ "Bsqueda", "CLI0001")

Formato
InputBox( prompt [, title] [, default] [, xpos] [,ypos] [, helpfile, context] )

El formato de la funcin InpuBox consta de los siguientes argumentos con nombre:


Parte Prompt Descripcin Prompt Requerido. Expresin de cadena que se muestra como mensaje en el cuadro de dilogo. La longitud mxima de prompt es de aproximadamente de 1024 caracteres, segn el ancho de los caracteres utilizados. Si prompt consta de ms de una lnea, puede separarlos utilizando un carcter de retorno de carro (Chr(13)), un carcter de avancen de lnea (Chr(10)) o una combinacin de los caracteres de retorno de carro avance de lnea
37

Title Default Xpos

Ypos

Helpfile

Context

(Chr(13) y (Chr(10)) entre cada lnea y la siguiente. Opcional. Expresin de cadena que se muestra en la barra de ttulo del cuadro de dilogo. Si omite title, en la barra de ttulo se coloca el nombre de la aplicacin. Opcional. Expresin de cadena que se muestra en el cuadro de texto como respuesta predeterminada. Si omite default, se muestra el cuadro de texto vaco. Opcional. Expresin numrica que especifica, la distancia en sentido horizontal entre el borde izquierdo del cuadro de dilogo y el borde izquierdo de la pantalla. Si se omite xpos, el cuadro de dilogo se centra horizontalmente. Opcional. Expresin numrica que especifica, la distancia en sentido horizontal entre el borde izquierdo del cuadro de dilogo y el borde izquierdo de la pantalla. Si se omite ypos, el cuadro de dilogo se coloca aproximadamente un tercio de la altura de la pantalla, desde el borde superior de la misma. Opcional. Expresin de cadena que identifica el archivo de Ayuda que se utilizar para proporcionar ayuda interactiva para el cuadro de dilogo. Si se especifica helpfile, tambin deber especificar context. Opcional. Expresin numrica que es el nmero de contexto de Ayuda asignado por el autor al tema de Ayuda correspondiente. Si se especifica context, tambin deber especificarse helpfile.

Comentarios Si el usuario hace clic en Cancelar, la funcin devuelve una cadena de caracteres de longitud cero ().

Funcin Chr Da como resultado el carcter ANSI correspondiente al cdigo de carcter especificado. Su sintaxis es:
Nombre_variable = Chr (cdigo_carcter)

donde cdigo_carcter es una expresin numrica de valor 0 a 255 y nombre_variable es una variable de caracteres. Chr normalmente se utiliza para enviar caracteres especiales al terminal o a la impresora. Por ejemplo:
For i = 65 To 90 Print Chr (i); escribe: ABCDE. . . Z Next i

Funcin Asc Da como resultado el cdigo de carcter correspondiente al primer carcter de la cadena de caracteres especificada. Su sintaxis es:
Cdigo_carcter = Asc (expresin_de_cadena)

donde expresin_de_cadena puede ser cualquier expresin de caracteres. Si la expresin_de_cadena es de longitud cero, se devuelve un error. Esta funcin es la inversa de Chr. Funcin Space Da como resultado una cadena de espacios. Su sintaxis es:
Cadena = Space (nmero)
38

donde nmero es la cantidad de espacios que se desea contenga la cadena. Por ejemplo:
For C = 1 To 5 CadenaA = Space (C) Print CadenaA ; C Next C

El resultado es
1 2 3 4

Variable Date Da como resultado la fecha actual del sistema en una cadena de caracteres. Su sintaxis es:
Cadena = Date

donde Cadena es una variable que almacenar una expresin de caracteres de la forma dd/mm/aa, en la que dd es el da, mm el mes y aa el ao. Sentencia Date Establece la fecha actual del sistema. Su sintaxis es:
Date = fecha

donde fecha es una constante o variable de caracteres de la forma dd-mm-aa, dd/mm/aa, ddmm-aaaa o dd/mm/aaaa. Por ejemplo:
Date = 27/05/99

Variable Time Da como resultado la hora actual del sistema en una cadena de caracteres. Su sintaxis es:
Cadena = Time

donde cadena es una variable que almacenar una expresin de caracteres de la forma hh:mm:aa. Sentencia Time Establece la hora actual del sistema. Su sintaxis es: Time = hora donde hora es una constante o variable de caracteres de la forma hh:mm o hh:mm:ss. Por ejemplo:
Time = 18:05:23

39

Funcin LCase Convierte una cadena de caracteres a letras minsculas. Su sintaxis es:
Cadena = LCase (expresin_de_cadena)

Donde expresin_de_cadena es una expresin de caracteres. Por ejemplo:


CadenaA = Esto es un EJEMPLO Print LCase (CadenaA) escribe: esto es un ejemplo

Funcin UCase Convierte una cadena de caracteres a letras maysculas. Su sintaxis es:
Cadena = UCase (expresin_de_cadena)

donde expresin_De cadena es una expresin de caracteres.


CadenaA = Esto es un EJEMPLO Print LCase (CadenaA) escribe: ESTO ES UN EJEMPLO

Funcin LTrim Da como resultado una copia de la cadena de caracteres especificada, pero sin espacios en blanco a la izquierda. Su sintaxis es:
Cadena = LTrim (expresin_de_cadena)

donde expresin_de_cadena es una expresin de caracteres. Por ejemplo:


CadenaA = abc Print CadenaA Print LTrim (CadenaA)

El resultado es:
abc abc

Funcin RTrim Da como resultado una copia de la cadena de caracteres especificada, pero sin espacios en blanco a la derecha. Su sintaxis es:
Cadena = RTrim (expresin_de_cadena)

donde expresin_de_cadena es una expresin de caracteres. Funcin Trim Da como resultado una copia de la cadena de caracteres especificada, pero sin espacios en blanco a la derecha y a la izquierda. Su sintaxis es:
Cadena = Trim (expresin_de_cadena)

donde expresin_de_cadena es una expresin de caracteres.

40

Funcin Now Devuelve la fecha y la hora actuales de acuerdo a la configuracin de la fecha y la hora del sistema. Su sintaxis es:
Now

Esta funcin devuelve un valor de tipo Date que se corresponde con una cadena de caracteres de la forma: dd/mm/aa HH:MM:SS. Para visualizar esta fecha y hora segn diversos patrones, utilizaremos la funcin Format con los smbolos d, m, y, h, m y s Patrn Format (Now, Patron) d-m-yy 27-05-99 dd/mm/yy 27/05/99 dd mmmm- yyyy 27 mayo 1999 d-mmm m yyyy 27- may 5 1999 dddd dd mmm m yyyy Jueves 27 may 5 1999 h:m:s, d-mmm-yyy 22:24:50, 27- may- 99 hh:mm:ss AM/PM, dd-mmm-yyyy 10:24:50 PM, 27 may 1999 Funcin Fix Da como resultado un nmero entero, que resulta de truncar el valor de una expresin numrica. Su sintaxis es:
Variable = Fix (expresin)

donde expresin puede ser cualquier expresin numrica. Por ejemplo:


a = 81.59 Print Fix (a), Fix (-2.67) escribe: 81 -2

Funcin Int Da como resultado el mayor nmero entero que sea menor o igual que el valor del argumento. Su sintaxis es:
Variable = Int (expresin)

donde expresin puede ser cualquier expresin numrica. Por ejemplo:


a = 81.59 Print Fix (a), Fix (-2.67) escribe: 81 -3

Funcin Timer Da como resultado el nmero de segundos transcurridos desde media noche. Su sintaxis es:
Variable = Timer

El siguiente ejemplo muestra cmo se utiliza esta funcin:


Dim segundos As Integer Time = 01:00 segundo = Timer Print segundos; segundo pasan de media noche
41

Funcin Rnd Rnd devuelve un nmero al azar de tipo Single mayor o igual que 0 y menor que 1. Sintaxis:
Variable = Rnd [(expresin)]

donde expresin es una expresin numrica de la que depende el nmero generado. Esto es, si expresin < 0 expresin > 0 o se omite expresin = 0 siempre da como resultado el mismo nmero, da como resultado el siguiente nmero aleatorio da como resultado el ltimo valor generado.

Si expresin > 0 o se omite, se generar la misma secuencia de nmero al azar cada vez que se ejecuta el programa que lo invoca. Para variar esta secuencia, se utilizar la sentencia Randomize. Para producir enteros aleatorios en un intervalo dado se utiliza esta frmula:
Int ((limitesup limiteinf +1) * Rnd + limiteinf)

Funcin Randomize Activa el generador de nmeros aleatorios a partir de un nmero determinado. Su sintaxis es:
Randomize [n]

donde n es una expresin entera que se utiliza para activar una secuencia aleatoria determinada. Si se omite, se utiliza el valor devuelto por el reloj del sistema. 3.3 ESTRUCTURAS VARIABLES Una estructura (segn la nomenclatura tpica del lenguaje C) es un nuevo tipo de datos, un tipo definido por el usuario, que puede ser manipulado de la misma forma que los tipos predefinidos (Int, Double, String, ...). Una estructura puede definirse como una coleccin o agrupacin de datos de diferentes tipos evidentemente relacionados entre s. Las estructuras pueden ser tambin argumentos en las llamadas a funciones y procedimientos Sub. Siempre son pasados por referencia, lo cual implica que pueden ser modificados dentro del procedimiento y esas modificaciones permenecen en el entorno de llamada al procedimiento. En el caso de las funciones, las estructuras pueden ser tambin valores de retorno. Sentencia Type Para crear una estructura hay que utilizar la sentencia Type ... End Type. Esta sentencia slo puede aparecer en la seccin de declaraciones de un mdulo. Por ejemplo:
Private Type Ficha Nombre As String *60 Direccin As String * 40 Telfono As Long Dni As Long End Type

Este ejemplo declara un tipo de datos denominado Ficha que consta de cuatro miembros o campos, denominados Nombre, Direccin, Telfono y Dni. Una vez definido un tipo de datos, podemos declarar variables de ese tipo, globales, a nivel de un mdulo, o bien locales. Por ejemplo, la siguiente sentencia declara la variable Alum de tipo
42

Ficha. Esta variable estar formada por los miembros Nombre, Direccin, Telfono y Dni.
Dim Alum As Ficha

La siguiente tabla muestra dnde y cmo se pueden declarar tipos definidos por el usuario, as como variables de esos tipos.
Procedimiento/mdulo Procedimientos Mdulos estndar Formularios Mdulos de clase Puede crear una estructura como No puede Private o Public Slo Private Slo Private Las variables de una estructura pueden ser Slo locales Private o Public Slo Private Slo Private

Para referirse a un determinado miembro de una estructura se utiliza la notacin variable.miembro. Por ejemplo:
Alum.Dni = 111333444

A su vez, un miembro de una estructura puede ser otra estructura. Por ejemplo, observemos a continuacin el miembro FechaContrato:
Private Type Fecha Dia As Integer Mes As Integer Ao As Integer End Type Private Type Ficha FechaContrato As Fecha Nombre As String * 60 Direccion As String * 40 Dni As Long End Type

Puesto que el miembro FechaContrato es a su vez una estructura, para acceder a uno de sus miembros, por ejemplo a Da, escribiramos:
Dim Alum1 As Ficha Alum1.FechaContrato.Dia = 15

Tambin a una estructura puede asignarse a otra estructura, lgicamente del mismo tipo. Por ejemplo:
Dim Alum1 As Ficha, Alum2 As Ficha . . . Alum2 = Alum1

Un tipo definido por el usuario puede tambin contener miembros que sean matrices estticas (de longitud fija) y matrices dinmicas.
Private Type Ficha Nombre As String * 60 Direccion As String * 40 Asignaturas() As String matriz dinmica AsgsOptativas (3) As String matriz de longitud fija Telefono As Long Dni As Long End Type

Para acceder a un elemento de un miembro de una matriz, por ejemplo al elemento


43

AsigsOptativas(0), escribiramos:
Dim Alum1 As Ficha Alum1.AsigsOptativas (0) = Informtica I

Sentencia With End With En ocasiones necesitaremos realizar varias acciones diferentes sobre el mismo objeto. Por ejemplo, puede que necesitemos establecer varias propiedades de un mismo objeto. Una manera de hacerlo es as:
Private Sub Form_Load() MiBoton.Caption = Aceptar MiBoton.Visible = True MiBoton.Top = 250 MiBoton.Left = 5500 MiBoton.Enabled = True End Sub

Obervemos que todas las sentencias utilizan la misma variable objeto, MiBoton. Podemos hacer que este cdigo resulte mucho ms fcil de escribir, ms legible y ms eficiente si utiliza la sentencia With . . . End With.
Private Sub Form_Load() With MiBoton .Caption = Aceptar .Visible = True .Top = 200 .Left = 5000 .Enabled = True End With End Sub

La sentencia With podemos aplicarla tambin sobre un objeto o variable de un tipo definido por el ususario. Por ejemplo:
Dim Alum1 As Ficha . . . With Alum1 .Nombre = Javier .Dni = 111222333 End With

Tambien podemos anidar instrucciones With si colocamos una sentencia With . . . End With dentro de otra. MATRIZ DE ESTRUCTURAS Tambin es posible declarar una matriz de estructuras. Por ejemplo:
Dim Alum (99) As Ficha

Este ejemplo define una matriz de 100 elementos, Alum(0) a Alum(99), cada uno de los cuales es una estructura de tipo Ficha. Para acceder a un miembro del elemento I de la matriz, por ejemplo a Nombre, escribiremos:
Alum(I).Nombre = Fco. Javier
44

4. EVENTOS, PROPIEDADES Y CONTROLES


Qu papel cumplen las propiedades, mtodos y eventos? Toda aplicacin necesita una interfaz de usuario, la parte visual a travs de la cual el usuario interacta con la aplicacin. Los bloques bsicos de construccin de una interfaz de usuario son los formularios y los controles. Visual Basic utiliza tcnicas de programacin visual para disear las aplicaciones.
Formulario.Nombre=frmEntrada Formulario.Ttulo=Bienvenidos al CBTa No. 86 Cuadro.Nombre=txtContrasea Cuadro.PasswordChar=*

Botn.Nombre=cmdIngresar Botn.Ttulo=Ingresar

Botn.Nombre=cmdLimpiar Botn.Ttulo=Limpiar Evento Hacer_Click Cuadro.txtUsuario.Texto= Cuadro.txtContrasea.Texto= Cuadro.txtUsuario.EstablecerEnfoque()

Para disear esta ventana (Formulario), del conjunto de objetos de Visual Basic seleccionamos un objeto tipo Formulario (Form). Luego a la propiedad Nombre (Name) le asignamos el valor frmEntrada; a la propiedad Ttulo le asignamos el valor Bienvenidos a Gestin y Sistemas. Dentro del formulario se colocan los controles. Para que el usuario pueda ingresar un dato (por ejemplo, la contrasea) colocamos en la ventana un control tipo Cuadro de Texto (TextBox); a continuacin establecemos su propiedad Nombre en txtContrasea, y su propiedad PasswordChar es un * (asterisco) para que el dato ingresado sea reemplazado por asteriscos slo en la pantalla, para que no se pueda visualizar. Para obtener el botn Ingresar seleccionamos un control tipo Botn de Comando (CommandButton), y lo colocamos en la ventana. Luego cambiamos sus propiedades; a la propiedad Nombre le asignamos cmdIngresar, y a la propiedad Ttulo le asignamos Ingresar. Se desea que cuando el usuario haga clic en el botn Limpiar, se borre cualquier dato que el
45

usuario haya ingresado en los Cuadros de Texto, y que el punto de insercin se ubique en el cuadro txtUsuario. Para que esto ocurra debemos programar el evento Hacer_Click del botn de comando cmdLimpiar. El evento debe ejecutar dos sentenciar para cambiar la propiedad Texto de cada uno de los cuadros de texto, y luego invocar al mtodo EstablecerEnfoque() del cuadro de texto txtUsuario. La programacin en Visual Basic 6.0 (al menos para ejemplos sencillos) suele proceder del siguiente modo: 1. Se definen interactivamente sobre el formulario los controles que van a constituir la aplicacin. 2. Se define para cada control el cdigo con el que se va a responder a cada uno de los eventos. Para ello basta hacer clic dos veces sobre el control y se abre una ventana de cdigo como la mostrada en la Figura 4.1. En ella Visual Basic 6.0 ha preparado ya el inicio y el final de la Figura 4.1.Cdigo que gestionar el evento Click funcin con la que se va a responder al sobre el control de nombre cmbSalir. evento. El nombre del evento forma parte del nombre de la funcin, junto al nombre del control. En el ejemplo del la Figura 4.1 est preparada la funcin para escribir el cdigo que se ejecutar al producirse el evento Click sobre el control cmbSalir. En el resto de este captulo se vern con un cierto detalle los eventos, controles y propiedades ms habituales en Visual Basic 6.0. 4.1 PROPIEDADES Hay algunas propiedades que son comunes a muchos controles. A continuacin se hace una lista con las utilizadas ms habitualmente: Appearance: Establece si un objeto tiene un aspecto plano (valor 0) o 3D (valor 1). BackColor: Establece el color de fondo de un objeto. Caption: Establece el texto que aparece dentro o junto al objeto. Tiene el papel de un ttulo. Enabled: Establece si un objeto es accesible y modificable o no. Font: Establece las caractersticas del tipo de letra del objeto. ForeColor: Establece el color del texto y/o grficos de un objeto. Height y Width: Establecen la altura y achura de un objeto. Left y Top: Establecen la distancia horizontal y vertical entre el origen del control y el origen del objeto que lo contiene, que puede ser un formulario, un marco (frame), etc. MousePointer: Establece la forma que adoptar el puntero del ratn al posicionarse sobre el objeto. Esta forma puede elegirse dentro de una lista en las que aparecen las habituales del puntero del ratn o creando iconos propios. Algunas constantes de significado inmediato que definen la forma del cursor son las siguientes: vbDefault, vbArrow, vbCrosshair, vbIbeam, vbSizePointer, vbUpArrow, vbHourglass, etc. Para ms informacin puede consultarse el Help de MousePointer. Name: Nombre del objeto. Todos los objetos incluidos en un formulario deben tener un nombre con el que poder referirse a l a la hora de programar la forma en que debe actuar.
46

Existen unas reglas para definir los nombre de los controles, que ya se vieron en el Captulo 1. Visible: Establece si el objeto es visible o invisible.

Estableciendo Propiedades Al disear la interfase de usuario de una aplicacin Visual Basic, se deben establecer la propiedades para los controles (objetos) creados. Estableciendo Propiedades en Tiempo de Diseo Algunas propiedades pueden ser establecidas en tiempo de diseo. Para establecer estas propiedades se emplea la ventana de propiedades. Para acceder a la ventana de propiedades, oprima en botn secundario del ratn sobre un objeto, y luego haga clic en Propiedades. Tambin se puede obtener el mismo resultado seleccionado el objeto y luego presionando F4. Si selecciona varios objetos a la vez y accede a la ventana de propiedades, slo se mostrarn las propiedades que son comunes para todos los controles seleccionados. Cualquier cambio que se haga a una propiedad ser aplicada a todos los controles. Estableciendo Propiedades en Tiempo de Ejecucin En tiempo de ejecucin, se puede escribir cdigo para establecer u obtener el valor de una propiedad. La siguiente lnea de cdigo establece a negrita la fuente de un cuadro de texto llamado txtData.
txtData.Font.Bold = True txtData.Text = "Hola ' Establece el texto a negrita 'Establece el valor del texto

Este cdigo establece la propiedad Text del cuadro de texto txtData


mundo"

Si se omite el nombre de la propiedad, se establece la propiedad predeterminada del control. La propiedad predeterminada de un cuadro de texto es la propiedad Text. La propiedad predeterminada de una etiqueta es la propiedad Caption. Las siguientes lneas de cdigo establecen las propiedades predeterminadas text y caption de un cuadro de texto y de una etiqueta.
txtData = "Se establece la propiedad Text del cuadro de texto" lblData = "Se establece la propiedad Caption de la etiqueta"

Obteniendo Propiedades en Tiempo de Ejecucin Puede emplear el siguiente cdigo para obtener el valor de una propiedad en tiempo de ejecucin.
Dim sNombre as String sNombre = txtName.Text

4.2 PROPIEDADES COMUNES ActiveControl Aplicable a: Objeto Form. Devuelve el control que tiene el enfoque. No est disponible en tiempo de diseo y es de slo lectura en tiempo de ejecucin. Sintaxis:
objeto.ActiveControl
47

El marcador de posicin objeto representa una expresin de objeto que da como resultado un objeto de la lista Aplicable a. Puede utilizar ActiveControl para tener acceso a las propiedades de un control o para invocar sus mtodos. Por ejemplo, Screen.ActiveControl.Tag = "0". Si todos los controles del formulario son invisibles o estn desactivados, se producir un error en tiempo de ejecucin. Cada formulario puede tener un control activo (Form.ActiveControl), independientemente de que el formulario est activo o no. Puede escribir cdigo que manipule el control activo de cada formulario de la aplicacin, incluso cuando el formulario no sea el activo. Ejemplo de la propiedad ActiveControl En este ejemplo se muestra el texto del control activo. Para probarlo, pegue el cdigo en la seccin Declaraciones de un formulario que contenga controles TextBox, Label y CommandButton, y luego presione F5 y haga clic en el formulario.
Private Sub Form_Click () If TypeOf Screen.ActiveControl Is TextBox Then Label1.Caption = Screen.ActiveControl.Text Else Label1.Caption = "Botn: " + Screen.ActiveControl.Caption End If End Sub

BackColor, ForeColor Aplicable a: Control CheckBox, Control ComboBox, Control CommandButton, Control Data, Objeto Form, Control Frame, Control Label, Control ListBox, Control OptionButton, Control PictureBox, Control Shape, Control TextBox. BackColor: devuelve o establece el color de fondo de un objeto. ForeColor: devuelve o establece el color de primer plano utilizado para mostrar texto y grficos en un objeto.

Sintaxis:
objeto.BackColor [= color] objeto.ForeColor [= color]

La sintaxis de las propiedades BackColor y ForeColor consta de las siguientes partes:


Parte objeto color Descripcin Una expresin de objeto que da como resultado un objeto de la lista Aplicable a. Un valor o una constante que determina el color de fondo o de primer plano del objeto, segn se indica en Valores.

Visual Basic utiliza el esquema de colores rojo-verde-azul (RGB) del entorno operativo Microsoft Windows. Para todos los formularios y controles, los valores predeterminados en tiempo de diseo son: BackColor: el color predeterminado del sistema especificado por la constante vbWindowBackground. ForeColor: el color predeterminado del sistema especificado por la constante vbWindowText.

En los controles Label y Shape, la propiedad BackColor se pasa por alto cuando el valor de la propiedad BackStyle es 0 (transparente). Si establece la propiedad BackColor de un objeto Form o
48

de un control PictureBox, se borra todo el texto y todos los grficos, incluidos los grficos persistentes. Al establecer la propiedad ForeColor, los grficos o el resultado impreso no se ven afectados. En el resto de los controles, el color de la pantalla cambia inmediatamente. El intervalo vlido para un color RGB normal va de 0 a 16.777.215 (&HFFFFFF). El byte ms alto de los nmeros de este intervalo es 0, y los 3 ms bajos, del menos significativo al ms significativo, determinan la intensidad de rojo, verde y azul, respectivamente. Cada uno de los componentes rojo, verde y azul se representa con un nmero entre 0 y 255 (&HFF). Si el byte ms alto no es 0, Visual Basic utiliza los colores del sistema, definidos por el usuario en el Panel de control o por las constantes que se encuentran en la biblioteca de objetos de Visual Basic (VB) en el Examinador de objetos. Para mostrar texto en el entorno operativo Windows, tanto el color del texto como el de fondo deben ser slidos. Si no aparece el color que ha seleccionado para el texto o para el fondo, puede que uno de ellos sea de medios tonos; es decir, puede que est formado por pxeles de hasta tres colores distintos. Si elige un color de medios tonos para el texto o el fondo, se utilizar el color slido ms prximo. Ejemplo de las propiedades BackColor y ForeColor En este ejemplo se restablecen aleatoriamente los colores de primer plano y de fondo dos veces por segundo en un formulario y en un control PictureBox. Para probar este ejemplo, pegue el cdigo en la seccin Declaraciones de un formulario que contenga un control PictureBox y un control Timer control, y luego presione F5.
Private Sub Form_Load () Timer1.Interval = 500 End Sub Private Sub Timer1_Timer () BackColor = QBColor(Rnd * 15) ForeColor = QBColor(Rnd * 10) Picture1.BackColor = QBColor(Rnd * 15) Picture1.ForeColor = QBColor(Rnd * 10) End Sub

BackStyle Aplicable a: Control Label, Control Shape. Devuelve o establece un valor que indica si un control Label o el fondo de un color Shape es transparente u opaco. Sintaxis:
Parte objeto nmero objeto.BackStyle [= nmero]

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


Descripcin Una expresin de objeto que da como resultado un objeto de la lista Aplicable a. Una expresin numrica que especifica la transparencia, segn se indica en Valores.

Los valores admitidos para nmero son: 0 - Transparente: el color de fondo y los grficos son visibles a travs del control. 1 - (Predeterminado) Opaco: el control se llena con el valor de su propiedad BackColor, ocultando los colores o grficos que haya tras l.

49

Puede utilizar la propiedad BackStyle para crear controles transparentes cuando use un color de fondo en un objeto Form o en un control PictureBox, o cuando desee colocar un control sobre un grfico. Utilice un control opaco cuando quiera que destaque. La propiedad BackColor de un control se pasa por alto cuando BackStyle = 0. BorderStyle Aplicable a: Objeto Form, Control Frame, Control Image, Control Label, Control Line, Control PictureBox, Control Shape, Control TextBox. Devuelve o establece un valor que indica cul es el estilo de los bordes del control. La propiedad BorderStyle es de lectura y escritura durante el diseo del control y de slo lectura en tiempo de ejecucin. Sintaxis:
Parte objeto enum objeto.BorderStyle [= enum]

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


Descripcin Una expresin de objeto que da como resultado un objeto de la lista Aplicable a. Valor enumerado que determina el estilo de los bordes del control, como se describe en Valores.

Los valores de enum son: 0 - None 1 - Fixed Single Sin bordes. ste es el valor predeterminado. Se dibuja una nica lnea alrededor del control.

Caption Aplicable a: Control CheckBox, Control CommandButton, Control Data, Objeto Form, Control Frame, Control Label, Control Menu, Control OptionButton. Formulario: determina el texto que se muestra en la barra de ttulo del objeto Form. Cuando el formulario est minimizado, este texto se muestra debajo del icono del formulario. Control: determina el texto que se muestra en un control o junto a ste. Objeto MenuLine: determina el texto que se muestra para un control Menu o un objeto de la coleccin MenuItems.
objeto.Caption [= cadena]

Sintaxis:
Parte objeto cadena

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


Descripcin Una expresin de objeto que da como resultado un objeto de la lista Aplicable a. Si se omite objeto, se supondr que el formulario asociado al mdulo de formulario activo es objeto. Una expresin de cadena que da como resultado el texto que se muestra como ttulo.

Cuando crea un nuevo objeto, su ttulo predeterminado es el valor predeterminado de la propiedad Name. Este ttulo predeterminado incluye el nombre de objeto y un entero, como Comando1 o Formulario1. Para obtener una etiqueta ms descriptiva, establezca la propiedad Caption. Puede utilizar la propiedad Caption para asignar una tecla de acceso a un control. En el ttulo, incluya un signo & inmediatamente delante del carcter que desea designar como tecla de acceso. El carcter estar subrayado. Presione la tecla ALT y el carcter subrayado para mover el
50

enfoque a ese control. Si desea incluir un signo & en un ttulo sin crear una tecla de acceso, incluya dos signos (&&). En el ttulo slo aparecer un smbolo y no habr caracteres subrayados. Para un control Label, el tamao del ttulo es ilimitado. Para los formularios y todos los dems controles que tienen ttulos, el lmite es de 255 caracteres. Para mostrar el ttulo de un formulario, establezca la propiedad BorderStyle a Fixed Single (1 o vbFixedSingle), Sizable (2 o vbSizable) o Fixed Dialog (3 o vbFixedDialog). Si el ttulo es demasiado largo para la barra de ttulo, se recortar. Sugerencia Para una etiqueta, establezca la propiedad AutoSize a True con el fin de ajustar automticamente el tamao del control de modo que quepa el ttulo. Ejemplo de la propiedad Caption Este ejemplo cambia la propiedad Caption de un control CommandButton cada vez que el usuario hace clic en el botn. Para probar este ejemplo, pegue el cdigo en la seccin Declaraciones de un formulario que contenga un CommandButton llamado Command1, y despus presione F5 y haga clic en el botn.
Private Sub Command1_Click () ' Comprueba el ttulo y lo cambia. If Command1.Caption = "Ha hecho clic" Then Command1.Caption = "Aceptar" Else Command1.Caption = "Ha hecho clic" End If End Sub

DataChanged Aplicable a: Control CheckBox, Control ComboBox, Control Image, Control Label, Control ListBox, Control PictureBox, Control TextBox. Devuelve o establece un valor que indica que algn proceso distinto de la recuperacin de datos del registro actual ha cambiado los datos del control enlazado. No est disponible en tiempo de diseo. Sintaxis:
Parte objeto valor objeto objeto.DataChanged [= valor]

La sintaxis de la propiedad DataChanged consta de estas partes:


Descripcin Una expresin de objeto que da como resultado un objeto de la lista Aplicable a. Si se omite objeto, se supondr que el formulario asociado al mdulo de formulario activo es objeto. Una expresin booleana que indica si los datos han cambiado, como se describe en Valores. Una expresin de objeto cuyo resultado es un objeto de la lista Aplicable a.

Los valores admitidos para valor son los siguientes: Trae - Los datos que hay actualmente en el control no son iguales que los del registro actual. False (Predeterminado) Los datos que hay actualmente en el control (si los hay) son iguales que los del registro actual.

Cuando un control Data se mueve de un registro a otro, pasa datos desde los campos del registro actual a controles enlazados al campo especfico o todo el registro. Cuando se muestran datos en los controles enlazados, la propiedad DataChanged se establece a False. Si el usuario o alguna otra operacin cambia el valor del control enlazado, la propiedad DataChanged se establece a
51

True. Si pasa a otro registro la propiedad DataChanged no se ve afectada. Cuando el control Data comienza a pasar a otro registro, se produce el evento Validate. Si DataChanged es True para algn control enlazado, el control Data invoca automticamente los mtodos Edit y Update para enviar los cambios a la base de datos. Si no desea guardar en la base de datos los cambios de un control enlazado, puede establecer la propiedad DataChanged a False en el evento Validate. Inspeccione el valor de la propiedad DataChanged en el cdigo para el evento Change de un control con el fin de evitar eventos en cascada. Esto se aplica a controles enlazados y no enlazados. Tipo de datos: Integer (Boolean) DataField Aplicable a: Control CheckBox, Control ComboBox, Control Image, Control Label, Control ListBox, Control PictureBox, Control TextBox. Devuelve o establece un valor que enlaza un control a un campo del registro actual. Sintaxis:
Parte objeto valor objeto.DataField [= valor]

La sintaxis de la propiedad DataField consta de estas partes:


Descripcin Una expresin de objeto que da como resultado un objeto de la lista Aplicable a. Una expresin de cadena que se evala como el nombre de uno de los campos del objeto Recordset especificado por las propiedades RecordSource y DatabaseName de un control Data.

Los controles enlazados proporcionan acceso a datos especficos de la base de datos. Los controles enlazados que administran un nico campo suelen mostrar el valor un campo especfico del registro actual. La propiedad DataSource de un control enlazado especifica un control Data vlido y la propiedad DataField especifica un nombre de campo vlido en el objeto Recordset creado por el control Data. Juntas, estas propiedades especifican qu datos aparecen en el control enlazado. Cuando utiliza un objeto QueryDef o una instruccin SQL que devuelve los resultados de una expresin, el motor de base de datos Microsoft Jet genera automticamente el nombre de campo . Por ejemplo, cuando codifica una funcin agregada de SQL o una expresin en su consulta SQL, a menos que asigne un alias a los campos agregados mediante una clusula AS, los nombres de campo se generarn automticamente. El nombre del campo de expresin suele ser Expr1 seguido de un nmero de tres dgitos que comienza por 000. La primera expresin devuelta tendra el nombre Expr1000. Se recomienda codificar las consultas SQL para asignar alias a columnas de expresin como se muestra a continuacin:
Data1.RecordSource = "Select AVG(Sales) " _ & " AS AverageSales From SalesTable" Text1.DataField = "AverageSales" Data1.Refresh

Nota Compruebe que el valor de la propiedad DataField es vlido para cada control enlazado. Si cambia el valor de la propiedad RecordSource de un control Data y a continuacin utiliza Refresh, el objeto Recordset identificar el nuevo objeto. Esto puede invalidar los valores de DataField de controles enlazados y generar un error interceptable. Tipo de datos: String

52

DataSource Aplicable a: Control CheckBox, Control ComboBox, Control Image, Control Label, Control ListBox, Control PictureBox. Establece un valor que especifica el control Data a travs del cual el control actual se enlaza a una base de datos. No est disponible en tiempo de ejecucin. Para enlazar un control a un campo de una base de datos en tiempo de ejecucin, debe especificar un control Data en la propiedad DataSource en tiempo de diseo desde la ventana Propiedades. Para completar la conexin con un campo del objeto Recordset administrado por el control Data, tambin deber proporcionar el nombre de un objeto Field en la propiedad DataField. A diferencia de la propiedad DataField, el valor de la propiedad DataSource no est disponible en tiempo de ejecucin. Tipo de datos: String Enabled Aplicable a: Control CheckBox, Control ComboBox, Control CommandButton, Control Data, Objeto Form, Control Frame, Controles HScrollBar y VScrollBar, Control Image, Control Label, Control ListBox, Control Menu, Control OptionButton, Control PictureBox, Control TextBox, Control Timer. Devuelve o establece un valor que determina si un formulario o un control puede responder a eventos generados por el usuario. Sintaxis:
Parte objeto Booleano objeto.Enabled [= booleano]

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


Descripcin Una expresin de objeto que da como resultado un objeto de la lista Aplicable a. Si se omite objeto, se supondr que el formulario asociado al mdulo del formulario activo es objeto. Una expresin de tipo Boolean que especifica si objeto puede responder a eventos generados por el usuario.

Los valores admitidos para booleano son: True False (Predeterminado) Permite que objeto responda a eventos. Impide que objeto responda a eventos.

La propiedad Enabled permite activar o desactivar formularios y controles en tiempo de ejecucin. Por ejemplo, puede desactivar objetos que no se aplican al estado actual de la aplicacin. Tambin puede desactivar un control empleado fundamentalmente con fines de presentacin, como un cuadro de texto que proporciona informacin de slo lectura.Si desactiva un control Timer estableciendo Enabled a False cancelar la cuenta atrs establecida por la propiedad Interval del control. Ejemplo de la propiedad Enabled Este ejemplo habilita un control CommandButton siempre que un control TextBox contenga texto. Para probar este ejemplo, pegue el cdigo en la seccin Declaraciones de un formulario con controles CommandButton y TextBox, y despus presione F5 y escriba algo en el cuadro de texto.

53

Private Sub Form_Load () Text1.Text = "" Command1.Caption = "Guardar" End Sub

' Borra el cuadro de texto. ' Coloca el ttulo del botn.

Private Sub Text1_Change () If Text1.Text = "" Then ' Mira si el cuadro de texto est vaco. Command1.Enabled = False ' Deshabilita el botn. Else Command1.Enabled = True ' Habilita el botn. End If End Sub

Visible Aplicable a: Control CheckBox, Control ComboBox, Control CommandButton, Control Data, Objeto Form Control Frame, Controles HScrollBar y VScrollBar, Control Image, Control Label, Control Line, Control ListBox, Control Menu, Control OptionButton, Control PictureBox, Control Shape, Control TextBox Devuelve o establece un valor que indica si un objeto es visible o est oculto. Sintaxis:
Parte Booleano objeto.Visible [= booleano]

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


Descripcin Una expresin booleana que especifica si el objeto es visible o si est oculto.

Los valores admitidos para booleano son: True False (Predeterminado) El objeto es visible. El objeto est oculto.

Para ocultar un objeto al inicio, establezca la propiedad Visible a False en tiempo de diseo. Si establece esta propiedad en el cdigo puede ocultar y volver a mostrar posteriormente un control en tiempo de ejecucin como respuesta a un evento determinado. El uso del mtodo Show o Hide en un formulario equivale a establecer True o False, respectivamente, en su propiedad Visible a travs del cdigo. Ejemplo de la propiedad Visible En este ejemplo se crea una animacin mediante dos controles PictureBox. Para probar este ejemplo, pegue el cdigo en la seccin Declaraciones de un formulario que contenga dos controles PictureBox de tamao de icono. Establezca a FileCab la propiedad Name de los dos controles PictureBox para crear una matriz, presione F5 y haga clic en la imagen para ver la animacin.
Private Sub Form_Load () Dim I ' Declara la variable. FileCab(0).BorderStyle = 0 ' Establecer BorderStyle. FileCab(1).BorderStyle = 0 ' Cargar los iconos en los cuadros de imagen. FileCab(1).Picture = LoadPicture("ICONOS\OFFICE\ARCH03B.ICO") FileCab(0).Picture = LoadPicture("ICONOS\OFFICE\ARCH03A.ICO") For I = 0 To 1 FileCab(I).Move 400, 400 ' Colocar los grficos en el mismo punto. Next I FileCab(1).Visible = False ' Establecer a invisible. FileCab(0).Visible = True ' Establecer a visible. 54

End Sub Private Sub FileCab_Click (Index As Integer) Dim I ' Declarar variable. For I = 0 To 1 ' Cambiar la visibilidad para los dos grficos. FileCab(I).Visible = Not FileCab(I).Visible Next I End Sub

4.3 CONTROLES (Form, Label, TextBox, CommandButton, Checkbox

Figura 4.2. Algunos de los controles ms habituales de Visual Basic.

En la Figura 4.2 se muestran algunos de los controles ms habituales en Visual Basic 6.0. Estos controles se explican a continuacin con ms detalle. Botn de comando (Command Button) La propiedades ms importantes del botn de comando son su Caption, que es lo que aparece escrito en l, las referentes a su posicin (Left y Top) y apariencia externa (Height, Width y tipo de letra) y la propiedad Enabled, que determina si en un momento dado puede ser pulsado o no. No hay que confundir la propiedad Caption con la propiedad Name. La primera define a un texto que aparecer escrito en el control, mientras que las segunda define el nombre interno con el que se puede hacer referencia al citado objeto. Si en la propiedad Caption se pone el carcter (&) antes de una de sus letras, dicha letra aparece subrayyada en el botn (como la x en el botn Exit de la figura anexa). Esto quiere decir que, como es habitual en Windows, dicho botn puede activarse con el teclado por medio de la
55

combinacin Alt+letra subrayada. Esta caracterstica es comn a muchos de los controles que tienen propiedad Caption. El evento que siempre suelen tener programado los botones de comandos es el evento Click. Botones de opcin (Option Button) Adems de las mencionadas para el caso anterior estos botones tienen la propiedad Value, que en un determinado momento slo puede ser True en uno de los botones del grupo ya que se trata de opciones que se excluyen mutuamente. Para agrupar botones se coloca primero un marco o frame en el formulario y, estando seleccionado, se colocan despus cuantos botones de opcin se desee. En un mismo formulario se pueden colocar cuantos grupos de botones de opcin se quiera, cada uno de ellos agrupado dentro de su propio marco. Es muy importante colocar primero el frame y despus los botones de opcin. Con esto se consigue que los botones de opcin estn agrupados, de modo que slo uno de ellos pueda estar activado. Si no se coloca ningn frame todos los botones de opcin de un mismo formulario forman un nico grupo. Si los botones ya existen y se quieren introducir un un frame se seleccionan, se hace Cut y luego Paste dentro del frame seleccionado. Slo un grupo de botones de opcin puede recibir el focus, no cada botn por separado. Cuando el grupo tiene el focus, con las flechas del teclado ( y ) se puede activar una u otra opcin sin necesidad de usar el ratn. Tambin se puede utilizar Alt+carcter introduciendo antes de dicho carcter un (&) en el Caption del botn de opcin. Botones de seleccin (Check Box) La nica diferencia entre estos botones y los anteriores es que en los botones de seleccin puede haber ms de uno con la propiedad Value a True. Estos botones no forman grupo aunque estn dentro de un frame, y reciben el focus individualmente. Se puede tambin utilizar el carcter (&) en el Caption para activarlos con el teclado. El usuario debe decidir qu tipo de botones se ajustan mejor a sus necesidades: en el caso de la edad, est claro que no se puede ser de dos edades diferentes; s es posible sin embargo conocer varios lenguajes de programacin. Barras de desplazamiento (Scroll Bars) En este tipo de control las propiedades ms importantes son Max y Min, que determinan el rango en el que est incluido su valor, LargeChange y SmallChange que determinan lo que se modifica su valor al hacer clic en la barra o en el botn con la flecha respectivamente y Value que determina el valor actual de la barra de desplazamiento. Las barras de desplazamiento no tienen propiedad Caption. El evento que se programa habitualmente es Change, que se activa cuando la barra de desplazamiento modifica su valor. Todo lo comentado en este apartado es comn para las barras de desplazamiento verticales y horizontales. Adems de las Scroll Bars horizontal y vertical, Visual Basic 6.0 dispone tambin del control Slider, utilizado en los paneles de control de Windows, que tiene una funcin similar.

56

Etiquetas (Labels) En las etiquetas o labels la propiedad ms importante es Caption, que contiene el texto que aparece sobre este control. Esta propiedad puede ser modificada desde programa, pero no interactivamente haciendo clic sobre ella (a diferencia de las cajas de texto, que se vern a continuacin). Puede controlarse su tamao, posicin, color de fondo y una especie de borde 3-D. Habitualmente las labels no suelen recibir eventos ni contener cdigo. Las Labels tienen las propiedades AutoSize y WordWrap. La primera, cuando est a True, ajusta el tamao del control al del texto en l contenido. La segunda hace que el texto se distribuya en varias lneas cuando no cabe en una sola. Cajas de texto (Text Box) La propiedad ms importante de las cajas de texto es Text, que almacena el texto contenido en ellas. Tambin se suelen controlar las que hacen referencia a su tamao, posicin y apariencia. En algn momento se puede desear impedir el acceso a la caja de texto, por lo que se establecer su propiedad Enabled como False. La propiedad Locked como True hace que la caja de texto sea de slo lectura. La propiedad MultiLine, que slo se aplica a las cajas de texto, determina si en una de ellas se pueden incluir ms de una lnea o si se ignoran los saltos de lnea. La justificacin o centrado del texto se controla con la propiedad Alignment. La propiedad ScrollBars permite controlar el que aparezca ninguna, una o las dos barras de desplazamiento de la caja. En una caja de texto no se pueden introducir Intros con el teclado en modo de diseo. En modo de ejecucin se deben introducir como caracteres ASCII (el 13 seguido del 10, esto Carriage Return y Line Feed). Afortunadamente Visual Basic 6.0 dispone de la constante vbCrLf, que realiza esta misin de modo automtico. Otras propiedades importantes hacen referencia a la seleccin de texto dentro de la caja, que slo estn disponibles en tiempo de ejecucin. La propiedad SelStart sirve para posicionar el cursor al comienzo del texto que se desea seleccionar (el primer carcter es el cero); SelLength indica el nmero de caracteres o longitud de la seleccin; SelText es una cadena de caracteres que representa el texto seleccionado. Para hacer Paste con otro texto sustituyendo al seleccionado basta asignarle a esta propiedad ese otro texto (si no hay ningn texto seleccionado, el texto de SelText se inserta en la posicin del cursor); para entresacar el texto seleccionado basta utilizar esta propiedad en alguna expresin. Los eventos que se programan son Change, cuando se quiere realizar alguna accin al modificar el contenido de la caja, Click y DblClick y en algunos casos especiales KeyPress para controlar los caracteres que se introducen. Por ejemplo, se puede chequear la introduccin del cdigo ASCII 13 (Intro) para detectar que ya se finalizado con la introduccin de datos. Tambin se utiliza la propiedad MaxLength para determinar el nmero mximo de caracteres que pueden introducirse en la caja de texto. En aquellos casos en los que se utilice una caja de texto como entrada de datos (es el control que se utiliza la mayora de las veces con esta finalidad), puede ser interesante utilizar el mtodo SetFocus para enviar el foco a la caja cuando se considere oportuno. Otras propiedades de las cajas de texto hacen referencia a los tipos de letra y al estilo. As la propiedad FontName es una cadena que contiene el nombre del Font (Courier New, Times New Roman, etc.), FontSize es un tipo Short que contiene el tamao de la letra, y FontBold, FontItalic,
57

FontUnderline y FontStrikethrough son propiedades tipo Boolean que indican si el texto va a tener esa caracterstica o no. Listas (List Box) Una lista es un control en el que se pueden mostrar varios registros o lneas, teniendo uno o varios de ellos seleccionado(s). Si en la lista hay ms registros de los que se pueden mostrar al mismo tiempo, se aade automticamente una scrollBar. Para aadir o eliminar registros de la lista en modo de ejecucin se utilizan los mtodos AddItem y RemoveItem. Las listas se suelen inicializar desde el evento Form_Load. La propiedad List es un array que permite definir el contenido de la lista en modo de diseo a travs de la ventana de propiedades. List permite tambin acceder a los elementos de la lista en tiempo de ejecucin, para utilizar y/o cambiar su valor. Para ello se pone en ndice del elemento entre parntesis (empezando a contar por cero) a continuacin de List, como se muestra a continuacin por ejemplo, para cambiar el tercer elemento:
lstName.List(2) = "Tercero"

Para aadir un registro en tiempo de ejecucin se utiliza AddItem:


lstName.AddItem Registro_Aadido, posicion

donde posicion es un argumento opcional que permite especificar la posicin en que se debe aadir. Si se omite el registro se aade al final de la lista. Lo anterior es vlido si la propiedad Sorted est a False; si est a True el nuevo registro se aade en la posicin ordenada que le corresponde. Para eliminar un registro,
lstName.RemoveItem Posicin_del_registro_en_la_lista

En el caso de que se quiera vaciar completamente el contenido de una lista se puede utilizar el mtodo Clear. Dos propiedades interesantes de las listas son ListCount y ListIndex. La primera contiene el nmero total de registros incluidos en la lista. La segunda permite acceder a una posicin concreta de la lista para aadir un registro nuevo en esa posicin, borrar uno ya existente, seleccionarlo, etc. Hay que recordar una vez ms que los elementos de la lista se empiezan a numerar por cero. El valor de propiedad ListIndex en cada momento coincide con el registro seleccionado y en el caso de no haber ninguno seleccionado esta propiedad vale -1. Es interesante saber que al seleccionar uno de los registros de la lista se activa el evento Click de dicha lista. Las listas permiten selecionar ms de un elemento poniendo la propiedad MultiSelect a valor 1-Simple o 2-Extended. En el primer caso los elementos se seleccionan o se elimina la seleccin simplemente haciendo clic sobre ellos. En el segundo caso la forma de hacer selecciones mltiples es la tpica de Windows, utilizando las teclas Ctrl y Shift. Con seleccin mltile la propiedad SelCount indica el nmero de elementos seleccionados, mientras que la propiedad Selected() es un array de valores boolean que indica si cada uno de los elementos de la lista est seleccionado o no.

58

Cajas combinadas (ComboBox) Un ComboBox tiene muchas cosas en comn con una lista. Por ejemplo los mtodos AddItem, RemoveItem o Clear y las propiedades List, ListIndex o ListCount. La diferencia principal es que en un ComboBox tiene una propiedad llamada Style, que puede adoptar tres valores (1,2 3) que corresponden con tres distintas formas de presentar una lista: 1. Style=0 Style=vbComboDropDown (Dropdown Combo), ste es el valor ms habitual y corresponde con el caso en el que slo se muestra el registro seleccionado, que es editable por el usuario, permaneciendo el resto oculto hasta que el usuario despliega la lista completa haciendo clic sobre el botn-flecha. 2. Style=1 Style=vbComboSimple (Simple Combo). En este caso el registro seleccionado tambin es editable, y se muestra una lista no desplegable dotada si es necesario de una scrollbar. 3. Style=2 Style=vbComboDropDownList (DropDown List). En este ltimo caso el registro seleccionado no es editable y la lista es desplegable. En una caja combinada, al igual que en una caja de texto sencilla, est permitido escribir con el teclado en tiempo de ejecucin, si la propiedad Enabled vale True. En una lista esto no es posible. La propiedad Text corresponde con lo que aparece en la parte de caja de texto del control ComboBox, bien sea porque el usuario lo ha introducido, bien porque lo haya seleccionado. Controles relacionados con archivos Trabajando en un entorno Windows 95/98/NT/Me/2000/XP es habitual tener que abrir y cerrar archivos parar leer datos, guardar un documento, etc. Hay tres controles bsicos que resultan de suma utilidad en esta tarea. Son la lista de unidades lgicas o discos (Drive ListBox), la lista de directorios (Dir ListBox) y la lista de archivos (File ListBox). Estos controles se tratan con ms detalle en el Captulo 7. Control Timer Si se desea que una accin suceda con cierta periodicidad se puede utilizar un control Timer. Este control produce de modo automtico un evento cada cierto nmero de milisegundos y es de fundamental importancia para crear animaciones o aplicaciones con movimiento de objetos. La propiedad ms importante de un objeto de este tipo es Interval, que determina, precisamente, el intervalo en milisegundos entre eventos consecutivos. La accin que se desea activar debe programarse en el evento Timer de ese mismo control. Si en algn momento se desea detener momentneamente la accin peridica es suficiente con hacer False la propiedad Enabled del control Timer y para arrancarla de nuevo volver a hacer True esa propiedad. Haciendo 0 la propiedad Interval tambin se consigue inhabilitar el Timer. 4.4 ARRAYS DE CONTROLES Arrays Un array permite referirse a una serie de elementos del mismo tipo con un mismo nombre, y hace referencia un nico elemento de la serie utilizando uno o ms ndices, como un vector o una matriz en lgebra. Visual Basic 6.0 permite definir arrays de variables de una o ms dimensiones (hasta 60) y de
59

cualquier tipo de datos (tipos fundamentales y definidos por el usuario). Pero adems Visual Basic introduce una nueva clase de arrays, los arrays de controles (esto es, arrays de botones, de etiquetas, de paneles, etc.) que permiten una programacin ms breve y clara. En este apartado slo se tratarn los arrays de variables. Todos los elementos de un array deben ser del mismo tipo y estn almacenados de forma contigua en la memoria. Por supuesto, si el array es de tipo Variant cada elemento puede contener un dato de tipo diferente, e incluso puede contener otro array. Entre los arrays de variables cabe distinguir dos tipos fundamentales, dependiendo de que nmero de elementos sea constante o pueda variar durante la ejecucin del programa. 1. Arrays estticos, cuya dimensin es siempre la misma. 2. Arrays dinmicos, cuya dimensin se puede modificar durante la ejecucin del programa. Arrays estticos La declaracin de un array esttico depender de su mbito. La declaracin de un array pblico se hace en la seccin de declaraciones de un mdulo utilizando la sentencia Public. La declaracin de un array a nivel del mdulo o del formulario se hace en la seccin de declaraciones del mdulo o del formulario utilizando la sentencia Dim o Private. Para declarar un array local a un procedimiento, se utiliza la sentencia Dim, Private o Static dentro del propio procedimiento.

A continuacin se presentan algunos ejemplos:


Dim vector(19) As Double

Este ejemplo declara un array de una dimensin, llamado vector, con veinte elementos, vector(0), vector(1), ... , vector(19), cada uno de los cuales permite almacenar un Double. Salvo que se indique otra cosa, los ndices se empiezan a contar en cero.
Dim matriz(3, 1 To 6) As Integer

Este ejemplo declara un array de dos dimensiones, llamado matriz, con 4x6 elementos, matriz(0,1), ... matriz(3,6), de tipo entero.
Public cadena(1 To 12) As String

El ejemplo anterior declara un array de una dimensin, cadena, con doce elementos, caract(1), ... , caract(12), cada uno de los cules permite almacenar una cadena de caracteres. La declaracin de los arrays estticos es bastante cmoda. Se declaran una vez. Sin embargo tienen el inconveniente que en la mayora de los casos estn sobredimensionados y utilizan ms memoria de la que realmente necesitan. Esto implica que se est malgastando memoria. Para solucionar este problema se utilizan los arrays dinmicos. Arrays dinmicos El espacio necesario para un array esttico se asigna al iniciarse el programa y permanece fijo durante su ejecucin. El espacio para un array dinmico se asigna durante la ejecucin del programa. Un array dinmico, puede ser redimensionado en cualquier momento de la ejecucin. La forma mejor de redimensionar los arrays es mediante variables que contienen los valores adecuados. Para crear un array dinmico primero hay que declararlo como si fuera una array esttico, pero sin darle dimensin. Es decir, se deja la lista -entre parntesis- vaca sin ponerle ningn nmero.
60

Esto se hace con la sentencia Public si se quiere que sea global, con Dim o Private si se quiere a nivel de mdulo o con Static, Dim o Private si se quiere que sea local. Para asignar el nmero actual de elementos del array se utiliza la sentencia ReDim. La sentencia ReDim puede aparecer solamente en un procedimiento y permite cambiar el nmero de elementos del array y sus lmites inferior y superior, pero no el nmero de dimensiones. Esto quiere decir que, por ejemplo, no se puede trasformar un vector en una matriz. A continuacin se presenta un ejemplo de cmo se declaran arrays dinmicos en Visual Basic. Si se declara el array Matriz a nivel del formulario,
Dim Matriz( ) As Integer

y ms tarde, un procedimiento Calculo puede asignar espacio para el array, como se indica a continuacin:
Sub Calculo( ) ... ReDim Matriz(F, C) ... End Sub

Cada vez que se ejecuta la sentencia ReDim, todos los valores almacenados en el array se pierden (si son Variant se ponen a Empty; si son numricos a cero y si son cadenas de caracteres a la cadena vaca). Cuando interese cambiar el tamao del array conservando los valores del array, hay que ejecutar ReDim con la palabra clave Preserve. Por ejemplo, supngase un array A de dos dimensiones. La sentencia,
ReDim Preserve A(D1, UBound(A, 2) + 2)

incrementa el tamao del array en dos columnas ms. Cuando se utiliza la palabra Preserve no puede cambiarse el ndice inferior del array (s el superior). La funcin UBound utilizada en este ejemplo es una funcin que devuelve el valor ms alto de la segunda dimensin de la matriz (ver el Help para ms informacin). Arrays de controles Un array de controles esta formado por controles del mismo tipo que comparten el nombre y los procedimientos o funciones para gestionar los eventos. Para identificar a cada uno de los controles pertenecientes al array se utiliza Index o ndice, que es una propiedad ms de cada control. Suponiendo que el sistema tenga memoria suficiente un array en Windows 95/98/NT/Me/2000/XP podra llegar a tener hasta 32767 elementos. La utilidad principal de los arrays se presenta en aquellos casos en los que el programa debe responder de forma semejante a un mismo evento sobre varios controles del mismo tipo. Los ejemplos ms claros son los botones de opcin y los mens. En estos casos el programa responde de manera semejante independientemente de cul es la opcin seleccionada. Los arrays de controles comparten cdigo, lo cual quiere decir que slo hay que programar una funcin para responder a un evento de un determinado tipo sobre cualquier control del array. Las funciones que gestionan los eventos de un array tienen siempre u argumento adicional del tipo Index As Integer que indica qu control del array ha recibido el evento. Una opcin avanzada de Visual Basic 6.0 permite crear objetos en tiempo de ejecucin, siempre que sean elementos de un array ya existente, con la instruccin Load. De forma anloga se
61

pueden destruir con Unload. 4.5 EVENTOS A continuacin se presentan brevemente los eventos ms normales que reconoce Visual Basic 6.0. Es importante tener una visin general de los eventos que existen en Windows 95/98/NT/Me/2000/XP porque cada control de los que se vern ms adelante tiene su propio conjunto de eventos que reconoce, y otros que no reconoce. Cualquier usuario de las aplicaciones escritas para Windows 95/98/NT/Me/2000/XP hace uso continuo e intuitivo de los eventos, pero es posible que nunca se haya detenido a pensar en ello. Para saber qu eventos puede recibir un control determinado basta seleccionarlo y pulsar <F1>. De esta forma se abre una ventana del Help que explica el control y permite acceder a los eventos que soporta. EVENTOS GENERALES Carga y descarga de formularios. Cuando se arranca una aplicacin, o ms en concreto cuando se visualiza por primera vez un formulario se producen varios eventos consecutivos: Initialize, Load, Activate y Paint. Cada uno de estos eventos se puede aprovechar para realizar ciertas operaciones por medio de la funcin correspondiente. Al ocultar, cerrar o eliminar un formulario se producen otra serie de eventos: Deactivate, QueryUnload, Unload y Terminate que se vern en un prximo ejemplo. Para inicializar las variables definidas a nivel de mdulo se suele utilizar el evento Initialize, que tiene lugar antes que el Load. El evento Load se activa al cargar un formulario. Con el formulario principal esto sucede al arrancar la ejecucin de un programa; con el resto de los formularios al mandarlos cargar desde cualquier procedimiento o al hacer referencia a alguna propiedad o control de un formulario que no est cargado. Al descargar un formulario se produce el evento Unload. Si se detiene el programa desde el botn Stop de Visual Basic 6.0 (o del men correspondiente) o con un End, no se pasa por el evento Unload. Para pasar por el evento Unload es necesario cerrar la ventana con el botn de cerrar o llamarlo explcitamente. El evento QueryUnload se produce antes del evento Unload y permite por ejemplo enviar un mensaje de confirmacin. El evento Load de un formulario se suele utilizar para ejecutar una funcin que d valor a sus propiedades y a las de los controles que dependen de dicho formulario. No se puede utilizar para dibujar o imprimir sobre el formulario, pues en el momento en que se produce este evento el formulario todava no est disponible para dichas operaciones. Por ejemplo, si en el formulario debe aparecer la salida del mtodo Print o de los mtodos grficos Pset, Line y Circle (que se estudian en el Captulo 6 de este manual) puede utilizarse el evento Paint u otro posterior (por ejemplo, el evento GotFocus del primer control) pero no puede utilizarse el evento Load. Se puede ocultar un formulario sin descargarlo con el mtodo Hide o haciendo la propiedad Visible = False. Esto hace que el formulario desaparezca de la ventana, aunque sus variables y propiedades sigan estando accesibles y conservando sus valores. Para hacer visible un formulario oculto pero ya cargado se utiliza el mtodo Show, que equivale a hacer la propiedad Visible = True, y que genera los eventos Activate y Paint. Si el formulario no haba sido cargado previamente, el mtodo Show genera los cuatro eventos mencionados. Cuando un formulario pasa a ser la ventana activa se produce el evento Activate y al dejar de
62

serlo el evento Deactivate. En el caso de que el formulario que va a ser activo no estuviera cargado ya, primero sucederan los eventos Initialize, Load y luego los eventos Activate y Paint. Todo esto se puede ver y entender con un simple ejemplo, mostrado en la Figura 4.3. Se han de crear dos formularios (frmPrincipal y frmSecundario). El primero de ellos contendr dos botones (cmdVerSec y cmdSalir) y el segundo tres (cmdHide, cmdUnload y cmdTerminate). El formulario principal ser el primero que aparece, y slo se ver el segundo si se hace clic en el botn Cargar Formulario. Cuando as se haga, a medida que los eventos antes mencionados se vayan sucediendo, irn apareciendo en pantalla unas cajas de mensajes que tendrn como texto el nombre del evento que se acaba de producir. Segn con cual de los tres botones se haga desaparecer el segundo formulario, al volverlo a ver se producirn unos eventos u otros, segn se puede ver por los mensajes que van apareciendo con cada evento.
' cdigo del form. principal Private Sub cmdCargar_Click() frmSecundario.Show End Sub ' cdigo del form. secundario Private Sub cmdHide_Click() Hide End Sub Private Sub cmdUnload_Click() Unload Me End Sub Private Sub cmdTerminate_Click() Hide Set Form2 = Nothing End Sub Private Sub Form_Activate() MsgBox ("Evento Activate") End Sub Private Sub Form_Deactivate() MsgBox ("Evento Deactivate") End Sub Private Sub Form_Initialize() MsgBox ("Evento Initialize") End Sub Private Sub Form_Load() MsgBox ("Evento Load") End Sub Private Sub Form_Paint() MsgBox ("Evento Paint") End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)MsgBox ("Evento QueryUnload")End Sub
63

Figura 4.3 Resultado del ejemplo de carga de formularios.

Private Sub Form_Terminate() MsgBox ("Evento Terminate") End Sub Private Sub Form_Unload(Cancel As Integer) MsgBox ("Evento Unload") End Sub

Es muy interesante realizar este ejemplo y seguir la secuencia de eventos que se producen al hacer aparecer y desaparecer los formularios. Paint El evento Paint sucede cuando hay que redibujar un formulario o PictureBox. Esto sucede cuando esos objetos se hacen visibles por primera vez y tambin cuando vuelven a ser visibles despus de haber estado tapados por otros, tras haber sido movidos o tras haber sido modificados de tamao. El foco (focus) En todas las aplicaciones de Windows, en cualquiera de sus versiones, siempre hay un nico control, formulario o ventana que puede recibir entradas desde teclado. En cada momento ese control, ventana o formulario es el que dispone del foco (focus). El objeto que posee el foco est caracterizado por estar resaltado con letra negrita, con un contorno ms vivo o teniendo parpadeando el cursor en l. Este foco puede ser trasladado de un objeto a otro por cdigo o por interacciones del usuario, como por ejemplo haciendo clic con el ratn en distintos puntos de la pantalla o pulsando la tecla Tab. Cada vez que un objeto pierde el foco se produce su evento LostFocus y, posteriormente, el evento GotFocus del objeto que ha recibido el foco. El mtodo SetFocus permite dar el focus al objeto al que se aplica. Dos propiedades de muchos controles relacionadas con el foco son TabIndex y TabStop. TabStop determina si el foco se va o no a posar en el objeto al pulsar la tecla Tab (si TabStop est a False no se puede obtener el foco mediante el tabulador) y TabIndex determina el orden en el que esto va a suceder. As al cargar un formulario, el foco estar en aquel objeto cuyo TabIndex sea 0. Al pulsar la tecla Tab el foco ir al objeto que tenga TabIndex = 1 y as sucesivamente. Para retroceder en esta lista se pulsa Maysculas+Tab. La propiedad TabIndex se puede determinar en tiempo de diseo por medio de la caja de propiedades de un control, del modo habitual. Cuando a un control se le asigna un determinado valor de TabIndex, Visual Basic ajusta automticamente los valores de los dems controles (si tiene que desplazarlos hacia arriba o hacia abajo, lo hace de modo que siempre tengan nmeros consecutivos). Para que un formulario reciba el foco es necesario que no haya en l ningn control que sea capaz de recibirlo. Un grupo de botones de opcin tiene un nico TabIndex, es decir, se comporta como si fuera un nico control. Para elegir una u otra de las opciones se utilizan las flechas del teclado ( y ). KeyPress, KeyUp y KeyDown El evento KeyPress sucede cuando el usuario pulsa y suelta determinada tecla. En el procedimiento asociado con este evento el nico argumento KeyAscii es necesario para conocer cul es el cdigo ASCII de la tecla pulsada. El evento KeyDown se produce cuando el usuario pulsa determinada tecla y el evento KeyUp al soltar una tecla. Los eventos KeyUp y KeyDown tienen un segundo argumento llamado Shift que permiten
64

determinar si esa tecla se ha pulsado estando pulsadas a la vez cualquier combinacin de las teclas Shift, Alt y Ctrl. En un apartado prximo se explica cmo se identifican las teclas pulsadas a partir del argumento Shift. Click y DblClick El evento Click se activa cuando el usuario pulsa y suelta rpidamente uno de los botones del ratn. Tambin puede activarse desde cdigo (sin tocar el ratn) variando la propiedad Value de alguno de los controles. En el caso de un formulario este evento se activa cuando el usuario hace clic sobre una zona del formulario en la que no haya ningn control o sobre un control que en ese momento est inhabilitado (propiedad Enabled = False). En el caso de un control, el evento se activa cuando el usuario realiza una de las siguientes operaciones: Hacer clic sobre un control con el botn derecho o izquierdo del ratn. En el caso de un botn de comando, de un botn de seleccin o de un botn de opcin, el evento sucede solamente al hacer clic con el botn izquierdo. Seleccionar un registro de alguno de los varios tipos listas desplegables que dispone Visual Basic. Pulsar la barra espaciadora cuando el foco est en un botn de comando, en un botn de seleccin o en un botn de opcin. Pulsar la tecla Return cuando en un formulario hay un botn que tiene su propiedad Default = True. Pulsar la tecla Esc cuando en un formulario hay un botn que tiene su propiedad Cancel = True. Pulsar una combinacin de teclas aceleradoras (Alt + otra tecla, como por ejemplo cuando de despliega el men Archivo de Word con Alt+F) definidas para activar un determinado control de un formulario.

Tambin se puede activar el evento Click desde cdigo realizando una de las siguientes operaciones: Hacer que la propiedad Value de un botn de comando valga True. Hacer que la propiedad Value de un botn de opcin valga True Modificar la propiedad Value de un botn de seleccin.

El evento DblClick sucede al hacer clic dos veces seguidas sobre un control o formulario con el botn izquierdo del ratn. MouseDown, MouseUp y MouseMove El evento MouseDown sucede cuando el usuario pulsa cualquiera de los botones del ratn, mientras que el evento MouseUp sucede al soltar un botn que haba sido pulsado. El evento MouseMove sucede al mover el ratn sobre un control o formulario. Los eventos MouseUp y MouseDown tienen algunos argumentos que merecen ser comentados. El argumento Button indica cul de los botones del ratn ha sido pulsado o soltado, y el argumento Shift indica si adems alguna de las teclas alt, shift o ctrl est tambin pulsada. La lista con todos los posibles valores de estos argumentos se muestra en la Tabla 4.1:
Cte simblica vbLeftButton Valor 1 Accin Botn izdo pulsado o soltado Cte simblica vbShiftMask Valor 1 Accin Tecla SHIFT pulsada 65

vbRightButton vbMiddleButton

Botn dcho pulsado o soltado

vbCtrlMask

Tecla CTRL pulsada

4 Botn central pulsado o soltado vbAltMask 4 Tecla ALT pulsada Tabla 4.1. Valores de los argumentos de los eventos MouseUp y MouseDown.

Con estos valores se aplica la aritmtica booleana, lo cual quiere decir que si se pulsan simultneamente los botones izquierdo y derecho del ratn el argumento Button valdr 3 (1+2) y si se pulsan las tres teclas shift, ctrl y alt simultneamente el argumento Shift valdr 7 (1+2+4). Con esta forma de combinar los valores se resuelven todas las indeterminaciones posibles. DragOver y DragDrop El evento DragOver sucede mientras se est arrastrando un objeto sobre un control. Suele utilizarse para variar la forma del cursor que se mueve con el ratn dependiendo de si el objeto sobre el que se encuentra el cursor en ese momento es vlido para soltar o no. El evento DragDrop sucede al concluir una operacin de arrastrar y soltar. El evento DragOver requiere de los argumentos que se muestran a continuacin:
Private Sub Text1_DragOver(Source As Control, _X As Single, Y As Single, State As Integer) ... End Sub

Los argumentos de este evento son Source que contiene el objeto que est siendo arrastrado, X e Y que indican la posicin del objeto arrastrado dentro del sistema de coordenadas del objeto sobre el que se est arrastrando y State (que es propio del DragOver, pero no aparece en el DragDrop) que vale 0, 1 2 segn se est entrando, saliendo o permaneciendo dentro del mismo objeto, respectivamente. Es importante sealar que el evento DragOver pertenece al objeto sobre el que se arrastra, no al objeto que es arrastrado. En el Help se puede encontrar informacin sobre la propiedad DragMode, que puede tomar dos valores (vbManual y vbAutomatic). Esta constante determina cmo comienza una oparacin de arrastre de un objeto. En modo manual se debe comenzar llamando al mtodo Drag para el objeto a arrastrar. En modo automtico basta hacer clic sobre el objeto a arrastrar, pero puede que en esta caso dicho objeto no responda del modo habitual a otros eventos. GotFocus Aplicable a: Control CheckBox, Control ComboBox, Control CommandButton, , Objeto Form Controles HScrollBar y VScrollBar, Control ListBox, Control OptionButton, Control PictureBox, Control TextBox. Ocurre cuando un objeto recibe el enfoque, ya sea mediante una accin del usuario, como tabular o hacer clic en el objeto, o cambiando el enfoque en el cdigo mediante el mtodo SetFocus. Un formulario recibe el enfoque slo cuando todos los controles visibles estn desactivados. Sintaxis:
Private Sub Form_GotFocus( ) Private Sub objeto_GotFocus([ndice As Integer])

La sintaxis del evento GotFocus consta de las siguientes partes:


Parte objeto ndice Descripcin Una expresin de objeto que da como resultado un objeto de la lista Aplicable a. Un entero que identifica de manera nica a un control si est en una matriz de controles.

Normalmente, el procedimiento de evento GotFocus se utiliza para especificar las acciones


66

que ocurren cuando un control o un formulario recibe primero el enfoque. Por ejemplo, si adjunta un procedimiento de evento GotFocus a cada control de un formulario puede guiar al usuario mostrndole instrucciones breves o mensajes en la barra de estado. Tambin puede proporcionar avisos visuales activando, desactivando o mostrando otros controles que dependan del control que tiene el enfoque. Un objeto puede recibir el enfoque slo si sus propiedades Enabled y Visible estn establecidas a True. Para personalizar el interfaz de teclado en Visual Basic para mover el enfoque, establezca el orden de tabulacin o especifique teclas de acceso para controles de un formulario. Ejemplo del evento GotFocus Este ejemplo muestra un mensaje en la barra de estado cuando un botn de un grupo OptionButton obtiene el enfoque. Para probar este ejemplo, pegue el cdigo en la seccin Declaraciones de un formulario que contenga dos controles OptionButton y un control Label. Establezca la propiedad Name de ambos controles OptionButton a OptionGroup y, despus, presione F5 y haga clic en los controles OptionButton.
Private Sub Form_Load () Label1.AutoSize = True End Sub Private Sub OptionGroup_GotFocus (Index As Integer) Select Case Index Case 0 Label1.Caption = "La opcin 1 tiene el enfoque." Case 1 Label1.Caption = "La opcin 2 tiene el enfoque." End Select End Sub Private Sub OptionGroup_LostFocus (Index As Integer) Label1.Caption = "" End Sub

Change Aplicable a: Control ComboBox, Controles HScrollBar y VScrollBar, Control Label, Control PictureBox, Control TextBox Indica que el contenido de un control ha cambiado. Cmo y cundo ha ocurrido este evento vara segn el control: ComboBox: cambia el texto de la parte de cuadro de texto del control. Ocurre slo si la propiedad Style est establecida a 0 (Dropdown Combo) o 1 (Simple Combo) y el usuario cambia el texto o usted cambia la configuracin de la propiedad Text mediante cdigo. DirListBox: cambia el directorio seleccionado. Ocurre cuando el usuario hace doble clic en un nuevo directorio o cuando usted cambia la configuracin de la propiedad Path mediante cdigo. DriveListBox: cambia la unidad seleccionada. Ocurre cuando el usuario selecciona una nueva unidad o cuando usted cambia la configuracin de la propiedad Drive mediante cdigo. HScrollBar y VScrollBar (barras de desplazamiento horizontal y vertical): mueven la parte de cuadro de desplazamiento de la barra de desplazamiento. Ocurre cuando el usuario desplaza o cuando usted cambia la configuracin de la propiedad Value mediante cdigo.
67

Label: cambia el contenido del control Label. Ocurre cuando un vnculo DDE actualiza los datos o cuando usted cambia la configuracin de la propiedad Caption mediante cdigo. PictureBox: cambia el contenido del control PictureBox. Ocurre cuando un vnculo DDE actualiza los datos o cuando usted cambia la configuracin de la propiedad Picture mediante cdigo. TextBox: cambia el contenido del cuadro de texto. Ocurre cuando un vnculo DDE actualiza los datos, cuando un usuario cambia el texto o cuando usted cambia la configuracin de la propiedad Text mediante cdigo.

Sintaxis: Private Sub objeto_Change([ndice As Integer]) La sintaxis del evento Change consta de las siguientes partes:
Parte objeto ndice Descripcin Una expresin de objeto que da como resultado un objeto de la lista Aplicable a. Un entero que identifica de manera nica a un control si est en una matriz de controles.

El procedimiento del evento Change puede sincronizar o coordinar la presentacin de datos entre controles. Por ejemplo, puede utilizar un procedimiento de evento Change de una barra de desplazamiento para actualizar la configuracin de la propiedad Value de la barra de desplazamiento de un control TextBox. O bien, puede utilizar un procedimiento de evento Change para mostrar datos y frmulas en un rea de trabajo y los resultados en otra rea. Los procedimientos de evento Change son tambin tiles para actualizar propiedades de controles del sistema de archivos (DirListBox, DriveListBox y FileListBox). Por ejemplo, puede actualizar la configuracin de la propiedad Path para que un control DirListBox refleje un cambio en la configuracin de la propiedad Drive de un control DriveListBox. Un procedimiento de evento Change puede algunas veces causar un evento en cascada. Esto ocurre cuando el procedimiento de evento Change del control altera el contenido del control, por ejemplo, estableciendo una propiedad en el cdigo que determina el valor del control, como el valor de la propiedad Text para un control TextBox. Para impedir un evento en cascada: Si es posible, evite escribir un procedimiento de evento Change para un control que altere el contenido de ese control. Si escribe un procedimiento as, asegrese de establecer un indicador que impida cambios posteriores mientras el cambio actual est en curso. Evite crear dos o ms controles cuyos procedimientos de evento Change se vean afectados entre s, por ejemplo, dos controles TextBox que se actualicen entre s durante sus eventos Change. Evite utilizar una funcin o una instruccin MsgBox en este evento para los controles HScrollBar y VScrollBar.

Ejemplo del evento Change Este ejemplo muestra la configuracin numrica de la propiedad Value de una barra de desplazamiento horizontal en un control TextBox. Para probar este ejemplo, cree un formulario con un control TextBox y un control HScrollBar y despus pegue el cdigo en la seccin Declaraciones de un formulario que contenga una barra de desplazamiento horizontal (control HScrollBar) y un control TextBox. Presione F5 y haga clic en la barra de desplazamiento horizontal.
Private Sub Form_Load () 68

HScroll1.Min = 0 HScroll1.Max = 1000 HScroll1.LargeChange = 100 HScroll1.SmallChange = 1 End Sub

' ' ' '

Establece Establece Establece Establece

Min. Max. LargeChange. SmallChange.

Private Sub HScroll1_Change () Text1.Text = HScroll1.Value End Sub

Click Aplicable a: Control CheckBox, Control ComboBox, Control CommandButton, Objeto Form, Control Frame, Control Image, Control Label, Control ListBox, Control Menu, Control OptionButton, Control PictureBox, Control TextBox. Ocurre cuando el usuario presiona y suelta un botn del mouse (ratn) en un objeto. Tambin puede ocurrir cuando se cambia el valor de un control. Para un objeto Form, este evento ocurre cuando el usuario hace clic en un rea en blanco o en un control desactivado. Para un control, este evento ocurre cuando el usuario: Hace clic en un control con el botn primario o secundario del mouse. Con un control CheckBox, CommandButton, ListBox o OptionButton, el evento Click slo ocurre cuando el usuario hace clic con el botn primario del mouse. Selecciona un elemento de un control ComboBox o ListBox, ya sea presionando las teclas de direccin o haciendo clic con el botn del mouse. Presiona la BARRA ESPACIADORA cuando un control CommandButton, OptionButton o CheckBox tiene el enfoque. Presiona ENTRAR cuando un formulario tiene un control CommandButton con su propiedad Default establecida a True. Presiona ESC cuando un formulario tiene un botn Cancelar, un control CommandButton con su propiedad Cancel establecida a True. Presiona una tecla de acceso para un control. Por ejemplo, si el ttulo de un control CommandButton es "&Ir", al presionar ALT+I se desencadena este evento.

Tambin puede desencadenar el evento Click en el cdigo si: Establece la propiedad Value de un control CommandButton a True. Establece la propiedad Value de un control OptionButton a True. Cambia el valor de la propiedad Value de un control CheckBox.

Sintaxis:
Private Sub Form_Click( ) Private Sub objeto_Click([ndice As Integer])

La sintaxis del evento Click consta de las siguientes partes:


Parte objeto ndice Descripcin Una expresin de objeto que da como resultado un objeto de la lista Aplicable a. Un entero que identifica de manera nica a un control si est en una matriz de controles.

69

Por lo general se adjunta un procedimiento de evento Click a un control CommandButton, un objeto Menu o un control PictureBox para realizar comandos y acciones similares a comandos. Para los dems controles aplicables, utilice este evento para desencadenar acciones como respuesta a un cambio en el control. Puede utilizar la propiedad Value de un control para comprobar el estado del control desde el cdigo. Hacer clic en un control genera los eventos MouseDown y MouseUp adems del evento Click. El orden en que ocurren estos tres eventos vara de un control a otro. Por ejemplo, para los controles ListBox y CommandButton, los eventos ocurren en este orden: MouseDown, Click, MouseUp. Pero para los controles FileListBox, Label o PictureBox, los eventos ocurren en este otro orden: MouseDown, MouseUp y Click. Cuando est adjuntando procedimientos para estos eventos relacionados, asegrese de que sus acciones no entran en conflicto. Si el orden de los eventos es importante en la aplicacin, pruebe el control para determinar el orden de los mismos. Para distinguir entre los botones primario, secundario y central del mouse, utilice los eventos MouseDown y MouseUp. Si hay cdigo en el evento Click, nunca se activar el evento DlbClick ya que de los dos eventos, Click es el primero que se activa. Como resultado, el evento Click intercepta el clic del mouse, por lo que DblClick nunca se producir. Ejemplo del Evento Click En este ejemplo, cada vez que se hace clic en un control PictureBox se mueve diagonalmente por un formulario. Para probar este ejemplo, pegue el cdigo en la seccin Declaraciones de un formulario que contenga un control PictureBox en la esquina inferior izquierda del mismo, despus presione F5 y haga clic en el control PictureBox.
Private Sub Picture1_Click () Picture1.Move Picture1.Left + 750, Picture1.Top - 550 End Sub

KeyPress Aplicable a: Control CheckBox, Control ComboBox, Control CommandButton, Objeto Form Controles HScrollBar y VScrollBar, Control ListBox, Control OptionButton, Control PictureBox, Control TextBox. Ocurre cuando el usuario presiona y suelta una tecla. Sintaxis:
Private Sub Form_KeyPress(keyascii As Integer) Private Sub objeto_KeyPress([ndice As Integer,]keyascii As Integer)

La sintaxis del evento KeyPress consta de las siguientes partes:


Parte objeto ndice keyascii Descripcin Una expresin de objeto que da como resultado un objeto de la lista Aplicable a. Un entero que identifica de manera nica a un control si est en una matriz de controles. Un entero que devuelve un cdigo de tecla numrico ANSI estndar. keyascii se pasa por referencia; al cambiarlo se enva un carcter diferente al objeto. Cambiar keyascii a 0 cancela la pulsacin de tecla, de forma que el objeto no recibe ningn carcter.

El objeto que tiene el enfoque recibe el evento. Un formulario puede recibir el evento slo si no tiene controles visibles y activados. Un evento KeyPress puede implicar a cualquier carcter imprimible del teclado, a la tecla CTRL combinada con un carcter del alfabeto estndar o uno de los caracteres especiales, y la tecla ENTRAR o RETROCESO. Un procedimiento de evento KeyPress es til para interceptar pulsaciones de teclas realizadas en un control TextBox o
70

ComboBox. Esto le permite comprobar inmediatamente la validez de las pulsaciones o el formato de los caracteres a medida que se escriben. Cambiar el valor del argumento keyascii cambia el carcter mostrado. KeyPress interpreta las maysculas y minsculas de cada carcter como cdigos de tecla distintos y, por tanto, como caracteres diferentes. El nmero ANSI para la combinacin de teclado CTRL+@ es 0. Puesto que Visual Basic reconoce un valor keyascii de 0 como una cadena de longitud cero (""), evite utilizar CTRL+@ en sus aplicaciones. Ejemplo del evento KeyPress Este ejemplo convierte a maysculas el texto escrito en un control TextBox. Para probar este ejemplo, pegue el cdigo en la seccin Declaraciones de un formulario que contenga un control TextBox y, despus, presione F5 y escriba algo en el control TextBox.
Private Sub Text1_KeyPress (KeyAscii As Integer) Char = Chr(KeyAscii) KeyAscii = Asc(UCase(Char)) End Sub

Load Aplicable a: Objeto Form. Ocurre cuando se carga un formulario. Para un formulario de inicio, ocurre cuando una aplicacin se inicia como resultado de una instruccin Load o como resultado de una referencia a una propiedad o control de un formulario descargado. Sintaxis:
Private Sub Form_Load( ) Private Sub MDIForm_Load( )

Normalmente utiliza un procedimiento de evento Load para incluir cdigo de inicializacin para un formulario; por ejemplo, cdigo que especifica los valores predeterminados de los controles, indica el contenido que se va a cargar en controles ComboBox o ListBox e inicializa variables a nivel del formulario. El evento Load ocurre tras el evento Initialize. Cuando cree procedimientos para eventos relacionados, como Activate, GotFocus, Paint y Resize, asegrese de que sus acciones no entran en conflicto y no producen eventos recursivos. Ejemplo del evento Load Este ejemplo carga elementos en un control ComboBox cuando se carga un formulario. Para probar este ejemplo, pegue el cdigo en la seccin Declaraciones de un formulario que contenga un control ComboBox y despus presione F5.
Private Sub Form_Load () Combo1.AddItem "Mozart" Combo1.AddItem "Beethoven" Combo1.AddItem "Rock 'n Roll" Combo1.AddItem "Reggae" Combo1.ListIndex = 2 End Sub ' Agrega elementos a la lista.

' Establece la seleccin predeterminada.

LostFocus Aplicable a: Control CheckBox, Control ComboBox, Control CommandButton, Objeto Form
71

Controles HScrollBar y VScrollBar, Control ListBox, Control OptionButton, Control PictureBox, Control TextBox. Ocurre cuando un objeto pierde el enfoque, ya sea por una accin del usuario, como tabular o hacer clic en otro objeto, o bien mediante un cambio del enfoque en el cdigo con el mtodo SetFocus. Sintaxis:
Private Sub Form_LostFocus( ) Private Sub objeto_LostFocus([ndice As Integer])

La sintaxis del evento LostFocus consta de las siguientes partes:


Parte objeto ndice Descripcin Una expresin de objeto que da como resultado un objeto de la lista Aplicable a. Un entero que identifica de manera nica a un control si est en una matriz de controles.

Un procedimiento de evento LostFocus resulta especialmente til para comprobar y validar actualizaciones. Utilizar LostFocus puede hacer que la validacin tenga lugar conforme el usuario mueve el enfoque del control. Otro uso para este tipo de procedimiento de evento es activar, desactivar, ocultar y mostrar otros objetos, como en un procedimiento de evento GotFocus. Tambin puede invertir o cambiar condiciones que estableci en el procedimiento de evento GotFocus del objeto. Ejemplo del evento LostFocus Este ejemplo cambia el color de un control TextBox cuando recibe o pierde el enfoque (se selecciona con el mouse o la tecla TAB) y muestra el texto apropiado en el control Label. Para probar este ejemplo, pegue el cdigo en la seccin Declaraciones de un formulario que contenga dos controles TextBox y un control Label y, despus, presione F5 y mueva el enfoque entre Text1 y Text2.
Private Sub Text1_GotFocus () ' Muestra el enfoque en rojo. Text1.BackColor = RGB(255, 0, 0) Label1.Caption = "Text1 tiene el enfoque." End Sub Private Sub Text1_LostFocus () ' Muestra la prdida del enfoque en azul. Text1.BackColor = RGB(0, 0, 255) Label1.Caption = "Text1 no tiene el enfoque." End Sub

MouseMove Aplicable a: Control CheckBox, Control CommandButton, Control Data, Objeto Form, Control Frame, Control Image, Control Label, Control ListBox, Control OptionButton, Control PictureBox, Control TextBox. Ocurre cuando el usuario mueve el mouse. Sintaxis:

72

Private Sub Form_MouseMove(botn As Integer, mays As Integer, x As Single, y As Single) Private Sub MDIForm_MouseMove(botn As Integer, mays As Integer, x As Single, y As Single) Private Sub objeto_MouseMove([ndice As Integer,] botn As Integer, mays As Integer, x As Single, y As Single)

La sintaxis del evento MouseMove consta de las siguientes partes:


Parte objeto ndice botn Descripcin Una expresin de objeto que da como resultado un objeto de la lista Aplicable a. Un entero que identifica de manera nica a un control si est en una matriz de controles. Un entero que corresponde al estado de los botones del mouse en el cual un bit se establece si el botn est presionado. El argumento botn es un campo de bit con los bits correspondientes al botn primario (bit 0), al botn secundario (bit 1) y al botn central (bit 2). Estos bits corresponden a los valores 1, 2 y 4, respectivamente. Indica el estado completo de los botones del mouse; alguno, todos o ninguno de estos tres bits puede estar establecido, lo que indica que algunos, todos o ninguno de los botones est presionado. Un entero que corresponde al estado de las teclas MAYS, CTRL y ALT. Un bit est establecido si la tecla est presionada. El argumento mays es un campo de bits con los bits menos significativos correspondientes a la tecla MAYS (bit 0), CTRL (bit 1) y ALT (bit 2 ). Estos bits corresponden a los valores 1, 2 y 4, respectivamente. El argumento mays indica el estado de estas teclas. Alguno, todos o ninguno de los bits puede estar establecido, lo que indica que alguna, todas o ninguna de las teclas est presionada. Por ejemplo, si se presionaron las teclas CTRL y ALT, el valor de shift sera 6. Un nmero que especifica la ubicacin actual del puntero del mouse. Los valores x e y siempre se expresan en trminos del sistema de coordenadas establecido por las propiedades ScaleHeight, ScaleWidth, ScaleLeft y ScaleTop del objeto.

mays

x, y

El evento MouseMove se genera continuamente a medida que el puntero del mouse se mueve por los objetos. A menos que otro objeto haya capturado el mouse, un objeto reconoce un evento MouseMove siempre que la posicin del mouse est dentro de sus bordes. Ejemplo del evento MouseMove Este ejemplo muestra una aplicacin de dibujo simple. El procedimiento de evento MouseDown funciona con un procedimiento MouseMove relacionado para activar el dibujo cuando est presionado cualquier botn del mouse. El procedimiento de evento MouseUp desactiva el dibujo. Para probar este ejemplo, pegue el cdigo en la seccin Declaraciones de un formulario, despus presione F5, haga clic en el formulario y mueva el mouse mientras est presionado el botn del mismo.
Dim PaintNow As Boolean ' Declara una variable. Private Sub Form_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As Single) PaintNow = True ' Activa el dibujo. End Sub Private Sub Form_MouseUp (Button As Integer, X As Single, Y As Single) PaintNow = False ' Desactiva el dibujo. End Sub Private Sub Form_MouseMove (Button As Integer, Shift As Integer, X As Single, Y As 73

Single) If PaintNow Then PSet (X, Y) End If End Sub Private Sub Form_Load () DrawWidth = 10 ForeColor = RGB(0, 0, 255) End Sub ' Utiliza un pincel ms ancho. ' Establece el color de dibujo. ' Dibuja un punto.

Timer Aplicable a: Control Timer Ocurre cuando ha transcurrido un intervalo preestablecido para un control Timer. La frecuencia del intervalo se almacena en la propiedad Interval del control, que especifica el tiempo en milisegundos. Sintaxis: Private Sub objeto_Timer([ndice As Integer]) La sintaxis del evento Timer consta de las siguientes partes:
Parte objeto ndice Descripcin Una expresin de objeto que da como resultado un objeto de la lista Aplicable a. Un entero que identifica de manera nica a un control si est en una matriz de controles.

Utilice este procedimiento de evento para indicar a Visual Basic qu hacer cada vez que se agote el intervalo de tiempo de un control Timer. Cuando est trabajando con el evento Timer: La propiedad Interval especifica el intervalo entre los eventos Timer, en milisegundos. Siempre que la propiedad Enabled del control Timer est establecida a True y la propiedad Interval sea mayor que 0, el evento Timer espera durante el periodo especificado en la propiedad Interval.

Ejemplo del evento Timer Este ejemplo muestra un reloj digital. Para probar este ejemplo, pegue el cdigo en la seccin Declaraciones de un formulario que contenga un control Label y un control Timer y, despus, presione F5.
Private Sub Form_Load () Timer1.Interval = 1000 End Sub Private Sub Timer1_Timer () Label1.Caption = Time End Sub ' Establece el intervalo de Timer.

' Actualiza la presentacin de la hora.

Este ejemplo mueve un control PictureBox por un formulario. Para probar este ejemplo, pegue el cdigo en la seccin Declaraciones de un formulario que contenga un control Timer y un control PictureBox y, despus, presione F5. Si desea obtener un efecto visual mejor puede asignar un mapa de bits al control PictureBox mediante la propiedad Picture.
Dim DeltaX, DeltaY As Integer ' Declara variables. 74

Private Sub Timer1_Timer () Picture1.Move Picture1.Left + DeltaX, Picture1.Top + DeltaY If Picture1.Left < ScaleLeft Then DeltaX = 100 If Picture1.Left + Picture1.Width > ScaleWidth + ScaleLeft Then DeltaX = -100 End If If Picture1.Top < ScaleTop Then DeltaY = 100 If Picture1.Top + Picture1.Height > ScaleHeight + ScaleTop Then DeltaY = -100 End If End Sub Private Sub Form_Load () Timer1.Interval = 1000 ' Establece el intervalo. DeltaX = 100 ' Inicializa variables. DeltaY = 100 End Sub

Unload Aplicable a: Objeto Form. Ocurre cuando un formulario est a punto de quitarse de la pantalla. Cuando ese formulario se vuelve a cargar, el contenido de todos sus controles se reinicializa. Este evento se desencadena porque un usuario cierra el formulario mediante el comando Cerrar del men Control o una instruccin Unload. Sintaxis: Private Sub objeto_Unload(cancelar As Integer) La sintaxis del evento Unload consta de las siguientes partes:
Parte objeto cancelar Descripcin Una expresin de objeto que da como resultado un objeto de la lista Aplicable a. Un entero que determina si el formulario se quita de la pantalla. Si cancelar es 0, el formulario se quita. Establecer cancelar a cualquier valor distinto de cero impide que el formulario se quite.

Establecer cancelar a un valor distinto de cero impide que el formulario se quite, pero no detiene los dems eventos, como la salida del entorno operativo Microsoft Windows. Utilice el evento QueryUnload para detener la salida de Windows. Utilice un procedimiento de evento Unload para comprobar si el formulario se debe descargar o para especificar acciones que desea que tengan lugar cuando se descargue el formulario. Tambin puede incluir cualquier cdigo de validacin a nivel del formulario que pueda necesitar para cerrar el formulario o guardar los datos en un archivo. El evento QueryUnload ocurre antes que el evento Unload. El evento Unload ocurre antes que el evento Terminate. El evento Unload puede estar causado por la utilizacin de la instruccin Unload o porque el usuario elija el comando Cerrar del men Control del formulario, salga de la aplicacin con el botn Finalizar tarea de la Lista de tareas, o salga del entorno operativo Microsoft Windows mientras la aplicacin se est ejecutando. Ejemplo del evento Unload Este ejemplo muestra un procedimiento simple para cerrar un formulario mientras se avisa al usuario con varios cuadros de mensajes. En una aplicacin real, puede agregar llamadas a procedimientos Sub de propsito general que emulen el proceso de los comandos Salir, Guardar y Guardar como del men Archivo de Visual Basic. Para probar este ejemplo, pegue el cdigo en la seccin Declaraciones de un formulario y, despus, presione F5. Una vez que se muestre el
75

formulario, presione ALT+F4 para cerrar el formulario.


Private Sub Form_Unload (Cancel As Integer) Dim Msg, Response ' Declara variables. Msg = "Desea guardar los datos antes de cerrar?" Response = MsgBox(Msg, vbQuestion + vbYesNoCancel, "Dilogo Cerrar") Select Case Response Case vbCancel ' No se permite cerrar. Cancel = -1 Msg = "Se ha cancelado el comando." Case vbYes ' Introduzca cdigo para guardar los datos aqu. Msg = "Datos guardados."' Case vbNo Msg = "Datos no guardados." End Select MsgBox Msg, vbOKOnly, "Confirmacin" ' Mostrar mensaje. End Sub

QueryUnload Aplicable a: Objeto Form y Coleccin Forms, Objeto MDIForm Ocurre antes de que se cierre un formulario o una aplicacin. Sintaxis:
Private Sub Form_QueryUnload(cancelar As Integer, modo_descarga As Integer) Private Integer) Sub MDIForm_QueryUnload(cancelar As Integer, modo_descarga As

La sintaxis del evento QueryUnload consta de las siguientes partes:


Parte cancelar Descripcin Un entero. Establecer este argumento a cualquier valor distinto de 0 detiene el evento QueryUnload en todos los formularios cargados y detiene el cierre del formulario y de la aplicacin. modo_descarga Un valor o una constante que indica la causa del evento QueryUnload, tal y como se describe en Valores que se pueden obtener.

El argumento modo_descarga devuelve los siguientes valores:


Constante vbFormControlMenu vbFormCode VbAppWindows vbAppTaskManager vbFormMDIForm Valor Descripcin 0 El usuario eligi el comando Cerrar del men Control del formulario. 1 Se invoc la instruccin Unload desde el cdigo. 2 La sesin actual del entorno operativo Microsoft Windows est inalizando. 3 El Administrador de tareas de Microsoft Windows est cerrando la aplicacin. 4 Un formulario MDI secundario se est cerrando porque el formulario MDI tambin se est cerrando.

Normalmente este evento se utiliza para asegurarse de que no hay tareas sin finalizar en los formularios incluidos en una aplicacin antes de que esa aplicacin se cierre. Por ejemplo, si un usuario no ha guardado todava algunos datos nuevos de cualquier formulario, su aplicacin puede pedir al usuario que los guarde. Cuando una aplicacin se cierra, puede utilizar los procedimientos
76

de evento QueryUnload o Unload para establecer la propiedad Cancel a True, deteniendo el proceso de cierre. Sin embargo, el evento QueryUnload ocurre en todos los formularios antes de que se descargue ninguno de ellos y el evento Unload ocurre conforme se descarga cada formulario. Ejemplo del evento QueryUnload En este ejemplo, al cerrar un formulario se consulta al operador si realmente quiere salir o no. Tambin se chequea si est saliendo del formulario o de toda la aplicacin.
' Pegar en la seccin Declaraciones de Form1. Private Sub Form_QueryUnload (Cancel As Integer, UnloadMode As Integer) Dim Msg ' Declara la variable. If UnloadMode > 0 Then ' Si sale de la aplicacin. Msg = "Realmente desea salir de la aplicacin?" Else ' Si slo se cierra el formulario. Msg = "Realmente desea cerrar el formulario?" End If ' Si el usuario hace clic en el botn No, se detiene QueryUnload. If MsgBox(Msg, vbQuestion + vbYesNo, Me.Caption) = vbNo Then Cancel = True End Sub

Validate Aplicable a: Control Data Se produce antes de que otro registro se convierta en el registro actual, antes del mtodo Update (excepto cuando se guardan los datos con el mtodo UpdateRecord) y antes de una operacin Delete, Unload o Close. Sintaxis: Private Sub objeto_Validate ([ndice As Integer,] accin As Integer, guardar As Integer) La sintaxis del evento Validate consta de las siguientes partes:
Parte objeto ndice accin guardar Descripcin Una expresin de objeto cuyo resultado es un objeto de la lista Aplicable a Identifica el control si se encuentra en una matriz de controles Un entero que indica la operacin que provoca el evento, como se describe en Valores Una expresin booleana que especifica si los datos enlazados han cambiado, como se describe en Valores

Los valores de accin son:


Constante vbDataActionCancel vbDataActionMoveFirst vbDataActionMovePrevious vbDataActionMoveNext vbDataActionMoveLast Valor 0 1 2 3 4 Descripcin Cancela la operacin al salir de Sub Mtodo MoveFirst Mtodo MovePrevious Mtodo MoveNext Mtodo MoveLast
77

vbDataActionAddNew vbDataActionUpdate vbDataActionDelete vbDataActionFind vbDataActionBookmark vbDataActionClose vbDataActionUnload

5 6 7 8 9 10 11

Mtodo AddNew Operacin Update (no UpdateRecord) Mtodo Delete Mtodo Find Se ha establecido la propiedad Bookmark El mtodo Close Se est descargando el formulario

Los valores de guardar son: True False Los datos enlazados han cambiado Los datos enlazados no han cambiado

El argumento guardar indica inicialmente si los datos enlazados han cambiado. Este argumento puede ser False si los datos del bfer de copia han cambiado. Si guardar es True cuando este evento termina, se invocan los mtodos Edit y UpdateRecord. El mtodo UpdateRecord slo guarda los datos de controles enlazados o del bfer de copia en los que la propiedad DataChanged sea True. Este evento se produce incluso aunque no se hayan modificado los datos de los controles enlazados y aunque no existan controles enlazados. Puede utilizar este evento para cambiar valores y actualizar datos. Tambin puede decidir guardar los datos o detener cualquier accin que est provocando el evento y sustituirla por otra accin diferente. Puede cambiar el argumento accin para cambiar una accin por otra. Puede cambiar los diversos mtodos Move y el mtodo AddNew, que se pueden intercambiar libremente (cualquier Move en AddNew, cualquier Move en cualquier otro Move o AddNew en cualquier Move). Cuando utilice AddNew, puede utilizar MoveNext y despus ejecutar otro AddNew para examinar la propiedad EditMode y determinar si hay una operacin Edit o AddNew en curso. El intento de sustituir AddNew o una accin Move en cualquier otra accin se pasa por alto o genera un error interceptable. Si se establece accin a 0, se puede detener cualquier accin. Dentro del cdigo de este evento puede comprobar los datos de cada control enlazado en el que DataChanged sea True. Despus puede establecer DataChanged a False para evitar guardar dichos datos en la base de datos. Durante este evento no puede utilizar ningn mtodo (como MoveNext) en el objeto Recordset subyacente. Ejemplo de la propiedad DataChanged y del evento Validate Este ejemplo ilustra una validacin de datos sencilla. En la tabla Authors de la base de datos Biblio.mdb hay dos campos: Au_ID y Author. Como el valor de Au_ID se utiliza para identificar de forma nica al autor, este valor no se debe cambiar. El ejemplo no permite que se modifique el campo Au_ID, que est enlazado a Text1.
Private Sub Data1_Validate (Action As Integer, Save As Integer) If Text1.DataChanged Then ' Comprueba si los datos han cambiado. MsgBox "No puede cambiar el nmero de Id." Text1.DataChanged = False ' No guarda los datos modificados. End If ... End Sub

78

4.6 MTODOS (Clear, Cls, Print, Refresh, RemoveItem, SetFocus) Los mtodos son un conjunto de procedimientos que permiten que un objeto ejecute una accin o tarea sobre s mismo. Por ejemplo, para un formulario tenemos el mtodo Hide que har que el formulario se oculte; o el mtodo Show que har que el formulario se vuelva a mostrar. Mtodos ms importantes de los controles estndares. AddItem Aplicable a: ControlComboBox, ControlListBox Agrega un elemento a un control ListBox o ComboBox. Sintaxis: objeto.AddItem elemento, ndice La sintaxis del mtodo AddItem consta de las siguientes partes:
Parte objeto Elemento ndice Descripcin Requerido. Una expresin de objeto cuyo resultado es un objeto de la lista Aplicable a. Requerido. Expresin de cadena que especifica el elemento que se va a agregar al objeto. Opcional. Entero que especifica la posicin dentro del objeto donde se insertan el elemento o la fila nuevos. Para el primer elemento de un control ListBox o ComboBox, ndice es 0.

Si se especifica un valor vlido para ndice, elemento se sita en dicha posicin dentro del objeto. Si se omite ndice, elemento se agrega en la posicin que le corresponda dentro del orden apropiado (si la propiedad Sorted es True) o al final de la lista (si Sorted es False).Los controles ListBox o ComboBox que estn enlazados a un control Data no aceptan el mtodo AddItem. Ejemplo del mtodo AddItem Este ejemplo utiliza el mtodo AddItem para agregar 100 elementos a un cuadro de lista. Para probar este ejemplo, pegue el cdigo en la seccin Declaraciones de un formulario con un control ListBox llamado List1, y despus presione F5 y haga clic en el formulario.
Private Sub Form_Click () Dim Entry, I, Msg ' Declara variables. Msg = "Haga clic en Aceptar para agregar 100 elementos a su cuadro de lista." MsgBox Msg ' Muestra el mensaje. For I = 1 To 100 ' Cuenta de 1 a 100. Entry = "Entrada " & I ' Crea la entrada. List1.AddItem Entry ' Agrega la entrada. Next I Msg = "Haga clic en Aceptar para quitar una de cada dos entradas." MsgBox Msg ' Muestra el mensaje. For I = 1 To 50 ' Determina cmo quitar List1.RemoveItem I ' cada elemento Next I Msg = "Haga clic en Aceptar para quitar todos los elementos del cuadro de lista." MsgBox Msg ' Muestra el mensaje. List1.Clear ' Limpia el cuadro de lista. End Sub

79

Clear (Clipboard, Combo Box, List Box) Aplicable a: Objeto Control ComboBox, Control ListBoxBorra el contenido de los controles ListBox o ComboBox. Sintaxis: objeto.Clear El marcador de posicin objeto representa una expresin de objeto cuyo resultado es un objeto de la lista Aplicable a. Los controles ListBox o ComboBox que estn enlazados a un control Data no aceptan el mtodo Clear. Ejemplo del mtodo Clear Este ejemplo utiliza el mtodo Clear para borrar todos los elementos de un cuadro de lista. Para probar este ejemplo, pegue el cdigo en la seccin Declaraciones de un formulario con un control ListBox llamado List1, y despus presione F5 y haga clic en el formulario.
Private Sub Form_Click () Dim Entry, I, Msg ' Declara variables. Msg = "Haga clic en Aceptar para agregar 100 elementos a su cuadro de lista." MsgBox Msg ' Muestra el mensaje. For I = 1 To 100 ' Cuenta de 1 a 100. Entry = "Entrada " & I ' Crea la entrada. List1.AddItem Entry ' Agrega la entrada. Next I Msg = "Haga clic en Aceptar para quitar cualquier otra entrada." MsgBox Msg ' Muestra el mensaje. For I = 1 To 50 ' Determina cmo quitar List1.RemoveItem I ' uno de cada dos Next I ' elementos. Msg = "Haga clic en Aceptar para quitar todos los elementos del cuadro de lista." MsgBox Msg ' Muestra el mensaje. List1.Clear ' Limpia el cuadro de lista. End Sub

Cls Aplicable a: Objeto Form, Control PictureBox. Borra los grficos y el texto generados en tiempo de ejecucin de los controles Form o PictureBox. Sintaxis: objeto.Cls El marcador de posicin objeto representa una expresin de objeto cuyo resultado es un objeto de la lista Aplicable a. Si se omite objeto, se supone que el objeto es el control Form que tenga el enfoque. Cls borra el texto y los grficos generados en tiempo de ejecucin por instrucciones grficas y de impresin. Los mapas de bits de fondo definidos mediante la propiedad Picture y los controles colocados en un Form en tiempo de diseo no se ven afectados por Cls. Despus de llamar a Cls, las propiedades CurrentX y CurrentY del objeto se restablecen a 0. Ejemplo del mtodo Cls
80

Este ejemplo utiliza el mtodo Cls para eliminar la informacin impresa de un formulario. Para probar este ejemplo, pegue el cdigo en la seccin Declaraciones de un formulario, y despus presione F5 y haga clic en el formulario.
Private Sub Form_Click () Dim Msg ' Declara variable. ForeColor = QBColor(15) ' Establece el color de primer plano a blanco. BackColor = QBColor(1) ' Establece el color de fondo a azul. Msg = "Esta informacin se imprime en el fondo del formulario." Print Msg ' Imprime el mensaje en el formulario. Msg = "Haga clic en Aceptar para borrar la informacin y el patrn de fondo " Msg = Msg & "mostrado en el formulario." MsgBox Msg ' Muestra el mensaje. Cls ' Borra el fondo del formulario. End Sub

Hide Aplicable a: Objeto Form. Oculta un objeto Form pero no lo descarga. Sintaxis: objeto.Hide El marcador de posicin objeto representa una expresin de objeto cuyo resultado es un objeto de la lista Aplicable a. Si se omite objeto, se supone que objeto es el formulario que tenga el enfoque. Cuando se oculta un formulario, se quita de la pantalla y su propiedad Visible queda establecida a False. Los controles de un formulario oculto no son accesibles para el usuario, pero estn disponibles para la aplicacin de Visual Basic en ejecucin y para otros procesos que se estn comunicando con la aplicacin mediante DDE, as como para los eventos del control Timer. Cuando se oculta un formulario, el usuario no puede interactuar con la aplicacin hasta que el cdigo del procedimiento de evento que ha provocado la ocultacin del formulario haya terminado de ejecutarse. Si el formulario no est cargado cuando se llama al mtodo Hide, el mtodo Hide carga el formulario pero no lo presenta. Ejemplo del mtodo Hide Este ejemplo utiliza el mtodo Hide para ocultar un formulario. Para probar este ejemplo, pegue el cdigo en la seccin Declaraciones de un formulario, y despus presione F5 y haga clic en el formulario.
Private Sub Form_Click () Dim Msg ' Declara variable. Hide ' Oculta el formulario. Msg = "Haga clic en Aceptar para que vuelva a aparecer el formulario." MsgBox Msg ' Muestra el mensaje. Show ' Muestra de nuevo el formulario. End Sub

81

RemoveItem Aplicable a: Control ComboBox, Control ListBox. Quita un elemento de un control ListBox o ComboBox. No acepta argumentos con nombre. Sintaxis: objeto.RemoveItem ndice La sintaxis del mtodo RemoveItem consta de las siguientes partes:
Parte objeto ndice Descripcin Requerido. Una expresin de objeto cuyo resultado es un objeto de la lista Aplicable a. Requerido. Un entero que especifica la posicin dentro del objeto del elemento o la fila que se va a quitar. Para los primeros elementos de los controles ListBox o ComboBox, ndice es 0.

Los controles ListBox o ComboBox que estn enlazados a un control Data no aceptan el mtodo RemoveItem. Ejemplo del mtodo RemoveItem Este ejemplo utiliza el mtodo RemoveItem para quitar entradas de un cuadro de lista. Para probar este ejemplo, pegue el cdigo en la seccin Declaraciones de un formulario que contenga un control ListBox llamado List1, y despus presione F5 y haga clic en el formulario.
Private Sub Form_Click () Dim Entry, I, Msg ' Declara variables. Msg = "Haga clic en Aceptar para agregar 100 elementos al cuadro de lista." MsgBox Msg ' Muestra el mensaje. For I = 1 To 100 ' Cuenta de 1 a 100. Entry = "Entrada " & I ' Crea la entrada. List1.AddItem Entry ' Agrega la entrada. Next I Msg = "Haga clic en Aceptar para quitar una de cada dos entradas." MsgBox Msg ' Muestra el mensaje. For I = 1 To 50 ' Determina cmo quitar List1.RemoveItem I ' uno de cada dos Next I ' elementos. Msg = "Haga clic en Aceptar para quitar todos los elementos del cuadro de lista." MsgBox Msg ' Muestra el mensaje. List1.Clear ' Borra el cuadro de lista. End Sub

SetFocus Aplicable a: Control CheckBox, Control ComboBox, Control CommandButton, Objeto Form Controles HScrollBar y VScrollBar, Control ListBoxControl OptionButton, Control PictureBox, Control TextBox. Mueve el enfoque al control o formulario especificado. Sintaxis: objeto.SetFocus
82

El marcador de posicin objeto representa una expresin de objeto que da como resultado un objeto de la lista Aplicable a. El objeto debe ser un objeto Form o un control que pueda recibir el enfoque. Despus de invocar el mtodo SetFocus, cualquier entrada del usuario se dirige al formulario o al control especificado. El enfoque slo se puede mover a un formulario o un control visible. Como un formulario y los controles de un formulario no son visibles hasta que el evento Load del formulario ha terminado, no puede usar en su propio evento Load el mtodo SetFocus para mover el enfoque al formulario que se est cargando a menos que use primero el mtodo Show para mostrar el formulario antes de que el procedimiento de evento Form_Load haya terminado. Tampoco puede mover el enfoque a un formulario o un control si su propiedad Enabled es False. Si la propiedad Enabled se ha establecido a False en tiempo de diseo, primero debe establecerla a True antes de poder recibir el enfoque mediante el mtodo SetFocus. Ejemplo del mtodo SetFocus Al hacer click en un botn de comando, setea el foco a la caja de texto txtCodigo
Private Sub cmd1_Click() TxtCodigo.Setfocus End Sub

Show Aplicable a: Objeto Form. Sintaxis: objeto.Show estilo, formulario_propietario La sintaxis del mtodo Show consta de las siguientes partes:
Descripcin Opcional. Una expresin de objeto cuyo resultado es un objeto de la lista Aplicable a. Si se omite objeto, se supone que objeto es el formulario asociado con el mdulo de formulario activo. estilo Opcional. Un entero que determina si el formulario es modal o no modal. Si estilo es 0, el formulario es no modal; si estilo es 1, el formulario es modal. formulario_propietario Opcional. Una expresin de cadena que especifica el componente que "posee" el formulario que se muestra. Para los formularios estndar de Visual Basic, utilice la palabra clave Me. objeto Parte

Si el formulario especificado no est cargado cuando se invoca el mtodo Show, Visual Basic lo carga automticamente. Cuando Show presenta un formulario no modal, contina con la ejecucin del cdigo que haya a continuacin. Cuando Show presenta un formulario modal, el cdigo que hay a continuacin no se ejecuta hasta que el formulario se oculta o se descarga. Cuando Show presenta un formulario modal, no hay entradas (de teclado o del mouse) excepto sobre los objetos del formulario modal. El programa debe ocultar o descargar los formularios modales (normalmente como respuesta a alguna accin del usuario) antes de que pueda producirse la entrada en otro formulario. Aunque los dems formularios de la aplicacin estn deshabilitados cuando se presenta un formulario modal, los de las dems aplicaciones no lo estn. El formulario inicial de una aplicacin se muestra automticamente despus de invocar su evento Load. Ejemplo del mtodo Show Este ejemplo utiliza el mtodo Show para mostrar un formulario oculto. Para probar este
83

ejemplo, pegue el cdigo en la seccin Declaraciones de un formulario y despus presione F5 y haga clic en el formulario.
Private Sub Form_Click () Dim Msg ' Declara variable. Hide ' Oculta el formulario. Msg = "Haga clic en Aceptar para que vuelva a aparecer el formulario." MsgBox Msg ' Muestra el mensaje. Show ' Muestra de nuevo el formulario. End Sub

PRINT Este mtodo permite escribir texto en formularios, cajas pictureBox y en un objeto llamado Printer. La forma general del mtodo Print se explica mejor con algunos ejemplos como los siguientes:
pctBox.Print pctBox.Print pctBox.Print pctBox.Print "La distancia es: "; Dist; " km." 123; 456; "San"; "Sebastin" 123, 456, "San", "Sebastin" -123; -456

Cuyo resultado se puede ver en la Figura 4.4 (puede variar dependiendo del tipo y tamao de las letras). El mtodo Print recibe como datos una lista de variables y/o cadenas de caracteres. Las cadenas son impresas y las variables se sustituyen por su valor. Hay dos tipos bsicos de separadores para los elementos de la lista. El carcter punto y coma (;) hace que se escriba inmediatamente a continuacin de lo anterior. La coma (,) hace que se vaya al comienzo de la siguiente rea de salida. Con letra de paso constante como la Courier las reas de salida empiezan cada 14 caracteres, es decir en las columnas 1, 15, 29, etc. Con letras de paso variable esto se hace slo de modo aproximado.

Figura 4.4. Ejemplo del mtodo Print

1. Las constantes numricas positivas van precedidas por un espacio en blanco y separadas entre s por otro espacio en blanco. Si son negativas el segundo espacio es ocupado por el signo menos (-). 2. El tipo y tamao de letra que se utiliza depende de la propiedad Font del formulario, objeto PictureBox u objeto Printer en que se est escribiendo. Existen otros separadores tales como Tab(n) y Spc(n). El primero de ellos lleva el punto de insercin de texto a la columna n, mientras que el segundo deja n espacios en blanco antes de seguir escribiendo. Tab sin argumento equivale a la coma (,). Estos espaciadores se utilizan en combinacin con el punto y coma (;), para separarlos de los dems argumentos. Por defecto, la salida de cada mtodo Print se escribe en una nueva lnea, pero si se coloca un punto y coma al final de un mtodo Print, el resultado del siguiente Print se escribe en la misma lnea. Puede controlarse el lugar del formulario o control donde se imprime la salida del mtodo Print. Esta salida se imprime en el lugar indicado por las propiedades CurrentX y CurrentY del
84

formulario o control donde se imprime. Cambiando estas propiedades se modifica el lugar de impresin, que por defecto es la esquina superior izquierda. Existen unas funciones llamadas TextWidth(string) y TextHeight(string) que devuelven la anchura y la altura de una cadena de caracteres pasada como argumento. Estas funciones pueden ayudar a calcular los valores ms adecuados para las propiedades CurrentX y CurrentY. La funcin str(valor_numrico) convierte un nmero en cadena de caracteres para facilitar su impresin. En realidad, es lo que Visual Basic 6.0 ha hecho de modo implcito en los ejemplos anteriores. En versiones anteriores del programa era necesario que el usuario realizase la conversin de modo explcito. UTILIZACIN DE IMPRESORAS Mtodo PrintForm El mtodo PrintForm permite imprimir un formulario con sus controles y con los resultados de los mtodos grficos (PSet, Line y Circle) y del mtodo Print. Para ello la propiedad AutoRedraw del formulario tiene que estar puesta a True, y los mtodos citados tienen que estar llamados desde un evento distinto del Paint. Lo nico que no se dibuja del formulario es la barra de ttulo. Este sistema de impresin es muy sencillo de utilizar, pero tiene el inconveniente de que el resultado se imprime con la misma resolucin de la pantalla (entre 50 y 100 puntos por pulgada), no aprovechando por tanto la mayor resolucin que suelen tener las impresoras (300, 600 ms puntos por pulgada). Objeto Printer Este segundo sistema tiene la ventaja de que permite aprovechar plenamente la resolucin de la impresora, pero no permite dibujar controles sino slo los mtodos grficos habituales (PSet, Line y Circle), el mtodo Print y un mtodo no visto hasta ahora que es PaintPicture. Para Visual Basic 6.0 la impresora es un objeto grfico ms, similar a los formularios y a las cajas grficas PictureBox. Como tal objeto grfico tiene sus propiedades generales (DrawStyle, BackColor, ForeColor, etc.), adems de otras propiedades especficas de la impresora, como DeviceName, DriverName, Orientation, Copies, etc. Para ms informacin puede utilizarse el Help, buscando Printer object. En principio se utiliza la impresora por defecto del PC, pero Visual Basic mantiene una Printers Collection, que es algo as como un array de impresoras disponibles. A partir de esta Printers Collection se puede cambiar a la impresora que se desee. El objeto Printer tiene un mtodo llamado EndDoc para enviar realmente a la impresora el resultado de los mtodos grficos. El mtodo PaintPicture permite incorporar el contenido de archivos grficos a un formulario, PictureBox o Printer. Su forma general es:
object.PaintPicture pictProp X, Y, Width, Height

donde pictProp indica el grfico (coincide con la propiedad Picture de PictureBox), X e Y indican las coordenadas de insercin y los dos ltimos parmetros las dimensiones (opcionales).

85

5. ESTRUCTURA DE CONTROL
5.1. SENTENCIAS DE CONTROL Las sentencias de control, denominadas tambin estructuras de control, permiten tomar decisiones y realizar un proceso repetidas veces. Son los denominados bifurcaciones y bucles. Este tipo de estructuras son comunes en cuanto a concepto en la mayora de los lenguajes de programacin, aunque su sintaxis puede variar de un lenguaje de programacin a otro. Se trata de unas estructuras muy importantes ya que son las encargadas de controlar el flujo de un programa segn los requerimientos del mismo. Visual Basic 6.0 dispone de las siguientes estructuras de control: If ... Then ... Else Select Case For ... Next Do ... Loop While Wend For Each Next

Sentencia IF ... THEN ... ELSE ... Esta estructura permite ejecutar condicionalmente una o ms sentencias y puede escribirse de dos formas. La primera ocupa slo una lnea y tiene la forma siguiente: If condicion Then sentencia1 [Else sentencia2] La segunda es ms general y se muestra a continuacin:
If condicion Then

sentencia(s) [Else sentencia(s)] End If Si condicin es True (verdadera), se ejecutan las sentencias que estn a continuacin de Then, y si condicin es False (falsa), se ejecutan las sentencias que estn a continuacin de Else, si esta clusula ha sido especificada (pues es opcional). Para indicar que se quiere ejecutar uno de varios bloques de sentencias dependientes cada uno de ellos de una condicin, la estructura adecuada es la siguiente:
If condicion1 Then sentencias1 ElseIf condicion2 Then sentencias2 Else sentencia-n End If

Si se cumple la condicion1 se ejecutan las sentencias1, y si no se cumple, se examinan secuencialmente las condiciones siguientes hasta Else, ejecutndose las sentencias correspondientes al primer ElseIf cuya condicin se cumpla. Si todas las condiciones son falsas, se ejecutan las sentencias-n correspondientes a Else, que es la opcin por defecto. La Figura 3.2 presenta
86

esquemticamente ambas formas de representar estas sentencias:

Figura 3.2. Bifurcaciones If e If...Else.

Por ejemplo,
Numero = 53 ' Se inicializa la variable. If Numero < 10 Then Digitos = 1 ElseIf Numero < 100 Then ' En este caso la condicin se cumple (True) luego se ejecuta lo siguiente. Digitos = 2 Else 'En el caso en que no se cumplan los dos anteriores se asigna 3 Digitos = 3 End If

Sentencia SELECT CASE Esta sentencia permite ejecutar una de entre varias acciones en funcin del valor de una expresin. Es una alternativa a If ... Then ... ElseIf cuando se compara la misma expresin con diferentes valores. Su forma general es la siguiente:
Select Case expression Case etiq1 [sentencias1] Case etiq2 [sentencias2] Case Else sentenciasn End Select

donde expresin es una expresin numrica o alfanumrica, y etiq1, etiq2, ... pueden adoptar las formas siguientes: 1. 2. 3. 4. expresion expresion To expresion Is operador-de-relacin expresion combinacin de las anteriores separadas por comas

Por ejemplo,
87

Numero = 8 ' Se inicializan las variable. Select Case Numero ' Se va a evaluar la variable Numero. Case 1 To 5 ' Numero est entre 1 y 5. Resultado = "Se encuentra entre 1 y 5" ' Lo siguiente se ejecuta si es True la expresin. Case 6, 7, 8 ' Numero es uno de los tres valores. Resultado = "Se encuentra entre 6 y 8" Case Is = 9 , Is = 10 ' Numero es 9 10. Resultado = "El valor es 9 o 10" Case Else ' Resto de valores. Resultado = "El nmero no se encuentra entre 1 y 10" End Select

Cuando se utiliza la forma expresion To expresion, el valor ms pequeo debe aparecer en primer lugar. Cuando se ejecuta una sentencia Select Case, Visual Basic evala la expresion y el control del programa se transfiere a la sentencia cuya etiqueta tenga el mismo valor que la expresin evaluada, ejecutando a continuacin el correspondiente bloque de sentencias. Si no existe un valor igual a la expresion entonces se ejecutan las sentencias a continuacin de Case Else. Sentencia FOR ... NEXT La sentencia For da lugar a un lazo o bucle, y permite ejecutar un conjunto de sentencias cierto nmero de veces. Su forma general es:
For variable = expresion1 To expresion2 [Step expresion3][sentencias] Exit For [sentencias]Next [variable]

Cuando se ejecuta una sentencia For, primero se asigna el valor de la expresion1 a la variable y se comprueba si su valor es mayor o menor que la expresion2. En caso de ser menor se ejecutan las sentencias, y en caso de ser mayor el control del programa salta a las lneas a continuacin de Next. Todo esto sucede en caso de ser la expresion3 positiva. En caso contrario se ejecutarn las sentencias cuando la variable sea mayor que expresion2. Una vez ejecutadas las sentencias, la variable se incrementa en el valor de la expresion3, o en 1 si Step no se especifica, volvindose a efectuar la comparacin entre la variable y la expresion2, y as sucesivamente. La sentencia Exit For es opcional y permite salir de un bucle For ... Next antes de que ste finalice. Por ejemplo,
MyString="Informtica " For Words = 3 To 1 Step -1 ' 3 veces decrementando de 1 en 1. For Chars = Words To Words+4 ' 5 veces. MyString = MyString & Chars ' Se aade el nmero Chars al string. Next Chars ' Se incrementa el contador MyString = MyString & " " ' Se aade un espacio. Next Words 'El valor de MyString es: Informtica 34567 23456 12345

Sentencia DO ... LOOP Un Loop (bucle) repite la ejecucin de un conjunto de sentencias mientras una condicin dada
88

sea cierta, o hasta que una condicin dada sea cierta. La condicin puede ser verificada antes o despus de ejecutarse el conjunto de sentencias. Sus posibles formas son las siguientes:
' Formato 1: Do [{While/Until} condicion] [sentencias] [Exit Do] [sentencias] Loop ' Formato 2: Do [sentencias] [Exit Do] [sentencias] Loop [{While/Until}condicion]

La sentencia opcional Exit Do permite salir de una bucle Do ... Loop antes de que finalice ste. Por ejemplo,
Check = Trae Counts = 0 Do Do While Counts < 20 Counts = Counts + 1 If Counts = 10 Then Check = False Exit Do End If Loop Loop Until Check = False ' Se inicializan las variables. ' ' ' ' ' ' Empieza sin comprobar ninguna condicin. Bucle que acaba si Counts>=20 o con Exit Do. Se incrementa Counts. Si Counts es 10. Se asigna a Check el valor False. Se acaba el segundo Do.

' Salir del "loop" si Check es False.

En el ejemplo mostrado, se sale de los bucles siempre con Counts = 10. Es necesario fijarse que si se inicializa Counts con un nmero mayor o igual a 10 se entrara en un bucle infinito (el primer bucle acabara con Counts = 20 pero el segundo no finalizara nunca, bloquendose el programa y a veces el ordenador). Sentencia WHILE WEND Esta sentencia es otra forma de generar bucles que se recorren mientras se cumpla la condicin inicial. Su estructura es la siguiente:
While condicion [sentencias] Wend Por ejemplo, Counts = 0 While Counts < 20 Counts = Counts + 1 Wend ' ' ' ' Se Se Se Se inicializa la variable. comprueba el valor de Counts. incrementa el valor de Counts. acaba el bucle cuando Counts > 19.

En cualquier caso se recuerda que la mejor forma de mirar y aprender el funcionamiento de


89

todas estas sentencias es mediante el uso del Help de Visual Basic. Ofrece una explicacin de cada comando con ejemplos de utilizacin. Sentencia FOR EACH ... NEXT Esta construccin es similar al bucle For, con la diferencia de que la variable que controla la repeticin del bucle no toma valores entre un mnimo y un mximo, sino a partir de los elementos de un array (o de una coleccin de objetos). La forma general es la siguiente:
For Each variable In grupo [sentencias] Next variable

Con arrays variable tiene que ser de tipo Variant. Con colecciones variable puede ser Variant o una variable de tipo Object. Esta construccin es muy til cuando no se sabe el nmero de elementos que tiene el array o la coleccin de objetos. 5.2 PROCEDIMIENTOS Y FUNCIONES Las aplicaciones informticas que habitualmente se utilizan, incluso a nivel de informtica personal, suelen contener decenas y an cientos de miles de lneas de cdigo fuente. A medida que los programas se van desarrollando y aumentan de tamao, se convertiran rpidamente en sistemas poco manejables si no fuera por la modularizacin, que es el proceso consistente en dividir un programa muy grande en una serie de mdulos mucho ms pequeos y manejables. A estos mdulos se les suele denominar de distintas formas (subprogramas, subrutinas, procedimientos, funciones, etc.) segn los distintos lenguajes. Sea cual sea la nomenclatura, la idea es sin embargo siempre la misma: dividir un programa grande en un conjunto de subprogramas o funciones ms pequeas que son llamadas por el programa principal; stas a su vez llaman a otras funciones ms especficas y as sucesivamente. La divisin de un programa en unidades ms pequeas o funciones presenta entre otras las ventajas siguientes: 1. Modularizacin. Cada funcin tiene una misin muy concreta, de modo que nunca tiene un nmero de lneas excesivo y siempre se mantiene dentro de un tamao manejable. Adems, una misma funcin (por ejemplo, un producto de matrices, una resolucin de un sistema de ecuaciones lineales, ...) puede ser llamada muchas veces en un mismo programa, e incluso puede ser reutilizada por otros programas. Cada funcin puede ser desarrollada y comprobada por separado. 2. Ahorro de memoria y tiempo de desarrollo. En la medida en que una misma funcin es utilizada muchas veces, el nmero total de lneas de cdigo del programa disminuye, y tambin lo hace la probabilidad de introducir errores en el programa. 3. Independencia de datos y ocultamiento de informacin. Una de las fuentes ms comunes de errores en los programas de computador son los efectos colaterales o perturbaciones que se pueden producir entre distintas partes del programa. Es muy frecuente que al hacer una modificacin para aadir una funcionalidad o corregir un error, se introduzcan nuevos errores en partes del programa que antes funcionaban correctamente. Una funcin es capaz de mantener una gran independencia con el resto del programa, manteniendo sus propios datos y definiendo muy claramente la interfaz o comunicacin con la funcin que la ha llamado y con las funciones a las que llama, y no teniendo ninguna posibilidad de acceso a la informacin que no le compete.
90

Funciones y procedimientos Sub en Visual Basic 6.0 En Visual Basic 6.0 se distingue entre funciones y procedimientos Sub. En ocasiones se utiliza la palabra genrica procedimiento para ambos. La fundamental diferencia entre un procedimiento Sub y una funcin es que sta ltima puede ser utilizada en una expresin porque tiene un valor de retorno. El valor de retorno ocupa el lugar de la llamada a la funcin donde esta aparece. Por ejemplo, si en una expresin aparece sin(x) se calcula el seno de la variable x y el resultado es el valor de retorno que sustituye a sin(x) en la expresin en la que apareca. Por tanto, las funciones devuelven valores, a diferencia de los procedimientos que no devuelven ningn valor, y por tanto no pueden ser utilizadas en expresiones. Un procedimiento Sub es un segmento de cdigo independiente del resto, que una vez llamado por el programa, ejecuta un nmero determinado de instrucciones, sin necesidad de devolver ningn valor al mismo (puede dar resultados modificando los argumentos), mientras que una funcin siempre tendr un valor de retorno. Los nombres de los procedimientos tienen reglas de visibilidad parecidas a las de las variables. Para llamar desde un formulario a un procedimiento Public definido en otro formulario es necesario preceder su nombre por el del formulario en que est definido. Sin embargo, si se desea llamar a un procedimiento definido en un mdulo estndar (*.bas) no es necesario precederlo del nombre del mdulo ms que si hay coincidencia de nombre con otro procedimiento de otro mdulo estndar. Funciones (function) La sintaxis correspondiente a una funcin es la siguiente:
[Static] [Private] Function nombre ([parmetros]) [As tipo] [sentencias] [nombre = expresion] [Exit Function] [sentencias] [nombre = expresion] End Function

donde nombre es el nombre de la funcin. Ser de un tipo u otro dependiendo del dato que devuelva. Para especificar el tipo se utiliza la clusula As Tipo (Integer, Long, Single, Double, Currency, String o Variant). parmetros son los argumentos que son pasados cuando se llama a la funcin. Visual Basic asigna el valor de cada argumento en la llamada al parmetro que ocupa su misma posicin. Si no se indica un tipo determinado los argumentos son Variant por defecto. Como se ver en un apartado posterior, los argumentos pueden ser pasados por referencia o por valor. El nombre de la funcin, que es el valor de retorno, acta como una variable dentro del cuerpo de la funcin. El valor de la variable expresion es almacenado en el propio nombre de la funcin. Si no se efecta esta asignacin, el resultado devuelto ser 0 si la funcin es numrica, nulo ("") si la funcin es de caracteres, o Empty si la funcin es Variant. Exit Function permite salir de una funcin antes de que sta finalice y devolver as el control del programa a la sentencia inmediatamente a continuacin de la que efectu la llamada a la funcin. La sentencia End Function marca el final del cdigo de la funcin y, al igual que la Exit Function, devuelve el control del programa a la sentencia siguiente a la que efectu la llamada, pero lgicamente una vez finalizada la funcin. La llamada a una funcin se hace de diversas formas. Por ejemplo, una de las ms usuales es la siguiente:
variable = nombre([argumentos])

91

donde argumentos son un lista de constantes, variables o expresiones separadas por comas que son pasadas a la funcin. En principio, el nmero de argumentos debe ser igual al nmero de parmetros de la funcin. Los tipos de los argumentos deben coincidir con los tipos de sus correspondientes parmetros, de lo contrario puede haber fallos importantes en la ejecucin del programa. Esta regla no rige si los argumentos se pasan por valor (concepto que se ver ms adelante). En cada llamada a una funcin hay que incluir los parntesis, aunque sta no tenga argumentos. El siguiente ejemplo corresponde a una funcin que devuelve como resultado la raz cuadrada de un nmero N:
Function Raiz (N As Double) As Double If N < 0 Then Exit Function Else Raiz = Sqr(N) End Function

La llamada a esta funcin se hace de la forma siguiente:


Cuadrada = Raiz(Num)

A diferencia de C y C++ en Visual Basic 6.0 no es necesario devolver explcitamente el valor de retorno, pues el nombre de la funcin ya contiene el valor que se desea devolver. Tampoco es necesario declarar las funciones antes de llamarlas. Procedimientos Sub La sintaxis que define un procedimiento Sub es la siguiente:
[Static] [Private] Sub nombre [(parmetros)] [sentencias] [Exit Sub] [sentencias] End Sub

La explicacin es anloga a la dada para funciones. La llamada a un procedimiento Sub puede ser de alguna de las dos formas siguientes:
Call nombre[(argumentos)]

o bien, sin pasar los argumentos entre parntesis, sino ponindolos a continuacin del nombre simplemente separados por comas:
nombre [argumentos]

A diferencia de una funcin, un procedimiento Sub no puede ser utilizado en una expresin pues no devuelve ningn valor. Por supuesto una funcin puede ser llamada al modo de un procedimiento Sub, pero en esta caso no se hace nada con el valor devuelto por la funcin. El siguiente ejemplo corresponde a un procedimiento Sub que devuelve una variable F que es la raz cuadrada de un nmero N.
Sub Raiz (N As Double, F As Double) If N < 0 Then Exit Sub 'Se mandara un mensaje de error Else F = Sqr(N) End If
92

End Sub

La llamada a este procedimiento Sub puede ser de cualquiera de las dos formas siguientes:
Raiz N, F Call Raiz(N, F)

En el ejemplo anterior, el resultado obtenido al extraer la raz cuadrada al nmero N se devuelve en la variable F pasada como argumento, debido a que como se ha mencionado anteriormente, un procedimiento Sub no puede ser utilizado en una expresin. Argumentos por referencia y por valor En las funciones (Function) y en los procedimientos Sub de Visual Basic, por defecto los argumentos se pasan por referencia2; de este modo, cualquier cambio de valor que sufra un parmetro dentro de la funcin o del procedimiento Sub tambin se produce en el argumento correspondiente de la llamada a la funcin o al procedimiento Sub. Cuando se llama a una funcin o a un procedimiento Sub, se podr especificar que el valor de una argumento no sea cambiado por la funcin o por el procedimiento, poniendo dicho argumento entre parntesis en la llamada. Un argumento entre parntesis en la llamada es un argumento pasado por valor. Por ejemplo,
Raiz ((Num)) ' En el caso de la funcin Raiz (Num), F ' En el caso del procedimiento

El argumento Num es pasado por valor. Significa que lo que se pasa es una copia de Num. Si el procedimiento cambia ese valor, el cambio afecta slo a la copia y no a la propia variable Num. Otra forma de especificar que un argumento ser siempre pasado por valor es anteponiendo la palabra ByVal a la declaracin del parmetro en la cabecera del procedimiento (Sub o Function). Por ejemplo,
Function Raiz (ByVal N As Double) Sub Raiz (ByVal N As Double, F As Double)

Pasar argumentos por valor evita modificaciones accidentales, pero tiene un coste en tiempo y memoria que puede ser significativo cuando se pasan grandes volmenes de informacin, como sucede con vectores, matrices y estructuras. Procedimientos recursivos Se dice que una funcin (Function) es recursiva o que un procedimiento Sub es recursivo si se llaman a s mismos. A continuacin se presenta una ejemplo de una funcin que calcula el factorial de un nmero programada de forma recursiva.
Function Factorial (N As Integer) As Long If N = 0 Then Factorial = 1 'Condicin de final Else Factorial = N * Factorial (N - 1) End If End Function

93

En este ejemplo, si la variable N que se le pasa a la funcin vale 0, significar que se ha llegado al final del proceso, y por tanto se le asigna el valor 1 al valor del factorial (recordar que 0! = 1). Si es distinto de 0, la funcin se llama a ella misma, pero variando el argumento a (N-1), hasta llegar al punto en el que N-1=0, finalizndose el proceso. Pasar un argumento por referencia implica que en realidad se pasa a la funcin la variable original, de modo que la funcin puede modificar su valor. Pasar por valor implica crear una nueva variable dentro de la funcin y pasarle una copia del valor de la variable externa. Si se modifica el valor de la variable copia, la variable original queda inalterada. Cuando en la llamada a una funcin se ponen como argumentos constantes numricas o expresiones los valores se pasan por valor. Procedimientos con argumentos opcionales Puede haber procedimientos en los que algunos de los argumentos incluidos en su definicin sean opcionales, de forma que el programador pueda o no incluirlos en la llamada de dichos procedimientos. La forma de incluir un argumento opcional es incluir la palabra Optional antes de dicho argumento en la definicin del procedimiento. Si un argumento es opcional, todos los argumentos que vienen a continuacin deben tambin ser opcionales. Cuando un argumento es opcional y en la llamada es omitido, el valor que se le pasa es un Variant con valor Empty. A los argumentos opcionales se les puede dar en la definicin del procedimiento un valor por defecto para el caso en que sean omitidos en la llamada, como por ejemplo:
Private Sub miProc(x As Double, Optional n=3 As Integer) sentencias End Sub

Nmero indeterminado de argumentos Este caso es similar pero diferente del anterior. En este caso no es que haya argumentos opcionales que puedan omitirse en la llamada, sino que realmente no se sabe con cuntos argumentos va a llamarse la funcin; unas veces se llamar con 2, otras con 3 y otras con 8. En este caso los argumentos se pasan al procedimiento por medio de un array, especificndolo con la palabra ParamArray en la definicin del procedimiento, como por ejemplo:
Public Function maximo(ParamArray numeros()) For Each x in numeros Sentencias maximo = x Next x End Function

Utilizacin de argumentos con nombre Visual Basic 6.0 ofrece tambien la posibilidad de llamar a las funciones y procedimientos Sub de una forma ms libre y menos formal, pasando los argumentos en la llamada al procedimiento con un orden arbitrario. Esto se consigue incluyendo el nombre de los argumentos en la llamada y asignndoles un valor por medio de una construccin del tipo miArgumento:=unValor. Unos argumentos se separan de otros por medio de comas (,). Considrese el siguiente ejemplo:
Public Sub EnviarCarta(direccion As String, destinatario As
94

String) Sentencias End Sub

que se puede llamar en la forma:


EnviarCarta destinatario:="Mike Tyson", direccion:="Las Vegas"

No todas las funciones que se pueden llamar en Visual Basic 6.0 admiten argumentos con nombre. Con AutoQuickInfo puede obtenerse ms informacin al respecto. FUNCIONES PARA MANEJO DE CADENAS DE CARACTERES Existen varias funciones tiles para el manejo de cadenas de caracteres (Strings). Estas funciones se utilizan para la evaluacin, manipulacin o conversin de cadenas de caracteres. Algunas de ellas se muestran en la tabla:
Utilidad Nmero de caracteres de una cadena Conversin a minsculas o a maysculas Conversin de cadenas a nmeros y de nmeros a cadenas Extraccin de un n de caracteres en un rango, de la parte derecha o izquierda de una cadena Extraccin de sub-cadenas Funcin en Visual Basic 6.0 Len(string | varname) LCase(x), UCase(x) Str(n), CStr(n), Val(string) Mid(string, ini[, n]), Right(string, length), Left(string, length) Split(string, [[delim], n]) el parmetro n de Mid es opcional e indica el nmero de caracteres a extraer a partir de "ini" devuelve un array con las n (-1 para todas) subcadenas separadas por delim (por defecto, el espacio) devuelve -1, 0, 1 segn str1 sea menor, igual o mayor que str2 devuelve la posicin de str2 en str1 buscando a partir del carcter n devuelve la posicin de str2 en str1 buscando a partir del carcter n reemplaza substring por replacewith Comentarios

Unin de sub-cadenas Comparacin de cadenas de caracteres

Join(string, [delim]) strComp(str1, str2)

InStr([n], str1, str2) Hallar si una cadena es parte de otra (est contenida como sub-cadena) InstrRev(str1, str2, [n]) Hallar una cadena en otra a partir del final (reverse order) Buscar y reemplazar una subcadena por otra en una cadena Replace(string, substring, replacewith)

Tabla 5.1. Funciones de manejo de cadenas de caracteres en Visual Basic 6.0.

Es necesario tener presente que cuando se quieren comparar dos cadenas de caracteres, dicha comparacin se realiza por defecto en funcin del cdigo ASCII asociado a cada letra (ver Anexo 8.1). Esto significa que por ejemplo caa es posterior a casa debido a que la letra tiene un cdigo ASCII asociado superior a la letra s ( es el 164; s es el 115). Esto mismo ocurre con las vocales acentuadas. Si se desea conseguir una comparacin alfabtica lgica es necesario incluir al comienzo del archivo de cdigo la sentencia Option Compare Text (frente a Option Compare Binary
95

establecida por defecto). La funcin strComp() admite un tercer argumento que permite especificar el tipo de comparacin (constantes vbBinaryCompare o vbTextCompare). Ejemplos:
MyDouble = 437.324 ' MyString = CStr(MyDouble) ' MyValue = Val("2457") ' MyValue = Val(" 2 45 7") ' MyValue = Val("24 and 57") ' AnyString = "Hello World" ' MyStr = Right(AnyString, 6) ' MyStr = Left(AnyString, 7) ' MyStr = Right(AnyString, 20) ' i = StrComp("casa", "caa") ' Compare Text MyString = "Mid Function Demo" ' LastWord = Mid(MyString, 14, 4)' MidWords = Mid(MyString, 5) ' MyDouble es un Double. MyString contiene "437.324". Devuelve 2457. Devuelve 2457. Devuelve 24. Se define el string. Devuelve " World". Devuelve "Hello W". Devuelve "Hello World". Devuelve 1 por defecto y 1 con Option Se crea un nuevo string. Devuelve "Demo". Devuelve "Function Demo".

El operador Like permite comparar dos cadenas de caracteres. Si son iguales devuelve True y si no lo son, False. Tngase en cuenta que Like es un operador, no una funcin. Existe adems el operador de concatenacin & que puede ser utilizado con cadenas de caracteres. Se utiliza para poner una cadena a continuacin de otra. Por ejemplo:
str1 = "My first string" 'Se inicializan los strings str2 = "My second string" TextoFinal = str1 & str2 'TextoFinal vale "My first stringMy second string"

El operador "+" opera de forma anloga, pero su uso se desaconseja pues en ciertas ocasiones convierte las cadenas en nmeros y realiza la suma. Funcin Format La funcin Format realiza las conversiones necesarias para que ciertos datos numricos o de otro tipo puedan ser impresos con Print. Como se ha visto, en el caso de las variables numricas esto no es imprescindible, pero la funcin Format permite controlar el nmero de espacios, el nmero de decimales, etc. En el caso de su aplicacin a objetos tipo fecha (date) y hora (time) la aplicacin de Format es imprescindible, pues Print no los escribe directamente. La forma general de esta funcin es la siguiente:
Format(expresion, formato)

donde expresion es una variable o expresin y formato -que es opcional- describe el formato deseado para el resultado. El valor de retorno es una cadena de caracteres directamente utilizable en Print. Para fechas existen formatos predefinidos tales como General Date, Long Date, Medium Date y Short Date; para la hora los formatos predefinidos son Long Time, Medium Time y Short Time. Adems existe la posibilidad de que el usuario defina sus propios formatos (ver UserDefined Date/Time Formats (Format Function), en el Help del programa). El usuario tambin puede definir sus propios formatos numricos y de cadenas de caracteres. A diferencia de la funcin Str, la funcin Format no deja espacio en blanco para el signo de los nmeros positivos. FUNCIONES MATEMTICAS Al igual que las funciones vistas para el manejo de cadenas de caracteres, existe una serie de
96

funciones matemticas las cuales permiten realizar clculos dentro de un programa de Visual Basic. Dichas funciones se muestran en la Tabla 5.2:
Funcin matemtica Valor absoluto Arco tangente Exponencial Parte entera Logaritmo Redondeo Funcin en Visual Basic Abs(x) Atn(x) Exp(x) Int(x), Fix(x) Log(x) Round(x, ndec)
Tabla 5.2. Funciones matemticas en Visual Basic 6.0.

Funcin matemtica N aleatorio Seno y coseno Tangente Raz cuadrada Signo (1, 0, -1)

Funcin en Visual Basic Rnd Sin(x), Cos(x) Tan(x) Sqr(x) Sgn(x)

Ejemplos:
MyNumber = Abs(50.3) ' Devuelve 50.3. MyNumber = Abs(-50.3) ' Devuelve 50.3. MyAngle = 1.3 ' El ngulo debe estar en radianes. MySecant = 1 / Cos(MyAngle) ' Calcula la secante. MySqr = Sqr(4) ' Devuelve 2. MySqr = Sqr(23) ' Devuelve 4.79583152331272. MyVar1 = 12: MyVar2 = -2.4: MyVar3 = 0 ' Declaracin de las variables MySign = Sgn(MyVar1) ' Devuelve 1. MySign = Sgn(MyVar2) ' Devuelve -1. MySign = Sgn(MyVar3) ' Devuelve 0.

Las funciones trigonomtricas de Visual Basic utilizan radianes para medir los ngulos. Con el fin de completar estas funciones, se ofrece a continuacin una relacin de funciones que son derivadas de las anteriores. El alumno podra programar dichas funciones en un archivo *.bas y as poderlas utilizar posteriormente en cualquier programa. Dichas funciones se muestran en la Tabla 5.3:
Funcin matemtica Secante Cosecante Cotangente Arcoseno Arcocoseno Arcosecante Arcocosecante Arcocotangente Seno Hiperblico Coseno Hiperblico Tangente Hiperblica Sec(X) = 1 / Cos(X) Cosec(X) = 1 / Sin(X) Cotan(X) = 1 / Tan(X) Arcsin(X) = Atn(X / Sqr(-X * X + 1)) Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1) Arcsec(X) = Atn(X / Sqr(X * X 1)) + Sgn((X) -1) * (2 * Atn(1)) Arccosec(X) = Atn(X / Sqr(X * X - 1)) + (Sgn(X) - 1) * (2 * Atn(1)) Arccotan(X) = Atn(X) + 2 * Atn(1) HSin(X) = (Exp(X) - Exp(-X)) / 2 Hcos(X) = (Exp(X) + Exp(-X)) / 2 Htan(X) = (Exp(X) - Exp(-X)) / (Exp(X) + Exp(-X))
97

Expresin equivalente

Secante Hiperblica Cosecante Hiperblica Cotangente Hiperblica Arcoseno Hiperblico Arcocoseno Hiperblico Arcotangente Hiperblica Arcosecante Hiperblica Arcocosecante Hiperblica Arcocotangente Hiperblica Logaritmo en base N

HSec(X) = 2 / (Exp(X) + Exp(-X)) Hcosec(X) = 2 / (Exp(X) - Exp(-X)) Hcotan(X) = (Exp(X) + Exp(-X)) / (Exp(X) - Exp(-X)) Harcsin(X) = Log(X + Sqr(X * X + 1)) Harccos(X) = Log(X + Sqr(X * X - 1)) Harctan(X) = Log((1 + X) / (1 - X)) / 2 Harcsec(X) = Log((Sqr(-X * X + 1) + 1) / X) Harccosec(X) = Log((Sgn(X) * Sqr(X * X + 1) +1) / X) Harccotan(X) = Log((X + 1) / (X 1)) / 2 LogN(X) = Log(X) / Log(N)

Tabla 5.3. Funciones auxiliares matemticas (no las tiene Visual Basic 6.0).

98

6. ARCHIVOS DE DATOS
6.1 CONTROLES DE SISTEMA DE ARCHIVO (FILELIST, DIRLIST Y DRIVELIST) Uno de los problemas que hay que resolver para leer o escribir en archivos de disco es ser capaces de localizar interactivamente los correspondientes archivos, de modo anlogo a como se realiza con los comandos Archivo/Abrir o Archivo/Guardar Como de Word, Excel o de cualquier otra aplicacin. Este tipo de operaciones se pueden hacer mucho ms fcilmente con los Common Dialog Controls, aconsejando por lo tanto su uso. A pesar de ello, aqu se van a explicar los controles especficos de que dispone Visual Basic 6.0. Visual Basic 6.0 dispone de tres controles que facilitan el recorrer el rbol de archivos y de directorios, localizando o creando interactivamente un archivo determinado. Estos controles son el FileListBox (para archivos), el DirListBox (para directorios) y el DriveListBox (para unidades de disco). La Figura 6.1 muestra estos tres controles, junto con unas etiquetas que los identifican. Los dos primeros son listas, mientras que el tercero es una caja de tipo ComboBox. En principio estos controles, cuando se colocan en un formulario tal como se Figura 6.1 Ejemplo del objeto Printer muestra en la Figura 6.1, estn desconectados. Quiere esto decir que al cambiar la unidad de disco (drive) no se muestran en la caja dirListBox los directorios correspondientes a la nueva unidad de disco. Por otra parte, al cambiar de directorio tendrn que cambiar de modo acorde los archivos en la caja fileListBox. La dificultad de conectar estas cajas no es grande, pero s hay que saber cmo se hace pues depende de propiedades de estas cajas que no aparecen en la ventana de propiedades (ventana Properties) en modo de diseo, y que slo estn accesibles en modo de ejecucin. De entre estas propiedades las ms importantes son las siguientes: 1. La DriveListBox tiene una propiedad llamada Drive que recoge la unidad seleccionada por el usuario (puede ser una unidad fsica como el disco c:\ o una unidad lgica asignada por el usuario a otro disco o directorio en un servidor o en otro ordenador de la red). 2. La propiedad path de la caja DirListBox determina el drive seleccionado y por tanto qu directorios se muestran en dicha caja. 3. Finalmente, una propiedad tambin llamada path de la caja FileListBox determina el directorio que contiene los archivos mostrados. Para enlazar correctamente las cajas de discos, directorios y archivos se puede utilizar el evento Change, de tal forma que cada vez que el usuario cambia la unidad de disco se cambia el path del directorio y cada vez que se cambia el directorio se cambia el path de los archivos. Esto puede hacerse con el cdigo siguiente:
Private Sub dirPrueba_Change() filPrueba.Path = dirPrueba.Path End Sub

99

Private Sub drvPrueba_Change() dirPrueba.Path = drvPrueba.Drive End Sub

La caja FileListBox tiene una propiedad llamada FileName que contiene el nombre del archivo seleccionado por el usuario. Para tener el path completo del archivo basta anteponerle la propiedad Path de la fileListBox, que incluye el directorio y el drive, y la barra invertida (\). Si el usuario introduce FileName incluyendo el path, Visual Basic actualiza tambin de modo automtico la propiedad Path de FileListBox. El usuario se debe preocupar de utilizar el evento Change para actualizar el Path de la caja DirListBox y la propiedad Drive de DriveListBox. Otra propiedad importante es la propiedad Pattern, que indica los tipos de archivos que se mostrarn en la caja. El valor por defecto es *.*, lo cual hace que se muestren todos los archivos. Si su valor fuese *.doc slo se mostraran los archivos con esta extensin. La propiedad Pattern admite varias opciones separadas por untos y coma (*.doc; *.dot). TIPOS DE ARCHIVOS Tanto en Windows como en Visual Basic 6.0 existen, principalmente, dos tipos de archivos: Archivos ASCII o archivos de texto. Contienen caracteres codificados segn el cdigo ASCII y se pueden leer con cualquier editor de texto como Notepad. Suelen tener extensin *.txt o *.bat, pero tambin otras como *.m para los programas de Matlab, *.c para los archivos fuente de C, *.cpp para los archivos fuente de C++ y *.java para los de Java. Archivos binarios: Son archivos imagen de los datos o programas tal como estn en la memoria del ordenador. No son legibles directamente por el usuario. Tienen la ventaja de que ocupan menos espacio en disco y que no se pierde tiempo y precisin cambindolos a formato ASCII al escribirlos y al leerlos en el disco. Con Visual Basic 6.0 se pueden leer tanto archivos ASCII como archivos binarios. Adems el acceso a un archivo puede ser de tres formas principales. Acceso secuencial. Se leen y escriben los datos como si se tratara de un libro: siempre a continuacin del anterior y sin posibilidad de volver atrs o saltar datos. Si se quiere acceder a un dato que est hacia la mitad de un archivo, habr que pasar primero por todos los datos anteriores. Los archivos de texto tienen acceso secuencial. Acceso aleatorio (random): Permiten acceder directamente a un dato sin tener que pasar por todos los dems, y pueden acceder a la informacin en cualquier orden. Tienen la limitacin de que los datos estn almacenados en unas unidades o bloques que se llaman registros, y que todos los registros que se almacenan en un archivo deben ser del mismo tamao. Los archivos de acceso aleatorio son archivos binarios. Acceso binario. Son como los de acceso aleatorio, pero el acceso no se hace por registros sino por bytes.

Antes de poder leer o escribir en un archivo hay que abrirlo por medio de la sentencia Open. En esta sentencia hay que especificar qu tipo de acceso se desea tener, distinguiendo tambin si es para lectura (input), escritura (output) o escritura aadida (append).

100

6.3 ARCHIVO DE ACCESO SECUENCIAL (TEXTO) Apertura y cierre de archivos Para poder leer o escribir en un archivo antes debe ser abierto con la sentencia Open, cuya forma general es la siguiente:
Open filename For modo As # fileNo

donde: filename es el nombre del archivo a abrir. Ser una variable string o un nombre entre dobles comillas ( ). modoPara acceso secuencial existen tres posibilidades: Input para leer, Output para escribir al comienzo de un archivo y Append para escribir al final de un archivo ya existente. Si se intenta abrir en modo Input un archivo que no existe, se produce un error. Si se abre para escritura en modo Output un archivo que no existe se crea, y si ya exista se borra su contenido y se comienza a escribir desde el principio. El modo Append es similar al modo Output, pero respeta siempre el contenido previo del archivo escribiendo a continuacin de lo ltimo que haya sido escrito anteriormente. fileNoes un nmero entero (o una variable con un valor entero) que se asigna a cada archivo que se abre. En todas las operaciones sucesivas de lectura y/o escritura se har referencia a este archivo por medio de este nmero. No puede haber dos archivos abiertos con el mismo nmero. Visual Basic dispone de una funcin llamada FreeFile que devuelve un nmero no ocupado por ningn archivo.

A continuacin puede verse un ejemplo de archivo abierto para lectura:


Open "C:\usuarios\PRUEBA1.txt" For Input As #1

Despus de terminar de leer o escribir en un archivo hay que cerrarlo. Para ello, se utilizara el comando Close, que tiene la siguiente forma:
Close # fileNo

donde el fileNo es el nmero que se la haba asignado al abrirlo con la instruccin Open. Lectura y escritura de datos Sentencia Input Existen varias formas de leer en un archivo de acceso secuencial. Por ejemplo, para leer el valor de una o ms variables se utiliza la sentencia Input:
Input # fileNo, varName1, varName2, varName3, ...

donde el fileNo es el nmero asignado al archivo al abrirlo y varName1, varName2, ... son los nombres de las variables donde se guardarn los valores ledos en el archivo. Debe haber una correspondencia entre el orden y los tipos de las variables en la lista, con los datos almacenados en el archivo. No se pueden leer directamente vectores, matrices o estructuras. Si los datos del disco han de ser escritos por el propio programa, conviene utilizar la sentencia write (mejor que Print) para garantizar que los valores estn convenientemente separados. La sentencia Write se ver posteriormente.

101

Funcin Line Input y funcin Input La funcin Line Input # lee una lnea completa del archivo y devuelve su contenido como valor de retorno. Su forma general es:
varString = Line Input #fileNo

Conviene recordar que en los archivos de texto se suele utilizar el carcter return (o Intro) para delimitar las distintas lneas. Este es el carcter ASCII n 13, que por no ser un carcter imprimible se representa en Visual Basic 6.0 como chr(13). En muchas ocasiones (como herencia del MS-DOS) se utiliza como delimitador de lneas una combinacin de los caracteres return y linefeed, representada en Visual Basic 6.0 como chr(13)+chr(10). En la cadena de caracteres que devuelve Line no se incluye el carcter de terminacin de la lnea. Para leer todas las lneas de un archivo se utiliza un bucle for o while. Visual Basic 6.0 dispone de la funcin EOF (End of File) que devuelve True cuando se ha llegado al final del archivo. Vase el siguiente ejemplo:
Do While Not EOF(fileNo) miLinea = Line Input #fileNo ... Loop Tambin se puede utilizar la funcin Input, que tiene la siguiente forma general: varString = Input(nchars, #fileNo)

donde nchars es el nmero de caracteres que se quieren leer y varString es la variable donde se almacenan los caracteres ledos por la funcin. Esta funcin lee y devuelve todos los caracteres que encuentra, incluidos los intro y linefeed. Para ayudar a utilizar esta funcin existe la funcin LOF (fileNo), que devuelve el n total de caracteres del archivo. Por ejemplo, para leer todo el contenido de un archivo y escribirlo en una caja de texto se puede utilizar:
txtCaja.text = Input(LOF(fileNo), #fileNo)

Funcin Print # Para escribir el valor de unas ciertas variables en un archivo previamente abierto en modo Output o Append se utiliza la instruccin Print #, que tiene la siguiente forma:
Print #fileNo, var1, var2, var2, ...

donde var1, var2,... pueden ser variables, expresiones que dan un resultado numrico o alfanumrico, o cadenas de caracteres entre dobles comillas, tales como El valor de x es.... Considrese el siguiente ejemplo:
Print #1, "El valor de la variable I es: ", I

donde I es una variable con un cierto valor que se escribe a continuacin de la cadena. Las reglas para determinar el formato de la funcin Print # son las mismas que las del mtodo Print visto previamente. Funcin Write # A diferencia de Print #, la funcin Write # introduce comas entre las variables y/o cadenas de caracteres de la lista, adems encierra entre dobles comillas las cadenas de caracteres antes de
102

escribirlas en el archivo. La funcin Write # introduce un carcter newline, esto es, un return o un return+linefeed despus del ltimo carcter de las lista de variables. Los archivos escritos con Write # son siempre legibles con Input #, cosa que no se puede decir de Print #. Vase el siguiente ejemplo:
' Se abre el archivo para escritura Open "C:\Temp\TestFile.txt" For Output As #1 Write #1, "Hello World", 234 ' Datos separados por comas MyBool = False: MyDate = #2/12/1969# ' Valores de tipo boolean y Date Write #1, MyBool; " is a Boolean value" Write #1, MyDate; " is a date" Close #1 ' Se cierra el archivo El archivo TestFile.txt guardado en C:\Temp contendr: "Hello World",234 #FALSE#," is a Boolean value" #1969-02-12#," is a date"

6.4 ARCHIVOS DE ACCESO ALEATORIO (REGRISTO) Los archivos de acceso aleatorio se caracterizan porque en ellos se puede leer en cualquier orden. Los archivos de acceso aleatorio son archivos binarios. Cuando se abre un archivo se debe escribir For Random, al especificar el modo de apertura (si el archivo se abre For Binary el acceso es similar, pero no por registros sino por bytes; este modo es mucho menos utilizado). Abrir y cerrar archivos de acceso aleatorio Estos archivos se abren tambin con la sentencia Open, pero con modo Random. Al final se aade la sentencia Len=longitudRegistro, en bytes. Vase el siguiente ejemplo:
fileNo = FreeFile size = Len(unObjeto)Open filename For Random As #fileNo Len = size

donde filename es una variable que almacena el nombre del archivo. Se recuerda que la funcin FreeFile devuelve un nmero entero vlido (esto es que no est siendo utilizado) para poder abrir un archivo. El ltimo parmetro informa de la longitud de los registros (todos deben tener la misma longitud). Visual Basic 6.0 dispone de la funcin Len(objetoName), que permite calcular la dimensin en bytes de cualquier objeto perteneciente a una clase o estructura. De ordinario los archivos de acceso directo se utilizan para leer o escribir de una vez todo un bloque de datos. Este bloque suele ser un objeto de una estructura, con varias variables miembro. Los archivos abiertos para acceso directo se cierran con Close, igual que los secuenciales. Leer y escribir en una archivo de acceso aleatorio. Funciones Get y Put Se utilizan las funciones Get y Put. Su sintaxis es la siguiente:
Get #fileNo, registroNo, variableObjeto Put #fileNo, registroNo, variableObjeto

La instruccin Get lee un registro del archivo y almacena los datos ledos en una variable, que puede ser un objeto de una determinada clase o estructura. La instruccin Put escribe el contenido de la variable en la posicin determinada del archivo. Si se omite el nmero de registro se lee (escribe) a continuacin del registro ledo (escrito) anteriormente. Vase el siguiente ejemplo:
FileNo=FreeFile size=Len(unObjeto)Open filename for Random As #fileNo
103

Len=size Get #fileNo, 3, size

Con este ejemplo, se ha abierto el archivo filename de la misma forma que se realiz en el ejemplo anterior, pero ahora, adems se ha ledo un registro de longitud size, y ms en concreto, el tercer registro. Si se quisiera modificar el valor de este registro, no habra ms que asignarle el valo r que se quisiera, para a continuacin introducirlo en el archivo mediante la sentencia siguiente:
Put #fileNo, 3, size

ARCHIVOS DE ACCESO BINARIO La tcnica a emplear es bsicamente la misma que con los archivos de acceso aleatorio, con la salvedad de que en lugar de manejar registros, en los archivos de acceso binario se trabaja con bytes. Vase el siguiente ejemplo:
FileNo=FreeFile Open filename for datodato = 7 Put #1, 4, datoClose #1 Binary As #fileNoGet #1, 4,

En el anterior ejemplo se puede observar como primero se introduce en la variable dato el valor del cuarto byte del archivo filename, para posteriormente asignarle el valor 7, e introducirlo de nuevo en el cuarto byte de filename.

104

7. MENS
Entre las capacidades de Visual Basic 6.0 no poda faltar la de construir mens con gran facilidad. Sin embargo, hay algunas diferencias respecto al modo el que se construyen los controles. Para crear mens Visual Basic dispone de una herramienta especial que se activa mediante el comando Menu Editor del men Tools. El cuadro de dilogo que se abre se nuestra en la Figura 5.1. Ms adelante se ver cmo se utiliza esta herramienta; antes, conviene recordar brevemente las caractersticas ms importantes de los mens de Windows 95/98/NT/Me/2000/XP. Los mens presentan sobre los dems controles la ventaja de que ocupan menos espacio en pantalla, pero tienen el inconveniente de que sus posibilidades no estn a la vista ms que cuando se despliegan. La mayor parte de las aplicaciones de Windows 95/98/NT/Me/2000/XP utilizan mens. Aunque todo el mundo est familiarizado con sus funciones ms bsicas, conviene ver algunas posibilidades menos usuales. Se utilizarn para ello una aplicacin tan conocida como lo es Microsoft Word. La Figura 5.2 recoge el aspecto del men View de Word 97, en el que conviene destacar las siguientes caractersticas: 1. Lo primero que llama la atencin es que los mens aparecen divididos en grupos de opciones separados por lneas horizontales. Figura 7.1 El men Ver de Microsoft Word 2. Algunos items como Diseo de Impresin tienen un icono resaltado a su izquierda. Esto quiere decir que ese tem es la opcin elegida entre los cuatro items de su grupo. En este sentido los mens se parecen a los controles OptionButton. Visual Basic 6.0 no permite hacer esto directamente, pero lo puede simular. 3. Otros items como Regla tienen una marca de seleccin a su izquierda. En este caso el men realiza la funcin de las cajas de seleccin (CheckBox). 4. Todas las opciones del men tienen una letra subrayada. La finalidad es poder desplegar y activar los mens desde teclado, sin ayuda del ratn (con Alt y la letra subrayada). 5. Tambin se observa que el tem Notas al pie aparece en gris claro. Esto quiere decir que en este momento no est activo y por tanto no es seleccionable. 6. Otros items como Barra de herramientas estn seguidos por un pequeo tringulo. Eso quiere decir que existe un men secundario con ms opciones. Otros items como Zoom aparecen seguidos por puntos suspensivos (...). Este es un convenio utilizado para indicar que eligiendo esa opcin se abrir un cuadro de dilogo en el que habr que tomar otras decisiones.

105

Por lo que respecta al men que aparece en la Figura 7.2 la caracterstica ms importante es que tiene sub-mens (sealados mediante un pequeo tringulo a su derecha), que se abren al colocar el cursor sobre el tem correspondiente. Estos mens se suelen llamar mens en cascada, y son muy frecuentes en Windows 95/98/NT/Me/2000/XP. Otra caracterstica de los mens, que no aparece en la Figura 7.1 ni en la Figura 7.2, es la posibilidad de definir combinaciones de teclas que realizan la misma funcin que una opcin del men. Por ejemplo, en muchas aplicaciones Ctrl+C equivale a Editar/Copiar y Ctrl+V a Editar/Pegar. Estas combinaciones de teclas se llaman accesos rpidos (shortcut) y hay que distinguirlas de acceder a los mens mediante la tecla Alt y las letras subrayadas de los nombres.
Figura 7.2 El men Insertar de Microsoft Word

7.1 CREAR UN MEN En la Figura 7.3 vemos al editor de mens, que se abre con Herramientas/Editor de mens o haciendo clic en el botn correspondiente de la barra de herramientas.

Se llama ttulo a cada elemento que aparece en la barra de mens y lnea o tem a cada elemento que aparece al desplegarse un ttulo. Para introducir un nuevo ttulo en la barra de mens hay que definir, en la caja de texto Caption de la Figura 7.3, el nombre con el que se quiere que aparezca. Si se desea acceder a dicho ttulo mediante teclado (Alt+letra), la letra que se desea utilizar deber ir precedida por el carcter (&). Adems, y al igual que todos los controles de Visual Basic 6.0, conviene que el ttulo tenga un nombre (caja de texto Name) para que se pueda acceder a l desde programa. Los nombres de los ttulos de los mens suelen comenzar por las letras mnu, como por ejemplo mnuFile, mnuEdit o mnuHelp. En la Figura 7.3 la caja de texto Index hace referencia a la posibilidad de crear arrays de mens. Se puede definir tambin un shortcut en la caja de texto correspondiente. En esta figura aparecen cuatro checkButtons (Enabled, Checked, Visible y WindowList) con los que se pueden especificar algunas propiedades iniciales del men, como por ejemplo que
106

Figura 7.3 Definicin de mens con el Editor de Mens

est activado o que sea visible. Se pueden introducir items subordinados a un ttulo por medio de la flecha hacia la derecha. Para ello basta definirlos del modo habitual y luego hacer clic sobre dicha flecha. El resultado es que aparecen unos puntos a la izquierda del caption correspondiente. Por ejemplo, en el men definido en la Figura 7.3, Salir es una lnea subordinada del men Archivo, mientras que Deshacer, Cortar, Copiar y Paste son items subordinados del men Editar. En este ltimo caso se ha introducido una lnea de separacin entre Deshacer y Copiar; para ello basta introducir un tem ms cuyo caption sea el carcter menos (-). La Figura 7.4 muestra el resultado de ejecutar la aplicacin cuyos mens estn definidos en el Menu Editor de la Figura 7.3. Obsrvese la lnea horizontal de separacin, los shortcuts y las letras subrayadas para poder abrir el men desde teclado. Respecto a los nombres de los items, lo habitual es seguir la nomenclatura que ya se muestra en la Figura 7.3 para Undo: primero se ponen las tres letras mnu, y despus los nombres del ttulo y del tem comenzando por mayscula: mnuEditUndo. Caso que haya mens en cascada, se ponen los distintos nombres siguiendo estas mismas normas. De esta forma siempre queda claro a partir del nombre a qu elemento del men se est haciendo referencia.
Figura 7.4 Funcionamiento del Men Editar elaborado con el Editor de Mens

La Figura 7.3 es bastante auto-explicativa respecto a cmo se debe proceder para estructurar un men, aadiendo, borrando o cambiando de posicin los distintos elementos. De forma resumida, se pueden establecer las siguientes normas generales: 1. Para insertar un ttulo o tem basta seleccionar la lnea por encima de la cual se quiere insertar y hacer clic en el botn Insert. Para aadir un nuevo tem al final de la lista se selecciona el ltimo elemento introducido y se hace clic en el botn Next. Para borrar un elemento, se selecciona y se hace clic en el botn Delete. 2. Se puede cambiar de posicin un ttulo o tem seleccionndolo y haciendo clic en los botones que muestran las flechas hacia arriba y hacia abajo. Para convertir un ttulo en tem o para cambiar el nivel de un tem se selecciona y se utilizan las flechas hacia la derecha y hacia la izquierda. Conviene recordar que los nombres de los items (por ejemplo mnuEditCopy) deben estar siempre de acuerdo con su posicin, segn las normas explicadas anteriormente. AADIR CDIGO A LOS MENS Los items de los mens admiten un nico evento: el evento click, que consiste en ser seleccionados por medio del ratn o del teclado. Para aadir el cdigo correspondiente basta elegir en el men, estando en modo diseo, el tem correspondiente para que se abra la ventana de cdigo en el procedimiento ligado a ese evento. Tambin puede buscarse directamente el objeto y el evento correspondiente en las listas desplegables de la ventana de cdigo. En ocasiones habr que cambiar las propiedades checked, active y visible desde los procedimientos. A estas propiedades se accede
107

del modo habitual, con el nombre del tem y el operador punto (.) ARRAYS DE MENS De la misma manera que pueden definirse arrays de controles, tambin pueden definirse arrays de items (y de ttulos) en un men. La ventaja de definir arrays de items es que basta definir un nico procedimiento que se haga cargo del evento click de todos los items del array. Este procedimiento recibe como parmetro la variable entera Index, que indica que tem del array ha sido seleccionado por el usuario. Dentro de este procedimiento se podr utilizar por ejemplo la sentencia Select Case para tratar de forma adecuada cada uno de los casos. EJEMPLO: MEN PARA DETERMINAR LAS CARACTERSTICAS DE UN TEXTO La Figura 7.5 muestra un formulario que contiene una caja de texto con una frase (Visual Basic es el lenguaje de programacin que hace ms fcil el desarrollar aplicaciones para Windows) a la que se puede dar formato desde el men Text. El men Text tiene tres submens: Font, Size y Style. El men Archivo slo tiene la opcin Exit, que termina la ejecucin. El sub-men Font tiene tres opciones: Arial, Courier New y Times New Roman. El sub-men Size tiene 5 opciones: 10, 11, 12, 13, y 14. El submen Style tiene 2 opciones: Bold e Italic. Los tipos de letra y los tamaos deben actuar como los Figura 7.5 Caja de Texto con formatos desde el Option Buttons: slo una opcin puede estar men seleccionada para el texto de la caja. Sin embargo, los estilos Bold e Italic actan como Checked Boxes: el texto puede ser a la vez Bold e Italic, y puede no ser ninguna de las dos cosas. Para los tamaos de letra se debe utilizar un array de mens con cinco elementos (propiedad Index de 0 a 4). Se deja al usuario que ponga los nombres que desee a los controles de la Figura 5.6, o que utilice los del cdigo del programa que se muestra a continuacin. Ntese que con los mens que se comportan como Option Buttons la propiedad Checked se pone a False en todas las opciones antes de poner a True la que el usuario ha elegido. Con el men que se comporta como Checked Box simplemente se cambia la propiedad Checked de True a False o viceversa, cuando el usuario la elige. El cdigo se muestra a continuacin:
Option Explicit Private Sub Form_Load() txtBox.Text = "Visual Basic es el lenguaje de programacin " & _ "que hace ms fcil el desarrollar aplicaciones para Windows" txtBox.Font.Name = "Arial" mnuTextFontArial.Checked = True txtBox.Font.Size = 10 mnuTextSizeA(0).Checked = True txtBox.Font.Bold = False txtBox.Font.Italic = False End Sub
108

Private Sub mnuFileExit_Click() End End Sub Private Sub mnuTextFontArial_Click() mnuTextFontCou.Checked = False mnuTextFontTimes.Checked = False txtBox.Font.Name = "Arial" mnuTextFontArial.Checked = True End Sub Private Sub mnuTextFontCou_Click() mnuTextFontArial.Checked = False mnuTextFontTimes.Checked = False txtBox.Font.Name = "Courier New" mnuTextFontCou.Checked = True End Sub Private Sub mnuTextFontTimes_Click() mnuTextFontArial.Checked = False mnuTextFontCou.Checked = False txtBox.Font.Name = "Times New Roman" mnuTextFontTimes.Checked = True End Sub Private Sub mnuTextSizeA_Click(Index As Integer) Dim i As Integer For i = 0 To 4 mnuTextSizeA(i).Checked = False Next i Select Case Index Case 0 txtBox.Font.Size = Case 1 txtBox.Font.Size = Case 2 txtBox.Font.Size = Case 3 txtBox.Font.Size = Case 4 txtBox.Font.Size = End Select mnuTextSizeA(Index).Checked 10 11 12 13 14 = True

End Sub Private Sub mnuTextStyleBold_Click() txtBox.Font.Bold = Not txtBox.Font.Bold mnuTextStyleBold.Checked = Not mnuTextStyleBold.Checked End Sub Private Sub mnuTextStyleItalic_Click() txtBox.Font.Italic = Not txtBox.Font.Italic mnuTextStyleItalic.Checked = Not mnuTextStyleItalic.Checked End Sub
109

MENS CONTEXTUALES (POPUP MENU) Los mens contextuales aparecen cuando el usuario hace clic con el botn derecho sobre un elemento de la aplicacin. El programa debe reconocer el evento MouseUp o MouseDown, ver si el usuario ha hace clicdo con el botn derecho (argumento Button igual a 2) y llamar al mtodo PopupMenu, que tiene la siguiente forma general: PopupMenu menuName [,flags[,x[,y]]] donde menuName ee el nombre de un men (con al menos un elemento), x e y son las coordenadas base para hacer aparecer el men contextual, y flags son unas constantes que determinan ms en concreto dnde y cmo se muestra el men. Las constantes que determinan dnde aparece el men son: vbPopupMenuLeftAlign (default), vbPopupMenuCenterAlign y vbPopupMenuRightAlign. Por otra parte vbPopupMenuLeftButton (default) y vbPopupMenuRightButton determinan si el comando se activa con el botn izquierdo o con cualquiera de los dos botones. Las constantes se combinan con el operador Or. El nombre del men que aparece en el mtodo PopupMenu debe haber sido creado con el Menu Editor, aunque puede tener la propiedad Visible a False, si no se desea que se vea. 7.2 BARRAS DE HERRAMIENTAS

Aadiendo Controles Adicionales al Cuadro de Herramientas


El Cuadro de Herramientas contiene los controles intrnsecos o estndar de Visual Basic. Es posible ampliar el cuadro de herramientas aadiendo controles ActiveX. La edicin profesional de Visual Basic proporciona controles ActiveX adicionales. Tambin es posible comprar controles ActiveX a terceras partes. Para aadir un control ActiveX al cuadro de herramientas haga lo siguiente: 1. En el men Proyecto, haga clic en Componentes. Visual Basic mostrar el cuadro de dilogo Componentes. 2. En la ficha Controles, haga clic en el control que desea incluir, y luego haga clic en Aceptar. Visual Basic aadir el control al cuadro de herramientas. El control ToolBar Un control Toolbar contiene una coleccin de objetos Button utilizados para crear una barra de herramientas asociada a una aplicacin. Normalmente, una barra de herramientas contiene botones que corresponden a elementos de men de una aplicacin, proporcionando una interfaz grfica al usuario que le permite tener acceso a las funciones y comandos empleados con ms frecuencia en esa aplicacin. El control Toolbar le permite crear barras de herramientas agregando objetos Button a una coleccin Buttons; cada objeto Button puede tener texto opcional o una imagen, proporcionados por un control ImageList asociado. Puede mostrar una imagen en un botn con la propiedad Image o mostrar texto con la propiedad Caption, o ambos, para cada objeto Button. En tiempo de diseo puede agregar objetos Button al control utilizando la Pgina de propiedades del control Toolbar.

110

En tiempo de ejecucin, puede agregar o quitar botones de la coleccin Buttons mediante los mtodos Add y Remove. Para programar el control Toolbar, agregue cdigo al evento ButtonClick para que responda al botn seleccionado. Tambin puede determinar el comportamiento y la apariencia de cada objeto Button mediante la propiedad Style. Por ejemplo, si a cuatro botones se les asigna el estilo ButtonGroup, slo se podr presionar uno de ellos y al menos uno estar siempre presionado. La facilidad de uso se mejora considerablemente programando descripciones ToolTipText de cada objeto Button. Para mostrar informacin sobre herramientas, la propiedad ShowTips debe establecerse a True. El Control ImageList Un control ImageList contiene una coleccin de objetos ListImage, a cada uno de los cuales se puede hacer referencia mediante su ndice o su clave. El control ImageList no est concebido para utilizarlo en solitario, sino como punto de almacenamiento central para proporcionar cmodamente imgenes a otros controles. Puede usar el control ImageList con cualquier control que asigne un objeto Picture a una propiedad Picture. Es posible agregar imgenes de diferentes tamaos al control ImageList, pero todas se ajustan al mismo tamao. El tamao de los objetos de ListImage est determinado por uno de los siguientes valores: El valor de las propiedades ImageWidth y ImageHeight antes de agregar alguna imagen. Las dimensiones de la primera imagen agregada.

No hay ninguna limitacin en cuanto al tamao de la imagen, pero el nmero total de imgenes que se puede cargar est limitado por la cantidad de memoria disponible. Durante el diseo del programa puede agregar imgenes mediante la ficha General del cuadro de dilogo Propiedades del control ImageList. En tiempo de ejecucin puede agregar imgenes mediante el mtodo Add para la coleccin ListImages. Programa de ejemplo con una barra de herramientas El control ToolBar acta como un contenedor de objetos de botn. Los botones se pueden agregar a la barra de herramientas que utiliza el mtodo Add como se muestra en la aplicacin de ejemplo siguiente o estableciendo la propiedad [Personalizado] del control ToolBar. Adems de realizar una funcin cuando se hace clic en una funcin, tambin los botones pueden contener descripciones y Texto de informacin sobre herramientas. Una informacin sobre herramientas es una descripcin breve de la funcin del botn y se muestra cuando se pasa el cursor sobre el botn. El control ToolBar se proporciona por el archivo COMCTL32.OCX. Al distribuir su aplicacin, COMCTL32.OCX debe estar instalado en el Microsoft Windows de su usuario directorio \SYSTEM. Utilizar el Asistente para la instalacin asegurar que se instalan esto y todos los archivos necesarios en los directorios adecuados. El programa de ejemplo es un procesador de textos simple que utiliza una barra de herramientas para realizar algunas funciones como abre un archivo, guarda un archivo y da formato al documento. El programa contiene el control enriquecer TextBox donde los tipos de usuario que realiza el archivo en un documento, un control de barra de herramientas que contiene botones para realizar una funcin, un control Lista de Imagen para almacenar el mapa de bits que aparece en los botones y un control Common Dialog abren y en el que guardan funciones. En este ejemplo, los botones se agregan en el evento Cargar del Formulario mediante programacin. Tambin las
111

propiedades de los botones se establecen en el evento Cargar. La funcin del botn se establece en el evento ButtonClick del control ToolBar. La barra de herramientas tiene la caracterstica agregada sobre ajustar los botones cuando se cambia el tamao del formulario y sobre personalizacin de las posiciones de todos los botones. Ajustar los botones se habilita estableciendo la propiedad Wrappable de la Barra de herramientas en True. Un botones se utiliza para personalizar la posicin de los botones diferentes. El hacer clic en este botn muestra un cuadro de dilogo que le permite agregar una barra separadora, quitar botones y reorganizar la posicin de botn. Antes de que el cuadro de dilogo muestra, las posiciones actuales de botn se almacenan en el Registro. Cuando hace clic en el botn Restaurar Barra, la informacin almacenada en el Registro se utiliza para restablecer las posiciones de los botones. Pasos para crear el programa de ejemplo 1. Inicie Visual Basic y seleccione EXE estndar. Si ya se ejecuta Visual Basic, haga clic en Nuevo proyecto en el men Archivo y seleccione EXE estndar. Se crear Form1 de manera predeterminada. 2. Elija Componentes en el men Proyecto. En Microsoft Visual Basic 5.0, agregue COMCTL32.OCX y RICHTX32.OCX. En Microsoft Visual Basic 6.0, agregue MSCOMCTL.OCX y RICHTX32.OCX. 3. Agregue a Form1 Barra de herramientas, enriquecer TextBox, ImageList y un control Common Dialog. 4. Copie el cdigo siguiente a la ventana de cdigo Form1:
Option Explicit ' SaveToolbar method constants. Const SaveToolbarKey = 1 Const SaveToolbarSubKey = "MyToolbar" Const SaveToolbarVal = "True" Private Sub Form_Load() ' Create object variable for the ImageList. Dim imgX As ListImage ' The following assumes that you checked the check box for "Graphics" ' when you installed VB. You can add the graphics by running ' VB setup again & checking the Graphics check box. ' Path to location of Windows95 toolbar bitmaps -VB5 ' Dim TlbrPath As String 'TlbrPath = "C:\Program Files\DevStudio\VB\Graphics" & _ "\Bitmaps\Tlbr_w95\" ' VB6 path

' If needed, change the drive and install directory for VB as ' needed. Dim TlbrPath As String TlbrPath = "Drive:\install directory\Graphics\Bitmaps" & _ "\Tlbr_w95\" Me.Caption = "Toolbar Demonstration" 112

'Load pictures for the Toolbar buttons into the ImageList 'control. Set imgX = ImageList1.ListImages. _ Add(, "open", LoadPicture(TlbrPath & "open.bmp")) Set imgX = ImageList1.ListImages. _ Add(, "save", LoadPicture(TlbrPath & "save.bmp")) Set imgX = ImageList1.ListImages. _ Add(, "left", LoadPicture(TlbrPath & "lft.bmp")) Set imgX = ImageList1.ListImages. _ Add(, "right", LoadPicture(TlbrPath & "rt.bmp")) Set imgX = ImageList1.ListImages. _ Add(, "center", LoadPicture(TlbrPath & "cnt.bmp")) Set imgX = ImageList1.ListImages. _ Add(, "justify", LoadPicture(TlbrPath & "jst.bmp")) Set imgX = ImageList1.ListImages. _ Add(, "bold", LoadPicture(TlbrPath & "bld.bmp")) Set imgX = ImageList1.ListImages. _ Add(, "italic", LoadPicture(TlbrPath & "Itl.bmp")) Set imgX = ImageList1.ListImages. _ Add(, "customize", LoadPicture(TlbrPath & "prop.bmp")) Set imgX = ImageList1.ListImages. _ Add(, "restore", LoadPicture(TlbrPath & "redo.bmp")) Toolbar1.ImageList = ImageList1 ' Create object variable for the Toolbar. Dim btnX As Button ' Add button objects to Buttons collection using the Add method. ' After creating the button, set the Description and ToolTipText ' properties. ' Create Open Button Set btnX = Toolbar1.Buttons.Add(, "open", , tbrDefault, _ "open") btnX.ToolTipText = "Open File" btnX.Description = btnX.ToolTipText ' Create Save Button Set btnX = Toolbar1.Buttons.Add(, "save", , tbrDefault, _ "save") btnX.ToolTipText = "Save File" btnX.Description = btnX.ToolTipText ' Add a Separator Set btnX = Toolbar1.Buttons.Add(, , , tbrSeparator) ' Create Paragraph Align Left button Set btnX = Toolbar1.Buttons.Add(, "left", , _ tbrButtonGroup, "left") btnX.ToolTipText = "Align Left" btnX.Description = btnX.ToolTipText ' Create Paragraph Align Center button Set btnX = Toolbar1.Buttons.Add(, "center", , _ tbrButtonGroup, "center") 113

btnX.ToolTipText = "Center" btnX.Description = btnX.ToolTipText ' Create Paragraph Align Right button Set btnX = Toolbar1.Buttons.Add(, "right", , _ tbrButtonGroup, "right") btnX.ToolTipText = "Align Right" btnX.Description = btnX.ToolTipText ' Add a Separator Set btnX = Toolbar1.Buttons.Add(, , , tbrSeparator) ' Create a Bold Button Set btnX = Toolbar1.Buttons.Add(, "bold", , tbrCheck, _ "bold") btnX.ToolTipText = "Bold" btnX.Description = btnX.ToolTipText ' Italic Button Set btnX = Toolbar1.Buttons.Add(, "italic", , tbrCheck, _ "italic") btnX.ToolTipText = "Italic" btnX.Description = btnX.ToolTipText ' Add a Separator Set btnX = Toolbar1.Buttons.Add(, , , tbrSeparator) ' Create a Customize Toolbar button Set btnX = Toolbar1.Buttons.Add(, "customize", , tbrCheck, _ "customize") btnX.ToolTipText = "Customize Toolbar" btnX.Description = btnX.ToolTipText ' Create a Restore Toolbar button Set btnX = Toolbar1.Buttons.Add(, "restore", , tbrCheck, _ "restore") btnX.ToolTipText = "Restore Toolbar" btnX.Description = btnX.ToolTipText With Toolbar1 .Wrappable = True ' Buttons can wrap. ' Prevent customization except by clicking Customize button. .AllowCustomize = False End With ' Configure commondialog1 for opening and saving files. With CommonDialog1 .DefaultExt = ".rtf" .Filter = "RTF Archivo (*.RTF)|*.RTF" End With ' Set margin of the RichTextBox to the width of the control. RichTextBox1.RightMargin = RichTextBox1.Width End Sub Private Sub richtextbox1_SelChange() ' When the insertion point changes, set the Toolbar buttons to ' reflect the attributes of the text where the cursor is located. ' Use the Select Case statement. The SelAlignment property ' returns either 0, 1, 2, or Null. Select Case RichTextBox1.SelAlignment Case Is = rtfLeft ' 0 Toolbar1.Buttons("left").Value = tbrPressed 114

Case Is = rtfRight '1 Toolbar1.Buttons("right").Value = tbrPressed Case Is = rtfCenter '2 Toolbar1.Buttons("center").Value = tbrPressed Case Else ' Null -- No buttons are shown in the up 'position. Toolbar1.Buttons("left").Value = tbrUnpressed Toolbar1.Buttons("right").Value = tbrUnpressed Toolbar1.Buttons("center").Value = tbrUnpressed End Select ' SelBold returns 0, -1, or Null. If it's Null, then set the ' MixedState property to True. Select Case RichTextBox1.SelBold Case 0 ' Not bold. Toolbar1.Buttons("bold").Value = tbrUnpressed Case -1 ' Bold. Toolbar1.Buttons("bold").Value = tbrPressed Case Else ' Mixed state. Toolbar1.Buttons("bold").MixedState = True End Select ' SelItalic returns 0, -1, or Null. If it's Null, then set the ' MixedState property to True. Select Case RichTextBox1.SelItalic Case 0 ' Not italic. Toolbar1.Buttons("italic").Value = tbrUnpressed Case -1 ' Italic. Toolbar1.Buttons("italic").Value = tbrPressed Case Else ' Mixed State. Toolbar1.Buttons("italic").MixedState = True End Select End Sub Private Sub toolbar1_ButtonClick(ByVal Button As Button) ' Use the Key property with the SelectCase statement to specify ' an action. Select Case Button.Key Case Is = "open" ' Open file. Dim strOpen As String ' String variable for file ' name. CommonDialog1.ShowOpen ' Show Open Archivo dialog box. strOpen = CommonDialog1.filename ' Set variable to ' filename. RichTextBox1.LoadFile strOpen, 0 ' Use LoadFile ' method. Case Is = "save" Dim strNewFile As String ' Save file. ' String variable for new ' Archivo name. CommonDialog1.ShowSave ' Show Save dialog box. strNewFile = CommonDialog1.filename ' Set variable to 'file name. RichTextBox1.SaveFile strNewFile, 0 ' Use SaveFile ' method. 115

Case Is = "left" RichTextBox1.SelAlignment = rtfLeft Case Is = "center" RichTextBox1.SelAlignment = rtfCenter Case Is = "right" RichTextBox1.SelAlignment = rtfRight Case Is = "bold" ' Test to see if the MixedState property is True. If so, ' then set it to False before doing anything else. If Button.MixedState = True Then Button.MixedState = False End If ' Toggle the SelBold property. RichTextBox1.SelBold = Abs(RichTextBox1.SelBold) - 1 Case Is = "italic" ' Test to see if the MixedState property is True. If so, ' then set it to False before doing anything else. If Button.MixedState = True Then Button.MixedState = False End If ' Toggle the SelItalic property. RichTextBox1.SelItalic = Abs(RichTextBox1.SelItalic) _ - 1 Case Is = "customize" ' Save the state of Toolbar1 in the registry before ' allowing further customization. With Toolbar1 .SaveToolbar SaveToolbarKey, SaveToolbarSubKey, _ SaveToolbarVal .AllowCustomize = True 'AllowCustomize must be True 'to change toolbar. .Customize 'Customize method invokes Customize 'Dialog box. .AllowCustomize = False 'After customization, set 'this to False. End With Case Is = "restore" ' Restore state of Toolbar1 using the information stored in ' the registry. Toolbar1.RestoreToolbar SaveToolbarKey, _ SaveToolbarSubKey, _ SaveToolbarVal End Select End Sub

116

8. BASES DE DATOS 8.1 Qu es una base de datos? Las bases de datos son ampliamente utilizadas por las aplicaciones de gestin de datos. Una base de datos es un conjunto ordenado de registros cuyos datos estn relacionados. Se encuentran bases de datos en los bancos, empresas de todo tipo, escuelas y muchas ms incluso nosotros disponemos de una agenda con los nombres, las direcciones, los telfonos y dems datos que pudiese almacenarse con respecto a una persona. Hay en el mercado varias aplicaciones que utilizan y gestionan bases de datos, quiz uno de los ms populares sea Microsoft Access. Sin embargo este tipo de bases de datos, si bien permiten realizar muchas tareas de administracin de base de datos, es muy abierto y no tiene especializacin, por lo que a menudo se elaboran programas que utilicen bases de datos para un fin especfico. Microsoft Access utiliza un motor de base de datos llamado Jet y se pueden crear en Visual Basic aplicaciones que utilicen este mismo motor para operar sobre bases de datos. Antes de comenzar a explicar cmo se accede desde Visual Basic a las bases de datos, se explicar cmo estn constituidas; en el caso de las bases de Access (*.mdb). Ya se mencion que una base de datos es un conjunto ordenado de registros cuyos datos estn relacionados. Estos conjuntos de registros se encuentran dentro de unos objetos llamados Tablas. Una base de datos puede contener una o ms tablas. Por ejemplo, supngase una base de datos que contiene informacin sobre una papelera (Negocio.mdb); dentro contiene algunas tablas donde se almacenan los artculos y operaciones de compra-venta que ocurre en el mismo: la tabla de nombre Artculos contiene la informacin sobre los artculos que se comercian; una tabla llamada Ventas con las distintas ventas efectuadas; otra llamada Compras con las compras que se realizan y otra de nombre Caja con las variaciones en los saldos de caja en virtud de las operaciones realizadas. Cada tabla est constituda por una serie de Registros y Campos. En la tabla siguiente se muestra la estructura de la tabla Artculos: Cdigo 15422 15423 15424 15500 15501 15502 Nombre Disquetes Storax 3 Disquetes Verbatim 3 Disquetes Imation 3 CD TDK 650 Mb CD TDK 700 Mb Block A4 CopyMax x 500 Precio $ 115.00 $ 120.00 $ 98.00 $ 6.50 $ 7.00 $ 103.00 Unidades 38 26 50 60 55 32

Cada registro (fila) contiene todos los datos acerca de un mismo elemento (en este caso un artculo) y cada columna un tipo de informacin sobre cada registro. En este caso, hay 6 registros, 6 artculos en los que se brinda su cdigo, su nombre, su precio y las unidades en stock que hay (de una forma similar a sta se ven en Access). Tambin se puede acceder a otras bases de datos como dBase o Paradox, e incluso a libros de Microsoft Excel, pero para ello se necesitar de un ISAM. En el caso de las bases de datos dBase y Paradox, la tabla es el fichero que contiene los datos (*.dbf y *.db respectivamente) y la base de datos es el directorio en el que se encuentran. Ahora, debe haber un modo para que Visual Basic pueda trabajar con Microsoft Jet: el motor de base de datos de Access; esto se realiza mediante una librera de objetos llamada Data Access Object o en forma abreviada, DAO.
117

Data Access Object. Esta es una librera de objetos de acceso a datos, utilizada por ejemplo, por el control Data. Si se quiere utilizar esta librera para acceder a bases de datos, debe ir al men Proyecto/Referencias; en la pantalla que aparece haga una referencia a una de las versiones de Dao (el control Data hace referencia a la 2.5/3.5 compatibily library). Al efectuar esta referencia y hacer clic en aceptar podr accederse a una nueva cantidad de objetos que permiten el acceso a las bases de datos. Si se desea conocerlos, basta con abrir el examinador de objetos y seleccionar en el cuadro combinado superior izquierdo la librera DAO. Ahora se explicarn algunos de los objetos de DAO. Database. Este objeto representa la base de datos: el fichero *.mdb en el caso de Access y el directorio en el que se encuentran los ficheros. Este objeto permite acceder a las propiedades de la base de datos y a las colecciones de objetos que tiene como Tablas, Recordsets y Consultas. Los objetos Database se crean mediante una funcin llamada OpenDatabase, la cual devuelve un objeto Database; cuya forma general es la siguiente: OpenDatabase(Nombre,[Opciones],[Slectura],[Conex]) Donde Nombre es una cadena de caracteres con la ruta y nombre de la base de datos que se abrir: Opciones es un tipo Variant que indica si se abrir de modo compartido (False, Predeterminado) o en modo exclusivo (True) de forma que otros usuarios no puedan abrir la base de datos; Slectura es un tipo Variant que especifica si se abrir como de solo lectura (True) o como lectura/escritura (False, Predeterminado); Conex es una cadena de caracteres con informacin variada sobre la conexin, incluyendo la contrasea. Tambin puede crear una base de datos con la funcin CreateDatabase, cuya forma general es la siguiente: CreateDatabase(Nombre,Escenario,[Opciones]) Donde Nombre es una cadena de caracteres con la ruta y nombre de la nueva base de datos; Escenario es una constante que especifica la ordenacin, utilice por ejemplo la constante dbLangSpanish, tambin puede especificar una contrasea si se utiliza la siguiente expresin en el argumento escenario: dbLangSpanish &;pwd=NuevaContrasea
118

Figura 8.1 Librera de objetos de acceso a datos.

Si se omite la constante se utiliza el escenario predeterminado; Opciones es un argumento opcional y permite especificar la versin del formato de base de datos, si se omite se utilizar el valor predeterminado dbVersion30. Este objeto se crea como ya se vi en el captulo Error! No se encuentra el origen de la referencia. Luego se dispone de una serie de propiedades; algunas de ellas son: Connect: proporciona informacin acerca de la conexin. Name: es una cadena de caracteres con el nombre de la base de datos. Version: devuelve la versin de Microsoft Jet que cre la base de datos *.mdb Este objeto dispone de colecciones de objetos que representan tablas, recordsets, etc.: QueryDefs: esta coleccin contiene todos los objetos QueryDef (consultas) existentes en una base de datos. Recordsets: esta coleccin contiene todos los objetos Recordset abiertos en la base de datos. TableDefs: esta coleccin contiene todos los objetos TableDef (tablas) existentes en la base de datos. Tambin tiene funciones para crear objetos y mtodos: Close: cierra la base de datos. NewPassword(anterior,actual): cambia la contrasea anterior por la actual, si desea borrar la contrasea d al argumento actual cadena vaca(). La funcin OpenRecordset abre un nuevo recordset y devuelve una referencia a l: devuelve un objeto Recordset. La forma general de esta funcin es la siguiente: DB.OpenRecordset(Origen,[Tipo],[Opciones],[Bloq])

Donde DB es una base de datos abierta; Origen es una cadena de caracteres el nombre de una tabla o consulta o una instruccin SQL; Tipo define el tipo de apertura del recordset (dbOpenTable, dbOpenDynamic, dbOpenDynaset por defecto , dbOpenSnapshot y dbOpenForwardOnly); el argumento Opciones consta de una serie de constantes que especifican el acceso al Recordset, por ejemplo, la constante dbSeeChanges genera un error si un usuario est cambiando los datos que se estn modificando; el argumento Bloq tambin consiste en una serie de constantes, por ejemplo, la constante dbReadOnly previene que los usuarios hagan cambios en el recordset. Otra funcin es la funcin es la funcin CreateTableDef la que crea un nuevo objeto TableDef y hace una referencia a l; su forma general es la siguiente: DB.CreateTableDef(Nombre,Atributos,Origen,Conectar) Donde DB es una base de datos abierta; Nombre es una cadena de caracteres con el nombre del campo; Atributos es una constante o conjunto de constantes que indican caractersticas del objeto TableDef; Origen es una cadena de caracteres que contiene el nombre de una tabla de una base de datos externa que es el origen de los datos; Conectar es una cadena de caracteres que contiene informacin acerca del origen de una base de datos abierta, una base de datos utilizada en una consulta de paso a travs o en una tabla adjunta. Recordset. Este objeto representa un conjunto de registros contenidos en una tabla o consulta. Mediante este objeto se agregan, consultan, eliminan y editan los registros y por lo tanto es uno de los ms utilizados. Puede crearse con los objetos Database, Connection, QueryDef, Recordset y TableDef. Los Recordset tienen las siguientes propiedades:
119

AbsolutePosition: la propiedad AbsolutePosition le permite situar el puntero del registro activo en un registro especfico basado en su posicin ordinal en un objeto Recordset de tipo Dynaset o Snapshot. Tambin puede determinar el nmero del registro activo examinando el valor de la propiedad AbsolutePosition. El primer registro tendr por valor 0. BOF: es una propiedad de tipo Boolean que indica si el registro activo es anterior al primer registro del Recordset. EOF: es una propiedad de tipo Boolean que indica si el registro activo es posterior al ltimo registro del Recordset. Name: es una cadena de caracteres con el nombre del Recordset. NoMatch: devuelve un valor de tipo Boolean que indica si un registro particular se encontr utilizando el mtodo Seek o uno de los mtodos Find (False) o no (True). RecordCount: devuelve un entero de tipo Long que especifica a cuntos registros se ha accedido; si se lleg al ltimo registro devuelve el total de registros contenidos en el Recordset. AddNew: aade un nuevo registro. Seguido de esta sentencia establezca los valores de los distintos campos y luego utilice el mtodo UpDate para actualizar los datos o CancelUpdate para cancelar. CancelUpdate: cancela las modificaciones producidas por los mtodos AddNew y Edit. Close: cierra el recordset abierto. Delete: elimina el registro actual. Edit: permite modificar el registro actual. Luego habr que utilizar el mtodo UpDate para actualizar los datos o CancelUpdate para cancelar. FindFirst,FindNext,FindLast,FindPrevious(Criteria): buscan el primero, ltimo, siguiente o anterior registro de un objeto Recordset de tipo Dynaset o Snapshot que cumpla el criterio especificado y lo convierte en el registro activo. Criteria es una cadena de caracteres con la condicin de bsqueda. MoveFirst,MoveNext,MoveLast,MovePrevious: mueven al registro primero, ltimo, siguiente o anterior de un objeto Recordset y lo convierten en el registro activo. Update: actualiza las modificaciones producidas por AddNew o Edit.

Este objeto tiene tambin sus mtodos; son los siguientes:

Tambin posee una coleccin muy til llamada Fields que contiene todos los objetos Field (Campo) del Recordset. Este objeto (Field) permite acceder a los valores de cada campo del registro activo, as como concer su nombre, el tipo de datos que almacena, etc. Sin embargo, los valores de los campos tambin se pueden obtener el valor de un campo si al nombre del campo le antecede el carcter !. Los Recordsets, en su creacin pueden ser de tipo Snapshot (dbOpenSnapshot), tipo Table (dbOpenTable) o tipo Dynaset (dbOpenDynaset). Los Recordsets de tipo Snapshot admiten los mtodos Find, pero no los mtodos AddNew, Delete, Edit y por consiguiente Update y CancelUpdate; los de tipo Table admiten los mtodos AddNew, Delete, Edit y por consiguiente Update y CancelUpdate pero no los mtodos Find y los de tipo Dynaset admiten todos los mtodos. Field. Este objeto representa un campo. Este objeto est presente en los objetos Recordset, TableDef y QueryDef. Este objeto dispone de las siguientes propiedades:
120

AllowZeroLength: indica si una cadena de longitud cero es un valor vlido cuando el campo almacena datos de texto o memo. DefaultValue: establece o devuelve el valor predeterminado de un objeto Field. Para un objeto Field no agregado an a la coleccin Fields, esta propiedad es de lectura/escritura. Name: devuelve una cadena de caracteres con el nombre del campo. Type: establece o devuelve un valor que indica el tipo operacional o el tipo de datos de un objeto Field. Value: es el valor que contiene el campo. Es un tipo Variant que luego se evala en funcin de la propiedad Type.

TableDef. Este objeto representa una tabla contenida en la base de datos (objeto Database). Para manipular una definicin de tabla, utilice un objeto TableDef y sus mtodos y propiedades. Se pueden crear recordsets, aadir y eliminar campos, etc. Este objeto puede crearse mediante las siguientes funciones: BD.CreateTableDef (Nombre, [Atrib], [Origen]) Donde BD es la base de datos en donde se crear la tabla; Nombre es una cadena de caracteres con el nombre de la tabla; Atrib: opcional, son los atributos y estn constituidos por una serie de constantes; Origen: opcional, es una cadena de caracteres que contiene el nombre de una tabla de una base de datos externa que es origen de la nueva tabla. Algunas propiedades importantes de este objeto son: Name: es el nombre de la tabla. RecordCount: devuelve el nmero total de registros en la tabla.

Una coleccin importante del objeto TableDef es la coleccin Fields, que contiene todos los campos de la tabla en cuestin. Mediante esta coleccin pueden agregarse, modificarse y eliminarse campos de la tabla. La funcin CreateField permite agregar campos a la tabla. La forma general es la siguiente: Tdf.CreateField(Nombre,Tipo,Tamao) Donde Nombre es el nombre del campo, Tipo es el tipo de dato que almacenar el campo y Tamao es el tamao en bytes que podr almacenarse en caso de almacenarse texto. Los tipos que admite el argumento Tipo estn contenidos en una enumeracin llamada DataTypeEnum. VisData. VisData es un complemento que viene con Visual Basic y sirve para crear y acceder a bases de datos, no solamente de Access sino tambin a otras como dBase o Paradox. Para iniciar este complemento dirjase al men Complementos, Administrador Visual de Datos. La pantalla presenta en el men Archivo las rdenes para crear una nueva base de datos as como para abrir una existente. En el pnel de la izquierda se puede observar las propiedades de la base de datos y las tablas y consultas que la componen. En su men contextual figura los comandos para crear y editar tablas y consultas.
121

Tambin puede abrirse la base de datos para ingresar registros, eliminarlos, eidtarlos y realizar bsquedas desde el men contextual de la tabla seleccionada. En el cuadro de la derecha se escriben instrucciones SQL para operar sobre la base de datos que se trabaja. La forma de utilizacin es muy sencilla, pero si presenta dificultades puede utilizar otro software de gestin de bases de datos como Microsoft Access. Ejemplo. Ahora se ejemplificar cmo se accede a una base de datos utilizando los objetos DAO. Asegrese antes de haber hecho una referencia a DAO desde el men Proyecto, Referencias. El primer procedimiento crear una base de datos llamada Dbase.mdb en el directorio C:\Windows\Temp\Afx y luego le crear una tabla llamada Articulos la cual contendr los campos Codigo, Nombre, Precio y Stock.
Option Explicit Dim db As Database Private Sub Command1_Click() Dim Tf As TableDef Set Tf = db.CreateTableDef("Articulos") With Tf .Fields.Append .CreateField("Codigo", dbInteger) .Fields.Append .CreateField("Nombre", dbText) .Fields.Append .CreateField("Precio", dbCurrency) .Fields.Append .CreateField("Stock", dbInteger) End With db.TableDefs.Append Tf aade la tabla a la base End Sub
Figura 8.2. Complemento VisData

Ahora, este procedimiento crea un objeto Recordset de tipo Table en el cual se agregar un registro, los valores son especificados por las entradas proporcionadas por la funcin InputBox. Dentro del bloque With puede accederse a los valores de cada campo mediante su nombre precedido del carcter !.
Private Sub IngresarRegistro() Dim Rst As Recordset Dim C1 As Integer,C2 As String,C3 As Currency Dim C4 As Integer Set Rst=db.OpenRecordset(Articulos,dbOpenTable) C1=CInt(InputBox(Ingrese el cdigo numrico)) C2=InputBox(Ingrese el nombre del artculo) C3=CCur(InputBox(Ingrese el precio del artculo)) C4=CInt(InputBox(Ingrese el stock del artculo))
122

With Rst .AddNew !Codigo=C1:!Nombre=C2:!Precio=C3:!Stock=C4 .Update .Close End With End Sub

En este procedimiento se recorrer un Recordset de la tabla creada al principio y se colocar en un cuadro de lista (List1) los registros recuperados.
Private Sub Recuperar() Dim Rst As Recordset,Texto As String el valor 4 es el valor de la constante dbOpenSnapshot Set Rst=db.OpenRecordset(Articulos,4) With Rst While Not .EOF Texto=Str(!Codigo) & - & !Nombre & - Texto=Texto & Str(!Precio) & & Str(!Stock) List1.AddItem Texto:.MoveNext Wend .Close End With End Sub

Ahora se utilizar el mtodo Find para encontrar datos en un registro. Los dos procedimientos utilizan el mtodo Find, uno para buscar datos numricos y el otro para buscar texto, ambos pasados por argumento.
Private Sub BuscarCdigo(Num As Integer) Dim Rs As Recordset Set Rs=db.OpenRecordset(Articulos,4) With Rs .FindFirst(Codigo=& Num) If .NoMatch Then MsgBox No se encontr ningn cdigo & Num Else:MsgBox El artculo es & !Nombre End If .Close End With End Sub Private Sub BuscarNombre(Nom As String) Dim Rs As Recordset Set Rs=db.OpenRecordset(Articulos,4) With Rs .FindFirst(Nombre=& Nom &) If .NoMatch Then MsgBox No se encontr ningn artculo & Nom Else:MsgBox Artculo nmero &!Codigo End If .Close End With End Sub

123

8.2 Controles utilizados en Bdatos (Control Data, Controles enlazados, Propiedades del control Dbgrid) Uso del control Data. En Visual Basic puede utilizar el control Data para crear aplicaciones de bases de datos para una gran variedad de formatos de base de datos. El control Data interacta con el motor de base de datos Microsoft Jet y permite crear aplicaciones preparadas para datos con la mnima cantidad de cdigo posible. Uso del Motor de Base de Datos Microsoft Jet. Los objetos de acceso a datos Data Access Objects (DAO) y el control Data usan el motor de base de datos Microsoft Jet para acceder a bases de datos. El motor de base de datos Jet puede acceder a los siguientes 3 tipos de bases de datos. Bases de datos Jet. Estas bases de datos son creadas y manipuladas directamente por el motor Jet. Microsoft Access y Visual Basic emplean el mismo motor de base de datos Jet. Bases de datos de Mtodo de Acceso Secuencial Indexado (ISAM). Los formatos de estas bases de datos incluyen Btrieve, dBase, Microsoft Visual FoxPro, y Paradox. Bases de datos compatibles con ODBC (Open DataBase Connectivity - Conectividad Abierta de Base de Datos). Estas bases de datos incluyen las bases de datos cliente/servidor que conforman el estndar ODBC, tal como Microsoft SQL Server. La mayora de bases de datos que soportan ODBC pueden ser accedidas empleando Visual Basic.

Otros mtodos de Acceso a Datos. Los otros mtodos de acceso a datos soportados por Visual Basic incluyen: El control Origen de Datos Remoto (Remote Data Source). Este es un control que emplea ODBC para acceder a bases de datos ODBC tales como Microsoft SQL Server y Oracle. El control Origen de Datos Remoto slo est disponible en la edicin Empresarial de Visual Basic. Libreras ODBC. Estas libreras permiten que se llame a la interface de programacin de aplicaciones (API) de ODBC directamente y estn disponibles como un producto separado. Libreras SQL de Visual Basic. Estas libreras proporcionan un enlace directo a Microsoft SQL Server, y estn disponibles como un producto separado.

Tener Acceso a Datos con el Control Data El control Data implementa el acceso a datos mediante el motor de base de datos Microsoft Jet. Esta tecnologa proporciona acceso a muchos formatos de base de datos y permite crear aplicaciones que manejan datos sin necesidad de escribir cdigo. Para crear una aplicacin de base de datos que emplee el control Data, se siguen los siguientes pasos: Aadir el control Data al formulario y establecer las propiedades para especificar la base de datos y la tabla desde la cual se obtendrn los datos. Aadir controles enlazados a datos al formulario, y establecer las propiedades para enlazar los controles al control Data para que los datos puedan ser mostrados.

124

Uso de Controles Enlazados a Datos Cuando un control que ha colocado en un formulario se enlaza a datos, se muestran automticamente los datos de la base de datos en el control enlazado. Si un usuario cambia los datos de un control enlazado, dichos cambios se actualizarn automticamente en la base de datos en cuanto el usuario se desplace a otro registro. Muchos controles intrnsecos o estndar de Figura 8.3 Control Data y dos controles enlazados. Visual Basic permiten ser enlazados a datos, como es el caso de los controles CheckBox, Image, Label, PictureBox, TextBox, ListBox, ComboBox y los contenedores OLE. La Figura 8.3 es un ejemplo de un formulario que contiene un control Data y dos controles enlazados. Establecer las Propiedades del Control Data Los siguientes pasos describen como conectar un control Data a una base de datos. 1. Especificar las base de datos a la cual se quiere acceder estableciendo la propiedad DatabaseName al nombre de la base de datos. 2. Para especificar que registros recuperar, establecer la propiedad RecordSource al nombre de la tabla dentro de la base de datos, o a una cadena SQL. Nota: Para acceder a una base de datos dBase, Paradox, o Btrieve, se debe establecer la propiedad DatabaseName a la carpeta que contiene los archivos de la base de datos, y la propiedad Connect al tipo apropiado de base de datos. Enlazar Controles Despus de establecer los valores de las propiedades para el control Data, es necesario enlazar al control Data controles individuales y despus especificar qu campo de la tabla mostrar cada control. En tiempo de diseo, establecer la propiedad DataSource del control enlazado a datos al control Data. En tiempo de diseo o en tiempo de ejecucin, especificar que campo se desea mostrar en el control enlazado estableciendo la propiedad DataField. La propiedad DataField puede ser establecida en tiempo de diseo o en tiempo de ejecucin. Usar las Propiedades y Mtodos del Control Data Para especificar los datos que se desean recuperar, se debe establecer las propiedades DatabaseName y RecordSource de un control Data. Adems, se pueden establecer las siguientes propiedades y mtodos.

125

La Propiedad Connect. Esta propiedad especifica el tipo de base de datos a abrir. Puede incluir argumentos tales como un nombre de usuario (user ID) y una contrasea. La Propiedad Exclusive. La propiedad Exclusive determina si se tiene o no un uso exclusivo de la base de datos. Si esta propiedad se establece a True, y luego se abre sin problemas la base de datos, ninguna otra aplicacin podr abrirla hasta que sea cerrada. La Propiedad ReadOnly. Esta propiedad determina si se puede o no actualizar o grabar cambios en la base de datos. Si no se tiene planeado hacer cambios en la base de datos, es ms eficiente establecer la propiedad ReadOnly a True. La Propiedad Recordset. La propiedad Recordset es un objeto que contiene el conjunto de registros devueltos por el control Data. Esta propiedad contiene a su vez propiedades y mtodos que pueden ser usados para trabajar con los registros devueltos. Las Propiedades BOFAction y EOFAction. Estas propiedades determinan que accin tomar el control Data cuando las propiedades BOF o EOF del recordset tomen como valor True. Por ejemplo, si la propiedad EOFAction del control Data es establecida a vbActionAddNew, y se emplea el control Data para desplazarse, una vez que se pase el ltimo registro, el control Data automticamente ejecutar el mtodo AddNew de modo que se pueda aadir un nuevo registro. 8.3 Gestin de Bdatos mediante cdigo (Movimientos, Bsquedas, Agregar registros, Modificar registros, Eliminar registros, Mtodos Refresh) Si utiliza cdigo para cambiar la posicin del registro actual, debe comprobar las propiedades EOF y BOF del objeto Recordset para determinar el inicio y el final del mismo. Cuando se desplace al registro EOF o al BOF, se ejecutar la accin indicada por el valor de la propiedad BOFAction o EOFAction. Por ejemplo, se puede establecer la propiedad EOFAction para aadir un nuevo registro automticamente. Si se establece la propiedad EOFAction a EOF, ninguna accin ser tomada cuando se desplace al registro EOF. Cuando se desplace pasando un registro los Figura 8.4. BOF y EOF limitan a RecordSet registros BOF o EOF, se producir un error en tiempo de ejecucin. En la Figura 8.4 se muestra cmo las propiedades BOF y EOF determinan los lmites del objeto Recordset. Para emplear el objeto Recordset de un control Data determinado, se debe especificar la propiedad Recordset del control Data, como se muestra en el siguiente cdigo:
Data1.Recordset.MoveNext 'Mueve el registro actual al siguiente If Data1.Recordset.EOF Then Data1.Recordset.MoveLast

Uso de las Propiedades y Mtodos de un Recordset Utilice los mtodos y las propiedades del objeto Recordset para recuperar informacin del conjunto de registros, desplazarse por los registros y agregar, actualizar o eliminar registros.

126

Las Propiedades BOF y EOF Las propiedades BOF y EOF del objeto Recordset indican si la posicin del registro actual es antes del primer registro o despus del ltimo registro dentro del conjunto de registros. Si no hay registros en el recordset, entonces el valor de las propiedades BOF y EOF es True. El Mtodo AddNew del Recordset Para agregar un nuevo registro a un recordset, se emplea el mtodo AddNew. Cuando se ejecuta el mtodo AddNew, Visual Basic limpia los controles enlazados y establece la propiedad EditMode del control Data a dbEditAdd. El nuevo registro no ser aadido a la base de datos hasta que sea ejecutado explcitamente un mtodo UpdateRecord o Update, o hasta que el usuario se mueva a otro registro. El siguiente cdigo muestra como agregar un nuevo registro a un recordset:
Private Sub cmdAgregar_Click() Data1.Recordset.AddNew

El Mtodo UpdateRecord del Control Data El mtodo UpdateRecord se emplea para grabar el registro actual a una base de datos. El siguiente cdigo muestra como grabar el registro actual y actualizar la base de datos:
Private Sub cmdGrabar_Click() Data1.UpdateRecord

El Mtodo CancelUpdate del Control Data El mtodo CancelUpdate se emplea para cancelar un mtodo AddNew o Edit y renovar o refrescar los controles enlazados con datos del recordset. Por ejemplo, si un usuario ha modificado los campos de un formulario, pero todava no los ha actualizado, el mtodo CancelUpdate refrescar los campos con los datos originales del recordset. Si un usuario selecciona un botn Agregar de un formulario, y luego decide no agregar el registro, el mtodo CancelUpdate cancelar la operacin y visualizar el registro actual. El siguiente cdigo muestra como cancelar la agregacin o edicin de un registro:
Private Sub cmdCancelar_Click() Data1.CancelUpdate

El Mtodo Delete del Recordset Para eliminar un registro de una base de datos, se emplea el mtodo Delete. El registro eliminado permanecer como el registro actual hasta que el usuario se mueva a un registro diferente, como se muestra en el siguiente cdigo. Nota: La base de datos Neptuno tiene definidas reglas de integridad referencial que impiden eliminar registros relacionados.
Private Sub cmdEliminar_Click() Data1.Recordset.Delete Data1.Recordset.MoveNext If Data1.Recordset.EOF Then Data1.Recordset.MoveLast End If End Sub

Uso del Asistente para Formularios de Datos El Asistente para Formularios de Datos es una utilidad de Visual Basic que genera formularios de datos simples que emplean el control Data. Se puede emplear el Asistente para Formularios de Datos para construir rpidamente formularios para una aplicacin de base de datos. Para cargar el
127

Asistente para Formularios de Datos, se emplea la orden Administrador de Complementos del men Complementos. Uso de los Eventos del Control Data El control Data proporciona tres eventos que puede utilizar para mejorar la aplicacin de base de datos: Validate, Error y Reposition. Dichos eventos permiten omitir parte del comportamiento predeterminado del control Data. Usar el Evento Validate Utilice el evento Validate para comprobar los datos antes de guardar un registro en la base de datos. Este evento se produce justo antes de que Visual Basic escriba en la base de datos los cambios procedentes de los controles enlazados y de que vuelva a colocar el puntero del registro actual en otro registro de la base de datos. Puede utilizar el evento Validate para pedir al usuario que confirme los cambios realizados. El evento Validate tiene la siguiente sintaxis:
Private Sub Data1_Validate (index As Integer, action As Integer, save As Integer)

El Argumento Action El argumento action indica la operacin que provoc el evento Validate. El evento Validate se produce como resultado de realizar las operaciones siguientes: MoveFirst, MovePrevious, MoveNext, MoveLast AddNew Update Delete Find Establecer la propiedad Bookmark Cerrar la base de datos Descargar el formulario

Para cancelar cualquiera de estas acciones, asigne al argumento action el valor vbDataActionCancel. El Argumento Save El argumento save indica si va a guardarse o no el registro. Si save es True, los datos enlazados han cambiado. Para cancelar la accin de guardar puede asignar a save el valor False. El siguiente cdigo pide al usuario que confirme los cambios hechos a la base de datos. Si el usuario responde No, los cambios sern cancelados.
Private Sub Data1_Validate (Action As Integer, Save As Integer) Dim iRespuesta as Integer If Save = True Then iRespuesta = MsgBox ("Desea guardar los cambios?" , vbYesNo) If iRespuesta = vbNo Then Save = False Data1.UpdateControls 'Actualiza los campos End If End If End Sub

128

Usar el Evento Reposition Utilice el evento Reposition para modificar la apariencia de un formulario o realizar una accin necesaria cuando se desplace a un nuevo registro. Este evento tiene lugar cuando Visual Basic desplaza el puntero del registro actual a otro registro de la base de datos. Tambin se produce la primera vez que se abre la base de datos. Modificar la apariencia de un formulario Para cambiar la manera en que un formulario muestra informacin basndose en el registro seleccionado en ese momento hay que utilizar el evento Reposition. Por ejemplo, puede modificar el ttulo del control Data de forma que se muestre el registro nmero n. Para ver el nmero del registro actual, utilice la propiedad AbsolutePosition del objeto Recordset. El nmero de registro es relativo a cero, por lo que el primer registro es el 0. El siguiente cdigo muestra como visualizar el nmero del registro actual:
Private Sub Data1_Reposition() Data1.Caption = "Registro N" & Data1.Recordset.AbsolutePosition + 1 End Sub

Tratar los cambios al desplazarse a un nuevo registro Cuando un usuario se desplaza a un nuevo registro mediante el control Data, puede que los datos del formulario tengan que presentarse de una forma distinta en el caso del nuevo registro. Por ejemplo, es posible que en un formulario que muestre registros de empleados haya distintas opciones Figura 8.5 Formulario que muestra el evento Reposition dependiendo de s los empleados son fijos, temporales o si trabajan por horas. Cada registro mostrar la informacin sobre un empleado distinto, cuyas opciones pueden no ser las mismas para todos los registros. Para que se seleccione la opcin correcta para cada registro, escriba cdigo en el evento Reposition. El cdigo siguiente utiliza el evento Reposition para modificar la apariencia de un formulario. La Figura 8.5 muestra el formulario basado ste cdigo.
Private Sub Data1_Reposition() Data1.Caption=Data1.Recordset.AbsolutePosition If Data1.Recordset("IdEmpleado") > 5 Then optSenior.Value = True Else optJunior.Value = True End If Data1.Caption = "Registro N" & Data1.Recordset.AbsolutePosition + 1 End Sub

Usar el Evento Error El evento Error tiene lugar cuando un usuario interacta con el control Data y se produce un error de acceso a datos. Utilice el evento Error para agregar tratamiento de errores personalizado al control Data. Por ejemplo, si un usuario modifica un campo y despus hace clic en el control Data para desplazarse al siguiente registro, el control Data actualizar el registro actual. Si se produce un error de acceso a datos durante la actualizacin, se producir el evento Error.
129

Los valores de los campos enlazados no cambian tras producirse un error. El usuario puede corregir los valores y hacer clic en el control Data para tratar de actualizar nuevamente el registro. Mostrar un mensaje de error personalizado Si no coloca cdigo para tratar errores en el evento Error y se produce un error cuando un usuario interacta con el control Data, Visual Basic muestra el mensaje de error y el programa contina ejecutndose. Si no desea que se muestre el mensaje de error estndar, puede asignar al argumento Response el valor 0 y mostrar un mensaje de error personalizado como se muestra en el siguiente cdigo.
Private Sub Data1_Error (DataErr As Integer, Response As Integer) If DataErr = 3022 Then 'Error de clave principal duplicada MsgBox "Ingrese un Id de Empleado nico" txtIdEmp.SetFocus Response = 0 Else Response = 1 'Muestra el mensaje de error estndar End If End Sub

Uso de Controles Enlazados a Datos ActiveX Adems de los controles enlazados intrnsecos, Visual Basic ofrece varios controles ActiveX enlazados a datos. En esta parte del curso se describen algunos controles ActiveX enlazados a datos avanzados. Usar el Control DBGrid El control de cuadrcula enlazada a datos (control DBGrid) permite que los usuarios de su aplicacin de base de datos trabajen con varios registros a la vez. Mostrar mltiples registros DBGrid es un control ActiveX que muestra una serie de filas y columnas que representan registros y campos de un objeto Recordset. Cuando asigne a la propiedad DataSource del control DBGrid un control Data, el control DBGrid se llenar automticamente de datos y se establecern automticamente sus Figura 8.6 Formulario que muestra mltiples registros. encabezados de columna a partir del conjunto de registros del control Data. Al contrario que la mayora de los controles enlazados a datos, el control DBGrid le permite ver y modificar varios registros simultneamente. En la siguiente ilustracin se muestra un formulario que utiliza un control DBGrid para presentar registros procedentes de la base de datos Neptuno.

130

Para aadir el control DBGrid a un proyecto Hacer clic en la orden Componentes del men Proyecto. En la ficha Controles, seleccionar Microsoft Data Bound Grid Control, y luego clic en Aceptar. El control DBGrid tiene varias propiedades que especifican cmo se comporta el control. Por ejemplo, si asigna a la propiedad AllowUpdate el valor True, un usuario puede modificar los datos del control. Tambin puede establecer propiedades para columnas individuales del control DBGrid. Puede cambiar el ttulo de la columna, cambiar el campo de datos al que se enlaza la columna, agregar valores predeterminados, etc. 1. 2. 3. 4. Para establecer propiedades de columnas Oprima el botn secundario del ratn sobre el control DBGrid. Haga clic en la orden Propiedades. Haga clic en Columnas.

Para establecer los encabezados de las columnas del control DBGrid, luego de haberlo enlazado a un control Data, oprima el botn secundario del ratn sobre el control en tiempo de diseo, y luego haga clic en la orden Recuperar campos. Obtener y establecer el texto de la celda actual Utilice la coleccin Columns del control DBGrid para recuperar el texto de la celda seleccionada actualmente en tiempo de ejecucin. Por ejemplo:
MsgBox DBGrid1.Columns(DBGrid1.Col).Text

Para cambiar la informacin del control DBGrid, cambie el objeto Recordset asociado. Por ejemplo, si el control DBGrid est enlazado al recordset Data1, se ejecutara el siguiente cdigo: Data1.Recordset.Edit Data1.Recordset.Fields("NombreProducto") = "Disco duro" Data1.Recordset.Update Usar el evento BeforeUpdate El evento BeforeUpdate tiene lugar antes de que se muevan datos desde un control DBGrid al bfer de copia del control Data. Puede validar los datos y cancelar la actualizacin si es necesario. Usar el Control MSFlexGrid El control MSFlexGrid proporciona caractersticas avanzadas para la presentacin de datos en una cuadrcula. Es similar al control DBGrid aunque, cuando se enlaza a un control Data, el control MSFlexGrid muestra datos de slo lectura. Puede utilizar el control MSFlexGrid para combinar filas o columnas de informacin y as agrupar la informacin relacionada. En la siguiente ilustracin se muestran registros agrupados por Id. de pedido en la tabla Detalles de pedidos.

Figura 8.7 Control MSFlexGrid

131

Para combinar celdas Establezca la propiedad MergeCells a un valor diferente a cero. Establezca las propiedades arreglo MergeRow() y MergeCol() a True para las filas y columnas que desee combinar.

Por ejemplo, para combinar las celdas en la tabla Detalles de pedidos, aada el siguiente cdigo al formulario donde se encuentra el control MSFlexGrid. Private Sub Form_Load() MSFlexGrid1.MergeCells = flexMergeFree MSFlexGrid1.MergeCol(0) = True End Sub Usar el Control DBCombo Puede utilizar el control de cuadro de lista enlazado a datos (DBList) o el cuadro combinado enlazado a datos (DBCombo) para presentar automticamente una lista de valores de un Recordset. Esto resulta til para proporcionar valores vlidos al usuario. Obtener informacin de una tabla de bsqueda Tambin puede utilizar estos controles en aplicaciones de "tabla de bsqueda". Por ejemplo, puede presentar una lista de nombres de categora vlidos (en vez de Id.) y utilizar el Id. correspondiente cuando el usuario agregue o modifique datos. La Figura 8.8 muestra un formulario que utiliza el control DBCombo para presentar nombres de categoras de la tabla Productos.

Figura 8.8 Uso del Control DBCombo

Establecer propiedades del control DBCombo Para determinar el valor que se presenta en el control DBCombo, asigne a la propiedad RowSource un nombre de control Data y a la propiedad ListField un nombre de campo. El cuadro combinado enlazado a datos contiene todos los valores de ese campo. Para determinar qu campo de la base de datos se actualiza cuando un usuario cambia un valor, establezca las propiedades DataSource y DataField. Para establecer la relacin entre la tabla que contiene los valores de bsqueda y la tabla que se est modificando realmente, establezca la propiedad BoundColumn. El Mtodo Refresh El mtodo Refresh renueva el objeto Recordset. Si se cambia la propiedad RecordSource en tiempo de ejecucin, se debe invocar al mtodo Refresh para renovar el recordset. El siguiente cdigo muestra como emplear el mtodo Refresh.
Data1.RecordSource = "SELECT * FROM Empleados " & _ "WHERE [IdEmpleado] = " & txtIdEmp.Text Data1.Refresh
132

ANEXO A: CONSIDERACIONES ADICIONALES SOBRE DATOS Y VARIABLES En este Anexo se incluyen algunas consideraciones de inters para personas que no han programado antes en otros lenguajes. A continuacin se explican las posibilidades y la forma de almacenar los distintos tipos de variables. CARACTERES Y CDIGO ASCII Las variables string (cadenas de caracteres) contienen un conjunto de caracteres que se almacenan en bytes de memoria. Cada carcter es almacenado en un byte (8 bits). En un bit se
2

pueden almacenar dos valores (0 y 1); con dos bits se pueden almacenar 2 = 4 valores (00, 01, 10,
8

11 en binario; 0, 1 2, 3 en decimal). Con 8 bits se podrn almacenar 2 = 256 valores diferentes (normalmente entre 0 y 255; con ciertos compiladores entre -128 y 127). En realidad, cada letra se guarda en un solo byte como un nmero entero, el correspondiente a esa letra en el cdigo ASCII (una correspondencia entre nmeros enteros y caracteres, ampliamente utilizada en informtica), que se muestra en la Tabla A1 para los caracteres estndar (existe un cdigo ASCII extendido que utiliza los 256 valores y que contiene caracteres especiales y caracteres especficos de los alfabetos de diversos pases, como por ejemplo las vocales acentuadas y la letra para el castellano). 0 1 2 3 4 5 6 7 8 9 10 11 12 0 nul nl dc4 rs ( 2 < F P Z d n x 1 soh vt nak us ) 3 = G Q [ e o y 2 stx np syn sp * 4 > H R \ f p z 3 etx cr etb ! + 5 ? I S ] g q { 4 eot so can , 6 @ J T ^ h r | 5 enq si em # 7 A K U _ i s } 6 ack dle sub $ . 8 B L V ` j t ~ 7 bel dc1 esc % / 9 C M W a k u del 8 bs dc2 fs & 0 : D N X b l v 9 ht dc3 gs 1 ; E O Y c m w

Tabla A1. Cdigo ASCII estndar. Ejemplo: El caracter A est en la fila 6 y la columna 5, por lo tanto el cdigo en decimal es igual a 65

Esta tabla se utiliza de la siguiente forma. La primera cifra (las dos primeras cifras, en el caso de los nmeros mayores o iguales que 100) del nmero ASCII correspondiente a un carcter determinado figura en la primera columna de la Tabla A1, y la ltima cifra en la primera fila de dicha Tabla. Sabiendo la fila y la columna en la que est un determinado carcter puede componerse el nmero ASCII correspondiente. Por ejemplo, la letra A est en la fila 6 y la columna 5. Su nmero ASCII es por tanto el 65. El carcter % est en la fila 3 y la columna 7, por lo que su representacin ASCII ser el 37. Obsrvese que el cdigo ASCII asocia nmeros consecutivos con las letras maysculas y minsculas ordenadas alfabticamente. Esto simplifica notablemente ciertas operaciones de ordenacin alfabtica de nombres. Ntese que todas las maysculas tienen cdigo ASCII anterior a cualquier minscula. En la Tabla A1 aparecen muchos caracteres no imprimibles (todos aquellos que se expresan con 2 3 letras). Por ejemplo, el ht es el tabulador horizontal, el nl
133

es el carcter nueva lnea, etc. En realidad la Versin 6.0 de Visual Basic no utiliza para representar caracteres el cdigo ASCII sino el Unicode, que utiliza dos bytes por carcter, con lo cual tiene capacidad para representar 65536 caracteres, pudindose adaptar a las lenguas orientales. Para los caracteres latinos el byte ms significativo coincide con el del cdigo ASCII, mientras que el segundo byte est a cero. En la tabla A2 se muestra en el cdigo ASCII extendido.

Tabla A2 Cdigo ASCII Extendido

134

NMEROS ENTEROS Los nmeros enteros en Visual Basic 6.0 se guardan en 1, 2 4 bytes. Con 8 bits (1 byte) se podran guardar 2 nmeros: desde 0 hasta 255. 16 Con 16 bits (2 bytes) se podran guardar 2 nmeros: desde 0 hasta 65.535. Si se reserva 15 un bit para el signo se tendran 2 nmeros: desde -32768 hasta 32767 32 Con 32 bits (4 bytes) se podran guardar 2 nmeros: desde 0 hasta 4.294.967.295. Si se 31 reserva un bit para el signo se tendran 2 : desde -2.147.483.648 hasta 2.147.483.647
8

NMEROS REALES En muchas aplicaciones hacen falta variables reales, capaces de representar magnitudes que contengan una parte entera y una parte fraccionaria o decimal. Estas variables se llaman tambin de punto flotante. De ordinario, en base 10 y con notacin cientfica, estas variables se representan por medio de la mantisa, que es un nmero mayor o igual que 0.1 y menor que 1.0, y un exponente que representa la potencia de 10 por la que hay que multiplicar la mantisa para obtener el nmero considerado. Por ejemplo, el nmero se representa como 0.3141592654 10 . Tanto la mantisa como el exponente pueden ser positivos y negativos.
1

Variables tipo Single Los computadores trabajan en base 2. Por eso un nmero con decimales de tipo Single se almacena en 4 bytes (32 bits), utilizando 24 bits para la mantisa (1 para el signo y 23 para el valor) y 8 bits para el exponente (1 para el signo y 7 para el valor). Es interesante ver qu clase de nmeros de punto flotante pueden representarse de esta forma. En este caso hay que distinguir el rango de la precisin. La precisin hace referencia al nmero de cifras con las que se representa la mantisa: con 23 bits el nmero ms grande que se puede representar es,
23

= 8.388.608

lo cual quiere decir que se pueden representar todos los nmeros decimales de 6 cifras y la mayor parte aunque no todos de los de 7 cifras (por ejemplo, el nmero 9.213.456 no se puede representar con 23 bits). Por eso se dice que las variables tipo Single tienen entre 6 y 7 cifras decimales equivalentes de precisin. Respecto al exponente de dos por el que hay que multiplicar la mantisa en base 2, con 7 bits el nmero ms grande que se puede representar es 127. El rango vendr definido por la potencia,
127 38

= 1.7014 10

lo cual indica el orden de magnitud del nmero ms grande representable de esta forma. En el caso de los nmeros Single (4 bytes) el rango es: desde -3.402823E38 a -1.401298E-45 para los valores negativos y desde 1.401298E-45 a 3.402823E38 para los valores positivos. Variables tipo Double As pues, las variables tipo Single tienen un rango y sobre todo una precisin muy limitada, insuficiente para la mayor parte de los clculos tcnicos y cientficos. Este problema se soluciona con el tipo Double, que utiliza 8 bytes (64 bits) para almacenar una variable. Se utilizan 53 bits para la mantisa (1 para el signo y 52 para el valor) y 11 para el exponente (1 para el signo y 10 para el valor). La precisin es en este caso,
135

52

2 = 4.503.599.627.370.496 lo cual representa entre 15 y 16 cifras decimales equivalentes. Con respecto al rango, con un exponente de 10 bits el nmero ms grande que se puede representar ser del orden de 2 elevado a 2 elevado a 10 (que es 1024):
1024 308

= 1.7977 10

Si se considera el caso de los nmeros declarados como Double (8 bytes) el rango va desde 1.79769313486232E308 a -4.94065645841247E-324 para los valores negativos y desde 4.94065645841247E-324 a 1.79769313486232E308 para los valores positivos. SISTEMA BINARIO, OCTAL, DECIMAL Y HEXADECIMAL A contnuacin se presentan los primeros nmeros naturales expresados en distintos sistemas de numeracin (bases 10, 2, 8 y 16). Para expresar los nmeros en base 16 se utilizan las seis primeras letras del abecedario (A, B, C, D, E y F) para representar los nmeros decimales 10, 11, 12, 13, 14 y 15. La calculadora que se incluye como accesorio en Windows 95 ofrece posibilidades de expresar un nmero en distintos sistemas de numeracin.
Decimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Binario 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 10000 10001 Octal 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 Hexadecimal 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11

Tabla A3. Expresin de un nmero en los distintos sistemas.

136

ANEXO B: TERMINOLOGA Terminologa de Visual Basic Trmino Tiempo de diseo Tiempo de ejecucin Definicin Es el momento en el que se construye la aplicacin. Es el momento en el cual ejecutamos e interactuamos con la aplicacin como lo hara el usuario. Un formulario sirve como una ventana que puede personalizar como la interfaz de su aplicacin o como un cuadro de dilogo que usa para obtener informacin del usuario. Un formulario puede existir individualmente o puede servir como un documento dentro de una interfaz de documento mltiple (MDI) Representacin grfica de objetos tales como botones, cuadros de lista, cuadros de edicin, etc., con los que el usuario interacta para proporcionar informacin a la aplicacin. Un trmino general usado para describir todos los formularios y controles que forman parte de la aplicacin. Los valores de un objeto, tales como tamao, ttulo, color, etc. Las acciones que un objeto puede realizar sobre s mismo. Son acciones reconocidas por un formulario o control. Los eventos ocurren a medida que el usuario interacta con los objetos de la aplicacin.

Formulario

Controles

Objetos

Propiedades Mtodos Eventos

Programacin controlada Cuando un programa es controlado por eventos, usted escribe cdigo por eventos que se ejecuta en respuesta a eventos invocados por el usuario. Difiere de la programacin procedural, en la cual el programa comienza en la primera lnea de cdigo y sigue un flujo definido llamando procedimientos cuando es necesario. La programacin controlada por eventos es la esencia de las interfaces grficas de usuario; el usuario acciona y el cdigo responde.

137

ANEXO C: EJERCICIOS RESUELTOS Ejemplo 1: Sencillo programa de colores y posiciones En la Figura A se muestra el formulario y los controles de un ejemplo muy sencillo que permite mover una caja de texto por la pantalla, permitiendo a su vez representarla con cuatro colores diferentes. En la Tabla 1 se describen los controles utilizados, as como algunas de sus propiedades ms importantes (sobre todo las que se separan de los valores por defecto). Los archivos de este proyecto se llamarn Colores0.vbp y Colores0.frm.

Figura A. Formulario y controles del Ejemplo 1 Control frmColores0 fraColores optAzul optRojo optAmarillo Propiedad Name Caption Name Caption Name Caption Name Caption Name Caption Valor Control Propiedad frmColores0 optVerde Name Colores Caption fraColor fraPosicion Name Colores Caption optAzul optArriba Name Azul Caption optRojo optAbajo Name Rojo Caption optAmarillo txtCaja Name Amarillo Text Tabla 1. Objetos y propiedades del ejemplo Colores0. Valor optVerde Verde fraPosicion Posicin optArriba Arriba optAbajo Abajo txtCaja

A continuacin se muestra el cdigo correspondiente a los procedimientos de este ejemplo.


Option Explicit Private Sub Form_Load() txtCaja.Top = 0 End Sub Private Sub optArriba_Click() txtCaja.Top = 0 End Sub Private Sub optAbajo_Click() txtCaja.Top = frmColores0.ScaleHeight - txtCaja.Height End Sub Private Sub optAzul_Click() txtCaja.BackColor = vbBlue End Sub

138

Private Sub optRojo_Click() txtCaja.BackColor = vbRed End Sub Private Sub optVerde_Click() txtCaja.BackColor = vbGreen End Sub Private Sub optAmarillo_Click() txtCaja.BackColor = vbYellow End Sub

Sobre este primer programa en Visual Basic 6.0 se pueden hacer algunos comentarios: 1. El comando Option Explicit sirve para obligar a declarar todas las variables que se utilicen. Esto impide el cometer errores en los nombres de las variables (confundir masa con mesa, por ejemplo). En este ejemplo esto no tiene ninguna importancia, pero es conveniente acostumbrarse a incluir esta opcin. Declarar una variable es crearla con un nombre y de un tipo determinado antes de utilizarla. 2. Cada una de las partes de cdigo que empieza con un Private Sub y termina con un End Sub es un procedimiento, esto es, una parte de cdigo independiente y reutilizable. El nombre de uno de estos procedimientos, por ejemplo optAzul_Click(), es tpico de Visual Basic. La primera parte es el nombre de un objeto (control); despus va un separador que es el carcter de subrayado (_); a continuacin el nombre de un evento -click, en este caso-, y finalmente unos parntesis entre los que iran los argumentos, en caso de que los hubiera. 3. Es tambin interesante ver cmo se accede desde programa a la propiedad backColor de la caja de texto que se llama txtCaja: se hace utilizando el punto en la forma txtCaja.BackColor. Los colores se podran tambin introducir con notacin hexadecimal (comenzando con &H, seguidos por dos dgitos entre 00 y FF (es decir, entre 0 y 255 en base 10) para los tres colores fundamentales, es decir para el Red, Green y Blue (RGB), de derecha a izquierda. Aqu se han utilizado las constantes simblicas predefinidas en Visual Basic 6.0: vbRed, vbGreen y vbBlue (ver Tabla 6.1, en la pgina 70). 4. Recurdese que si se desea que el cdigo de todos los eventos aparezca en una misma ventana hay que activar la opcin Default to Full Module View en la solapa Editor del comando Tools/Options. Tambin puede hacerse directamente en la ventana de cdigo con uno de los botones que aparecen en la parte inferior izquierda ( ) 5. Es muy importante crear primero el control frame y despus, estando seleccionado, colocar los botones de opcin en su interior. No sirve hacerlo a la inversa. Visual Basic supone que todos los botones de opcin que estn dentro del mismo frame forman parte del mismo grupo y slo permite que uno est seleccionado.

139

Ejemplo 2: Minicalculadora elemental En este ejemplo se muestra una calculadora elemental que permite hacer las cuatro operaciones aritmticas (Figura B). Los archivos de este proyecto se pueden llamar minicalc.vbp y minicalc.frm. El usuario introduce los datos y hace clic sobre el botn correspondiente a la operacin que desea realizar, apareciendo inmediatamente el resultado en la caja de texto de la derecha. La Tabla 2 muestra los objetos y las propiedades ms importantes de este ejemplo.

Figura B. Minicalculadora elemental Control frmMinicalc txtOper1 txtOper2 txtResult lblOp Propiedad Name Caption Name Text Name Text Name Text Name Caption Valor frmMinicalc Minicalculadora txtOper1 Propiedad Valor Name lblEqual Caption = cmdSuma Name cmdSuma Caption + txtOper2 cmdResta Name cmdResta Caption txtResult cmdMulti Name cmdProd Caption * lblOp cmdDivi Name cmdDiv Caption / Tabla. 2. Objetos y propiedades del ejemplo Minicalculadora. Control lblEqual

En este ejemplo se ha utilizado repetidamente la funcin Val() de Visual Basic. Esta funcin convierte una serie de caracteres numricos (un texto formado por cifras) en el nmero entero o de punto flotante correspondiente. Sin la llamada a la funcin Val() el operador + aplicado a cadenas de caracteres las concatena, y como resultado, por ejemplo, 3+4 dara 34. No es lo mismo los caracteres 1 y 2 formando la cadena o string 12 que el nmero 12; la funcin val() convierte cadenas de caracteres numricos con los que no se pueden realizar operaciones aritmticas- en los nmeros correspondientes con los que s se puede operar matemticamente-. Visual Basic 6.0 transforma de modo automtico nmeros en cadenas de caracteres y viceversa, pero este es un caso en el que dicha transformacin no funciona porque el operador + tiene sentido tanto con nmeros como con cadenas.

140

A continuacin se muestra el cdigo correspondiente a los procedimientos que gestionan los eventos de este ejemplo.
Option Explicit Private Sub cmdDiv_Click() txtResult.Text = Val(txtOper1.Text) / Val(txtOper2.Text) lblOp.Caption = "/" End Sub Private Sub cmdProd_Click() txtResult.Text = Val(txtOper1.Text) * Val(txtOper2.Text) lblOp.Caption = "*" End Sub Private Sub cmdResta_Click() txtResult.Text = Val(txtOper1.Text) - Val(txtOper2.Text) lblOp.Caption = "-" End Sub Private Sub cmdSuma_Click() txtResult.Text = Val(txtOper1.Text) + Val(txtOper2.Text) lblOp.Caption = "+" End Sub

141

Ejemplo 3: Transformacin de unidades de temperatura La Figura C muestra un programa sencillo que permite ver la equivalencia entre las escalas de temperaturas en grados centgrados y grados Fahrenheit. Los archivos de este proyecto se pueden llamar Temperat.vbp y Temperat.frm. En el centro del formulario aparece una barra de desplazamiento vertical que permite desplazarse con incrementos pequeos de 1 C y grandes de 10 C. Como es habitual, tambin puede cambiarse el valor arrastrando con el ratn el cursor de la barra. Los valores mximos y mnimo de la barra son 100 C y 100 C. A ambos lados de la barra aparecen dos cuadros de texto (color de fondo blanco) donde aparecen los grados correspondientes a la barra en ambas escalas. Figura C. Transformacin de unidades de Encima aparecen dos rtulos (labels) que indican la temperatura escala de temperaturas correspondiente. Completan la aplicacin un botn Salir que termina la ejecucin y un men Archivo con la nica opcin Exit, que termina asimismo la ejecucin del programa. La Tabla 3 indica los controles utilizados en este ejemplo junto con las propiedades y los valores correspondientes.
Control frmTemp Propiedad Name Caption Name Caption Name Caption Name Caption Font Name text Name text Valor Control Propiedad frmTemp vsbTemp Name Conversor de Min temperaturas mnuFile Max &File SmallChange mnuFileExit LargeChange E&xit Value cmdSalir lblCent Name Salir Caption MS Sans Serif, Bold, 14 Font txtCent lblFahr Name 0 Caption txtFahr Font 32 Tabla 3. Controles y propiedades del Ejemplo 1.3. Valor vsbTemp 100 -100 1 10 0 lblCent Grados Centgrados MS Sans Serif, 10 lblFahr Grados Fahrenheit MS Sans Serif, 10

mnuFile mnuFileExit cmdSalir

txtCent txtFahr

142

Por otra parte, el cdigo con el que este programa responde a los eventos es el contenido en los siguientes procedimientos:
Option Explicit Private Sub cmbSalir_Click() Beep End End Sub Private Sub mnuFileExit_Click() End End Sub Private Sub vsbTemp_Change() txtCent.Text = vsbTemp.Value txtFahr.Text = 32 + 1.8 * vsbTemp.Value End Sub

Sobre este tercer ejemplo se puede comentar lo siguiente: 1. Se ha utilizado la propiedad Value de la barra de desplazamiento, la cual da el valor actual de la misma con respecto a los lmites inferior y superior, previamente establecidos (-100 y 100). 2. Mediante el procedimiento cmdSalir_Click, se cierra el programa, gracias a la instruccin End. El cometido de Beep no es otro que el de emitir un pitido a travs del altavoz del ordenador, que indicar que en efecto se ha salido del programa. 3. La funcin mnuFileExit_Click() y activa desde el men y termina la ejecucin sin emitir ningn sonido. 4. Finalmente, la funcin vsbTemp_Change() se activa al cambiar el valor de la barra de desplazamiento; su efecto es modificar el valor de la propiedad text en las cajas de texto que muestran la temperatura en cada una de las dos escalas.

143

Ejemplo 4: Colores RGB La Figura D muestra el formulario y los controles del proyecto Colores. Los archivos de este proyecto se pueden llamar Colores.vbp y Colores.frm. En este ejemplo se dispone de tres barras de desplazamiento con las que pueden controlarse las componentes RGB del color del fondo y del color del texto de un control label. Dos botones de opcin permiten determinar si los valores de las barras se aplican al fondo o al texto. Cuando se cambia del texto al fondo o viceversa los valores de las barras de desplazamiento (y la posicin de los cursores) cambian de modo acorde. A la derecha de las barras de desplazamiento tres cajas de texto contienen los valores numricos de los tres colores (entre 0 y 255). A la izquierda, tres labels indican los colores de las tres barras. La Tabla 4 muestra los controles y las propiedades utilizadas en el este ejemplo.

Figura D. Programa Colores RGB Control frmColores lblCuadro Propiedad Name Caption Name Caption Font Name Caption Font Name Index Caption Font Valor frmColores Colores lblCuadro INFORMTICA 1 Propiedad Name Min Max SmallChange MS Sans Serif, Bold, 24 LargeChange cmdSalir Index Salir Value MS Sans Serif, Bold, 10 txtColor Name optColor Text 0,1 Locked Fondo, Texto Index MS Sans Serif, Bold, 10 lblColor Name Caption Index Font Tabla 1.5. Objetos y propiedades del ejemplo Colores. Control hsbColor Valor hsbColor 0 255 1 16 0,1,2 0 txtColor 0 True 0,1,2 lblColor Rojo,Verde,Azul 0,1,2 MS Sans Serif, 10

cmdSalir

optColor

144

Una caracterstica importante de este ejemplo es que se han utilizado vectores (arrays) de controles. Las tres barras se llaman hsbColor y se diferencian por la propiedad Index, que toma los valores 0, 1 y 2. Tambin las tres cajas de texto, las tres labels y los dos botones de opcin son arrays de controles. Para crear un array de controles basta crear el primero de ellos y luego hacer Copy y Paste tantas veces como se desee, respondiendo afirmativamente al cuadro de dilogo que pregunta si desea crear un array. El procedimiento Sub que contiene el cdigo que gestiona un evento de un array es nico para todo el array, y recibe como argumento la propiedad Index. De este modo que se puede saber exactamente en qu control del array se ha producido el evento. As pues, una ventaja de los arrays de controles es que pueden compartir el cdigo de los eventos y permitir un tratamiento conjunto por medio de bucles for. A continuacin se muestra el cdigo correspondiente a los procedimientos que tratan los eventos de este ejemplo.
Option Explicit Public Brojo, Bverde, Bazul As Integer Public Frojo, Fverde, Fazul AS Integer Private Sub cmdSalir_Click() End End Sub Private Sub Form_Load() Brojo = 0 Bverde = 0 Bazul = 0 Frojo = 255 Fverde = 255 Fazul = 255 lblCuadro.BackColor = RGB(Brojo, Bverde, Bazul) lblCuadro.ForeColor = RGB(Frojo, Fverde, Fazul) End Sub Private Sub hsbColor_Change(Index As Integer)If optColor(0).Value = True Then lblCuadro.BackColor = RGB(hsbColor(0).Value, hsbColor(1).Value, _ hsbColor(2).Value) Dim i As Integer For i = 0 To 2 txtColor(i).Text = hsbColor(i).ValueNext i Else lblCuadro.ForeColor = RGB(hsbColor(0).Value, hsbColor(1).Value, _hsbColor(2).Value)For i = 0 To 2 txtColor(i).Text = hsbColor(i).ValueNext i End If End Sub Private Sub optColor_Click(Index As Integer) If Index = 0 Then 'Se pasa a cambiar el fondo Frojo = hsbColor(0).Value Fverde = hsbColor(1).Value Fazul = hsbColor(2).Value hsbColor(0).Value = Brojo
145

hsbColor(1).Value = Bverde hsbColor(2).Value = Bazul Else 'Se pasa a cambiar el texto Brojo = hsbColor(0).Value Bverde = hsbColor(1).Value Bazul = hsbColor(2).Value hsbColor(0).Value = Frojo hsbColor(1).Value = Fverde hsbColor(2).Value = Fazul End If End Sub

El cdigo de este ejemplo es un poco ms complicado que el de los ejemplos anteriores y requiere unas ciertas explicaciones adicionales adelantando cuestiones que se vern posteriormente: 1. La funcin RGB() crea un cdigo de color a partir de sus argumentos: las componentes RGB (Red, Green and Blue). Estas componentes, cuyo valor se almacena en un byte y puede oscilar entre 0 y 255, se determinan por medio de las tres barras de desplazamiento. 2. El color blanco se obtiene con los tres colores fundamentales a su mxima intensidad. El color negro se obtiene con los tres colores RGB a cero. Tambin se pueden introducir con las constantes predefinidas vbWhite y vbBlack, respectivamente. 3. Es importante disponer de unas variables globales que almacenen los colores del fondo y del texto, y que permitan tanto guardar los valores anteriores de las barras como cambiar stas a sus nuevos valores cuando se hace clic en los botones de opcin. Las variables globales, definidas en la parte de definiciones generales del cdigo, fuera de cualquier procedimiento, son visibles desde cualquier parte del programa. Las variables definidas dentro de una funcin o procedimiento slo son visibles desde dentro de dicha funcin o procedimiento (variables locales). 4. La funcin hsbColor_Change(Index As Integer) se activa cada vez que se cambia el valor en una cualquiera de las barras de desplazamiento. El argumento Index, que Visual Basic define automticamente, indica cul de las barras del array es la que ha cambiado de valor (la 0, la 1 la 2). En este ejemplo dicho argumento no se ha utilizado, pero est disponible por si se hubiera querido utilizar en el cdigo.

146

ANEXO D: EJERCICIOS PROPUESTOS Ejercicio 1. Programa para convertir de centmetros a pulgadas. Mejora el programa para que pueda convertir de pulgadas a centmetros.

Ejercicio 2. Programa para calcular la edad de una persona introduciendo su fecha de nacimiento. Mejora el programa haciendo que indique cuantos das faltan para el cumpleaos de la persona y si coincide que el da actual con el cumpleaos, que despliege Feliz Cumpleaos!

Ejercicio 3. Programa que muestra los nmeros del 0 al 100 de 5 en 5. Mejora el programa agregando un control deslizante para cambiar el intervalo y pueda ser de 1 en 1, de 2 en 2, de 3 en 3, etc.

147

Ejercicio 4. Programa para elevar un nmero a una potencia. Mejora el programa agregando un botn para calcular la raiz ensima del nmero ingresado.

Ejercicio 5. Programa para calcular el factorial de un nmero. Mejora el programa agregando un control deslizante para ingresar el nmero del cual se va calcular el factorial, de 1 a 50.

Ejercicio 6. Programa para calcular el total de la compra frutas y verduras, ingresando la cantidad de kilogramos comprados, el precio por kilo y tomando en cuenta una tabla de descuento. Nota: Utiliza IF THEN para saber que descuento utilizar: 0% de 0 a 2Kg. 10% de 2.01 a 5Kg. 15% de 5.01 a 10Kg y 20% por ms de 10.01Kg comprados.

148

Ejercicio 7. Este programa tiene que mostrar tres preguntas cuya respuesta es S o No, si el usuario se equivoca en una, el programa tiene darle un mensaje al usuario de Error Fin del juego, si el usuario acierta en la tres, entonces el programa tiene que decir Has ganado el juego, las preguntas pueden ser: 1. Cristbal Coln Descubrio America? 2. La independencia de Mxico fue en el ao 1810? 3. The Doors fue un grupo de rock Americano? Nota: Utiliza MsgBox Ejercicio 8. Programa que muestra la suma de los nmeros impares del 25 al 125. Mejora el programa agregando dos cajas de texto para ingresar el intervalo y que el programa sume los nmeros impares en dicho intervalo. Mejora el programa tambin agregando otro botn de comando para sumar los nmeros pares del intervalo.

Ejercicio 9. Programa que calcula el nmero de aos bisiestos que ha vivido una persona indicando nicamente el ao actual y el ao de nacimiento de la persona. Mejora el programa agregando un mensaje que diga el ltimo ao bisiesto que ha vivido la persona.

149

Ejercicio 10. Programa que calcula si un nmero ingresado es primo o no es primo. Una vez ingresado el nmero debe de desplegar un mensaje que diga S es nmero primo o No es nmero primo

Ejercicio 11. Programa que convierte de un da de la semana dado en nmero a texto, empezando con 1 como el da domingo.

Ejercicio 12. Programa que convierte de un mes del ao dado en nmero a texto y que tambin diga la estacin del ao que es.

150

Ejercicio 13. Programa que realiza la suma, resta, multiplicacin o divisin de dos nmeros dados indicando el nmero de opcin (1 para suma, 2 para resta, 3 para multiplicaci y 4 para divisin), desplegando el resultado. Mejora el programa agregando botones de opcin para no capturar el nmero de opcin.

Ejercicio 14. Programa que realiza operaciones con texto, tal y como se indica en la figura, se ingresa una cadena de texto y haciendo clic en el botn correspondiente se realiza la operacin indicada en el botn, apareciendo el resultado en la parte de abajo. Los botones <Fecha>, <Hora> y <Fecha y Hora> nicamente muestran la fecha actual, la hora actual y la fecha y la hora actuales en la parte inferior del programa.

151

Ejercicio 15. Programa que, ingresados el nombre, el apellido paterno y el apellido materno de una persona, concatena los datos para formar el nombre completo. Mejora el programa agregando dos botones de opcin para elegir dos maneras de poner el nombre completo de la persona: 1. Paterno, Materno y Nombre 2. Nombre, Paterno y Materno

Ejercicio 16. Programa que dibuja crculos al azar, rellenndolos de un color al azar. Mejora el programa para que tambin haga el dimetro de los crculos variable, tambin al azar dentro de un rango pequeo,

Ejercicio 17. Programa que encuentra el menor valor de entre tres nmeros dados. Mejora el programa para que tambin encuentre el mayor de entre los tres, procurando que el programa pueda encontrar el mayor y el menor an cuando los nmeros dados sean decimales o negativos.

152

Ejercicio 18. Programa que encuentra y lista todos los nmero primos desde 1 hasta un nmero dado.

Ejercicio 19. Programa que calcula la frmula general para la solucin de ecuaciones cuadrticas con una incgnita, dados A, B y C. Recordemos que aplica para las ecuaciones de la forma: ax2 + bx + c = 0 Siendo la frmula general:

Recuerda que el resultado tiene dos races del mismo valor, una positiva y otra negativa.

Ejercicio 20. De manera similar al programa anterior, escribe un programa que resuelva el teorema de Pitgoras para los tringulos rectngulos, que contemple los dos casos posibles: 1. Dado los catetos calcular la hipotenusa. 2. Dado uno de los catetos y la hipotenusa, calcular el otro cateto. Mejora el programa calculando y desplegando los ngulos internos que forman los catetos con la hipotenusa, recuerda que el ngulo que forman los catetos siempre es de 90. Agrega el dibujo de un tringulo en el programa, mostrando las distancias y los ngulos en el lugar correspondiente una vez realizados los clculos. Recordemos que la frmula del teorema de Pitgoras es: A2 + B2 = C2 siendo: A y B los catetos y C la hipotenusa. C A B
153

También podría gustarte